iOSでMQTT通信を使う ‘24.7月編

IoT用通信で利用されるMQTTですが、 iOS で適用する案件があり対応したので要点の覚え書きです。MQTT Broker が何なのかは知らされておりませんが、汎用的なものだと思います。

AWSでは各プロットフォーム毎にライブラリが提供されていました。汎用タイプのMQTTとなると使えるのは以下の2とおりでした。Get/Post methodのように、各プラットフォームで公式APIは未だ無いみたいです。いづれもOpenソースなので信頼性は要注意です。

ライブラリプラットフォーム公開URLMQTTバージョン備考
MQTTnetXamarin / Visual Studiohttps://github.com/dotnet/MQTTnet3.1.0、3.1.1、5.0指定可。.NetSockectがコアのためiOSでも動作する。
Xamarin.MQTTXamarin / Visual Studiohttps://github.com/xamarin/mqtt指定不可。開発止まっている。MQTTnetを簡易callしたもので利用価値低い。
CocoaMQTTSwift / Xcodehttps://github.com/emqx/CocoaMQTT3.1.1、5.0指定可。
iOS, macOS, tvOS native ObjectiveC MQTT Client FrameworkSwift / Xcodehttps://github.com/novastone-media/MQTT-Client-Framework最終更新日が4年前

上記から現用と思われる2つを確認してみました。

最新 4.3.4.1xxx はConnectで落ちました。ここ一か月間で頻繁にコード更新がかかっています。怪しい。一つ前のリビジョンで一年前くらい 4.2.0.706 をchoiceし通過しました。.net 的なネーミングですが、Microsoftが管理しているわけでもなんでもないようです。

NuGetで「最新安定版」と記載されていても、だれも安定しているか確認していないのかもしれません。

尚、各クラスとmethod/propertyの使い方説明はなく、サンプルコード を見て理解してといった感じです。

iPadOS16互換で、Xode 14.2互換でXcode 15.1です。こちらも最新は落ちました。Gitでバージョン切替えながら試すと、2.1.7 で落ち着きました。


BSD Socket は、CocoaAsyncSocket MqttCocoaAsyncSocket の2つがあり指定できるのですが、後者でないと動きませんでした。下位ライブラリは、MqttCocoaAsyncSocket 1.0.8、Starscrem 4.0.4 でした。

こちらも各クラスとmethod/propertyの使い方説明はなく、Example をみる感じです。今回は他ライブラリが Swift でないとダメでしたので、CocoaMQTT を適用しました。MQTTnet より以下の機能メリットがみられました。

  • サーバ自動接続モードあり。再接続インターバルの指定などもできる。ただ永遠ではない。
  • デバッグモードあり。有効にすると Xcode コンソール に、JSON送信データなどがプリントされる。
  • MQTTnet では未トライですが、SSLモードもすんなりOK。

すこしコードを紹介すると、

ただし接続できたかは、ステータスを監視する必要があります。送信時は、

iOSからMQTTを使用した結果、以下の課題がありそうです。

  • 端末起動直後、インターネットネットにつながっていない期間があるため、MQTT接続のリトライが必要です。 ラズパイ等の場合、shで自由にUNIXコマンドで監視管理できますが、iOS下では自由度がありません。iOSのインターネット接続状態の取得API NWPathMonitor も確実性がないようてす。

またMQTT全般的にいえることですが、

  • サーバに Publish が未到達でも端末側では分からない。そもそも MQTT は高信頼性を目指したものではないのですが、実際に発生するとエンドユーザは怒ります。信頼性仕様の協議と取交わしが必要でしょう。再送やユーザに通知したい場合、サーバ側のカレントデータを読みだしてベリファイするインターフェイスを追加するとが必要だと思います(サーバ側の協力があれば)。もしくは最初からHTTPや独自protocolにしとく。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です