2017-04-18 5 views
4

Basierend auf den aufgelisteten Diensten here, ich versuche, einen Dienst von einem Android-Gerät zu abonnieren, kann aber nicht die Aufforderung Teil arbeiten. Versucht, mit 7905F431-B5CE-4E99-A40F-4B1E122D00D0 zu werben, aber das Peripheriegerät wird nicht auf der iPhone-Liste der Bluetooth-Geräte angezeigt. Auch mit (LE) -Scan und Filtern gespielt, um den ANCS-Server ohne Glück zu entdecken. Irgendein Hinweis?Abonnieren ANCS auf Android

edit: Code

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()); 
     } 
    } 
}; 

Update: Ich bin ein Nach der Verbindung mit einem auf dem iPhone beworbenen Dienst können Sie die Dienste und Merkmale finden. Das Abonnieren von Benachrichtigungen löst jedoch nach dem Empfang einer Benachrichtigung auf dem iPhone keine onCharacteristicChanged aus.

update2: Alle Aufrufe von write descriptor.setValue sind erfolgreich und werden nacheinander ausgeführt.

Update3: verwendete Teil des Codes aus this sample.

Update4: Testgeräte: Nexus 5X Android 6.0.1; iPhone 6S + iOS 10.3.1

update5: BT meldet

Schreibanforderung enter image description here

Schreibantwort enter image description here

+1

gut In Nexus-Geräten gehen In den Entwickleroptionen gibt es ein Kontrollkästchen, das "Enable Bluetooth HCI Snoop Log" ist. Wenn Sie es aktivieren, protokolliert das Gerät alles, was auf dem Bluetooth-Stack geschieht .... siehe Protokoll auf der SD-Karte namens "HCIsnoop.log". Wenn Sie Ihre Datei auf Ihrer Festplatte haben, laden Sie diese Software (kostenlos) herunter: http://www.fte.com/support/download.aspx?demo=ComProbe%20SD&type=capture&iid=1v, um diese BT-Protokolldatei anzuzeigen. Mit diesem können Sie jedes Paket sehen, das von einem Gerät zu einem anderen ausgetauscht wurde (wie ein Wireshark für BT). – PN10

+0

Wie können Sie diese Anwendung auf Github veröffentlichen? Ein einfacher ANCS Android Client wäre erstaunlich – Jason

Antwort

3

Oh ich hatte ein ähnliches Problem, stellen Sie sicher, dass Sie nicht lokale Benachrichtigungen beim Testen auf iOS verwenden, da diese nicht über ANCS verbreitet werden. Sie benötigen echte Push-Benachrichtigungen aus welchem ​​Grund auch immer.

0

ich vor kurzem ein ähnliches Problem aufgetreten. Was ich getan habe, um es zu lösen, war das Hinzufügen eines writeDescriptor zu meinem BluetoothGatt. Mein setCharacteristicNotification sieht nun wie folgt aus:

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); 
} 

Vielleicht, wenn Sie Beiträge verfassen können/verknüpfen Sie Ihr Code, den ich wäre in der Lage, um Ihre genaue Problem zu diagnostizieren, aber die oben genannten Code war die Lösung für mein Problem.

+0

Ein Code-Snippet hinzugefügt. – mbmc

Verwandte Themen