0

我在 Android 应用程序中使用了一些Red Bear Beacons(在 Android 中作为bluetooth设备收费),我想将 UUID 存储在信标中,就像它们在本机应用程序中一样。使用他们提供的样本我无法得到它。

我试过的:

  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][....]
          };
      };
    

这些结果都不420903bf01004915e79610a7f5d060b0b0702980-a295-a8ab-f734-031a98a512de我要找的,应该是这样的:(来自RedBear BeaconTool应用程序的屏幕截图) 在此处输入图像描述

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

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

或者

谁能告诉我是否E2C56DB5-DFFB-48D2-B060-D0F5A71096E0b0702980-a295-a8ab-f734-031a98a512de代表以不同方式编码的同一事物,如果是,如何转换?

希望我足够清楚,请帮助我;任何帮助将不胜感激!谢谢。

4

2 回答 2

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”即可。

于 2015-02-22T21:51:51.887 回答
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.
于 2019-11-11T12:33:17.923 回答