kCBAdvDataManufacturerData

kCBAdvDataManufacturerData

我有一个TI传感器标签作为外围设备,它以kCBAdvDataManufacturerData的形式广播BLE数据。我想从iOS中的这些数据中提取不同的值。

我正在Swift中执行以下操作:

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
     for (index, foundPeripheral) in peripherals.enumerated(){
         if foundPeripheral.peripheral?.identifier == peripheral.identifier{
             peripherals[index].lastRSSI = RSSI
             print("AdvertisementData:\(advertisementData)")
             return

         }
     }

     let isConnectable = advertisementData["kCBAdvDataIsConnectable"] as! Bool
     let displayPeripheral = DisplayPeripheral(peripheral: peripheral, lastRSSI: RSSI, isConnectable: isConnectable)
     peripherals.append(displayPeripheral)
     tableView.reloadData()
    }
}

这就是我在控制台中看到的内容:

AdvertisementData:[“kCBAdvDataIsConnectable”:0,“kCBAdvDataManufacturerData”:,“kCBAdvDataLocalName”:CLIMBC]

我对解码感兴趣的数据是kCBAdvDataManufacturerData:并在屏幕上显示每个字段。
具体来说,这就是我所代表的数字:
  • 0d00-TI制造商ID
  • fe-我给了
  • 的节点ID
  • 05-节点的状态(保持不变的内容
  • c6f-传感器标签电池电压
  • 32-是BLE数据包计数器。

  • 在Android中,我可以进行以下解码:
    private static String getNodeIdFromRawPacket(byte[] manufSpecField) {
        if(manufSpecField != null && manufSpecField.length > 1) {
            return String.format("%02X", manufSpecField[0]);
        }else{
            return null;
        }
    }
    private static int getNodeBatteryVoltageFromRawPacket(byte[] manufSpecField){
        if(manufSpecField != null && manufSpecField.length > 4) {
            return (((((int) manufSpecField[manufSpecField.length - 3]) << 24) >>> 24) << 8) + ((((int) manufSpecField[manufSpecField.length - 2]) << 24) >>> 24);
        }else{
            return 0;
        }
    }
    
    private byte[] extractManufacturerSpecificData(byte[] scanRecord, int manufacturer_id){
    
         if(scanRecord != null) {
             int ptr = 0;
             while (ptr < scanRecord.length && scanRecord[ptr] != 0) {
                 int field_length = scanRecord[ptr];
                 if (scanRecord[ptr + 1] == (byte) (0xFF)) { //this is true when the manufacturer specific data field has been found
                     if (((scanRecord[ptr + 3] << 8) + scanRecord[ptr + 2]) == manufacturer_id) {
                        byte[] manufacturerSpecificData = new byte[field_length - 3];
                         System.arraycopy(scanRecord, ptr + 4, manufacturerSpecificData, 0, field_length - 3);
                         return manufacturerSpecificData;
                     }
                 }
                 ptr += (field_length + 1);
             }
             return null;
         }else{
            return null;
         }
      }
    };
    

    我如何才能做到这一点?我是Swift的新手,这就是为什么我遇到一些困难。任何代码段都将受到欢迎。

    最佳答案

    看到控制台的输出,advertisementData["kCBAdvDataManufacturerData"]似乎是一个包含7个字节的NSData。您可以通过Swift Data轻松访问它,并且Data中的每个字节都可以使用下标访问:

    if let manufacturerData = advertisementData["kCBAdvDataManufacturerData"] as? Data {
        assert(manufacturerData.count >= 7)
        //0d00 - TI manufacturer ID
        //Constructing 2-byte data as little endian (as TI's manufacturer ID is 000D)
        let manufactureID = UInt16(manufacturerData[0]) + UInt16(manufacturerData[1]) << 8
        print(String(format: "%04X", manufactureID)) //->000D
        //fe - the node ID that I have given
        let nodeID = manufacturerData[2]
        print(String(format: "%02X", nodeID)) //->FE
        //05 - state of the node (something that remains constant
        let state = manufacturerData[3]
        print(String(format: "%02X", state)) //->05
        //c6f - is the sensor tag battery voltage
        //Constructing 2-byte data as big endian (as shown in the Java code)
        let batteryVoltage = UInt16(manufacturerData[4]) << 8 + UInt16(manufacturerData[5])
        print(String(format: "%04X", batteryVoltage)) //->0C6F
        //32- is the BLE packet counter.
        let packetCounter = manufacturerData[6]
        print(String(format: "%02X", packetCounter)) //->32
    }
    

    关于ios - 在Swift上从kCBAdvDataManufacturerData提取数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42140636/

    10-10 16:40