当前位置: 首页 > 知识库问答 >
问题:

Android系统中蓝牙低能耗下的私有地址与公共地址

韦高格
2023-03-14

蓝牙低能耗设备由其地址唯一标识(在Android API中,他们称之为MAC地址,并将其表示为冒号分隔的十六进制值,如11:AA:22:BB:33:CC)。

但是要唯一地标识BLE地址,您需要知道它是公共地址还是私人地址。本质上,识别一个地址需要49位,而不是48位。

随机地址可以是静态随机地址、不可解析私有地址或可解析私有地址,这些类型在两个最高有效字节(分别为11、00和10)中由位模式分隔。

Valid Bluetooth hardware addresses must be upper case, in a format such as
"00:11:22:33:AA:BB". The helper checkBluetoothAddress(String) is available
to validate a Bluetooth address.

A BluetoothDevice will always be returned for a valid hardware address,
even if this adapter has never seen that device.

所以你给这个函数48位数据,没有办法告诉它地址是公共的还是私人的。这意味着设备不是唯一标识的。

共有1个答案

巫马自明
2023-03-14

因为似乎没有其他人提供答案,我开始自己测试。

我试着做一个应用程序,从一个地址的字符串表示来创建一个设备,并尝试用48位地址交替公共或私人位来设置我的设备,看看Android堆栈有什么作用。

private final BluetoothGattCallback leGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            Log.i("Fisken", "Gatt connected " + gatt.getDevice().getAddress() + " status " + status);
            if (status != BluetoothGatt.GATT_SUCCESS) {
                Log.w("Fisken", "Disconnect and close");
                gatt.disconnect();
                gatt.close();
            }
        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            Log.i("Fisken", "Gatt disconnected " + gatt.getDevice().getAddress() + " status " + status);
            if (status != BluetoothGatt.GATT_SUCCESS) {
                Log.w("Fisken", "Disconnect and close");
                gatt.disconnect();
            }
            gatt.close();
        }
    }
};

BluetoothAdapter mBluetoothAdapter = ((BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter();
BluetoothDevice d = mBluetoothAdapter.getRemoteDevice("FF:55:44:33:22:11");
d.connectGatt(this, false, leGattCallback);

有了这段代码,如果我用一个随机地址启动BLE外设,一切都按预期进行。但是,如果我尝试在设置了公共位的情况下使用相同的地址运行它,logcat会说“GATT Connected”,但这不是真的。我永远无法断开联系。

 类似资料:
  • 我目前正在开发一个基于蓝牙低能耗设备的iOS应用程序。为了得到一个唯一的标识符来比较得到的外设,我必须得到外设的MAC地址。 据观察,外围设备的UUID属性在iOS设备中不同,而且外围设备要获得UUID,必须至少连接到主设备一次。因为我必须处理登机手续,所以我不想建立连接。当我通过bluetooth services portal时,我发现设备信息本身就是一项服务,除非主iOS设备和外围bluet

  • 最近,我买了一台iBeacon设备,打算创建Android应用程序,以便识别和使用它。我是一个在Android应用程序中使用蓝牙的新手,有很多事情我还不知道。在互联网和本论坛中,我找到了使用Radius Networks的Android IBeacon库的建议,但是,唉,现在它不再可用了: https://github.com/RadiusNetworks/android-ibeacon-serv

  • 我试图访问Android中低能蓝牙设备的UUID,最终将字符串发布到web API。 以下是我的代码,可以很好地为本地名称和mac地址敬酒: 有人能帮忙吗?

  • 是否可以自动连接到蓝牙低能耗(BLE)设备? Android文档表明[](https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context,boolean,android.bluetooth.BluetoothGattCallback)

  • 每当设备断开连接时,我确保对BluetoothGatt对象调用close()并将其设置为null。有什么见解吗? 编辑: 日志转储:对于这些日志,我将我的电话根目录化,并提高了/etc/bluetooth/bt_stack.conf中相关项的跟踪级别 成功连接-重新启动手机并安装应用程序后的第一次尝试。我能够连接,发现所有的服务/特性,并读/写。

  • jd.readBLECharacteristicValue(Object object) 读取低功耗蓝牙设备的特征值的二进制数据值。注意:必须设备的特征值支持 read 才可以成功调用。 参数名 类型 默认值 必填 说明 deviceId string 是 蓝牙设备 id serviceId string 是 蓝牙特征值对应服务的 uuid characteristicId string 是 蓝牙