我有一个TI传感器标签作为外设,以kCBAdvDataManufacturerData的形式广播BLE数据。我想从iOS中的这些数据中提取不同的值。从Swift提取kCBAdvDataManufacturerData的数据
我执行斯威夫特如下:
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”:< 0d00fe05 0c6f32> ,“kCBAdvDataLocalName”:CLIMBC]
我感兴趣解码的数据是kCBAdvDataManufacturerData:< 0d00fe05 0c6f32>并在屏幕上显示每个字段。 具体而言,这是个什么数字在我的情况表示:
- 0d00 - TI制造商ID
- FE - 我已经给
- 05节点ID - 节点的东西的(状态保持不变
- 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很陌生,这就是为什么我发现一些困难。任何代码片段将是最受欢迎的。
在伪代码'VAR manData = AdvertisementData [“kCBAdvDataManufacturerData”]作为Data'然后就可以调用'子数据(范围:NSRange)'将你的manData分成你想要的每个部分,然后读取它们。 – Larme