#使用mpvue 開發(fā)小程序過程中 簡單介紹一下微信小程序藍牙連接過程
#在藍牙連接的過程中部分api需要加定時器延時1秒到2秒左右再執(zhí)行缴啡,原因為何不知道,小程序有這樣的要求
#1.首先是要初始化藍牙:openBluetoothAdapter()
```js
if (wx.openBluetoothAdapter) {
wx.openBluetoothAdapter({
? ? ? ? success: function(res) {
????????????/* 獲取本機的藍牙狀態(tài) */
? ? ? ? ? ? setTimeout(() => {
????????????????getBluetoothAdapterState()
????????????}, 1000)
????????},
? ? ? ? fail: function(err) {
????????????// 初始化失敗
????????}
????})
????} else {????
????}
```
#2.檢測本機藍牙是否可用:
#? 要在上述的初始化藍牙成功之后回調(diào)里調(diào)用
```js
getBluetoothAdapterState() {
? ? var that= this;
? ? that.toastTitle= '檢查藍牙狀態(tài)'
wx.getBluetoothAdapterState({
? ? ? ? success: function(res) {
startBluetoothDevicesDiscovery()
},
? ? ? ? fail(res) {
? ? ? ? ? ? console.log(res)
}
})
}
```
#3. 開始搜索藍牙設(shè)備:
```js
startBluetoothDevicesDiscovery() {
? ? var that= this;
? ? setTimeout(() => {
wx.startBluetoothDevicesDiscovery({
? ? ? ? ? ? success: function(res) {
/* 獲取藍牙設(shè)備列表 */
? ? ? ? ? ? ? ? that.getBluetoothDevices()
},
? ? ? ? ? ? fail(res) {
}
})
}, 1000)
}
```
#4. 獲取搜索到的藍牙設(shè)備列表
# /* that.deviceName 是獲取到的藍牙設(shè)備的名稱赁温, 因為藍牙設(shè)備在安卓和蘋果手機上搜到的藍牙地址顯示是不一樣的速兔,所以根據(jù)設(shè)備名稱匹配藍牙*/
```js
getBluetoothDevices() {
? ? var that= this;
? ? setTimeout(() => {
wx.getBluetoothDevices({
? ? ? ? ? ? services: [],
? ? ? ? ? ? allowDuplicatesKey: false,
? ? ? ? ? ? interval: 0,
? ? ? ? ? ? success: function(res) {
? ? ? ? ? ? ? ? if (res.devices.length> 0) {
? ? ? ? ? ? ? ? ? ? if (JSON.stringify(res.devices).indexOf(that.deviceName) !== -1) {
? ? ? ? ? ? ? ? ? ? ? ? for (let i = 0; i < res.devices.length; i++) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? if (that.deviceName === res.devices[i].name) {
/* 根據(jù)指定的藍牙設(shè)備名稱匹配到deviceId */
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? that.deviceId = that.devices[i].deviceId;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setTimeout(() => {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? that.connectTO();
}, 2000);
};
};
} else {
}
} else {
}
},
? ? ? ? ? ? fail(res) {
? ? ? ? ? ? ? ? console.log(res, '獲取藍牙設(shè)備列表失敗=====')
}
})
}, 2000)
},
```
#5.連接藍牙
# 匹配到的藍牙設(shè)備ID 發(fā)送連接藍牙的請求墅拭, 連接成功之后 應(yīng)該斷開藍牙搜索的api,然后去獲取所連接藍牙設(shè)備的service服務(wù)
```js
connectTO() {
wx.createBLEConnection({
? ? ? ? deviceId: deviceId,
? ? ? ? success: function(res) {
? ? ? ? ? ? that.connectedDeviceId = deviceId;
/* 4.獲取連接設(shè)備的service服務(wù) */
that.getBLEDeviceServices();
wx.stopBluetoothDevicesDiscovery({
? ? ? ? ? ? ? ? success: function(res) {
? ? ? ? ? ? ? ? ? ? console.log(res, '停止搜索')
},
? ? ? ? ? ? ? ? fail(res) {
}
})
},
? ? ? ? fail: function(res) {
}
})
}
```
#6. 獲取藍牙設(shè)備的service服務(wù),獲取的serviceId有多個要試著連接最終確定哪個是穩(wěn)定版本的service 獲取服務(wù)完后獲取設(shè)備特征值
```js
getBLEDeviceServices() {
? ? setTimeout(() => {
wx.getBLEDeviceServices({
? ? ? ? ? ? deviceId: that.connectedDeviceId,
? ? ? ? ? ? success: function(res) {
? ? ? ? ? ? ? ? that.services= res.services
/* 獲取連接設(shè)備的所有特征值 */
that.getBLEDeviceCharacteristics()
},
? ? ? ? ? ? fail: (res) => {
}
})
}, 2000)
},
```
#7.獲取藍牙設(shè)備特征值
# 獲取到的特征值有多個憨栽,最后要用的事能讀帜矾,能寫,能監(jiān)聽的那個值的uuid作為特征值id屑柔,
```js
getBLEDeviceCharacteristics() {
? ? ? ? ? ? setTimeout(() => {
wx.getBLEDeviceCharacteristics({
? ? ? ? ? ? ? ? ? ? deviceId: connectedDeviceId,
? ? ? ? ? ? ? ? ? ? serviceId: services[2].uuid,
? ? ? ? ? ? ? ? ? ? success: function(res) {
? ? ? ? ? ? ? ? ? ? ? ? for (var i = 0; i < res.characteristics.length; i++) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? if ((res.characteristics[i].properties.notify || res.characteristics[i].properties.indicate) &&
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (res.characteristics[i].properties.read && res.characteristics[i].properties.write)) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? console.log(res.characteristics[i].uuid, '藍牙特征值 ==========')
/* 獲取藍牙特征值 */
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? that.notifyCharacteristicsId = res.characteristics[i].uuid
// 啟用低功耗藍牙設(shè)備特征值變化時的 notify 功能
that.notifyBLECharacteristicValueChange()
}
}
},
? ? ? ? ? ? ? ? ? ? fail: function(res) {
}
})
}, 1000)
},
```
#8.啟動notify 藍牙監(jiān)聽功能 然后使用 wx.onBLECharacteristicValueChange用來監(jiān)聽藍牙設(shè)備傳遞數(shù)據(jù)
#接收到的數(shù)據(jù)和發(fā)送的數(shù)據(jù)必須是二級制數(shù)據(jù), 頁面展示的時候需要進行轉(zhuǎn)換
```js
notifyBLECharacteristicValueChange() { // 啟用低功耗藍牙設(shè)備特征值變化時的 notify 功能
? ? ? ? ? ? var that= this;
? ? ? ? ? ? console.log('6.啟用低功耗藍牙設(shè)備特征值變化時的 notify 功能')
wx.notifyBLECharacteristicValueChange({
? ? ? ? ? ? ? ? state: true,
? ? ? ? ? ? ? ? deviceId: that.connectedDeviceId,
? ? ? ? ? ? ? ? serviceId: that.notifyServicweId,
? ? ? ? ? ? ? ? characteristicId: that.notifyCharacteristicsId,
? ? ? ? ? ? ? ? complete(res) {
/*用來監(jiān)聽手機藍牙設(shè)備的數(shù)據(jù)變化*/
wx.onBLECharacteristicValueChange(function(res) {
/**/
? ? ? ? ? ? ? ? ? ? ? ? that.balanceData += that.buf2string(res.value)
? ? ? ? ? ? ? ? ? ? ? ? that.hexstr += that.receiveData(res.value)
})
},
? ? ? ? ? ? ? ? fail(res) {
? ? ? ? ? ? ? ? ? ? console.log(res, '啟用低功耗藍牙設(shè)備監(jiān)聽失敗')
? ? ? ? ? ? ? ? ? ? that.measuringTip(res)
}
})
},
/*轉(zhuǎn)換成需要的格式*/
buf2string(buffer) {
? ? ? ? ? ? ? ? ? ? var arr = Array.prototype.map.call(new Uint8Array(buffer), x => x)
? ? ? ? ? ? ? ? ? ? return arr.map((char, i) => {
? ? ? ? ? ? ? ? ? ? ? ? return String.fromCharCode(char);
? ? ? ? ? ? ? ? ? ? }).join('');
},
receiveData(buf) {
return this.hexCharCodeToStr(this.ab2hex(buf))
},
/*轉(zhuǎn)成二進制*/
ab2hex (buffer) {
? ? ? ? ? ? ? var hexArr = Array.prototype.map.call(
? ? ? ? ? ? ? ? ? new Uint8Array(buffer), function (bit) {
? ? ? ? ? ? ? ? ? ? ? return ('00' + bit.toString(16)).slice(-2)
}
)
? ? ? ? ? ? ? return hexArr.join('')
},
/*轉(zhuǎn)成可展會的文字*/
hexCharCodeToStr(hexCharCodeStr) {
? ? ? ? ? ? ? var trimedStr = hexCharCodeStr.trim();
? ? ? ? ? ? ? var rawStr = trimedStr.substr(0, 2).toLowerCase() === '0x' ? trimedStr.substr(2) : trimedStr;
? ? ? ? ? ? ? var len = rawStr.length;
? ? ? ? ? ? ? var curCharCode;
? ? ? ? ? ? ? var resultStr= [];
? ? ? ? ? ? ? for (var i = 0; i < len; i = i+ 2) {
? ? ? ? ? ? ? ? ? curCharCode = parseInt(rawStr.substr(i, 2), 16);
? ? ? ? ? ? ? ? ? resultStr.push(String.fromCharCode(curCharCode));
}
? ? ? ? ? ? ? return resultStr.join('');
},
```
# 向藍牙設(shè)備發(fā)送數(shù)據(jù)
```js
sendData(str) {
? ? let that= this;
? ? let dataBuffer = new ArrayBuffer(str.length)
? ? let dataView = new DataView(dataBuffer)
? ? for (var i = 0; i < str.length; i++) {
? ? ? ? dataView.setUint8(i, str.charAt(i).charCodeAt())
}
? ? let dataHex = that.ab2hex(dataBuffer);
? ? this.writeDatas = that.hexCharCodeToStr(dataHex);
wx.writeBLECharacteristicValue({
? ? ? ? deviceId: that.connectedDeviceId,
? ? ? ? serviceId: that.notifyServicweId,
? ? ? ? characteristicId: that.notifyCharacteristicsId,
? ? ? ? value: dataBuffer,
? ? ? ? success: function (res) {
? ? ? ? ? ? console.log('發(fā)送的數(shù)據(jù):' + that.writeDatas)
? ? ? ? ? ? console.log('message發(fā)送成功')
},
? ? ? ? fail: function (res) {
},
? ? ? ? complete: function (res) {
}
})
},
```
# 當(dāng)不需要連接藍牙了后就要關(guān)閉藍牙珍剑,并關(guān)閉藍牙模塊
```js
// 斷開設(shè)備連接
closeConnect() {
if (that.connectedDeviceId) {
wx.closeBLEConnection({
? ? ? ? ? ? deviceId: that.connectedDeviceId,
? ? ? ? ? ? success: function(res) {
that.closeBluetoothAdapter()
},
? ? ? ? ? ? fail(res) {
}
})
} else {
that.closeBluetoothAdapter()
}
},
// 關(guān)閉藍牙模塊
closeBluetoothAdapter() {
wx.closeBluetoothAdapter({
? ? ? ? success: function(res) {
},
? ? ? ? fail: function(err) {
}
})
},
```
#在向藍牙設(shè)備傳遞數(shù)據(jù)和接收數(shù)據(jù)的過程中掸宛,并未使用到read的API 不知道有沒有潛在的問題,目前線上運行為發(fā)現(xiàn)任何的問題
#今天的藍牙使用心得到此結(jié)束招拙,謝謝