RedBear Beacon。如何使用蓝牙扫描获取UUID?

时间:2015-02-20 15:23:31

标签: android bluetooth-lowenergy ibeacon ibeacon-android android-ibeacon

我在Android应用程序中使用了一些Red Bear Beacons(在Android中被称为bluetooth设备)并且我希望将UUID存储在信标中,就像它们在{{3中所做的那样}}。 使用their native app我无法得到它。

我尝试过:

  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][....]
          };
      };
    
  3. 这些结果420903bf01004915e79610a7f5d060b0b0702980-a295-a8ab-f734-031a98a512de都不是我想要的,应该是这样的:(来自RedBear BeaconTool app的截图) enter image description here

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

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

    OR

    任何人都可以告诉我E2C56DB5-DFFB-48D2-B060-D0F5A71096E0b0702980-a295-a8ab-f734-031a98a512de是否表示以不同方式编码的相同内容,如果是,可以如何转换?

    希望我很清楚,请帮助我;任何帮助将受到高度赞赏!感谢。

2 个答案:

答案 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.