<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>BLE read</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>BLE read</h1>
<p>Micro:bitに接続完了後、ボタンA・Bを押してください。
ボタンの情報を取得します。</p>
<hr>
<p><button type="button" id="connect">接続</button> <span id="msg"></span></p>
<div id="buttonA"></div>
<div id="buttonB"></div>
<script>
//microbit ボタンサービスのUUID
const uuid1 = "E95D9882-251D-470A-A062-FA1922DFA9A8"; //buttonUuid
const uuida = "E95DDA90-251D-470A-A062-FA1922DFA9A8"; //AButtonUuid
const uuidb = "E95DDA91-251D-470A-A062-FA1922DFA9A8"; //BButtonUuid
//デバイスの取得
document.getElementById('connect').addEventListener('click', function(e){
if (document.getElementById('connect').textContent == '接続') {
start() ;
buttonA.innerHTML = "" ; buttonB.innerHTML = "" ;
}
else { gatt.disconnect() ; update(false) ; }
}) ;
function update(connected) {
connect.textContent = connected ? '切断' : '接続'
msg.innerHTML = connected ? 'BLE connected' : 'BLE disconnected'
//send.disabled = !connected ;
}
function start(){
navigator.bluetooth.requestDevice({
filters: [{namePrefix: 'BBC micro:bit'}],optionalServices:[uuid1.toLowerCase()]} )
.then( device => { gatt = device.gatt ; return gatt.connect(); } )
.then( server => { return server.getPrimaryService(uuid1.toLowerCase()); } )
.then( //サービスが取得できたら
service => {
return Promise.all([
//characteristicsの取得(Aボタン用)
service.getCharacteristic(uuida.toLowerCase())
.then(chara => {
//停止できるようにグローバルに保持
charaA = chara;
//通知サービスを開始
chara.startNotifications();
//リスナー関数の設定
chara.addEventListener('characteristicvaluechanged',listenerButtonA);
update(true) ;
} ),
//characteristicsの取得(Bボタン用)
service.getCharacteristic(uuidb.toLowerCase())
.then(chara => {
//停止できるようにグローバルに保持
charaB = chara;
//通知サービスを開始
chara.startNotifications();
//リスナー関数の設定
chara.addEventListener('characteristicvaluechanged',listenerButtonB);
update(true) ;
}
)
]);
}
//).catch( error => { console.log('sorry Error!'); } )
).catch( error => { msg.innerHTML = (error) ; } )
}
//通知停止
function Stop(){
if( charaA ){
//通知の停止
charaA.stopNotifications().then(() => {
//リスナーの解放
charaA.removeEventListener('characteristicvaluechanged',listenerButtonA);
});
}
if( charaB ){
//通知の停止
charaB.stopNotifications().then(() => {
//リスナーの解放
charaB.removeEventListener('characteristicvaluechanged',listenerButtonB);
});
}
}
//Aボタン用リスナ
function listenerButtonA(event){
let chara = event.target;
let message = 'Aボタンが' + getStatus( chara.value.getUint8(0) );
document.getElementById('buttonA').innerHTML = message;
}
//Bボタン用リスナ
function listenerButtonB(event){
let chara = event.target;
let message = 'Bボタンが' + getStatus( chara.value.getUint8(0) );
document.getElementById('buttonB').innerHTML = message;
}
//ボタンの状態を判別し文字列を返す
function getStatus( value ){
switch(value){
case 0: return '離されました'; break;
case 1: return '押されました'; break;
case 2: return '長押しされました'; break;
}
}
</script>
</body>
</html>