红熊信标。如何使用蓝牙扫描获取UUID?
RedBear Beacon. How to get UUID using Bluetooth scan?
我正在使用一些 Red Bear Beacons (that in Android are charged as bluetooth
devices) into an Android application and I want to get the UUID stored in the beacon, as they do in their native app。
使用 samples they provide 我还没能得到它。
我尝试过的:
第一种方法
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][....]
};
};
None 这些结果 420903bf01004915e79610a7f5d060b0
或 b0702980-a295-a8ab-f734-031a98a512de
是我要找的,应该是这样的:(来自 RedBear BeaconTool
app 的屏幕截图)
在对我的信标进行一些测试后,我可以看到这个 UUID 以某种方式与我的 mBluetoothLeScanner
-> b0702980-a295-a8ab-f734-031a98a512de
找到的 UUID 相关联,这让我认为它是相同的但编码(显示) 以不同的方式。
有没有人使用过 redbear
信标,可以告诉我如何在我的应用程序中获取信标的 UUID
(E2C56DB5-DFFB-48D2-B060-D0F5A71096E0)?
或
谁能告诉我 E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
和 b0702980-a295-a8ab-f734-031a98a512de
是否代表以不同方式编码的同一事物?如果是,如何转换?
希望我说得够清楚,请帮助我;任何帮助将不胜感激!谢谢。
了解信标接近 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 布局或 "profile".
轻松获得。
另外,如果你想做的不仅仅是像这样的简单处理,你可以考虑使用像我的 Android Beacon Library 这样的全功能库。虽然它仅适用于开箱即用的 AltBeacons,但如果您知道信标布局,则使用任何专有信标类型进行配置都是微不足道的。只需 Google 搜索 "setBeaconLayout"。
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.
我正在使用一些 Red Bear Beacons (that in Android are charged as bluetooth
devices) into an Android application and I want to get the UUID stored in the beacon, as they do in their native app。
使用 samples they provide 我还没能得到它。
我尝试过的:
第一种方法
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][....] }; };
None 这些结果 420903bf01004915e79610a7f5d060b0
或 b0702980-a295-a8ab-f734-031a98a512de
是我要找的,应该是这样的:(来自 RedBear BeaconTool
app 的屏幕截图)
在对我的信标进行一些测试后,我可以看到这个 UUID 以某种方式与我的 mBluetoothLeScanner
-> b0702980-a295-a8ab-f734-031a98a512de
找到的 UUID 相关联,这让我认为它是相同的但编码(显示) 以不同的方式。
有没有人使用过 redbear
信标,可以告诉我如何在我的应用程序中获取信标的 UUID
(E2C56DB5-DFFB-48D2-B060-D0F5A71096E0)?
或
谁能告诉我 E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
和 b0702980-a295-a8ab-f734-031a98a512de
是否代表以不同方式编码的同一事物?如果是,如何转换?
希望我说得够清楚,请帮助我;任何帮助将不胜感激!谢谢。
了解信标接近 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 布局或 "profile".
轻松获得。另外,如果你想做的不仅仅是像这样的简单处理,你可以考虑使用像我的 Android Beacon Library 这样的全功能库。虽然它仅适用于开箱即用的 AltBeacons,但如果您知道信标布局,则使用任何专有信标类型进行配置都是微不足道的。只需 Google 搜索 "setBeaconLayout"。
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.