このプロジェクトは、CTIC Foundationが使用できる情報を収集するために、LORAトランスミッションテクノロジーの小さなテストを実施しようとしています。情報は最終的なデバイス(ノードまたは顧客)から送信され、この情報はゲートウェイデバイスによって収集され、これによりサーバーに転送して保存します。
Loraは、SemTechが特許を取得した種類の無線周波数変調を使用するワイヤレステクノロジー(WiFi、Bluetooth、LTE、Sigfox、Zigbeeなど)です。
現在、このテクノロジーは、このテクノロジーと連携しようとするすべてのハードウェア製造を証明するAlliance Loraによって管理されています。
LORAは、干渉に対する耐性が高く、データを受信するための感度が高い(-168dB)、非常に低い消費量(デバイスは1つのバッテリーで10年続くことができます)、および10〜20kmの範囲(土地の直接ビジョンまたはトポロジーが利用可能かどうかに応じて)。一方、データ転送が非常に低いことがわかります(最大255バイト)。
これにより、この転送技術は、電流を必要としない、またはアクセスしていない遠距離またはIoTネットワークに役立ちます。
LORAは、自由周波数で動作します(ヨーロッパでは868MHz 、アメリカでは916MHz、アジアでは433MHz、たとえば433MHzなど)。これは、電気ネットワークサプライヤーと電気通信プロバイダー(RadioFrequenceを使用)を使用するために必要なものを集めて、リスクなしで情報を発することを可能にします。
Loremac(Loraでも知られている)またはLorawanを介してデバイスと通信できます。
Loramac :ポイントツーポイントで2つのデバイスを互いに通信するために使用され、1つは情報を送信し、もう1つはそれを収集します(またはその逆)。
Lorawan :デバイスのネットワークを通信するために使用されます。このアプローチでは、ゲートウェイの図が表示されます(1つ以上のデバイスの情報を収集してサーバーに転送するデバイス)。ロラワンでは、ゲートウェイを聴くべきデバイスと無視するべきデバイスを知るために情報をフィルタリングする必要がありますが、これは後で見られます。このアプローチでは、スタートポロジーを使用しています。
一方、ロラワンでは、 3種類の最終的なデバイスまたはノードもあります。
*例では、クラスAおよびBノードのみのサポート(使用されているライブラリによってサポートされています)が、タイプAのみが実装されています。
ヨーロッパの自由周波数帯(868MHz)を使用する場合、いくつかの制限を考慮する必要があります。
各周波数帯域にはいくつかのチャネルまたはサブバンドがあります。ヨーロッパ(868MHz)の場合、0から9までの10のチャネルがあります。たとえば、アメリカ(915MHz)では、最大64を見つけることができます。
あるチャネルを介した情報の送信は、図書館が通常使用できるようにするタスクです。
いくつかの終わりには、 DatarrateまたはDeviceスプレッダーを変更することができます。
DatarrateとSpreadingFactorは関連しています。0のデータリートは、SF12を示し、5のDatarrateはSF7を示します。すべての周波数125kHzで、次の例外があります。6のデータデータテートは、250kHzのSF7を示します。
2つのデバイス(1つはノード用とゲートウェイ用に1つは、WiFi接続も必要です)とTTS( Thing Network )またはChirpstack (自宅で独自のサーバーを使用できる)の関連アカウント。この例では、ArduinoノードとPycomゲートウェイを使用するLoremacとLorawanの両方の例。
開始するには、リポジトリをクローンするだけで十分です。
git clone https://github.com/Javieral95/Getting_Started_With_LoRa.git
次に、関連するプロジェクトをデバイスにアップロードします
なぜ2つのIDE?シンプルなPymakr拡張機能は、Visual Studioコードでかろうじて機能します。最も快適な作業スペースを自由に使用してください。
どちらのデバイスにも、それらに接続されているアンテラロラがあります。
注:ArduinomKr1300のコード(Lora End-Deviceなどの使用のためにさらに準備)と、端端としてPysenseまたはPytrackを使用するコードもリポジトリに含まれています。

Loramacの例(同名フォルダーにあります)は、Arduinoの最終デバイスとPycomゲートウェイを使用する機能的です。
ノードはハードコード情報のみを送信し、ゲートウェイはLORAとWiFiにのみ接続し、PYCOM情報を受信し、データをネットワークに送信する機能を実装していますが)。
ネットワークサーバーの使用には分配されます。
もっと知るには、フォルダー/loramacにアクセスできます。
これらの例(ArduinoファイナルデバイスとPycomゲートウェイを使用する機能的な例)を使用するには、データを視覚化するためにサーバーが必要です。この例では、 Thing NetworkとChirpstack (以前はLoraserverとして知られていました)の使用が対処されています。
詳細を知るには、フォルダー/lorawanにアクセスしてから、このドキュメントに相談し続けることができます。
ロラワンには認証には2つのタイプがあります。
*現時点での例では、OTAAのみが作成されています。
前述のように、サーバーが必要になります。この例では、Thing Networkの無料バージョン、Pycomが所有するChirpstackサーバー、および自宅に展開された別の装備が使用されています。
それは最も信頼性が高く、安全で、より良い文書化された代替品です。ただし、すべてが開いていなくなることを示しています(アプリケーションごとに50ノードの制限があります)。
アプリケーションの作成は簡単で、メニューにアクセスし、 +ボタンをクリックします。アプリケーションの名前、一意のID、および説明を示したら。
アプリケーションが作成されたら、 +ボタンをクリックする最終的なデバイス(ノード)を追加できます。
ゲートウェイは、いくつかの最終的なデバイス(いくつかのアプリケーションに属する)から来るトラフィックを送信し、サーバーに転送するデバイスです。ゲートウェイの作成もシンプルで、 +ボタンをクリックして、次の概念に注意を払ってフォームに入力します。
ノードがサーバーに送信したデータを読み取るには、ペイロードをデコードする必要があります。TTNの場合、ペイロードフォーマッタタブで各デバイスに対してそれを行います。 FormatterはJavaScriptオプションをどのように入力するかを選択します。
function Decoder(bytes, port) {
// Decode plain text; for testing only
return {
myTestValue: String.fromCharCode.apply(null, bytes)
};
}
arduino_ttn_decoder.js Networkのすべての16進アドレスが市長にあることが確立されており、デバイスをプログラミングするときは重要ではありませんが、過去のバージョンではエラーが発生しています。
これはオープンソースの代替品であり、まだ開発中であり、そのドキュメントはそれほど良くありません。ただし、それは機能し、サーバーを起動できるようにします。
Pycomは、Gatewayデバイスを接続するためのChirpstackサーバーを提供しています。
アプリケーションは、Thing Networkのセクションで詳細に似ています。
サーバーセクションのデバイスプロファイルに移動する必要があります。その中に興味があるプロファイル(この場合はOTAA)にアクセスし、バージョンを変更する必要があります。
ゲートウェイを作成するには、同じ名前にアクセスし、 +ボタンをクリックします。ゲートウェイIDフィールド(ゲートウェイを識別する16進数で64ビット)に特別な注意を払うフォームに記入してください。Chirpstackにそれらを生成させることができますが、デバイスのMACは通常使用されます(ゲートウェイPycomを説明するセクションでそれを知らない場合は、それを取得するように詳しく説明します)。
残りのデフォルト値を残すことができます。
ノードがサーバーに送信したデータを読み取るには、ペイロードを解読する必要があります。チャープスタックの場合は、各デバイスプロファイルに対してそれを行います。デバイスプロパイルでは、関心のあるプロファイル(この場合はOTAA)にアクセスし、コーデックタブにアクセスします。
カスタムDECIPTコーデック関数で選択します。
function Decode(fPort, bytes) {
var tempObj = new Object();
tempObj.data=bytes;
tempObj.decodedData = String.fromCharCode.apply(null, bytes);
tempObj.message = "Informacion recibida del nodo";
return tempObj;
}
arduino_chirpstark_decoder.js Chirpstackのすべての16進アドレスが極度にあることが確立されており、デバイスをプログラミングするときは重要ではありませんが、過去のバージョンではエラーが発生しています。
Chirpstackは、Lorawanで独自のプライベートサーバーを起動するためのOpenSourceの代替品を提供し、簡単な方法でコンテナを通してそれを行うことができます。
そのため、この操作を許可するChirpstack(Brocar)の創設者が所有する別のリポジトリ:Chirpstack-Dockerが現在のリポジトリにクローニングされています。 chirpstack-dockerフォルダーにあります。
Chirpstackには、サービスを操作できるようにするためのアーキテクチャにさまざまなコンポーネントがあります。次のようです。

コンテナの形でサーバーを表示する方法により、アーキテクチャコンポーネントの多くを抽象化することができますが、以下に詳しく説明します。
展開する前に、すべての必要なパラメーターを構成ボードに保存されている構成ファイルで構成する必要があります。
次の公式文書を参照できます。
注:構成ファイルは、空白のスペースや空のラインに敏感で(蚊のネットで見つかった)、ファイルをチェックしてエラーを避けるために排除します。
前述のように、コンテナへの展開はシンプルで、 chirpstack-dockerディレクトリにあります。
必要なものが既に構成されたら、 Chirpstack-Dockerディレクトリに配置して起動するだけで十分です。
docker-compose up
デフォルトの構成を使用すると、ローカル方向のサーバーにアクセスできます:8080 。ユーザーは管理者と管理者のパスワードになります。
基本的な構成の追加を始めましょう:
サーバーが構成されたら、ゲートウェイを登録し、最終的なデバイスを記録するためのアプリケーションを作成する必要があります。このプロセスは、このドキュメントの前のセクションで説明されているものと同様に実行されます:Chirpstack(Lora Server)。
さらに、受信した情報をデコードしてエンコードする関数を示す必要があります。前のセクションでも説明されています。
ゲートウェイの起動に使用されるコードは、以下のPycom(Pytrackとfipy)で詳細に詳述されています。このコードは、Lorawan/Lorapycomgatewayにあります。
Nanogateway Py Libraryが使用されており、ゲートウェイを数分で起動できるようにしています。
Nano-Gatewayは、PycomデバイスをFrequency Band(Monochanal)チャネルのみに耳を傾ける単純なゲートウェイに変換し、Pycomのより多くのバンドを聴くために、コマーシャルゲートウェイに必要になる可能性があります。
構成ファイルでは、ゲートウェイをカスタマイズするために必要なものすべてを使用します。
WIFI_MAC = ubinascii.hexlify(machine.unique_id()) #.toUpper() para TTS
SERVER = 'loraserver.pycom.io' #(or url of your server)
GATEWAY_ID = WIFI_MAC[:6] + "ffff" + WIFI_MAC[6:12] #Minusculas: Chirpstack
NTP = "es.pool.ntp.org"
NTP_PERIOD_S = 3600
#WiFi settings (change it)
WLAN_SSID = "MyAwesomeWiFi" #"pycom-wifi"
WLAN_PASS = "CheckOutThisGoodPassword" #"securepassword"
WLAN_TIMEOUT_MS = 180000
### LoRaWAN for EU868 ###
LORA_FREQUENCY = 868500000
#Spreading Factor: (Higher value in SF=More distance but less speed transmision)
LORA_GW_DR = "SF7BW125" # DR_5,Can change in range: SF7 to SF15 (SF7B250 also exists)
LORA_NODE_DR = 5 #5 (6 uses 250Khz) for SF7, 4 for SF6.. all using 125Khz
###
def get_gateway_id():
print("Your gateway_id is: {}".format(GATEWAY_ID)) #The gateway is b'THIS_STRING'
return GATEWAY_ID
注:インターネット接続なしでゲートウェイをローカルネットワークに接続すると、時計を同期するときにエラーが返されます。次の例を示しているように、 nanogateway.pyファイルの開始(自己)関数で次のコード行についてコメントするステップから抜け出すことができます。
# get a time sync
self._log('Syncing time with {} ...', self.ntp_server)
#self.rtc.ntp_sync(self.ntp_server, update_period=self.ntp_period)
#while not self.rtc.synced():
# utime.sleep_ms(50)
self._log("RTC NTP sync complete")
いくつかのメインファイル関数は使用されていません。次のようにゲートウェイを起動するだけで、すでに機能しています。
def init_loraWAN_gateway():
print("Initializing LoRaWAN nano Gateway")
nanogw = NanoGateway(
id=config.GATEWAY_ID,
frequency=config.LORA_FREQUENCY,
datarate=config.LORA_GW_DR,
ssid=config.WLAN_SSID,
password=config.WLAN_PASS,
server=config.SERVER,
port=config.PORT,
ntp_server=config.NTP,
ntp_period=config.NTP_PERIOD_S
)
print("Ok! Now you have a LoRaWAN Gateway! Lets start it, wait . . .")
pycom.rgbled(0xAA0000)
nanogw.start()
nanogw._log('. . . Yeah! Nano gateway is connected and running, enjoy the log:')
pycom.rgbled(0x000000)
Pycomは、接続するまで赤信号を保持します。デバイスのデバイスを聴くと、グリーンLEDが点滅します。
Arduinoを使用してクラスノードAを操作するには、以下が詳細です。
理論では、周波数帯域で利用可能なすべてのチャネルを使用しますが、後で力のある方法は1つだけ(推奨されません)。
McCi Arduino Lorawan Libraryが使用されており、Lora Communicationの多くの側面を抽象化できます。プラットフォームライブラリマネージャーによってインストールされています。
基本的に、Arduinoクライアントに使用されるコードは、いくつかの変更を除いて、ライブラリのttn-otaa.inoの例にあるコードです。
構成は2つの異なるファイルで作成されます。
上記のように、Lorawanに関連するすべての構成は、 Lorawan.cppファイルに示されています。ドキュメントの冒頭では、データを示す必要があることが詳細です: app_eui 、 dev_eui 、 app_key (以下に示す形式への目)。
次に、Chirpstackの例:
static const u1_t PROGMEM APPEUI[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
static const u1_t PROGMEM DEVEUI[8] = {0x7b, 0x6b, 0xff, 0x2c, 0x7b, 0x2c, 0x19, 0x5a};
static const u1_t PROGMEM APPKEY[16] = {0xbd, 0x21, 0x5a, 0x82, 0xb2, 0xf7, 0x92, 0xf3, 0xc7, 0xcb, 0xb2, 0x88, 0xc7, 0x55, 0x33, 0xe7};
キー構成全体の下で、 loraWan.cppファイルでは、温度と湿度センサーからフラットテキストまたはデータを送信するかどうかを選択できます。目的のオプションを分解します:
/******* Send data config *******/
// Use this to send a Hello world in plain text
// static uint8_t mydata[] = "Hello World!";
// Use this to send sensor data
const int neededBytes = 4; // 4 bytes: 2 for temperature and 2 for humidity, can change this value
static byte mydata[neededBytes];
static LoraEncoder encoder(mydata);
送信された情報に応じて、Things NetworkとChirpstackのセクションに示されているように、デコードまたはその他の機能を使用する必要があります。
以前に見たように、 Nano-Gateway Pycomプレートはチャンネルでのみ読み取ることができ、Arduinoの最終デバイスはすべてのバンドチャンネルでブロードキャストできます(たとえば、ヨーロッパのバンドには10チャネルがあります)。推奨されていませんが(1%のルールに違反する可能性があります)、開発とテストの問題により、チャネルと頻度のみを使用することを余儀なくされます。
このためには、ライブラリコード、より具体的にはlorabase_eu868.h (ヨーロッパの頻度を使用する場合)をより具体的に変更し、目的の周波数を次のように発行するように強制する必要があります(すべての値がどのようにハードコーディングされて頻度868.mhzを示すかを観察します):
enum {
EU868_F1 = 868500000, // g1 SF7-12
EU868_F2 = 868500000, // g1 SF7-12 FSK SF7/250
EU868_F3 = 868500000, // g1 SF7-12
EU868_F4 = 868500000, // g2 SF7-12
EU868_F5 = 868500000, // g2 SF7-12
EU868_F6 = 868500000, // g3 SF7-12
EU868_J4 = 868500000, // g2 SF7-12 used during join
EU868_J5 = 868500000, // g2 SF7-12 ditto
EU868_J6 = 868500000, // g2 SF7-12 ditto
};
enum {
EU868_FREQ_MIN = 868500000,
EU868_FREQ_MAX = 868500000
};
次の関数は、lora( lorawan_startjob()関数の初めにも呼び出される必要があります。
// Define the single channel and data rate (SF) to use
void disableChannels(int selectedChannel, int dr)
{
// Disable all channels, except for the one defined above.
// ONLY FOR TESTING AND DEVELOPING!
for (int i = 0; i < 9; i++)
{ // For EU; for US use i<71
if (i != selectedChannel)
{
LMIC_disableChannel(i);
}
}
// Set data rate (SF) and transmit power for uplink
LMIC_setDrTxpow(dr, 14);
}
構成されるチャネルとデイテルレートは、ファイルの先頭にあり、行の先頭にあります(デフォルト:チャンネル0と、値が5である拡散係数7の目的のデータセート):
/******* Channel config (only change if you want to uses a single channel) *******/
const int channel = 0; // Use if you want to use only one Band's Channel.
const int dr = DR_SF7; // Use if you want to use a specific datarate (The spreading factor mark the dr's value).
これにより、パッケージの損失が大幅に削減されますが、ゲートウェイが受け取らないものがまだあります。
プロジェクトをArduinoプレートにコピーするだけです。
書店はイベントで機能します。この場合、最も重要なのは認証です(完了すると、コンソールにキーが表示されます)。
データが送信されるイベントは、 lorawan.cppファイルのvoid onevent関数(ev_t ev)でev_txcompleteになります。このイベントには、デバイスが耳を傾ける「Rxウィンドウ」が含まれていることに注意してください。
case EV_TXCOMPLETE:
Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
if (LMIC.txrxFlags & TXRX_ACK)
Serial.println(F("Received ack"));
if (LMIC.dataLen)
{
Serial.print(F("Received "));
Serial.print(LMIC.dataLen);
Serial.println(F(" bytes of payload"));
}
// Schedule next transmission
os_setTimedCallback(&sendjob, os_getTime() + sec2osticks(TX_INTERVAL), do_send);
break;
同じファイルで、送信されるデータが詳細に表示される機能は、 do_sendです(フラットテキストを送信する場合は情報をエンコードする行にコメントまたは分解します):
void do_send(osjob_t *j)
{
// Check if there is not a current TX/RX job running
if (LMIC.opmode & OP_TXRXPEND)
{
Serial.println(F("OP_TXRXPEND, not sending"));
}
else
{
// Leer datos de sensor y codificar (Libreria LoRa_Serialization).
am2315_readedData data = readAM2315Data();
encoder.writeTemperature(data.temp);
encoder.writeHumidity(data.hum);
// Comentar las dos lineas "encoder" para enviar texto plano
// Send packet
LMIC_setTxData2(1, mydata, sizeof(mydata), 0);
if (isLoopRunning)
{
freq = String(LMIC.freq);
Serial.println("-->Packet queued using freq = " + freq);
// Prepare upstream data transmission at the next possible time.
printSensorInfoInDisplay(data.temp, data.hum);
printLoraSentInDisplay(freq);
}
}
// Next TX is scheduled after TX_COMPLETE event.
}
注:ノードがバックパッケージの受信を防ぐエラーが発生したため、サーバーの前でデバイスを認証することは不可能でした。それは顧客セットアップ()に追加されました(より具体的にはlorawan_startjob() lorawan.cppファイルの関数に)次のコード行を10%10%増加させる次のコード行。
LMIC_setClockError(MAX_CLOCK_ERROR * 10 / 100);
ChirpstackとThings Networkの両方が、サーバーが受け取るデータを他のサービスに送信するための一連の統合を提供します。たとえば、データを影響データベースに送信したり、MQTTを使用したり、AWSサービスまたはAzureに接続したりできます。
このセクションでは、 HTTP (Things NetworkのWebhooks)とMQTTの統合を使用して、デバイスが送信するデータを送信し、サーバーが独自のアプリケーションに受信できる実用的なケースを見ます。
統合にアクセスするには:
Chirpstackを使用している場合、私たちは興味があります
どちらのサーバーでも、この統合は同様の方法で機能します。アプリケーションデバイスが情報を送信するたびにイベントを起動します(TTNの場合、アップリンクメッセージボックスをマークする必要があります)。この情報を使用して、ポストタイプのHTTPリクエストのPOSTがURLに起動されます。
注:イベントが正しく起動されていることを確認するか、データ形式を視覚化することを確認するために、ポストビンサービスにアクセスして、ビン(リクエストを受信するための一時URL)を作成できます。
注2:請願書を起動するアプリケーションがLocalHostとChirpstackサーバーに(このドキュメントに示されているようにドーカー化された方法で)に収容されている場合は、次のようにURLを示す必要があります。
http://host.docker.internal:PUERTO/uri
このドキュメントは、Chirpstackの使用のみをカバーしており、TTNはデータを送信するために文書化されていません(請願書には異なる形式があります)。
このリポジトリ(フォルダーDecoders-Integrations )の例でデータがデコードされている場合、次のようなリクエストでボディを取得します。
{
"applicationID": 0,
"applicationName": "Name",
"deviceName": "DeviceName",
"devEUI": "BYTES_EUI",
"txInfo": [Object object],
"adr": true,
"dr": 5,
"fCnt": 24,
"fPort": 1,
"data": "DATA_WITHOUT_DECODE",
"objectJSON": {
"data":"DATA_WITHOUT_DECODE==",
"decodedData":{
"humidity":37,"temperature":23
},
"message":"Informacion recibida del nodo"
},
"tags": [Object object],
"confirmedUplink": false,
"devAddr": "BYTES_DEV_ADDR"
}
ObjectJsonは、デコーダー関数によって返されるオブジェクトです。
たとえば、JavaScriptアプリケーションでは、次のようなことを行うのに十分です(ファイル/Decoders-Integrations/arduino_Chirpstack_Http_Integration.jsで詳細)
const { deviceName, objectJSON, devAddr} = req.body;
var sensorData = JSON.parse(objectJSON);
//devAddr esta codificado!
var temperature = sensorData.decodedData.temperature;
var humidity = sensorData.decodedData.humidity;
実際、MQTTS(TLSでMQTT)を使用しない限り、サーバーWebアプリケーションからの統合にアクセスする必要はありません。
この例では、最終的なデバイスがデータを送信するトピックにアプリケーションに署名します。
アプリケーションが自宅とChirpstackサーバーで起動された場合(このドキュメントで示したようにDockerized)、ブローカーホストはWSLマシンのIPになります。このデータを知るために、私たちは起動します:
wsl hostname -I
また、次のコマンドを起動することでいくつかの構成を作成する必要があります(1883は、別の変更が使用されている場合は蚊の港です):
netsh interface portproxy add v4tov4 listenport=1883 listenaddress=0.0.0.0 connectport=1883 connectaddress=127.0.0.1
MQTTは、Dockerの例に掲載されているため、 TRU値を持つ匿名パラメーター(ユーザーのリストやリストを使用せずに)を使用するか、それぞれのパスワードを使用してユーザーのリスト(読み書きができるトピックを持つトピックを持つ)を構成することができます(以下のドキュメントで示されています)。
これを行うために、次のコマンドを起動します( WSLからそれらを起動できます)。各コマンドは、各ユーザーのパスワードを導入するように依頼します(この例では、すべてのパスが使用されています)。
# Create a password file, with users chirpstack_gw, chirpstack_ns, chirpstack_as, bob and nodeApp
sudo mosquitto_passwd -c /etc/mosquitto/passwd chirpstack_gw
sudo mosquitto_passwd /etc/mosquitto/passwd chirpstack_ns
sudo mosquitto_passwd /etc/mosquitto/passwd chirpstack_as
sudo mosquitto_passwd /etc/mosquitto/passwd bob
sudo mosquitto_passwd /etc/mosquitto/passwd nodeApp
# Optional, Secure the password file
sudo chmod 600 /etc/mosquitto/passwd
これにより、すべてのユーザーとパスワードを含むpasswdファイルが作成されます。次のような同名ファイルでACLSリストを構成できるようになりました。
user chirpstack_gw
topic write gateway/+/event/+
topic read gateway/+/command/+
user chirpstackns
topic read gateway/+/event/+
topic write gateway/+/command/+
user chirpstack_as
topic write application/+/device/+/event/+
topic read application/+/device/+/command/+
user bob
topic read application/123/device/+/event/+
topic write application/123/device/+/command/+
user nodeApp
topic read application/+/device/#
topic write application/+/device/#
これで、 /chirpstack-docker/configurationに掲載されたファイルを変更して、これらの資格情報を使用するようにサーバー構成を変更する必要があります。
[application_server.integration.mqtt]
server="tcp://mosquitto:1883"
username="chirpstack_as"
password="pass"
[integration.mqtt.auth.generic]
servers=["tcp://mosquitto:1883"]
username="chirpstack_gw"
password="pass"
[network_server.gateway.backend.mqtt]
server="tcp://mosquitto:1883"
username="chirpstack_ns"
password="pass"
listener 1883
password_file /mosquitto/config/passwd
acl_file /mosquitto/config/acls
allow_anonymous false
mosquitto:
image: eclipse-mosquitto:2
ports:
- 1883:1883
volumes:
- ./configuration/eclipse-mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf
- ./configuration/eclipse-mosquitto/passwd:/mosquitto/config/passwd
- ./configuration/eclipse-mosquitto/acls:/mosquitto/config/acls
この例では、nodejsアプリケーションを使用して、ローカルChirpstackローカルサーバーに接続します。すべてのコードは、 /Decoders-Integrations/arduino_Chirpstack_mqtt_Integration.js arduino_chirpstack_mqtt_integration.jsファイルにあります。
まず、MQTTパッケージをインストールする必要があります
npm install mqtt --save
彼と一緒に、私たちはすでにブローカーに接続することができます:
var mqtt = require('mqtt')
const host = 'WSL_IP'
const port = '1883' //or your port
const clientId = 'mqtt_NodeApp_' + Math.random().toString(16).slice(3)
const connectUrl = 'mqtt://' + host + ':' + port;
const client = mqtt.connect(connectUrl, {
clientId,
clean: true,
//username: "nodeApp", //Descomentar si usamos contraseñas y acls
//password: "pass", //Colocar el usuario y contraseña correspondiente
connectTimeout: 4000,
reconnectPeriod: 1000,
debug: true
})
目的のトピックを購読します( #文字はマルチレベルのワイルドカードであり、任意のサブトピアを読むことを意味しますが、キャラクター+は単一レベルのワイルドカードです)。
const chirpstackApplicationID = 1; //Check url, for example: http://localhost:8080/#/organizations/1/applications. /1/ is the ID
const chirpstackDeviceID = "DEV_EUI";
const chirpstackReadAppTopic = "application/" + chirpstackApplicationID + "/device/#";
const chirpstackWriteAppTopic = "application/" + chirpstackApplicationID + "/device/"+chirpstackDeviceID+"/EXAMPLE";
これには、次のイベントを使用します。
//Evento al conectarse
client.on('connect', function () {
console.log("Connected")
client.subscribe(chirpstackReadAppTopic, function (err) {
if (!err) {
console.log("Subscribed to topic: "+chirpstackReadAppTopic)
//client.publish(chirpstackWriteAppTopic, 'Hello mqtt') //Podemso enviar un mensaje para debugear
}
else {
console.log("Error in connection:")
console.log(err)
}
})
})
//Evento al recibir un mensaje
client.on('message', function (topic, message) {
// El mensaje es un buffer, convertimos a String.
var stringMsg = message.toString();
console.log(topic + " - " + stringMsg)
insertSensorEntry_Mqtt(topic, stringMsg); //Funcion que lee el mensaje e inserta en base de datos
})
両方のサーバー(ChirpstackとThings Network)で、統合はMQTTと呼ばれます。はい、統合を行う前に、証明書を構成する必要があります。
A continuación se documentará como realizar la integración con MQTT en un servidor local de Chirpstack (para más info revisar el apartado ChirpStack privado en local de esta documentación).
Antes de generar los certificados, debemos tener instalado CFSSL & CFSSLJSON. Tras ello, clonaremos el siguiente repositorio propiedad del creador de Chirpstack y seguiremos los pasos de su documentación: Chirpstack-Certificates.
NOTA: Si se usa Windows, instalar los pre-requisitos en la máquina WSL pues se necesitará hacer uso del comando make .
Colocamos la carpeta certs generada con el proyecto Chirpstack-Certificates en nuestro proyecto Chirpstack-Docker . Después modificados el archivo docker-compose.yml para añadir a cada contenedor el volumen que contendrá los certificados correspondientes.
Seguimos siguiendo la documentación del proyecto Chirpstack-Certificates para realizar todas las modificaciones pertinentes en la configuración del servidor:
Como hemos visto anteriormente, el evento que se lanza al recibir un mensaje llama a una función que lee el mensaje recibido y lo descodifica.
El formato del mensaje recibido (si hemos usado los descodificadores del ejemplo) es una cadena de texto con el siguiente contenido:
{"applicationID":"1","applicationName":"APP_NAME","deviceName":"DEV_NAME","devEUI":"DEV_ADDRESS", "txInfo":{"frequency":868500000,"dr":5},"adr":true,"fCnt":2, "fPort":1,"data":"DATA","object":{"data":"DATA","decodedData":{"humidity":0,"temperature":-327},"message":"Informacion recibida del nodo"}}
Y es lo que buscamos leer en la siguiente función:
function insertSensorEntry_Mqtt(topic, msg){
console.log("INSERTAMOS DATO DE SENSOR RECIBIDO POR MQTT EN TOPICO: "+topic);
const parseMsg = JSON.parse(msg); //Recordar haber hecho un ToString al buffer antes!
var deviceName = parseMsg.deviceName;
var devAddr = parseMsg.devEUI; //No codificado
var temperature = parseMsg.object.decodedData.temperature;
var humidity = parseMsg.object.decodedData.humidity;
var success = true;
}
object es el objeto retornado por nuestra función Decoder .
Como bien se sabe, la tasa de transferencia de LoRA es muy baja, lo que provoca una gran perdida de paquetes y una enorme latencia cuando se envía información:
Algunos expertos indican que es necesario cierta distancia entre los dispositivos (30m y preferiblemente algún obstaculo entre ellos) para que la comunicación sea más fluida. No ha sido probado y solo se ha lanzado con las dos tarjetas en un extremo cada una de un piso.
Por otro lado se hace uso de versiones antiguas de LoRaWAN (1.0.2 y 1.0.3) que tienen problemas de seguridad que se solventan en parte en las siguientes versiones (1.0.4 y 1.1.0, esta última también implementa re-conectividad en caso de desconectarse de la red LoRaWAN), pero no se dispone de librerias para trabajar con ellas.
Esto no quita que esta técnología pueda ser muy interesante y útil en el futuro debido a no depender de proveedores externos (de comunicaciones y electricidad), siendo una opción ecónomica y muy llamativa para utilizar en proyectos IoT de grandes ciudades o entornos rurales.
Este proyecto ha sido realizado para la Fundación CTIC, su uso es libre y no es necesarío ningún crédito en su uso (Revisar las licencia de las librerias utilizadas).