最後に、デバイスからACK要求付きの上りデータ送信を試してみます。
ACK要求付きデータ送信
送ってはみたものの…
まずはおさらいということで、ACK要求なしの上りデータ送信を行ってみます。
> lorawan tx ucnf 1 01
>> Ok
>> tx_ok
アプリケーションサーバにも想定通りのデータが届いていることが確認できました(詳細略)。引き続き、ACK確認付きで送信してみます。
> lorawan tx cnf 1 01
>> Ok
>> tx_ok
あれ?
てっきりアプリケーションサーバからACKを返す必要があるのだと思っていたのですが、実際にはACK要求なしの場合と同じ動作をしています。もちろんアプリケーションサーバには正常にデータが届いていて、
lora/<useryname>/<devEUI>/rx {"gw":[{"date":"2018-04-28T01:34:28.243316Z","rssi":-43,"snr":7.8,"gwid":"<gwid>"}],"mod":{"fq":927.8,"cnt":26,"data":"01","mt":"cnf","devEUI":"<devEUI>","dr":"2","port":1}}
"mt":"cnf"
となっていて、正常にACK要求付きで送信されていることが確認できます。なぜ??
調べてみる
まだまだLoRaWANの資料というのは少なく、ちょっとググってみてもなかなか情報が見つかりません。正規の規格書Core LoRaWAN™ Specificationを読んでみてやっと動作が理解できました。
抜粋すると
4.3.1.2 Message acknowledge bit and acknowledgement procedure (ACK in FCtrl)
When receiving a confirmed data message, the receiver SHALL respond with a data frame that has the acknowledgment bit (ACK) set. If the sender is an end-device, the network will try to send the acknowledgement using one of the receive windows opened by the end-device after the send operation.
```
拙訳ですが、
confirmedな(訳注 ACK確認要求付きの)データメッセージを受信したとき、受信側は確認ビット(ACK)をセットしたデータフレームを返送しなければならない。送信側がエンドデバイスのとき、ネットワーク側(訳注 ゲートウェイのことですね)は送信側の送信動作に引き続いて行われる(訳注 2つの)受信ウィンドウのいずれか1つを使ってACKを送信しようとする。
と規定されていました。つまり、私が誤解していたのは
- 誤:アプリケーションサーバがACKを返す
- 正;ゲートウェイがACKを返す
こういうことであって、アプリケーションが知らないところで自動的にACKが返されているというわけです。ですから、ACK確認があろうが無かろうが見かけ上は全く同じ動作になるのが当たり前、ということになります。
改めて、ACK確認付きメッセージを送ってみる
ACKはゲートウェイが自動的に返すわけですから、裏を返すとデバイスがゲートウェイに接続できない場合にはACKが返ってこないということになります。というわけで、ゲートウェイの電源をOFFにしてから試してみましょう。まずはACK確認なしの場合です。
> lorawan tx ucnf 1 01
>> Ok
>> tx_ok
無事(?)送信が成功しました。もちろんアプリケーションサーバには全くデータが届きません。一方、ACK確認付きの場合は
> lorawan tx cnf 1 01
>> Ok
>> err
今度は正常に(?)送信エラーになりました。なるほど、デバイスからのACK確認付き送信というのは、ゲートウェイにデータが届いたかどうかを確認するためのものだったのですね。
まとめ
- デバイスからACK確認付きデータを送ると、ゲートウェイまでデータが届いたかどうかを確認することができます
- アプリケーションサーバにデータが届いたか、ではありません
- ACK確認なしで送信すると、ゲートウェイが死んでいたり圏外だったりした場合でも送信が成功してしまいます
これでひととおりの動作確認が完了しました。実際には今回紹介したような低水準の操作をユーザーが行うことはあまり無く、何かしらのライブラリを使うことになると思います。とはいえ、こうしてひとつひとつ動作を追うのも楽しいものです。