質問: 私は今、BLEモジュール(ペリフェラル)とAndroid端末(セントラル)でBLE通信を行っております。 動作としては、BLEモジュールに接続された加速度センサの値(X,Y,Z)をBLE通信でAndroidへ送信し、画面上でリアルタイムで値が更新されているのを確認したいです。 今現在の実装状況としては、ペリフェラルから任意のデータ一つをセントラルに送信し、Android端末上で値が更新されていることを確認できています。 しかし加速度データは3軸あるので複数のデータの送信をしたいです。 そこで方法についての提案が2つあるのですが、 ・1)送信したいデータごとにcharacteristicを作成し、それぞれ送信する。 ・2)使用するcharacteristicは1つにする。ペリフェラルではデータ送信する関数の引数でX,Y,Zと分けて(送信する関数は計3回呼ぶ)、セントラルでXを受け取ったら配列[0]に代入、Yを受け取ったら配列[1]に代入というようにしてデータがそろったら表示する。というのを繰り返す。(説明分かりにくくてごめんなさい) ということが考えられるのですが、BLE通信で複数のデータを送信する際の一般的な方法はどちらでしょうか? BLE通信初心者で一般的な方法が分からずにいます。 どなたか回答よろしくお願いします。
回答: BLEのペリフェラルからの通信は、分かりやすく大きく分けて2つあり、ビーコンのようにセントラルに対して送りっぱなしにするもの(アドバタイジング)と、セントラルからの要求に対して1対1で接続し、(characteristicはここから必要になる)任意の長さのデータをやる取りするものがあります。 ここで質問者さんが心配されている「一回の送信が20バイト」までと言うのはアドバタイジングのパケットでの状況ですが、送りたいデータをいちパケットに詰め込めるのであれば、アドバタイジングパケットに載せてしまっても良いと思います。 有名なiBeaconのアドバタイジングパケットは以下のようなものですが、 Tech Web IoT - iBeaconとは この内、UUID/Major/Minor/TxPowerのサイズ分を自分用のオリジナルのデータに割り当てて使うようなことになると思います。アドバタイジングは送信周期の最低~最高値が決まっていたりするので、数ミリオーダーでのデータ送信はできません。詳細はBluetooth Low Energyの仕様書などをあたってください。 もし、ペリフェラルとセントラル間でコマンド/リクエストやレスポンスのような対話型のやり取りが必要なのであれば、アドバタイジングを終えて、characteristicを使って1対1で接続し、相互にやり取りすることが必須となります。接続が確立するとあらかじめ決めたプロトコルに沿って、整形したデータを送りたいときに送れるようになります。要は用途次第です。