项目 | Android | iOS |
---|---|---|
deviceId | 返回真实 Mac 地址 | 返回 UUID,需特殊处理 |
获取 Mac | 可直接使用 | 连接后监听 / 广播包解析 |
广播数据 | 可用,可加密携带 Mac 地址 | 推荐使用,用于连接前标识设备 |
加密建议 | AES 对称加密 / CRC16 校验 | 同 Android,建议一致处理方式 |
1Byte(功能ID) + 6Byte(设备ID) + 1Byte(版本号) + nByte(功能内容)服务端回应消息体格式:
1Byte(功能ID) + nByte(功能内容)二、Android 与 iOS 的差异与解决方案
.Apple 这么设计是为 保护用户隐私,避免开发者追踪设备或用户。
uni.onBLECharacteristicValueChange((res) => { const value = ab2hex(res.value); if (value.startsWith("01")) { const mac = value.slice(2, 14); // 截取6字节mac uni.setStorageSync('deviceMac', mac) // 存储mac用于后续通讯,有用 vuex 或者 pinia 等其他方法也可以 await this.send('11'); // 应答设备防止一直上报 } });方法二:通过广播数据 (advertisData) 提取 Mac 地址
import CryptoJS from "crypto-js"; function decryptMac(cipherHex) { const key = CryptoJS.enc.Hex.parse("00112233445566778899aabbccddeeff"); // 16字节密钥 const iv = CryptoJS.enc.Hex.parse("00000000000000000000000000000000"); // 默认全0 IV const encrypted = CryptoJS.enc.Hex.parse(cipherHex); const encryptedBase64 = CryptoJS.enc.Base64.stringify(encrypted); const decrypted = CryptoJS.AES.decrypt(encryptedBase64, key, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); return decrypted.toString(CryptoJS.enc.Hex); } uni.startBluetoothDevicesDiscovery({ success() { uni.onBluetoothDeviceFound((device) => { const advertisData = device.advertisData; const raw = ab2hex(advertisData); //堆代码 duidaima.com const encryptedMac = raw.slice(10, 42); // 示例中为16字节加密 const mac = decryptMac(encryptedMac); console.log("解密出的Mac地址:", mac); }); }, });三、通讯流程简单示意
async function connectBLE(device) { await uni.createBLEConnection({ deviceId: device.deviceId }); // 监听特征值变化 uni.onBLECharacteristicValueChange((res) => handleResponse(res)); // 启用 notify 监听 await uni.notifyBLECharacteristicValueChange({ deviceId: device.deviceId, serviceId: serviceUUID, characteristicId: notifyUUID, state: true, }); // 发送数据 const platform = uni.getSystemInfoSync().platform; const macAddress = uni.getStorageSync("deviceMac"); const payload = buildPayload( "01", platform == "ios" ? macAddress : device.deviceId, "01", content ); await uni.writeBLECharacteristicValue({ deviceId: device.deviceId, serviceId: serviceUUID, characteristicId: writeUUID, value: str2ab(payload), }); }四、安全建议
五、总结
项目
Android
iOS
deviceId
返回真实 Mac 地址
返回 UUID,需特殊处理
获取 Mac
可直接使用
连接后监听 / 广播包解析
广播数据
可用,可加密携带 Mac 地址
推荐使用,用于连接前标识设备
加密建议
AES 对称加密 / CRC16 校验
同 Android,建议一致处理方式