LoRaWAN
LoRaWAN のドライバーの手引き。内蔵の Basics Station のネットワークサーバー、ゲートウェイの証明書、センサーとコンセントレーターの登録、そしてペイロードのアドレス指定。
LoRaWAN のドライバーは、Ganter Lab を小さな LoRaWAN のネットワークサーバーにします。ほとんどのドライバーとは関係の向きが逆です。ステーションのほうからセンサーに手を伸ばすのではなく、ゲートウェイのほうが Ganter Lab につなぎ、センサーはそのゲートウェイを通じてアップリンクとして読み取りを届けます。Ganter Lab は Semtech の LoRa Basics Station のプロトコルを話すネットワークサーバーを内蔵しているので、Basics Station のファームウェアで動くゲートウェイなら、このステーションを自分の LNS として使えます。
内蔵のサーバーは、アプリの起動時ではなく、有効な LoRaWAN の機器の 1 つ目が動いている connector に読み込まれたときに始まり、最後の 1 つが削除されるか無効になったときに止まります。センサーもコンセントレーターも設定されていなければ、そのポートで待ち受けるものは何もありません。1 つ追加すれば、アプリケーションを再起動せずに戻ってきます。
このドライバーの下の機器はそれぞれ、パネルで選ぶ2 つの登録のどちらかです。
- センサー。自分の DevEUI で見分けられ、アプリケーションキーで受け入れられます。そのタグが、アップリンクのペイロードを読み解きます。
- 無線コンセントレーター(ゲートウェイ)。自分の基地局の EUI で見分けられ、一覧から選んだ無線の地域に登録されます。自分のタグは持ちません。
センサーだけでなく、コンセントレーターも登録してください。Basics Station のコンセントレーターは、つないだらすぐ自分の無線の構成を求め、答えをもらうまで何も中継しません。ですから、その基地局の EUI を一度も見たことのないステーションは、接続そのものは健全に見えるのに、その向こうのセンサーをすべて値なしのまま置き去りにします。答えは、選んだ地域からここで組み立てられます。貼り付ける設定の文はありません。
ネットワークサーバーとポート
| 項目 | 値 |
|---|---|
| プロトコル | LoRa Basics Station(WebSocket、JSON) |
| 待ち受け | すべてのインターフェース、TCP のポート 5001、TLS のみ |
| ゲートウェイのアドレス | wss://<station-address>:5001 |
| 探索のエンドポイント | Basics Station の router-info の要求も、同じ待ち受けで受けます |
| データの接続 | WebSocket のパスの最後の部分にあるゲートウェイの基地局の EUI で宛先が決まります |
待ち受けは必ず TLS です。暗号化を切る設定はありません。平文の HTTP の待ち受けは、loopback 以外では拒否されます。loopback はプラントネットワークからは届かず、プロセス内の試験のためだけにあります。
証明書
受け入れは相互の TLS で行います。サーバーは自分の証明書で自分が誰かを示し、ゲートウェイもそれぞれクライアントの証明書で自分が誰かを示さなければなりません。
サーバー証明書。最初の起動で自動的に作られ、アプリのデータフォルダーの ua\pki\own\private の下に保存されます。
GanterLabOPCUAServer-with-san.pfx:秘密鍵です。無作為のパスワードで暗号化され、そのパスワード自身が Windows のユーザーごとに保護されている(DPAPI)ので、ほかの場所にコピーしたこの 2 つの組は誰にも開けません。GanterLabOPCUAServer-with-san.pem:公開の証明書です。このステーションを信頼させるためにゲートウェイへ入れるのは、このファイルです。
この証明書は自己署名で、期限が切れません。公開のほうを各コンセントレーターに一度、手で入れる仕組みなので、期限の切れる証明書は、その記念日にセンサーのネットワークを丸ごと止めてしまいます。拒否されるのはコンセントレーターの側で、このステーションからは何も見えず、戻すにはコンセントレーターを 1 台ずつ訪ねることになります。期限の警告も更新のコマンドもありません。更新するものがないからです。ドライバーのページは、証明書が持つ日付を表示として見せます。
書き直されるのは 2 つの場合だけで、どちらも診断ログにそう残ります。
- 保存されたファイルをもう開けない。たとえば、別の Windows アカウントで書かれた場合です。
- このアプリケーションの前の版が発行したもので、当時は 12 か月を与えていた場合です。
どちらの場合も、ドライバーのページが 1 度だけ、すべてのコンセントレーターに新しい GanterLabOPCUAServer-with-san.pem を渡す必要があると述べます。渡すまで、それらは接続できません。
ゲートウェイのクライアント証明書。ゲートウェイは TLS の握手のときにクライアントの証明書を差し出さなければなりません。それのない握手は、データが 1 つも流れる前に落とされます。証明書には次のことが要ります。
- この Windows の機械の上で正しい連鎖を組み立てられること(信頼されていないルートのような連鎖のエラーは接続を拒否し、どの検査に落ちたかを診断ログが記録します)。
- その主体の一般名か、DNS のサブジェクト代替名に、そのゲートウェイの基地局の EUI を載せていること。識別子は値として読まれるので、
AABBCCDDEEFF0011、AA-BB-CC-DD-EE-FF-00-11、AA:BB:CC:DD:EE:FF:00:11はどれも同じ基地局を指します。 - データの接続が名乗るのと同じ基地局を名指ししていること。接続のアドレスにあるものと違うゲートウェイを名乗る証明書は拒否されます。
接続の項目
LoRaWAN の機器は、自分のホストもポートも持ちません。センサーには、その無線の通信を運ぶコンセントレーターを通じて届きますし、コンセントレーターのほうがこのステーションに届きます。パネルは、まず登録の選択を見せ、その次に、その登録が必要とする項目を見せます。
| 項目 | 意味 | 形式 | 既定 |
|---|---|---|---|
| 登録名 | この機器が 2 つの登録のどちらであるか。センサーか無線コンセントレーターです。切り替えると下の項目が消えます。アプリケーションキーと地域は同じものではないからです。 | センサー/無線コンセントレーター | センサー |
| センサーの DevEUI | そのセンサーの DevEUI で、参加の要求で名乗る識別です。 | 16 進数 16 桁。区切りなし(8899AABBCCDDEEFF)、ダッシュ入り(88-99-AA-BB-CC-DD-EE-FF)、コロン入りのどれでも。 |
空 |
| アプリケーションキー(センサー) | そのセンサーの OTAA のアプリケーションキー(AppKey)です。参加を認証し、セッションの鍵を導きます。 | 区切りのない 16 進数ちょうど 32 桁。 | 空 |
| 基地局の EUI(コンセントレーター) | そのコンセントレーターの基地局の EUI で、クライアントの証明書が載せていなければならない識別子であり、接続のアドレスに置く識別子でもあります。 | 16 進数 16 桁。上のどの書き方でも。 | 空 |
| 無線の地域(コンセントレーター) | そのコンセントレーターが立っている場所。接続のときにこのステーションが渡すチャネル、データレート、受信の窓を決めます。一覧から選ぶもので、自由記述はありません。 | ヨーロッパ 868 MHz、アメリカ合衆国 915 MHz、オーストラリア 915 MHz、アジア 923 MHz、中国 470 MHz(改訂 1)、中国 470 MHz(改訂 2) | ヨーロッパ 868 MHz |
| 送信がないまま許す最長時間(センサー) | このセンサーが黙っていてよい秒数で、これを過ぎると、保存された値は読み取りとして数えられなくなります。0 なら期限切れを切ります。下を参照してください。 | 0 以上 | 3600 |
識別子を空のままにすると、機器の名前を整えたものに戻りますが、それが正しい EUI であることはまずないので、入力してください。
アプリケーションキーは秘密であり、ステーションもそのように扱います。パネルはそれを点で隠し、入力した内容を確かめるあいだだけ見せる パスワードを表示 のチェックボックスを添えます。設定のデータベースは、入力した Windows アカウントのもとで保護して保存します。そして診断ログにも、ドライバーが読むアドレスにも現れません。そのアドレスは DevEUI だけを運びます。別の Windows アカウントで同じ設定を開くと、この鍵は一緒には開きません。欄は空で戻り、「この Windows アカウントでは読み取れません。入力したコンピューターと Windows アカウントでしか開けないためです。ここでもう一度入力してください。」と伝え、キーをもう一度入力するまでセンサーは参加しなくなります。バックアップで持ち出した設定はキーを保ちます。バックアップは、あなたが与えたパスワードで封をされているからです。
参加は OTAA だけです。センサーはコンセントレーターを通じて無線で参加し、ネットワークサーバーは設定した AppKey でそれに答えます。どの機器も持っていない DevEUI からの参加の要求は拒否され、診断ログに残ります。個体設定による有効化(ABP、あらかじめ用意したセッションの鍵)には対応していません。
機器を無効にするか削除すると、再起動を待たずにその場でネットワークサーバーから外れます。鍵が登録から消え、どのコンセントレーターが保持していたセッションも解放され、次の参加は拒否されます。サーバーが受け入れない登録、つまり打ち間違えた DevEUI、アプリケーションキー、基地局の EUI、地域があると、その機器は接続していないものとして読まれ、診断ログが拒否した項目を名指しします。
コンセントレーターに送られるもの
登録済みのコンセントレーターが版の握手を終えると、このステーションはその地域の無線の構成で答えます。周波数の範囲、データレートと、そのうちどれがダウンリンク専用か、そしてその地域の既定のチャネルの計画です。基地局の EUI がここに登録されていなければ何も送られず、どの基地局が尋ねてきたのか、それが登録されていないことを診断ログが述べます。コンセントレーターがつないでいるのに、その向こうのセンサーが 1 つも値を伝えないときに探すのは、その記録です。
読み出し周期の項目はありません。LoRaWAN は押し出し型です。いつアップリンクするかはセンサーが決め、サーバーは機器ごとにいちばん新しい読み解いたペイロードを保ち、タグの値は 1 秒の決まった周期でそのキャッシュから更新されます。
ですから、まだアップリンクしていないセンサーには、失敗した読み取りではなく、読み取りがありません。そのタグは空のままで、機器はオフラインになるのではなく、まだ何も観測していないと伝え、失敗は診断ログに残りません。最初のアップリンクを待つのは、プロトコルが働いている姿です。センサーが実際に送ったペイロードの中で何にも解決しないアドレスは別の話で、そのとおり読み取りの失敗として伝えられます。
センサーが黙ったとき
センサーを読みにいくものが何もないので、最後に送られたペイロードは、次のものが来るまでそのキャッシュに残ります。放っておくと、電池の切れたセンサーは、ステーションが動いているかぎり同じ数値を良好な読み取りとして出し続け、真ではなくなった値でグラフ、履歴、警報を養うことになります。
ですから、センサーはそれぞれ自分のパネルに、秒で表した送信がないまま許す最長時間を持っています。既定は 3600 秒、つまり 1 時間で、よくあるセンサーの 10 分から 30 分の周期を余裕をもって覆います。もっとまれにしか伝えないセンサーは、自分の値を上げてください。その期限を過ぎると、次のようになります。
- そのタグは値を運ぶのをやめ、最後のアップリンクを繰り返す代わりに品質の悪い状態を出します。
- 機器のパネルが、そのセンサーが最後に送信した時刻を述べるので、どれくらい黙っているかが分かります。
この項目を 0 にすると、そのセンサーの期限切れを切ります。最後のアップリンクが、いつまでも良好として読まれ続けます。ほかは何も変わりませんし、保存されたペイロードが捨てられることもありません。
タグのアドレス指定
LoRaWAN のタグは、読み解いたアップリンクのペイロードの中のバイトをアドレスに取ります。自由記述のアドレスはありません。「取得元」のカードは、Cayenne LPP のチャネルと型で指定するのチェックで切り替わる 2 つの方式で、型付きの項目を出します。
| 項目 | 意味 | 受け付ける値 | 既定 |
|---|---|---|---|
| Cayenne LPP のチャネルと型で指定する | オフのとき、チャネルの項目はただのバイトのオフセットです。オンのとき、ペイロードから Cayenne LPP のチャネルと型の組を探します。 | オン/オフ | オフ |
| チャネル / ペイロードのオフセット | オフセットの方式では、値が始まる 0 起算のバイトのオフセット。LPP の方式では、探す LPP のチャネル番号。 | 0 以上 | 0 |
| LPP の型コード | LPP の方式でだけ使います。チャネルのバイトに続く Cayenne LPP のデータ型のバイトです(たとえば温度なら 103)。値のバイトは、一致したチャネルと型の組のすぐ後ろから読み、いくつものペイロードが一致するときは、いちばん新しいものが勝ちます。 | 0 以上 | 0 |
| 読み取り長(バイト、空欄なら自動) | 値を作るペイロードのバイト数。空欄ならデータ型から決めます。Boolean と Byte は 1、Int16 は 2、Int32 と Float は 4、String は 16 です。 | 1 以上、または空欄 | 空欄 |
| ビットマスク(16 進数。空欄ならなし) | ほかの何よりも先に、生のバイトに AND で当てる 16 進数のマスクです(たとえば状態のビットを落とす 0x0FFF)。0x の接頭辞は任意で、桁数が奇数のマスクは左に 0 を足します。マスクは読み取り長とちょうど同じバイト数を覆わなければならず、そうでなければ読み取りがエラーになります。 |
16 進数の文字列か空欄 | 空欄 |
| 上位バイトを先に | そのペイロードが値をビッグエンディアンで運ぶと宣言します。読んだバイトは、変換の前に並びを逆にします。ここにワードの順の項目はありません。長さの決まっていないペイロードには、入れ替える 16 ビットのワードがないからです。 | オン/オフ | オフ |
| 係数(空欄ならなし) | ネットワークサーバーが読み解いた直後、値がタグ自身の変換経路に入る前に当てる、バス側の係数です。数値の型にだけ効きます。入力したその場で 0 は拒否されます(「係数が 0 だと、すべての読み値が 0 になります。」)。そのタグのすべての読み取りを、良好な品質のまま 0 として伝えてしまうからです。 | 0 以外の任意の数、または空欄 | 空欄 |
読み取りのときの処理の順序は、アドレスの示すバイトを取る → ビットマスクを当てる → 上位バイトを先にがオンなら並びを逆にする → タグのデータ型に変換する → 係数を当てる(数値の型)、です。
11 バイトのペイロードのオフセット 2 に、ビッグエンディアンの Int16 の温度を運ぶセンサーの例です。
- オフセットの方式:チャネル / オフセットは
2、読み取り長は2、上位バイトを先にはオン。 - LPP の方式で、同じセンサーがチャネル 1、型 103 で Cayenne LPP を話す場合:LPP のチェックを入れ、チャネルは
1、型コードは103、読み取り長は2。
対応するデータ型
| 型 | 読むバイト数(自動) | バイトの読み解き方 |
|---|---|---|
| Boolean | 1 | 0 は false、それ以外は true |
| Byte | 1 | 符号なしのバイト |
| Int16 | 2 | 符号付きの 16 ビット整数 |
| Int32 | 4 | 符号付きの 32 ビット整数 |
| Float | 4 | IEEE 754 の単精度 |
| String | 16 | 読み取り長の分の UTF-8 の文字列 |
書き込みと機器検出
LoRaWAN のタグは読み取り専用です。値はセンサーのアップリンクからしか来ませんし、アクセスの項目に書き込める選択肢はなく、ランタイムは成功を装うのではなく書き込みを拒否します。ダウンリンクは、ネットワークの通信としてはプロトコルの中に存在しますが(参加の受理、MAC のコマンド)、タグの値の書き込みとしては存在しません。
このドライバーに機器検出のスキャンはありません。コンセントレーターは基地局の EUI と地域で、センサーはそれぞれ DevEUI と AppKey で、手で追加してください。機器を追加する全体の流れは Connector のページにあります。