私は、kCBAdvDataManufacturerDataの形式でBLEデータをブロードキャストする周辺機器としてTIセンサータグを持っています。私は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パケットカウンタであるセンサータグのバッテリ電圧であるアンドロイドで
私がすることができますよ次のようにデコードしてください:
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;
}
}
};
どのようにこれを達成できますか?私はスウィフトには新しいので、私はいくつかの困難を見つけるのです。すべてのコードスニペットが大歓迎です。ここで
擬似コード 'VAR manData = AdvertisementData [「kCBAdvDataManufacturerData」]でData'としてその後、あなたは'サブデータを呼び出すことができます(範囲:NSRange) 'を使って' manData'をあなたが望む各部分に分割し、それらを読むことができます。 – Larme