山星盛電子科技是一家衡器硬件設(shè)備提供商
山星盛電子科技是一家衡器硬件設(shè)備提供商
騰訊微信小程序電子稱
前情:在微信小程序中連接藍(lán)牙電子計重桌秤
此次
確保手機藍(lán)牙已經(jīng)打開
微信小程序中搜索到的藍(lán)牙設(shè)備很多
最終得到的結(jié)果是 ArrayBuffer 型數(shù)據(jù),需要先轉(zhuǎn)為16進制字符串
// 定義數(shù)據(jù)data: { devices: [], // 搜索到的藍(lán)牙設(shè)備 deviceId 數(shù)組 deviceId: '', // 目標(biāo)藍(lán)牙設(shè)備 deviceId services: [] // 設(shè)備服務(wù)列表 serviceId 數(shù)組 serviceId: '', characteristics: [] // 特征值列表 characteristicId: '' // 選擇某一個特征值 value: '' // 16 進制數(shù)據(jù)值}// 藍(lán)牙 API 調(diào)用步驟openBluetoothAdapter() { wx.openBluetoothAdapter({ // (1) success: res => { console.log('openBluetoothAdapter初始化藍(lán)牙模塊成功:', res) this.startBluetoothDevicesDiscovery() // (2) 開始搜索 }, fail: err => { console.log('openBluetoothAdapter初始化藍(lán)牙模塊失?div id="m50uktp" class="box-center"> 。?#39;, err) if (err.errCode === 10001) { // 當(dāng)前藍(lán)牙適配器不可用 wx.onBluetoothAdapterStateChange( res => { if (res.available) { this.startBluetoothDevicesDiscovery() } }) } } }) }
入?yún)?services 作用要搜索的藍(lán)牙設(shè)備主 service 的 uuid 列表,某些藍(lán)牙設(shè)備會廣播自己的主 service 的 uuid
入?yún)?allowDuplicatesKey 作用是否允許重復(fù)上報同一設(shè)備
?? 此操作比較耗費系統(tǒng)資源
,需要在搜索并連接到設(shè)備后調(diào)用 wx.stopBluetoothDevicesDiscovery 方法停止搜索startBluetoothDevicesDiscovery() { wx.startBluetoothDevicesDiscovery({ success: res => { console.log('startBluetoothDevicesDiscovery開始搜索外圍設(shè)備成功:', res) this.getBluetoothDevices() // (3) 獲取藍(lán)牙列表 }, fail: err => { console.log('startBluetoothDevicesDiscovery搜索外圍設(shè)備失敗:', err) } }) }
getBluetoothDevices() { wx.getBluetoothDevices({ success: res => { console.log('getBluetoothDevices獲取藍(lán)牙設(shè)備成功:', res) this.setData({ devices: res. devices || [] // uuid 對應(yīng)的的已連接設(shè)備列表 }) this.createBLEConnection(); // (4) 與目標(biāo)設(shè)備建立連接 }, fail: err => { console.log('getBluetoothDevices獲取藍(lán)牙設(shè)備失?div id="4qifd00" class="flower right">
?? 如果微信小程序此前搜索過某個藍(lán)牙設(shè)備
,并成功建立連接,可直接傳入之前搜索獲取的 deviceId 直接嘗試連接該設(shè)備,不用重新搜索createBLEConnection() { // 如果是第一次建立連接,可以通過名稱匹配,獲取相應(yīng)設(shè)備的 deviceId let devices = this.data.devices; devices.forEach(item => { if(item.name == 'kunHong') { this.setData({ deviceId: item.deviceId }) } }) // 建立連接 wx.createBLEConnection({ deviceId: this.data.deviceId, success: res => { console.log('createBLEConnection與目標(biāo)藍(lán)牙連接成功:', res) this.getBLEDeviceServices() // (5)獲取服務(wù) }, fail: err => { console.log('createBLEConnection與目標(biāo)藍(lán)牙連接失敗:', err) } }) }
入?yún)?deviceId 為 wx.getBluetoothDevices 中獲取的目標(biāo)藍(lán)牙設(shè)備的 deviceId
??開發(fā)過程中
,主服務(wù) serviceId 和 主服務(wù)的特征值 characteristics 都是選取的實際操作過程中,得到的類似于該目標(biāo)藍(lán)牙設(shè)備的 id,但是小程序官方文檔的 demo,遍歷了所有的列表(serviceId 和 characteristics),需要區(qū)分一下getBLEDeviceServices() { wx.getBLEDeviceServices({ deviceId: this.data.deviceId, success: res => { console.log('getBLEDeviceServices獲取藍(lán)牙設(shè)備服務(wù)', res) // getBluetoothDevices 獲取的有 deviceId 和 advertisServiceUUIDs,可以在這里獲取的服務(wù)列表中選擇一個一樣的作為后續(xù) API 請求的服務(wù)id,這個 id 需要滿足是否可讀 this.setData({ services: res.services, serviceId: res.services[0].uuid // 假設(shè)是第一個 }) this.getBLEDeviceCharacteristics() // (6) 獲取特征值 // 官方 demo for(var i = 0; i < res.services.length; i++) { // 該服務(wù)是否為主服務(wù) if(res.services[i].isPrimary) { this.getBLEDeviceCharacteristics(res.services[i].uuid) } } }, fail: err => { console.log('getBLEDeviceServices獲取藍(lán)牙設(shè)備服務(wù)失?div id="4qifd00" class="flower right">
入?yún)?deviceId 為 wx.getBluetoothDevices 中獲取的目標(biāo)藍(lán)牙設(shè)備的 deviceId
入?yún)?serviceId 為藍(lán)牙服務(wù) uuid ,通過 wx.getBLEDeviceServices 獲取
getBLEDeviceCharacteristics(serviceId) { wx.getBLEDeviceCharacteristics({ deviceId: this.data.deviceId, serviceId: this.data.serviceId, success: res => { console.log('getBLEDeviceCharacteristics獲取藍(lán)牙服務(wù)特征值成功:', res) this.setData({ characteristics: res. characteristics, characteristics: res. characteristics[0].uuid }) this.notifyBLECharacteristicValueChange(); // (7)啟用 notify 功能 // 官方 demo for(var i = 0; i < res.characteristics.length; i++) { // 是否可讀 if(res.characteristics[i].read) { // 讀取數(shù)據(jù) wx.readBLECharacteristicValue({ deviceId: this.data.deviceId, serviceId: serviceid, characteristicId: res.characteristicId[i].uuid }) }, if(res.characteristics[i].properties.notify || res.characteristics[i].properties.indicate) { // 啟用功能 wx.notifyBLECharacteristicValueChange({ deviceId, serviceId, characteristicId: item.uuid, state: true, }) } } }, fail: err => { console.log('getBLEDeviceCharacteristics獲取藍(lán)牙服務(wù)特征值失?div id="4qifd00" class="flower right">
??必須設(shè)備的特征值支持 notify 或者 indicate 才可以成功啟用
notifyBLECharacteristicValueChange() { wx.notifyBLECharacteristicValueChange({ deviceId: this.data.deviceId, serviceId: this.data.serviceId, characteristicId: this.data. characteristicId, state: true // 是否啟用 notify (四個字段全部必填) }) }
??必須先啟用 notifyBLECharacteristicValueChange 接口才能接收到設(shè)備推送的 notification(通知)
// 先監(jiān)聽一下,保證第一時間獲取數(shù)據(jù)onBLECharacteristicValueChange() { wx.onBLECharacteristicValueChange( characteristic => { console.log('onBLECharacteristicValueChange從目標(biāo)藍(lán)牙設(shè)備監(jiān)聽到的數(shù)據(jù)值:', characteristic) this.setData({ value: this.ab2hex(abcharacteristic.value) // (10) 轉(zhuǎn)為 16 進制 }) }) }
??必須目標(biāo)藍(lán)牙設(shè)備的特征值支持 read 才可以成功調(diào)用
,并且單獨使用 readBLECharacteristicValue 并不能獲取到真正的特征值,只能返回獲取特征值的狀態(tài),即是否成功獲取到值readBLECharacteristicValue() { wx.readBLECharacteristicValue({ deviceId: this.data.deviceId, serviceId: this.data.serviceId, characteristicId: this.data.charecteristicId, success: res => { console.log('readBLECharacteristicValue讀取特征值成功:', res) }, fail: err => { console.log('readBLECharacteristicValue讀取特征值失?div id="m50uktp" class="box-center"> 。?#39;, err) } }) }
<br>###(10)轉(zhuǎn)為 16 進制####官方文檔中介紹了 ArrayBuffer 轉(zhuǎn)為 16 進制的方法 // ArrayBuffer轉(zhuǎn)16進制字符串示例 ab2hex(buffer) { let hexArr = Array.prototype.map.call( new Uint8Array(buffer), function(bit) { return ('00' + bit.toString(16)).slice(-2) } ) return hexArr.join(''); } <br>###(11)值轉(zhuǎn)換####官方文檔介紹的方法似乎有點不適用哎,試下這個 ab2Str(arrayBuffer){ let unit8Arr = new Uint8Array(arrayBuffer); let encodedString = String.fromCharCode.apply(null, unit8Arr); return encodedString; }ACSII碼16進制轉(zhuǎn)換代碼
如以上轉(zhuǎn)換都不能成功,請試用以下轉(zhuǎn)換代碼
ab2Weight(abValue) {
let characteristicValue = this.ab2hex(abValue);
let strValue = this.hexCharCodeToStr(characteristicValue)
return strValue
// let weightValue =
},
ab2hex(buffer) {
let hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function (bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
},
hexCharCodeToStr(hexCharCodeStr) {
var trimedStr = hexCharCodeStr.trim();
var rawStr =
trimedStr.substr(0, 2).toLowerCase() === "0x" ?
trimedStr.substr(2) :
trimedStr;
var len = rawStr.length;
if (len % 2 !== 0) {
alert("Illegal Format ASCII Code!");
return "";
}
var curCharCode;
var resultStr = [];
for (var i = 0; i < len; i = i + 2) {
curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value
resultStr.push(String.fromCharCode(curCharCode));
}
return resultStr.join("");
}
來源:
http://www.dxalxbgw.cn/new/WeChat-scale.html
我們專業(yè)提供電子秤硬件稱重設(shè)備:服務(wù)電話:0755-23035550 直線:18923420600/15307550221
聯(lián)系人:黃金
手 機:153 0755 0221
郵 箱:jane@dzc.hk
公 司:深圳市山星盛電子科技有限公司-稱重產(chǎn)品官方展示網(wǎng)站
地 址:廣東省深圳市寶安鳳塘大道25號(山星盛電子秤)