蓝牙低能耗设备由其地址唯一标识(在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位数据,没有办法告诉它地址是公共的还是私人的。这意味着设备不是唯一标识的。
因为似乎没有其他人提供答案,我开始自己测试。
我试着做一个应用程序,从一个地址的字符串表示来创建一个设备,并尝试用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 是 蓝牙