blog

アプレットがBluetooth経由でデバイスに接続

1.ハードウェアエンジニアにBluetooth機能値を教えてもらいます。 2.返されるread/write uuidは配列で、どれがreadかwriteかわかりません。 1.デバイスonBLEChar...

Jan 9, 2021 · 4 min. read
シェア
Bluetooth api

1.ブルートゥース初期化

wx.openBluetoothAdapter({
 success() {
 setTimeout(()=>{
 that.getBluetoothAdapterState()
 }, 200)
 },
 fail() {
 console.log('携帯電話のBluetoothがオンになっていない')
 }
})

注:すべてのBluetooth操作は、最初にBluetoothを初期化する必要があります。
1.すべてのBluetooth操作は、最初に初期化する必要があります。
2.ユーザーの Bluetooth スイッチがオンになっていない場合、または電話が Bluetooth をサポートしていない場合、wx.openBluetoothAdapter を呼び出すと、電話の Bluetooth 機能が使用できないことを示すエラーが返されます。

2.Bluetoothが利用可能かどうかの検出

getBluetoothAdapterState() {
 wx.getBluetoothAdapterState({
 success(res) {
 console.log(res)
 if (res.available) {
 that.startBluetoothDevicesDiscovery()
 }
 },
 fail(error) {
 
 }
 })
},

注意事項
1.一度だけ実行、wx.onBluetoothAdapterStateChangeメソッドは、リアルタイムのBluetooth操作リスニングすることができます。

3.Bluetoothデバイス検索の初期化

startBluetoothDevicesDiscovery() {
 wx.startBluetoothDevicesDiscovery({
 success(res) {
 console.log(res)
 that.getBluetoothDevices()
 },
 fail(error) {
 
 }
 })
},

4.検索されたBluetoothデバイスを取得

getBluetoothDevices() {
 wx.getBluetoothDevices({ //現在検索されているすべてのBluetoothデバイスを取得する
 成功 {
 console.log(res)
 setTimeout(()=>{
 if(res.devices.length < 1) { //Bluetoothをオフにし、デバイスが1台以下になったら検索を停止する
 wx.stopBluetoothDevicesDiscovery()
 wx.closeBluetoothAdapter()
 }
 }, 15000)
 }
 })
 
 wx.onBluetoothDeviceFound(res=>{ //検索されたブルートゥースを聴く-常に新しい設備を探している
 let devices = res.devices
 for(let item of devices) {
 let advertisData = that.buf2hex(item.advertisData) //Androidとiosに共通するブロードキャスト・データは本来deviceIdによって決定されるが、iosのdeviceIdは正しいものではない
 if(advertisData.toUpperCase().indexOf('ブルートゥースのマックアドレス') != -1) { //ハードウェアエンジニアが提供した、またはAndroidシステムが取得したBluetooth macアドレスを検索し、BluetoothデバイスIDが存在する場合はそれを取得する。
 let deviceId = item.deviceId //BluetoothデバイスIDを取得する。
 wx.stopBluetoothDevicesDiscovery({ //新しいデバイスを探すのをやめる
 成功 {
 setTimeout(()=>{
 that.createBLEConnection(deviceId)
 }, 200)
 }
 })
 }
 }
 })
},

5.BluetoothデバイスIDによる低消費電力Bluetoothデバイスの接続

createBLEConnection(deviceId) {
 wx.createBLEConnection({
 deviceId,
 success(res) {
 console.log(res)
 that.getBLEDeviceServices(deviceId)
 }
 })
},

6.BluetoothデバイスIDを介してBluetoothのすべてのサービスを取得します。

getBLEDeviceServices(deviceId) {
 wx.getBLEDeviceServices({
 deviceId,
 success(res) {
 console.log(res)
 that.getBLEDeviceCharacteristics(deviceId)
 }
 })
},

7.Bluetooth固有値サービスidとBluetoothデバイスidを通して、Bluetooth固有値の読み書きのためのuuidを取得します。

getBLEDeviceCharacteristics(deviceId) {
 console.log(services)
 wx.getBLEDeviceCharacteristics({
 deviceId,
 serviceId: '', //Bluetooth固有値サービスID
 成功 {
 console.log(res) //主に、Bluetooth固有値の読み書き用のuuidがあるかどうかをチェックする
 セットタイムアウト=>{
 that.notifyBLECharacteristicValueChange(deviceId)
 }, 200)
 }
 })
},

注意事項
1. bluetooth 機能の値はハードウェアエンジニアに教えてください。
2.返されるread/write uuidは配列で、どれがreadかwriteかわかりません。

8.Bluetooth通知機能を有効にします。

notifyBLECharacteristicValueChange(deviceId) {
 wx.notifyBLECharacteristicValueChange({
 deviceId, //ブルートゥース・デバイスID
 serviceId: '', //ブルートゥース固有値サービスID
 characteristicId: '', //ブルートゥース固有値読み取り uuid
 state: true, //通知を有効にするかどうか
 成功 {
 that.onBLECharacteristicValueChange()
 setTimeout(()=>{
 that.writeBLECharacteristicValue(deviceId)
 },200)
 }
 })
},

9.Bluetooth機器からのプッシュ受信

onBLECharacteristicValueChange() {
 wx.onBLECharacteristicValueChange(res=>{
 let data = that.buf2string(res.value) //通常のテキストを10進数で解析する
 console.log(data)
 })
},

10.低電力Bluetoothデバイスの機能値へのバイナリデータの書き込み

writeBLECharacteristicValue(deviceId){
 let str = '{code: 1, data: {md5: gffd544, ts: 3654}, msg: "hello"}' //データを定義する
 
 //放送データに変換する
 let buffer = new ArrayBuffer(str.length)
 let dataView = new DataView(buffer)
 for (var i = 0; i < str.length; i++) {
 dataView.setUint8(i, str.charAt(i).charCodeAt())
 }
 
 // let dataHex = buf2hex(buffer); //バイナリに変換する

 wx.writeBLECharacteristicValue({
 deviceId, //BluetoothデバイスID
 serviceId: '', //ブルートゥース固有値サービスID
 characteristicId: '', //Bluetoothの固有値はuuidと表記される
 value: buffer, 
 success (res) {
 console.log('writeBLECharacteristicValue success', res.errMsg)
 }
 })
 }

データ変換

データをバイナリにブロードキャスト

buf2hex(buffer) {
 let hexArr = Array.prototype.map.call(new Uint8Array(buffer), bit=>{
 return ('00' + bit.toString(16)).slice(-2)
 })
 return hexArr.join('')
},

10進数、通常のテキストにパース

buf2string(buffer) {
 let arr = Array.prototype.map.call(new Uint8Array(buffer), x => x)
 return arr.map((char, i) => {
 return String.fromCharCode(char)
 }).join('')
},
Read next

データベース - MySQLインデックス

3レベルのB+ツリーは数百万のデータを表現することができ、大幅なパフォーマンス向上となります。 最左端の接頭辞マッチングの原則。mysqlは範囲クエリに遭遇してマッチングを停止するまで、右にマッチングし続けます。例えば、a = 1かつb = 2かつc > 3かつd = 4の場合、(a,b,...)を構築すると、(a,b,...)のようになります。

Jan 9, 2021 · 2 min read