// 连接模式蓝牙 var util = require('util.js') var data = { bioland_device_uuid: '00001000-0000-1000-8000-00805f9b34fb', // 血压uuid list:[], deviceIdStr: '' } var characteristic_write_uuid = '00001001-0000-1000-8000-00805F9B34FB' // 数据写入接口特征值 var service_write_uuid = '00001000-0000-1000-8000-00805F9B34FB' // 数据写入接口服务服务值 var characteristic_notify_uuid = '00001002-0000-1000-8000-00805F9B34FB' // 数据读取接口特征值 var service_notify_uuid = '00001000-0000-1000-8000-00805F9B34FB' // 数据读取接口服务值 var responseData = { code: '', status: '', data: {} } var notOpenBle = false var callBack; var notification; // 401蓝牙设备中断连接 201连接设备 200蓝牙状态成功 402连接失败 function openBluetooth(data, callBackFun){ var self = this callBack = callBackFun var system = wx.getSystemInfoSync() if (system.platform == 'android'){ toLower() } responseData = { code: '', status: '', data: {} } getBLEData() wx.onBluetoothAdapterStateChange(function (res) { // callback if (res.available == false) { notOpenBle = true responseData.status = '设备蓝牙未开启' responseData.code = '404' callBack(responseData) } else { if (notOpenBle) { responseData.code = '200' getBLEData() } } }) } function getBLEData() { console.log('获取蓝牙适配器') wx.openBluetoothAdapter({ success: function (res) { // success notOpenBle = false wx.getBluetoothAdapterState({ success: function (res) { console.log('蓝牙适配器状态', res) if (res.discovering == true) { console.log('正在搜索') foundDevice() } else { console.log('开始获取连接设备') getConnectedDevice() } }, fail: function (res) { responseData.status = '未能成功获取到蓝牙信息' callBack(responseData) console.log(res) } }) }, fail: function (res) { console.log(res) if (res.errMsg.indexOf("already opened") != -1) { notOpenBle = false wx.getBluetoothAdapterState({ success: function (res) { if (res.discovering == true) { console.log('正在搜索') foundDevice() } else { console.log('开始获取连接设备') getConnectedDevice() } } }) console.log('初始化蓝牙适配器') return } notOpenBle = true responseData.status = '请检查蓝牙是否打开' callBack(responseData) } }) } // 获取已经连接的设备 function getConnectedDevice() { var self = this responseData.code = '200' wx.getConnectedBluetoothDevices({ services: [data.bioland_device_uuid], success: function (res) { // success console.log('获取之前已经连接的蓝牙', res) if (res.devices.length == 0) { console.log('之前没有设备连接,开始搜索') searchDevices() } else { var currentDev; if (res.deviceId) { // android currentDev = res } else if (res.devices) { // ios currentDev = res.devices[0] } wx.closeBLEConnection({ deviceId: res.devices[0].deviceId, success: function (res) { console.log('断开之前已经连接的设备,开始搜索') searchDevices() }, }) } }, fail: function (res) { // fail console.log('获取已经连接蓝牙失败', res) searchDevices() }, complete: function (res) { // complete } }) } // 搜索设备 function searchDevices(){ var self = this wx.startBluetoothDevicesDiscovery({ services: [data.bioland_device_uuid], success: function (res) { // success console.log(`开始搜索设备`, res) foundDevice() }, fail: function (res) { // fail responseData.status = '未能搜索到设备' callBack(responseData) console.log('搜索失败', res) } }) } // 找到设备 function foundDevice(){ var self = this responseData.status = '搜索设备中...' responseData.code = '200' callBack(responseData) wx.onBluetoothDeviceFound(function (res) { console.log('搜索到',res) var same = false var currentDev; if (res.deviceId) { // android currentDev = res } else if (res.devices) { // ios currentDev = res.devices[0] } for (var i = 0; i < data.list.length; i++) { var item = data.list[i] if (item.deviceId == currentDev.deviceId) { same = true } } if (!same) { // var list = data.list // list.push(currentDev) responseData.data.currentDev = currentDev callBack(responseData) } }) } function addNotification(notificationFun){ notification = notificationFun } // 选择设备 function connectionDevice(deviceId, callbackFun){ var self = this data.deviceIdStr = deviceId wx.stopBluetoothDevicesDiscovery({ success: function (res) { console.log('成功停止搜索') }, fail: function (res) { console.log('未能成功停止搜索') } }) responseData.status = '开始连接设备' callbackFun(responseData) wx.createBLEConnection({ deviceId: data.deviceIdStr, success: function (res) { // success console.log('成功连接') getDeviceService() }, fail: function (res) { // fail console.log('连接失败',res) responseData.status = '未能连接到设备' responseData.code = '402' callbackFun(responseData) } }) } function getDeviceService(){ var self = this wx.getBLEDeviceServices({ deviceId: data.deviceIdStr, success: function (res) { // success console.log('成功获取服务') res.services.map(function (item) { if (item.uuid == service_write_uuid || item.uuid.toLowerCase() == service_write_uuid) { // 如果是大写 就全部转换成大写 if (util.checkIsContainCapital(item.uuid)) { toCapital() } else { toLower() } getDeviceServiceCharacteristics(item.uuid) } }) }, fail: function (res) { responseData.status = '未能连接到设备' callBack(responseData) } }) wx.onBLEConnectionStateChanged(function (res) { // 该方法回调中可以用于处理连接意外断开等异常情况 if (res.connected == false){ responseData.status = '设备连接已断开' responseData.code = '401' callBack(responseData) } console.log(`device ${res.deviceId} state has changed, connected: ${res}`) }) } function getDeviceServiceCharacteristics(serviceId){ var self = this wx.getBLEDeviceCharacteristics({ deviceId: data.deviceIdStr, serviceId: serviceId, success: function (res) { // success console.log('成功获取特征') res.characteristics.map(function (item) { if (item.uuid == characteristic_notify_uuid || item.uuid.toLowerCase() == characteristic_notify_uuid) { console.log('打开监听',item) openNotify() } responseData.code = '201' responseData.status = '成功连接设备' callBack(responseData) }) }, fail: function (res) { console.log('失败获取特征',res) } }) } // 获取设备特征值信息 function getDeviceServiceCharacteristicsValue(serviceId, characteristicsUuid){ var self = this wx.readBLECharacteristicValue({ deviceId: data.deviceIdStr, serviceId: service_notify_uuid, characteristicId: characteristic_notify_uuid, success: function (res) { // success console.log('成功duqu特征') }, fail: function (res) { // fail responseData.status = '未能获取到设备信息' callBack(responseData) } }) wx.onBLECharacteristicValueChange(function (res) { var dataStr = buf2hex(res.value) if (dataStr) { notification(dataStr) } // 55 0F 00 0A 00 01 00 00 64 00 00 00 00 00 D5 }) } // 开启监听 function openNotify(){ var self = this console.log(service_notify_uuid) console.log(characteristic_notify_uuid) wx.notifyBLECharacteristicValueChanged({ deviceId: data.deviceIdStr, serviceId: service_notify_uuid, characteristicId: characteristic_notify_uuid, state: true, success: function (res) { }, fail: function (res) { // fail console.log('notifyBLECharacteristicValueChange fail --', res) // responseData.status = '未能获取到设备信息' callBack(responseData) } }) } function writeDataWithStr(str){ var self = this var typedArray = new Uint8Array(str.match(/[\da-f]{2}/gi).map(function (h) { return parseInt(h, 16) })) var buffer = typedArray.buffer wx.writeBLECharacteristicValue({ deviceId: data.deviceIdStr, serviceId: service_write_uuid, characteristicId: characteristic_write_uuid, value: buffer, success: function (res) { // success }, fail: function (res) { // fail }, complete: function (res) { // complete getDeviceServiceCharacteristicsValue() } }) } function closeBLE() { wx.stopBluetoothDevicesDiscovery({ complete: function (res) { console.log('停止搜索', res) }, }) wx.closeBLEConnection({ deviceId: data.deviceIdStr, complete: function(res) { console.log('断开该设备的蓝牙', res) } }) wx.closeBluetoothAdapter({ complete: function (res) { console.log('关闭蓝牙', res) }, }) } function buf2hex(buffer) { // buffer is an ArrayBuffer return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join(''); } function toCapital() { characteristic_write_uuid = characteristic_write_uuid.toUpperCase() service_write_uuid = service_write_uuid.toUpperCase() characteristic_notify_uuid = characteristic_notify_uuid.toUpperCase() service_notify_uuid = service_notify_uuid.toUpperCase() } function toLower() { characteristic_write_uuid = characteristic_write_uuid.toLowerCase() service_write_uuid = service_write_uuid.toLowerCase() characteristic_notify_uuid = characteristic_notify_uuid.toLowerCase() service_notify_uuid = service_notify_uuid.toLowerCase() } module.exports = { writeDataWithStr: writeDataWithStr, openBluetooth: openBluetooth, connectionDevice: connectionDevice, closeBLE: closeBLE, addNotification: addNotification }