我有一个 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()
}
}
这是我在控制台中看到的:
广告数据:[“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 新手,这就是为什么我发现一些困难。任何代码片段都将受到欢迎。