У меня есть датчик TI. Тег как периферийное устройство, которое передает данные BLE в виде kCBAdvDataManufacturerData. Я хотел бы извлечь разные значения из этих данных в iOS.Извлечь данные из kCBAdvDataManufacturerData on Swift
Я выполнение следующих действий в 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": < 0d00fe05 0c6f32> , "kCBAdvDataLocalName": CLIMBC]
Данные, которые меня интересуют в декодировании, это kCBAdvDataManufacturerData: < 0d00fe05 0c6f32> и отображение каждого поля на экране. В частности, это то, что числа представляют в моем случае:
- 0d00 - TI производитель ID
- FE - идентификатор узла, который я дал
- 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, поэтому я нахожу некоторые трудности. Любой фрагмент кода будет приветствоваться.
В псевдокоде 'вар manData = AdvertisementData [«kCBAdvDataManufacturerData»], как Data' Тогда вы можете позвонить' subdata (с диапазоном: NSRange) ', чтобы разделить ваши' manData' на каждую часть, которую вы хотите, и прочитать их. – Larme