我現在有一個問題,因爲我試圖從我的Onyx iBeacon讀取tx-Power。我已閱讀了多個建議,並在互聯網上嘗試了很多代碼,但我仍然無法弄清楚。Android:iBeacon - 閱讀其廣告(例如txPower)
我正在使用android棒棒糖,並嘗試從https://github.com/devunwired/accessory-samples/tree/master/BluetoothGatt 的iBeacon教程中提取BLUETOOTH_THERM_SERVICE
的藍牙應用程序。
我發現了發射機功率兩個值從廣告: Bluetooth LE TX Power reading
0x1804
及其特點0x2A07
,所以我適應了包裹UUID與0x1804
過濾我ScanResults:如上所述
public static final ParcelUuid THERM_SERVICE = ParcelUuid.fromString("00001809-0000-1000-8000-00805f9b34fb");
public static final ParcelUuid TX_POWER_SERVICE = ParcelUuid.fromString("00001804-0000-1000-8000-00805F9B34FB");
public static final ParcelUuid ONYX_STANDARD_SERVICE = ParcelUuid.fromString("0000180a-0000-1000-8000-00805f9b34fb");
在教程中:
byte[] data = record.getServiceData(TX_POWER_SERVICE);
應該存儲一個字節數組,但它總是返回null!存儲字節數組,但我認爲它存儲了整個記錄的唯一的事情是:
byte[] data = record.getServiceData(ONYX_STANDARD_SERVICE);
試圖移動並使用我可以ONYX_STANDARD_SERVICE
獲取數據,我可以看到一個scanResult:
onScanResult() - ScanResult{mDevice=78:A5:04:07:AE:96, mScanRecord=ScanRecord [mAdvertiseFlags=6, mServiceUuids=null, mManufacturerSpecificData={76=[2, 21, 32, -54, -24, -96, -87, -49, 17, -29, -91, -30, 8, 0, 32, 12, -102, 102, 0, 7, -82, -106, -78]}, mServiceData={0000180a-0000-1000-8000-00805f9b34fb=[120, -91, 4, 7, -82, -106, -78, 32, -54, -24, -96, 0, 7, -82, -106]}, mTxPowerLevel=-2147483648, mDeviceName=OnyxBeacon], mRssi=-63, mTimestampNanos=174691272168825}
我覺得我的紀錄的重要組成部分是:
mServiceData={0000180a-0000-1000-8000-00805f9b34fb=[120, -91, 4, 7, -82, -106, -78, 32, -54, -24, -96, 0, 7, -82, -106]}
如何從這個ServiceData提取我的TXPOWER價值?我檢查了幾個應用程序,我的TX功率是-78。
通過使用ONYX_STANDARD_SERVICE檢查結果,我可以通過scanResult[6] = -78
得到該值。
這是做到這一點的正確方法,如果是的話,爲什麼?
我也發現了這個問題,即另一個值提到從記錄讀一些有趣的例子:
如果你看看這裏,你會發現代碼:
private static final int DATA_TYPE_TX_POWER_LEVEL = 0x0A;
其中哪一個(0x1804
,0x2A07
,0x0A
)是正確的?
這也將是不錯,但有人可以解釋我沒有必要從如何獲得THERM_SERVICE
工程示例代碼:
private float parseTemp(byte[] serviceData) {
/*
* Temperature data is two bytes, and precision is 0.5degC.
* LSB contains temperature whole number
* MSB contains a bit flag noting if fractional part exists
*/
float temp = (serviceData[0] & 0xFF);
if ((serviceData[1] & 0x80) != 0) {
temp += 0.5f;
}
return temp;
}
請幫我在閱讀廣告數據和提取發射機功率。
非常感謝你的榜樣! 你能解釋一下主要和次要代碼嗎? 就像'&0xff'用'scanData [25]'做的那樣,爲什麼你用'0x100'來乘它呢? 我想事後我可以理解一切方式,即使你已經幫助了我很多:) – BigPenguin
主要和次要無符號短整型,所以他們有2個字節的長度。 'scanData'是一個字節數組,所以我們必須從兩個字節構造一個'unsigned short'。主要值字節位於'scanData [25]'和'scanData [26]',其中'scanData [25]'是最高有效字節,'scanData [26]'是最低有效字節。 '&0xff'確保字節的掩碼,以確保只使用最後一個字節。 * 0x100等同於「<< 8」。因此,位置25處的字節向左移動8位,爲位置26處的字節留出空間。將這些值相加後得出主要的無符號短值。 – istirbu