var device_QHC_UUID = '0000ffb0-0000-1000-8000-00805f9b34fb' // 蓝牙电子秤uuid
var weighing_scale_type = '0BFF2608AC01' // 体重秤id
var weighing_scale_close = 'ac01fe010000cccb'// 体重秤灯熄灭
var weighing_scale_measure_end = 'ca'// 体重秤灯熄灭
var devList = []
var notOpenBle = false
function openBluetoothAdapter(success,fail) {
getBLEData(success, fail)
wx.onBluetoothAdapterStateChange(function (res) {
// callback
if (res.available == false) {
notOpenBle = true
fail('设备链接已断开')
} else {
console.log('蓝牙连接开启')
if(notOpenBle){
getBLEData(success, fail)
}
}
})
}
function getBLEData(success, fail) {
wx.openBluetoothAdapter({
success: function (res) {
// success
notOpenBle = false
wx.getBluetoothAdapterState({
success: function (res) {
console.log('蓝牙适配器状态', res)
if (res.discovering == true){
console.log('正在搜索')
findingDevice(0, function (dev) {
success(dev)
})
} else {
searchDevice(success, fail)
}
}
})
console.log('初始化蓝牙适配器')
},
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('正在搜索')
findingDevice(0, function (dev) {
success(dev)
})
} else {
console.log('开始搜索')
searchDevice(success, fail)
}
}
})
console.log('初始化蓝牙适配器')
return
}
notOpenBle = true
fail('请检查蓝牙是否打开')
}
})
}
function searchDevice(success, fail){
// 开始扫描
// var uuid = device_QHC_UUID
// var system = wx.getSystemInfoSync()
// if (system.platform == 'android'){
// var str = new String(system.system)
// console.log('系统版本', parseInt(str))
// }
wx.startBluetoothDevicesDiscovery({
// services: [device_QHC_UUID],
allowDuplicatesKey: true,
success: function (res) {
console.log('开始扫描',res)
findingDevice(0, function (dev) {
success(dev)
})
},
fail: function (res) {
console.log('扫描报错',res)
console.log(res)
}
})
}
// 搜索到设备
function findingDevice(filter,valueChange){
var response = {};
response.status = '设备已连接,请站上体重秤'
valueChange(response)
console.log('开启搜索监听')
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]
}
// 解析广播数据
var data;
if (wx.getSystemInfoSync().version == '6.5.7'){
data = wx.base64ToArrayBuffer(currentDev.advertisData)
} else {
data = currentDev.advertisData
}
var str = buf2hex(data).toLowerCase()
if (res.deviceId) { // android
str = buf2hex(currentDev.advertisData).toLowerCase()
}
var index = str.indexOf(weighing_scale_type.toLowerCase())
// console.log(str)
if (index == -1){ // 过滤电子秤
// console.log('不是电子秤')
return
}
if (str.indexOf(weighing_scale_close) != -1) {
console.log('设备休眠')
return
}
for(var i = 0;i < devList.length;i++){
var item = devList[i]
if(item.deviceId == currentDev.deviceId){
same = true
var dataStr = str.substr(index + weighing_scale_type.length - 4,16)
// console.log('测量数据', dataStr)
var weightH = dataStr.substr(4,2)
var weightL = dataStr.substr(6,2)
var weightInt = parseInt(weightH.substr(1, 1) + weightL, 16) / 10
// 转成str加上小数点
var wStr = weightInt.toString()
response.weight = weightInt
if (wStr.indexOf('.') == -1){
response.weight = wStr + '.0'
}
console.log('测量数据', weightInt)
if (dataStr.toLowerCase().indexOf(weighing_scale_measure_end) != -1) {
response.status = '测量完成'
if(weightInt > 150){
return
}
valueChange(response)
return
}
// console.log('返回测量数据', dataStr)
response.status = '设备已连接,测量中'
}
}
if(!same){
devList.push(currentDev)
response.devList = devList
response.status = '搜索到设备,正在连接'
}
response.devList = devList
valueChange(response)
})
}
function buf2hex(buffer) { // buffer is an ArrayBuffer
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}
function closeBLE(){
wx.stopBluetoothDevicesDiscovery({
complete: function (res) {
console.log('停止搜索', res)
},
})
wx.closeBluetoothAdapter({
complete: function (res) {
console.log('关闭蓝牙',res)
},
})
}
module.exports = {
openBluetoothAdapter: openBluetoothAdapter,
findingDevice : findingDevice,
closeBLE: closeBLE
}