ICOMのBLEペアリングの仕様を解析
IC-705 用のリモコンアプリ、705 Remote の開発をしていますが、ちょいちょい「iOS 版はありますか?」というお問い合わせを世界各国から頂いていました。
IC-705 と Bluetooth で通信する場合、Android は SPP というプロトコルで通信しており、この場合 ICOM が公開している CI-V コマンドの仕様書だけでアプリの開発が出来ます。 しかし、iOS では SPP で通信するためにはデバイスが MFi の認証を受けている必要があり、Android と同じ方法は使えないため iOS 版の開発は断念していました。
もう一つ、iOS で 通信する方法として Bluetooth LE (以下、BLE) を使った通信方法があります。 ICOM から iOS 向けに RS-MS1I という、D-STAR 用のアプリが公開されており、このアプリも BLE で通信しています。
BLE の通信仕様が公開されていれば、私も iOS 版 705 Remote が開発できるのですが、残念ながら仕様が公開されていません。 そこで、ICOMに「 BLE の通信仕様を公開してほしい」とお願いしたところ、
会社の方針として、BLE の仕様は公開していない
と回答を頂きました…残念!
よろしい、ならば戦争だ
しかし、度重なる iOS 版の要望があったことと、iOS 開発の勉強がしたくなったので 705 Remote for iOS の開発を目標に、本気出して通信仕様を解析してみました。
通信仕様を推測する
と言うわけで、ICOM 純正アプリの RS-MS1I を元に通信仕様を推測します。
まず、設定画面に CI-V アドレスの設定があることから、機器制御コマンドは通常のCI-Vコマンドが流れていると考えられます。 次に、BLE スキャナーでアドバタイズしている情報を確認するとカスタムサービスが一つだけ公開されています。
BLE は詳しくないですが、なんとなくカスタムサービスに Write すると Notification で結果が帰ってきそうな気がします。
しかし、BLE スキャナーから適当な CI-V コマンドを書き込もうとするとすぐに切断されてしまいます。まぁ、そりゃペアリングしてないのに勝手にコントロールされたら困りますもんね…
通信仕様を解析する
なので、次にペアリングの手順を解析します。
BLEの通信を解析をするとなると、BLE スニッファという機械で通信内容を傍受する必要があるので面倒だなーと思ってあきらめかけました
nRF51822搭載 Bluefruit LE Sniffer - スイッチサイエンス
が、調べてみると iOS の開発ツールの中に iPhone が BLE の通信している内容をキャプチャ出来るツールがあることがわかりました。
と言うわけで、RS-MS1I が IC-705 とペアリングするときの通信内容をキャプチャしたのがこちらです。
ぱっと見、なんのこっちゃですが CI-V を使った経験があるのでなんとなく読めます。
まず、先頭の"FEF1" はプリアンブルだと思います。CI-V では "FEFE" が使われています。 末尾の "FD" はポストアンブルでしょう。これは CI-V も同じです。
次に、0061 0062 0063がきているので、ここがコマンドだと考えられます。
そして、コマンドからポストアンブルまでがデータ部になります。
コマンドの内容を推測
ペアリング時は 0061 0062 0063 の順でコマンドを送っており、2回目以降の接続は 0061 0063 の順で送っていたので、
- 0061 接続要求
- 0062 デバイス登録
- 0063 通信開始
と考えられます。
データ部を推測
各コマンドのデータ部を見てみると、0061(接続要求)のデータは 16 バイトで、いくつかの iOS 端末 で接続したときのデータを比べても全く法則がなかったので、接続元を一意に特定するためのUUIDではないかと思います。
次に 0062(デバイス登録)のデータ部も 16 バイトですが、ASCII でみると iPhone という文字列が見えたため、IC-705 のペアリング画面で表示するためのデバイス名を送っているようです。 日本語を含むデバイス名で確認したところ、文字コードは UTF-8 でした。
最後に 0063(通信開始)のデータ部は 4 バイトですが、特に法則も意味も見当がつかないので、とりあえず気にしないことにします。
テストアプリ実装
ペアリングの手順が読めてきたので、実際にテスト用の iOS アプリを作ってみます。
なお、私は普段は Android エンジニアで、 iOS も Swift もほぼ初めてなので、とりあえずネットで見つけた BLE のサンプルコードを切った貼ったでテストアプリを作っています。
動作としては、カスタムサービスを持つデバイスをスキャンして接続し、接続後は各コマンド用のボタンを順番に指でタップしていきます。
接続シーケンスは手動ですが、PTT On/Offの動作確認。
— いけちょ(JN4JXL) (@ikeda_shogouki) 2020年11月28日
まだ不安なところはあるけど、iOS版開発のめどが立ったかな。
チョロいぜ#705Remote #IC705 pic.twitter.com/It7zl6nD4E
これは、2回目の接続のため、コマンドは 0061 → 0063 の順に送信しています。 また、送信状態と受信状態を切り替える CI-V コマンドを送り、送信 / 受信が切り替わることも確認できました。
これで 705 Remote for iOS の開発の目処が立ちました。