J'ai un capteur TI Tag comme 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.
J'exécute ce qui suit en 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 qui m'intéressent pour le décodage sont kCBAdvDataManufacturerData : <0d00fe05 0c6f32> et afficher chaque champ à l'écran. Plus précisément, voici ce que représentent les chiffres dans mon cas :
- 0d00 - ID du fabricant de TI
- fe - l'ID du noeud que j'ai donné
- 05 - état du nœud (quelque chose qui reste constant)
- c6f - est la tension de la batterie de la balise du capteur
- 32- est le compteur de paquets BLE.
Dans Android, je suis capable de 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 puis-je y parvenir exactement ? Je suis novice en Swift, c'est pourquoi je rencontre quelques difficultés. Tout extrait de code sera le bienvenu.