wioLTEを使うときに困った
wioLTEとsoracomのsimをつかってものづくりをしていたときに困ったことがありました。
simを使って通信すれば、長期間、通信がつづくと考えていましたが、実際はある一定時間が経つと、通信できない状態(無通信状態)になることがありました(soracomのコンソール画面上でいうとsimがオフラインになります)。
IoTのような長期間動作し続けてくれるシステムが望ましいときに、無通信状態になると困ります。
参考にですが、そのときに実現しようとしていたことは、下記の図の通りでwioLTEに一定時間ごとにデータを取得しにいくというものです。
解決方法
よくよく調べてみると、soracomのF&Qに下記のようなF&Qがみつかりました。
[無通信の状態が続くと通信が切れるのはなぜですか?]
(https://soracom.zendesk.com/hc/ja/articles/235781348-%E7%84%A1%E9%80%9A%E4%BF%A1%E3%81%AE%E7%8A%B6%E6%85%8B%E3%81%8C%E7%B6%9A%E3%81%8F%E3%81%A8%E9%80%9A%E4%BF%A1%E3%81%8C%E5%88%87%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B-)
そして、このような記載がありました。
通信を長時間維持する必要がある場合、デバイスからお客様のサーバ宛に定期的にkeep-aliveメッセージを送るなどして無通信の状態が長く続かないようにしてください。
前述したシステムでは、soracom上のサービスを使用せずに、MQTTでデータをやりとりしていました。
なので急場しのぎ、一定時間ごとにSORACOM Harvestにデータを送信する処理をwioLTEに書き加えました。
その処理の作成には下記が参考になりました。こちらにはsoracom harvestに使用するための設定方法も記載されています。
【作業】1-2: デバイス稼働時間を SORACOM Harvest で可視化
Arduino IDE上のサンプルプログラムでいうと「soracom-unified」を使用します。
サンプルコードでは、センサを使用して温湿度データを送信するプログラムとなっていますが、必要な部分だけ抜き出し手を入れて利用しました。具体的には44~109行目です。
送信するデータは、経過時間でも、一定の数値(例えば数値の1)でも何でも大丈夫です。
とにかく、「soracomのsimをつかっているよ!」というようなkeep-aliveメッセージを一定間隔で送信できれば良いです。
そうしたところ、wioLTEに電源が入っている間は長時間つづけて通信することに成功しました。
下記のグラフは、wioLTEから電源をいれてからの経過時間を送信しています。なので、右肩上がりのグラフになっています。急に0に下がっている部分は、電源を外し通信を止めたためです。
まとめや理解できていないこと
休場しのぎの対応のため、他に良い方法がありそうです。
今回はsoracomのsimを利用したため、上記のような対処で上手くいきました。
同時に、LINEモバイルといった他のsimでも通信させてみました。
しかしkeep-aliveメッセージを利用しないと、ある一定時間経過ののち無通信状態に入ってしまいます。こちらのsimでは対処方法がわかりませんでした。
simをつかった長時間通信が必要なシステムには、再接続処理といった通信周りのエラーハンドリングをきっちりと実現する必要があることを痛感しました。