美文网首页js css html
CoreBluetooth系列教程(三):Mac地址的获取及写入

CoreBluetooth系列教程(三):Mac地址的获取及写入

作者: 卢叁 | 来源:发表于2022-07-28 15:23 被阅读0次

Mac地址的获取

iOS7之后,苹果不支持获取Mac地址,只能用UUID来标识设备。若想获得Mac地址,可以跟硬件工程师沟通,增加一个指令获取,也可以让硬件工程师把Mac地址写到广播包里,在扫描的时候获取Mac地址,如下所示:

 func centralManager(_ central: CBCentralManager,
                        didDiscover peripheral: CBPeripheral,
                        advertisementData: [String: Any],
                        rssi RSSI: NSNumber)
{
// 在 advertisementData里读取,获取的manufacturerData是二进制数据,需要转换成UInt8数据,然后根据约定的格式解析成Mac地址。
let data = advertisementData["kCBAdvDataManufacturerData"] as? Data {             
  let macString = BlueUtil.getIOSMacString(data:[UInt8](manufacturerData) )
// FD:00:EA:00:85:9C
}

写入数据的处理

调用writeValue写入指令,可以看到,需要把指令转换成Data数据。譬如[217, 162, 3, 25, 188, 153](一般来讲第一位是指令头,倒数第二位是校验码,各家公司不一样,根据实际情况,不多叙述)。

 open func writeValue(_ data: Data, for characteristic: CBCharacteristic, type: CBCharacteristicWriteType)
// 对应的回调代理
 @objc func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
}

跟硬件交互涉及到大小端的问题。大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,有兴趣的具体见大小端

    // 数据转换
   private func converSendData(send :[Int]) -> Data {
        
        var result = Data()
        for i in send {
            var bts = [i]
            let data = Data(bytes: &bts, count: 1)
            result.append(data)
        }
        return result
    }

需要注意的是使用Data(bytes: UnsafeRawPointer, count: Int)时,一定要注意传入的count,最后生成的二进制数据要符合硬件的要求(蓝牙一次能写入的最大数据为20bytes),否则写入失败。

相关文章

网友评论

    本文标题:CoreBluetooth系列教程(三):Mac地址的获取及写入

    本文链接:https://www.haomeiwen.com/subject/cbkxwrtx.html