J'ai une étiquette de capteur TI en tant que périphérique qui diffuse des données BLE sous la forme de kCBAdvDataManufacturerData. Je voudrais extraire différentes valeurs de ces données dans iOS.Extraire des données de kCBAdvDataManufacturerData sur Swift
J'exécute ce qui suit à 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()
}
}
Et voici ce que je vois dans la console:
AdvertisementData: [ "kCBAdvDataIsConnectable": 0, "kCBAdvDataManufacturerData": < 0d00fe05 0c6f32> , "kCBAdvDataLocalName": CLIMBC]
Les données que je suis intéressé par le décodage sont les suivantes: kCBAdvDataManufacturerData: < 0d00fe05 0c6f32> et l'affichage de chaque champ à l'écran. Plus précisément, c'est ce que les chiffres représentent dans mon cas:
- 0d00 - TI fabricant ID
- fe - l'ID de nœud que j'ai donné
- 05 - état du nœud (quelque chose qui reste constante
- C6F - est la tension de la batterie d'étiquette de détection
- 32- est le compteur de paquets BLE
Dans Android je peux. décoder comme suit:
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;
}
}
};
Comment exactement puis-je y parvenir? Je suis nouveau à Swift c'est pourquoi je trouve quelques difficultés. Tout extrait de code sera le bienvenu.
Dans le code pseudo 'var mandata = AdvertisementData [ « kCBAdvDataManufacturerData »] comme data' Ensuite, vous pouvez appeler' sous-données (avec range: NSRange) 'diviser votre' manData' en chaque partie que vous voulez, et les lire. – Larme