import $store from '@/store' import messages from '@/language/index.js' let searchTimer = null let devicesList = [] // 初始化蓝牙 function openBluetoothAdapter() { let Language = $store.state.setLocale let $t = messages[Language] uni.openBluetoothAdapter({ success: e => { $store.commit("changeBluetoothValue", { bleTipsText: $t.SearchBluetooth, isConnectStatus: 0 }) startBluetoothDeviceDiscovery() }, fail: e => { $store.commit("changeBluetoothValue", { bleTipsText: $t.ConnectionTimeout, isConnectStatus: 1 }) } }); } // 开始搜寻附近的蓝牙外围设备 function startBluetoothDeviceDiscovery() { let Language = $store.state.setLocale let $t = messages[Language] uni.startBluetoothDevicesDiscovery({ allowDuplicatesKey: true, interval: 200, success: res => { onBluetoothDeviceFound(); searchTimer = setTimeout(() => { uni.stopBluetoothDevicesDiscovery() if (!devicesList.length) { clearTimeout(searchTimer); $store.commit("changeBluetoothValue", { bleTipsText: $t.ConnectionTimeout, isConnectStatus: 1 }); } }, 30000); // 30秒超时 }, fail: res => { $store.commit("changeBluetoothValue", { bleTipsText: $t.ConnectionTimeout, isConnectStatus: 1 }) } }); } /** * 发现外围设备 */ function onBluetoothDeviceFound() { uni.onBluetoothDeviceFound(res => { res.devices.forEach(device => { console.log("name", device.name) if (device.name.indexOf('PC-C02Pro') != -1 || (device.localName && device.localName.indexOf( 'PC-C02Pro') != -1)) { clearTimeout(searchTimer); stopBluetoothDevicesDiscovery() Bluetoothfilter(device.deviceId) return } }) }); } // 过滤蓝牙 function Bluetoothfilter(device_id) { const foundDevices = devicesList const idx = inArray(foundDevices, "deviceId", device_id) if (idx === -1) { devicesList.push(device_id); connectDevice(device_id) } } //连接设备 function connectDevice(device_id) { uni.createBLEConnection({ deviceId: device_id, success: res => { setTimeout(function() { getBLEDeviceServices(device_id) }, 200) }, fail: res => { console.log("连接失败,点击重新连接", res); } }); } /** * 获取设备的UUID */ function getBLEDeviceServices(device_id) { let serviceList = []; uni.getBLEDeviceServices({ deviceId: device_id, success: res => { console.log("获取设备的UUID成功", res) serviceList = res.services; for (let i = 0; i < serviceList.length; i++) { let service = serviceList[i]; if (service.uuid.indexOf("FFF0") != -1) { stopBluetoothDevicesDiscovery() getBLEDeviceCharacteristics(device_id, service.uuid); break; } } }, fail: res => { console.log('获取设备的UUID失败:', res) } }); } /** * 获取指定服务的特征值 */ function getBLEDeviceCharacteristics(deviceId, serviceId) { let characteristicsList = []; uni.getBLEDeviceCharacteristics({ deviceId: deviceId, serviceId: serviceId, success: res => { let write, notify for (let i = 0; i < res.characteristics.length; i++) { let item = res.characteristics[i]; if (item.uuid.indexOf('0000FFF2') != -1) { write = item.uuid } else if (item.uuid.indexOf('0000FFF1') != -1) { notify = item.uuid } } getBLECharacteristicValueChange(deviceId, serviceId, notify, write) }, fail: res => { console.log('获取特征值失败:', JSON.stringify(res)) } }) } function getBLECharacteristicValueChange(deviceId, serviceId, notify, write) { let that = this let Language = $store.state.setLocale let $t = messages[Language] uni.notifyBLECharacteristicValueChange({ deviceId: deviceId, serviceId: serviceId, characteristicId: notify, state: true, success: () => { $store.commit('changeBluetoothValue', { deviceId: deviceId, serviceId: serviceId, notify: notify, write: write, unit: "g", countWeight: "", bleTipsText: $t.Measuring, isConnectStatus: 0 }) const units = ['kg', 'g', 'st:lb', 'lb', 'g', 'ml', 'Waterml', 'milkml', 'oz', 'floz', 'lboz' ] uni.onBLECharacteristicValueChange(function(res) { const value = res.value const dataView = new DataView(value) const header = dataView.getUint8(0) // MCU主动上报数据 if (header === 0xC7) { const cmd = dataView.getUint8(2) switch (cmd) { case 0x02: const statusByte = dataView.getUint8(4) const isNegative = !!(statusByte & 0x80) // 最高位表示正负 const statusType = statusByte & 0x0F // 状态类型 // 组合24位重量值 (大端序) const weightValue = (dataView.getUint8(5) << 16) | (dataView.getUint8(6) << 8) | dataView.getUint8(7) // 精度和单位 const unitByte = dataView.getUint8(8) const precision = (unitByte & 0xF0) >> 4 // 高4位精度 const unitIndex = unitByte & 0x0F // 低4位单位 // 计算实际重量 let finalWeight = weightValue / Math.pow(10, precision) if (isNegative) finalWeight = -finalWeight $store.commit("changeBluetoothValue", { countWeight: finalWeight, unit: units[unitIndex], }) break case 0x03: break } } }) }, fail: res => { console.log('获取特征值失败:', JSON.stringify(res)) } }) } function inArray(arr, key, val) { if (!arr || !arr.length || typeof arr != 'object' || !Array.isArray(arr)) { return -1 } for (let i = 0; i < arr.length; i++) { if (!key) { if (arr[i] == val) { return i } } else if (arr[i][key] === val) { return i } } return -1; } function ab2hex(buffer, split) { var hexArr = Array.prototype.map.call( new Uint8Array(buffer), function(bit) { return ('00' + bit.toString(16)).slice(-2) } ) return hexArr.join(split); } /** * 断开蓝牙模块 */ function closeBluetoothAdapter() { uni.closeBluetoothAdapter({ success: res => { $store.commit("changeBluetoothValue", { deviceId: "", serviceId: "", notify: "", write: "", unit: "g", countWeight: '', }) console.log('蓝牙模块关闭成功'); } }) } /** * 断开蓝牙连接 */ function closeBLEConnection(deviceId) { uni.closeBLEConnection({ deviceId: deviceId, success: res => { console.log('断开蓝牙连接成功'); } }); } // 监听蓝牙连接状态 function onBLEConnectionStateChange() { let Language = $store.state.setLocale let $t = messages[Language] uni.onBLEConnectionStateChange(function(res) { console.log("监听蓝牙连接状态", res.connected) if (!res.connected) { $store.commit("changeBluetoothValue", { bleTipsText: $t.ConnectionTimeout, isConnectStatus: 1 }) closeBLEConnection() closeBluetoothAdapter() } $store.commit("changeBluetooth", res.connected); }) } /** * 停止搜索蓝牙设备 */ function stopBluetoothDevicesDiscovery() { uni.stopBluetoothDevicesDiscovery({ success: e => { console.log("停止搜索蓝牙设备", e) }, }); } export default { ab2hex, inArray, openBluetoothAdapter, startBluetoothDeviceDiscovery, onBluetoothDeviceFound, Bluetoothfilter, connectDevice, getBLEDeviceServices, getBLEDeviceCharacteristics, closeBluetoothAdapter, closeBLEConnection, getBLECharacteristicValueChange, onBLEConnectionStateChange, stopBluetoothDevicesDiscovery }