我在Android应用程序中使用了一些Red Bear Beacons(在Android中被称为bluetooth
设备)并且我希望将UUID存储在信标中,就像它们在{{3中所做的那样}}。
使用their native app我无法得到它。
我尝试过:
第一种方法
BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = mBluetoothManager.getAdapter(); mBluetoothAdapter.startLeScan(mLeScanCallback); BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) { runOnUiThread(new Runnable() { @Override public void run() { if (mDevice.indexOf(device) == -1){ mDevice.add(device); byte[] serviceUuidBytes = new byte[16]; String serviceUuid = ""; for (int i = 32, j = 0; i >= 17; i--, j++) { serviceUuidBytes[j] = scanRecord[i]; } serviceUuid = bytesToHex(serviceUuidBytes); Log.i(TAG, "UUID is: " + serviceUuid); //This is the result 420903bf01004915e79610a7f5d060b0 } } }); } };
第二种方法
BluetoothLeScanner mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner(); mBluetoothLeScanner.startScan(mScanCallback); ScanCallback mScanCallback = new ScanCallback() { public void onScanResult(int callbackType, android.bluetooth.le.ScanResult result) { Log.i(TAG, "scan result" + result.toString()); //this contains something like [...] mServiceUuids=[b0702980-a295-a8ab-f734-031a98a512de][....] }; };
这些结果420903bf01004915e79610a7f5d060b0
或b0702980-a295-a8ab-f734-031a98a512de
都不是我想要的,应该是这样的:(来自RedBear BeaconTool
app的截图)
在使用我的信标进行一些测试后,我可以看到这个UUID与我的mBluetoothLeScanner
- >找到的UUID有某种关联。 b0702980-a295-a8ab-f734-031a98a512de
让我觉得它是相同的,但以不同的方式编码(显示)。
有没有人使用redbear
信标,可以告诉我如何在我的应用中获取信标UUID
(E2C56DB5-DFFB-48D2-B060-D0F5A71096E0)?
OR
任何人都可以告诉我E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
和b0702980-a295-a8ab-f734-031a98a512de
是否表示以不同方式编码的相同内容,如果是,可以如何转换?
希望我很清楚,请帮助我;任何帮助将受到高度赞赏!感谢。
答案 0 :(得分:3)
了解信标接近UUID与蓝牙GATT服务UUID不同。这就是你展示的第二个样本不起作用的原因。您需要做的是从广告的字节中解析出Proximity UUID,正如您在第一种方法中尝试的那样。但是在这种方法中,这段代码存在问题
for (int i = 32, j = 0; i >= 17; i--, j++) {
serviceUuidBytes[j] = scanRecord[i];
}
首先,您从扫描中读取的字节不是相反的顺序,因此您不应该减小i变量。您需要知道Proximity UUID和其他字段的偏移量才能正确执行此操作。这是专有的Apple信息,但可以通过在Google上搜索iBeacon布局或“个人资料”来获取。
此外,如果您想要做的不仅仅是这样的简单处理,您可以考虑使用像Android Beacon Library这样的全功能库。虽然它只适用于开箱即用的AltBeacons,但如果您知道信标布局,则使用任何专有信标类型进行配置是微不足道的。只需在Google上搜索“setBeaconLayout”。
答案 1 :(得分:0)
String uuid = IntToHex2(scanRecord[6] & 0xff) + IntToHex2(scanRecord[7] & 0xff) + IntToHex2(scanRecord[8] & 0xff) + IntToHex2(scanRecord[9] & 0xff)
+ "-" + IntToHex2(scanRecord[10] & 0xff) + IntToHex2(scanRecord[11] & 0xff)
+ "-" + IntToHex2(scanRecord[12] & 0xff) + IntToHex2(scanRecord[13] & 0xff)
+ "-" + IntToHex2(scanRecord[14] & 0xff) + IntToHex2(scanRecord[15] & 0xff)
+ "-" + IntToHex2(scanRecord[16] & 0xff) + IntToHex2(scanRecord[17] & 0xff)
+ IntToHex2(scanRecord[18] & 0xff) + IntToHex2(scanRecord[19] & 0xff)
+ IntToHex2(scanRecord[20] & 0xff) + IntToHex2(scanRecord[21] & 0xff);
public String IntToHex2(int i) {
char hex_2[] = {Character.forDigit((i >> 4) & 0x0f, 16), Character.forDigit(i & 0x0f, 16)};
String hex_2_str = new String(hex_2);
return hex_2_str.toUpperCase();
}
// This should work out for you.