在 Android 上订阅 ANCS
Subscribe to ANCS on Android
根据 here 列出的服务,我正在尝试从 Android 设备订阅服务,但无法使请求部分正常工作。尝试使用 7905F431-B5CE-4E99-A40F-4B1E122D00D0
进行广告宣传,但外围设备未显示在 iPhone 的蓝牙设备列表中。还玩了 (LE) 扫描和过滤器来发现 ANCS 服务器,但运气不佳。有什么提示吗?
编辑:代码
BleService.java
public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,
boolean enabled) {
Log.d(TAG, "setCharacteristicNotification");
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
Log.w(TAG, "BluetoothAdapter not initialized");
return;
}
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.DESCRIPTOR));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor)
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
}
}
SampleGattAttributes.java
public class SampleGattAttributes {
public static String ANCS_SERVICE = "7905F431-B5CE-4E99-A40F-4B1E122D00D0";
public static String NOTIFICATION_SOURCE = "9FBF120D-6301-42D9-8C58-25E699A21DBD";
public static String DATA_CONTROL = "22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB";
public static String DESCRIPTOR = "00002902-0000-1000-8000-00805f9b34fb";
}
MainActivity.java
private void displayServices(List<BluetoothGattService> services) {
for (BluetoothGattService service : services) {
if (service.getUuid().compareTo(UUID.fromString(ANCS_SERVICE)) == 0) {
for (BluetoothGattCharacteristic characteristic : service.getCharacteristics()) {
Log.d(TAG, "charac: " + characteristic.getUuid());
for (BluetoothGattDescriptor descriptor : characteristic.getDescriptors()) {
Log.d(TAG, "desc: " + descriptor.getUuid());
}
if (characteristic.getUuid().compareTo(UUID.fromString(NOTIFICATION_SOURCE)) == 0) {
bleService.setCharacteristicNotification(characteristic, true);
}
}
}
}
}
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (BleService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
displayServices(bleService.getSupportedGattServices());
}
}
};
更新:连接到 iPhone 上宣传的服务后,我能够找到服务和特征。但是,在 iPhone.
上收到通知后,订阅通知不会触发 onCharacteristicChanged
update2: 所有writedescriptor.setValue
调用成功,依次运行
update3:使用了 this sample.
中的部分代码
更新4:测试设备:Nexus 5X Android 6.0.1; iPhone 6S+ iOS 10.3.1
更新5:BT日志
写入请求
写回复
我最近遇到了类似的问题。我最终解决这个问题的方法是在我的 BluetoothGatt
中添加一个 writeDescriptor
。我的 setCharacteristicNotification
现在看起来像这样:
public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled) {
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
Log.w(TAG, "BluetoothAdapter not initialized");
return;
}
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor);
}
也许如果你可以 post/link 你的代码我将能够进一步诊断你的确切问题,但上面的代码是我的问题的解决方案。
哦,我有一个类似的问题,请确保在 iOS 上测试时不要使用本地通知,因为这些不会通过 ANCS 传播。无论出于何种原因,您都需要真正的推送通知。
根据 here 列出的服务,我正在尝试从 Android 设备订阅服务,但无法使请求部分正常工作。尝试使用 7905F431-B5CE-4E99-A40F-4B1E122D00D0
进行广告宣传,但外围设备未显示在 iPhone 的蓝牙设备列表中。还玩了 (LE) 扫描和过滤器来发现 ANCS 服务器,但运气不佳。有什么提示吗?
编辑:代码
BleService.java
public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,
boolean enabled) {
Log.d(TAG, "setCharacteristicNotification");
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
Log.w(TAG, "BluetoothAdapter not initialized");
return;
}
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.DESCRIPTOR));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor)
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
}
}
SampleGattAttributes.java
public class SampleGattAttributes {
public static String ANCS_SERVICE = "7905F431-B5CE-4E99-A40F-4B1E122D00D0";
public static String NOTIFICATION_SOURCE = "9FBF120D-6301-42D9-8C58-25E699A21DBD";
public static String DATA_CONTROL = "22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB";
public static String DESCRIPTOR = "00002902-0000-1000-8000-00805f9b34fb";
}
MainActivity.java
private void displayServices(List<BluetoothGattService> services) {
for (BluetoothGattService service : services) {
if (service.getUuid().compareTo(UUID.fromString(ANCS_SERVICE)) == 0) {
for (BluetoothGattCharacteristic characteristic : service.getCharacteristics()) {
Log.d(TAG, "charac: " + characteristic.getUuid());
for (BluetoothGattDescriptor descriptor : characteristic.getDescriptors()) {
Log.d(TAG, "desc: " + descriptor.getUuid());
}
if (characteristic.getUuid().compareTo(UUID.fromString(NOTIFICATION_SOURCE)) == 0) {
bleService.setCharacteristicNotification(characteristic, true);
}
}
}
}
}
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (BleService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
displayServices(bleService.getSupportedGattServices());
}
}
};
更新:连接到 iPhone 上宣传的服务后,我能够找到服务和特征。但是,在 iPhone.
上收到通知后,订阅通知不会触发onCharacteristicChanged
update2: 所有writedescriptor.setValue
调用成功,依次运行
update3:使用了 this sample.
中的部分代码更新4:测试设备:Nexus 5X Android 6.0.1; iPhone 6S+ iOS 10.3.1
更新5:BT日志
写入请求
写回复
我最近遇到了类似的问题。我最终解决这个问题的方法是在我的 BluetoothGatt
中添加一个 writeDescriptor
。我的 setCharacteristicNotification
现在看起来像这样:
public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled) {
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
Log.w(TAG, "BluetoothAdapter not initialized");
return;
}
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor);
}
也许如果你可以 post/link 你的代码我将能够进一步诊断你的确切问题,但上面的代码是我的问题的解决方案。
哦,我有一个类似的问题,请确保在 iOS 上测试时不要使用本地通知,因为这些不会通过 ANCS 传播。无论出于何种原因,您都需要真正的推送通知。