红熊信标。如何使用蓝牙扫描获取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 我还没能得到它。

我尝试过的:

  1. 第一种方法

     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
                              }
                          }
                      });
                  }
              };
    
  2. 第二种方法

    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 这些结果 420903bf01004915e79610a7f5d060b0b0702980-a295-a8ab-f734-031a98a512de 是我要找的,应该是这样的:(来自 RedBear BeaconToolapp 的屏幕截图)

在对我的信标进行一些测试后,我可以看到这个 UUID 以某种方式与我的 mBluetoothLeScanner -> b0702980-a295-a8ab-f734-031a98a512de 找到的 UUID 相关联,这让我认为它是相同的但编码(显示) 以不同的方式。

有没有人使用过 redbear 信标,可以告诉我如何在我的应用程序中获取信标的 UUID (E2C56DB5-DFFB-48D2-B060-D0F5A71096E0)?

谁能告诉我 E2C56DB5-DFFB-48D2-B060-D0F5A71096E0b0702980-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.