У меня есть простое приложение для iOS, которое отображает близость маяков Bluetooth LE, которые он обнаруживает, используя такие выражения, как "немедленный", "близкий" и т.д., и мне нужно написать что-то подобное на Android.
Я следил за учебником в разработчике Android, и я могу перечислить обнаруженные устройства и теперь хочу оценить расстояние/близость - вот где это становится проблемой. Согласно эта SO-нить, это всего лишь несколько математических вычислений. Однако они требуют, чтобы я предоставлял значение txPower.
В соответствии с этот учебник от Dave Smith (и перекрестная ссылка с этим Инструкция Bluetooth SIG), он должен быть передан маяковыми устройствами как "структура AD" типа 0x0A
. Итак, что я делаю, это проанализировать структуры AD и искать полезную нагрузку той, которая соответствует типу.
Проблема: У меня есть 4 маяка - 2 оценки и 2 приложения. Оценки вообще не транслируют txPower, и приложени передают их как 0.
Есть ли что-то, что мне не хватает здесь? Кажется, что приложение iOS обрабатывает все без проблем, но с помощью SDK iOS он делает это за кулисами, поэтому я не уверен, как производить то же самое или подобное поведение. Есть ли другой способ решить мою проблему?
Если вы хотите взглянуть на код, который я использую для анализа структур AD, он взят из вышеупомянутого гитаба Dave Smith и может быть найден . Единственное изменение, которое я сделал для этого класса, это добавить следующий метод:
public byte[] getData() {
return mData;
}
И вот как я обрабатываю обратный вызов из сканирования:
// Prepare the callback for BLE device scan
this.leScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
if (!deviceList.contains(device)) {
MyService.this.deviceList.add(device);
Log.e("Test", "Device: " + device.getName());
List<AdRecord> adRecords = AdRecord.parseScanRecord(scanRecord);
for (AdRecord adRecord : adRecords) {
if (adRecord.getType() == AdRecord.TYPE_TRANSMITPOWER) {
Log.e("Test", "size of payload: " + adRecord.getData().length);
Log.e("Test", "payload: " + Byte.toString(adRecord.getData()[0]));
}
}
}
}
};
И что я вижу в консоли:
04-01 11:33:35.864: E/Test(15061): Device: estimote
04-01 11:33:36.304: E/Test(15061): Device: estimote
04-01 11:33:36.475: E/Test(15061): Device: n86
04-01 11:33:36.475: E/Test(15061): size of payload: 1
04-01 11:33:36.475: E/Test(15061): payload: 0
04-01 11:33:36.525: E/Test(15061): Device: f79
04-01 11:33:36.525: E/Test(15061): size of payload: 1
04-01 11:33:36.525: E/Test(15061): payload: 0