2021年07月29日 更新
どうも、クラゲです。
Web Bluetooth APIを超簡単に扱えるBlueJellyを使って複数BLEデバイスと同時接続を行います。BlueJellyを使えば、簡単にできます!
Scan と同様
Scan と同様
micro:bitが手元にない人は、HTML側のUUIDと受信データフォーマットを変更すれば、他のBLEデバイスでも対応可能です
1つのHTMLファイルで2つのmicro:bitと接続し、Notifyを行っています。
WEB上で試せるデモページはこちら
BlueJelly Sample : Notify 2 connection
ローカル環境で試したい方はこちらのGitHubからダウンロードし、notify_2connection.html
を開いて実行してください。
2つのそれぞれのBLEデバイスに対して、Notifyを同時に行っています。今回はNotifyの例ですが、もちろんReadやWriteも可能です。
それではプログラムの解説に入ります。
単純にボタンを増やしただけです。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に応じて追加する必要があります。
インスタンスの生成を単純に2つ生成すればいけます。
こちらもインスタンス名は2
を追加した名前にしました。
var ble = new BlueJelly();
var ble2 = new BlueJelly();
ロード時の処理にて、UUIDをble2
側にも追加で登録します。
window.onload = function () {
//UUIDの設定
ble.setUUID("UUID1", BlueJelly.MICROBIT_UART_SERVICE, BlueJelly.MICROBIT_TX_CHARACTERISTIC);
ble2.setUUID("UUID1", BlueJelly.MICROBIT_UART_SERVICE, BlueJelly.MICROBIT_TX_CHARACTERISTIC);
}
ble2のonRead
処理も追加します。最初にHTMLで追加したように、ID名に2
を追加するのをお忘れなく。
ble.onRead = function (data, uuid){
//フォーマットに従って値を取得
let value = "";
for(let i = 0; i < data.byteLength; i++){
value = value + String.fromCharCode(data.getInt8(i));
}
//数値化
value = Number(value);
//コンソールに値を表示
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){
//フォーマットに従って値を取得
let value = "";
for(let i = 0; i < data.byteLength; i++){
value = value + String.fromCharCode(data.getInt8(i));
}
//数値化
value = Number(value);
//コンソールに値を表示
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とBLE nanoで少なくとも3台は同時接続できました。4台以上は実験していませんが、結構いけるのではないでしょうか?
複数同時にBLE通信できると、新たな発想でサービスが作れそうですね!
以上、複数のデバイスとBLE同時通信でした!