BLE 从特征接收 GATT 通知
BLE receiving GATT notifications from a characteristic
我想在这个特征改变时收到通知Micro:Bit。
我做的基本上是这样的:
1) 检查系统是否兼容BLE
2) 启用蓝牙以防它被禁用
3) 连接到唯一的配对设备 (Micro:Bit)
4) 连接改变时激活此代码 (¿Connected/Disconnected?)
5) 特征更新时激活此代码 ¿?
public class MainActivity extends Activity {
BluetoothAdapter bleAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
**(1)**
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, "BLE Not Supported", Toast.LENGTH_SHORT).show();
finish();
}
**(2)**
bleAdapter = ((BluetoothManager) getSystemService(BLUETOOTH_SERVICE)).getAdapter();
if (bleAdapter == null || !bleAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, 1);
}
Set<BluetoothDevice> pairedDevices = bleAdapter.getBondedDevices();
for (BluetoothDevice device : pairedDevices) {
**(3)**
device.connectGatt(this, true, new BluetoothGattCallback() {
**(4)**
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
super.onConnectionStateChange(gatt, status, newState);
switch (newState) {
case BluetoothProfile.STATE_CONNECTED:
gatt.setCharacteristicNotification("6E400003B5A3F393E0A9E50E24DCCA9E", true); // This doesn't work
break;
}
}
**5**
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
super.onCharacteristicChanged(gatt, characteristic);
TextView x = (TextView) findViewById(R.id.x_axis);
TextView y = (TextView) findViewById(R.id.y_axis);
TextView z = (TextView) findViewById(R.id.z_axis);
x.setText(characteristic.getValue().toString());
y.setText(characteristic.getValue().toString());
z.setText(characteristic.getValue().toString());
}
});
}
}
}
我有一个错误,这个 UUID“6E400003B5A3F393E0A9E50E24DCCA9E”格式不正确。反正我不知道这是不是订阅特征和接收通知的方法。
查看 setCharacteristicNotification
的文档显示只有一个构造函数
boolean setCharacteristicNotification (BluetoothGattCharacteristic characteristic,
boolean enable)
因此,您需要先从您的 UUID 创建一个 BluetoothGattCharacteristic
,例如:
public static final UUID SERIAL_SERVICE = UUID.fromString("0000ffe0-0000-1000-8000-00805f9b34fb");
public static final UUID SERIAL_VALUE = UUID.fromString("0000ffe1-0000-1000-8000-00805f9b34fb");
BluetoothGattCharacteristic characteristic = gatt.getService(SERIAL_SERVICE).getCharacteristic(SERIAL_VALUE);
然后设置通知
gatt.setCharacteristicNotification(characteristic,true);
最后,设置客户端特征配置描述符以允许服务器启动更新
public static final UUID CONFIG_DESCRIPTOR = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
BluetoothGattDescriptor desc = characteristic.getDescriptor(CONFIG_DESCRIPTOR);
desc.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(desc);
最后一部分使您能够接收来自设备的通知。 CCCD的UUID总是一样的。
我想在这个特征改变时收到通知Micro:Bit。
我做的基本上是这样的:
1) 检查系统是否兼容BLE
2) 启用蓝牙以防它被禁用
3) 连接到唯一的配对设备 (Micro:Bit)
4) 连接改变时激活此代码 (¿Connected/Disconnected?)
5) 特征更新时激活此代码 ¿?
public class MainActivity extends Activity {
BluetoothAdapter bleAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
**(1)**
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, "BLE Not Supported", Toast.LENGTH_SHORT).show();
finish();
}
**(2)**
bleAdapter = ((BluetoothManager) getSystemService(BLUETOOTH_SERVICE)).getAdapter();
if (bleAdapter == null || !bleAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, 1);
}
Set<BluetoothDevice> pairedDevices = bleAdapter.getBondedDevices();
for (BluetoothDevice device : pairedDevices) {
**(3)**
device.connectGatt(this, true, new BluetoothGattCallback() {
**(4)**
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
super.onConnectionStateChange(gatt, status, newState);
switch (newState) {
case BluetoothProfile.STATE_CONNECTED:
gatt.setCharacteristicNotification("6E400003B5A3F393E0A9E50E24DCCA9E", true); // This doesn't work
break;
}
}
**5**
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
super.onCharacteristicChanged(gatt, characteristic);
TextView x = (TextView) findViewById(R.id.x_axis);
TextView y = (TextView) findViewById(R.id.y_axis);
TextView z = (TextView) findViewById(R.id.z_axis);
x.setText(characteristic.getValue().toString());
y.setText(characteristic.getValue().toString());
z.setText(characteristic.getValue().toString());
}
});
}
}
}
我有一个错误,这个 UUID“6E400003B5A3F393E0A9E50E24DCCA9E”格式不正确。反正我不知道这是不是订阅特征和接收通知的方法。
查看 setCharacteristicNotification
的文档显示只有一个构造函数
boolean setCharacteristicNotification (BluetoothGattCharacteristic characteristic,
boolean enable)
因此,您需要先从您的 UUID 创建一个 BluetoothGattCharacteristic
,例如:
public static final UUID SERIAL_SERVICE = UUID.fromString("0000ffe0-0000-1000-8000-00805f9b34fb");
public static final UUID SERIAL_VALUE = UUID.fromString("0000ffe1-0000-1000-8000-00805f9b34fb");
BluetoothGattCharacteristic characteristic = gatt.getService(SERIAL_SERVICE).getCharacteristic(SERIAL_VALUE);
然后设置通知
gatt.setCharacteristicNotification(characteristic,true);
最后,设置客户端特征配置描述符以允许服务器启动更新
public static final UUID CONFIG_DESCRIPTOR = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
BluetoothGattDescriptor desc = characteristic.getDescriptor(CONFIG_DESCRIPTOR);
desc.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(desc);
最后一部分使您能够接收来自设备的通知。 CCCD的UUID总是一样的。