2017/9/21

複数デバイスとBLE同時接続

どうも、クラゲです。
Web Bluetooth APIを超簡単に扱えるBlueJellyを使って複数BLEデバイスと同時接続を行います。
BlueJellyを使えば、簡単にできます!

【 必要なもの 】

scan のときと同じです

【 デモページとソースコード 】

デバイスがBLE Nanoの場合で説明します。
1つのHTMLファイルで2つのBLE Nanoと接続し、Notifyを行っています。

WEB上で試せるデモページはこちら
https://secure1689.sakura.ne.jp/kurage.jellyware.jp/bluejelly/notify_2connection.html

ローカル環境で試したい方はこちらのGitHubからダウンロードし、notify_2connection.htmlを実行してください。
https://github.com/electricbaka/bluejelly

2つのそれぞれのBLEデバイスに対して、Notifyを同時に行っています。今回はNotifyの例ですが、もちろんReadやWriteも可能です。
それではプログラムの解説に入ります。

【 プログラム解説(HTML) 】

単純にボタンを増やしただけです。id名は1つ目とは別名にしてください。
今回は簡単に"2"を追加しました。

<div class="contents margin">
    <button id="startNotifications" class="button">Start Notify</button>
    <button id="stopNotifications" class="button">Stop Notify</button>
    <hr>
    <div id="device_name"> </div>
    <div id="uuid_name"> </div>
    <div id="data_text"> </div>
    <div id="status"> </div>
</div>
 
<div class="contents margin">
    <button id="startNotifications2" class="button">Start Notify2</button>
    <button id="stopNotifications2" class="button">Stop Notify2</button>
    <hr>
    <div id="device_name2"> </div>
    <div id="uuid_name2"> </div>
    <div id="data_text2"> </div>
    <div id="status2"> </div>
</div>

ここでは説明省略しますが、style.cssも増やしたidに応じて追加する必要があります。

【 プログラム解説(JavaScript) 】

インスタンスの生成を単純に2つ生成すればいけます。
こちらもインスタンス名は"2"を追加した名前にしました。

var ble = new BlueJelly();
var ble2 = new BlueJelly();

ロード時の処理にて、UUIDをble2側にも追加で登録します。

window.onload = function () {
  //UUIDの設定
  ble.setUUID("UUID1", "713d0000-503e-4c75-ba94-3148f18d941e", "713d0002-503e-4c75-ba94-3148f18d941e");  //BLEnano SimpleControl rx_uuid
  ble2.setUUID("UUID1", "713d0000-503e-4c75-ba94-3148f18d941e", "713d0002-503e-4c75-ba94-3148f18d941e");  //BLEnano SimpleControl rx_uuid
}

ble2のonRead処理も追加します。最初にHTMLで追加したように、ID名に"2"を追加するのをお忘れなく。

ble.onRead = function (data, uuid){
  //フォーマットに従って値を取得
  value = data.getInt16(0);//2Byteの場合のフォーマット
 
  //コンソールに値を表示
  console.log(value);
 
  //HTMLに値を表示
  document.getElementById('data_text').innerHTML = value;
  document.getElementById('uuid_name').innerHTML = uuid;
  document.getElementById('status').innerHTML = "read data"
}
 
ble2.onRead = function (data, uuid){
  //フォーマットに従って値を取得
  value = data.getInt16(0);//2Byteの場合のフォーマット
 
  //コンソールに値を表示
  console.log(value);
 
  //HTMLに値を表示
  document.getElementById('data_text2').innerHTML = value;
  document.getElementById('uuid_name2').innerHTML = uuid;
  document.getElementById('status2').innerHTML = "read data"
}

ble2のボタン押下時のイベントリスナーも追加

document.getElementById('startNotifications').addEventListener('click', function() {
      ble.startNotify('UUID1');
});
 
document.getElementById('stopNotifications').addEventListener('click', function() {
      ble.stopNotify('UUID1');
});
 
document.getElementById('startNotifications2').addEventListener('click', function() {
      ble2.startNotify('UUID1');
});
 
document.getElementById('stopNotifications2').addEventListener('click', function() {
      ble2.stopNotify('UUID1');
});

クラシックBluetoothは最大同時接続数7台という制限がありましたが、BLEの同時接続数は制限がありません。
セントラルとなるPCやスマホの実力次第かと思います。クラゲは、MacBookAirで少なくとも3台は同時接続できました。4台以上は実験していませんが、結構いけるのではないでしょうか?
複数同時にBLE通信できると、新たな発想でサービスが作れそうですね!

以上、複数のデバイスとBLE同時通信でした!