本文作者:IMWeb dujingya 原文出處:IMWeb社區(qū)
github地址:https://github.com/dujingya/blueDevice/blob/master/blueDevice.md
if (wx.openBluetoothAdapter) { wx.openBluetoothAdapter({ success: function(res) { /* 獲取本機(jī)的藍(lán)牙狀態(tài) */ setTimeout(() => { getBluetoothAdapterState() }, 1000) }, fail: function(err) { // 初始化失敗 } })} else {}
getBluetoothAdapterState() { var that = this; that.toastTitle = '檢查藍(lán)牙狀態(tài)' wx.getBluetoothAdapterState({ success: function(res) { startBluetoothDevicesDiscovery() }, fail(res) { console.log(res) } })}
startBluetoothDevicesDiscovery() { var that = this; setTimeout(() => { wx.startBluetoothDevicesDiscovery({ success: function(res) { /* 獲取藍(lán)牙設(shè)備列表 */ that.getBluetoothDevices() }, fail(res) { } }) }, 1000)}
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ù)指定的藍(lán)牙設(shè)備名稱匹配到deviceId */ that.deviceId = that.devices[i].deviceId; setTimeout(() => { that.connectTO(); }, 2000); }; }; } else { } } else { } }, fail(res) { console.log(res, '獲取藍(lán)牙設(shè)備列表失敗=====') } }) }, 2000)},
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) { } })}
getBLEDeviceServices() { setTimeout(() => { wx.getBLEDeviceServices({ deviceId: that.connectedDeviceId, success: function(res) { that.services = res.services /* 獲取連接設(shè)備的所有特征值 */ that.getBLEDeviceCharacteristics() }, fail: (res) => { } }) }, 2000)},
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, '藍(lán)牙特征值 ==========') /* 獲取藍(lán)牙特征值 */ that.notifyCharacteristicsId = res.characteristics[i].uuid // 啟用低功耗藍(lán)牙設(shè)備特征值變化時(shí)的 notify 功能 that.notifyBLECharacteristicValueChange() } } }, fail: function(res) { } }) }, 1000) },
notifyBLECharacteristicValueChange() { // 啟用低功耗藍(lán)牙設(shè)備特征值變化時(shí)的 notify 功能 var that = this; console.log('6.啟用低功耗藍(lán)牙設(shè)備特征值變化時(shí)的 notify 功能') wx.notifyBLECharacteristicValueChange({ state: true, deviceId: that.connectedDeviceId, serviceId: that.notifyServicweId, characteristicId: that.notifyCharacteristicsId, complete(res) { /*用來(lái)監(jiān)聽(tīng)手機(jī)藍(lá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, '啟用低功耗藍(lán)牙設(shè)備監(jiān)聽(tīng)失敗') 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)成二進(jì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)成可展會(huì)的文字*/ 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(''); },
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) { } }) },
// 斷開(kāi)設(shè)備連接closeConnect() { if (that.connectedDeviceId) { wx.closeBLEConnection({ deviceId: that.connectedDeviceId, success: function(res) { that.closeBluetoothAdapter() }, fail(res) { } }) } else { that.closeBluetoothAdapter() }},// 關(guān)閉藍(lán)牙模塊closeBluetoothAdapter() { wx.closeBluetoothAdapter({ success: function(res) { }, fail: function(err) { } })},
聯(lián)系客服