9

J'essaie d'activer les notifications pour plus d'une caractéristique BLE en utilisant Xamarin/Android mais semble incapable de le faire. L'application semble cesser de recevoir des événements BLE si j'essaie d'en activer plus d'un à la fois.Comment activer plusieurs notifications de caractéristiques BLE sur Xamarin/Android?

Quelqu'un peut-il confirmer si cela est possible en utilisant Tamarin/Android. Nous avons une application iOS native qui fonctionne très bien avec plusieurs notifications activées. Les étapes de base que nous utilisons sont les suivantes:

  1. scan pour le dispositif
  2. Se connecter au périphérique
  3. Découvrez les services
  4. Pour chaque itérer de service découvert par les caractéristiques et permettent ceux qui sont nécessaires
  5. processus chaque événement de rappel asynchrone dans le rappel BLE

Chaque fois que nous essayons d'activer les notifications sur plus de une caractéristique nous ne recevons plus aucun événement.

J'ai aussi été incapable de trouver des exemples où plus d'une caractéristique est activée.

J'espère avoir simplement manqué quelque chose de fondamental sur l'utilisation des API Xamarin/Android ici.

public override void OnServicesDiscovered (BluetoothGatt gatt, GattStatus status) 
{ 
    base.OnServicesDiscovered (gatt, status); 
    foreach (BluetoothGattService service in gatt.Services) { 
     string uuid = service.Uuid.ToString().ToUpper(); 
     if (uuid.Equals (BLEServices.HRService.ToUpper())) { 
      _Adap.LogMessage ("HRService discovered"); 
      foreach(BluetoothGattCharacteristic characteristic in service.Characteristics) { 
       string c_uuid = characteristic.Uuid.ToString().ToUpper(); 
       _Adap.LogMessage (" HRCharacteristic: " + c_uuid); 

       if (c_uuid.Equals(_Adap.useCharacteristic.ToUpper())) { 
        _Adap.LogMessage (" enabling HRCharacteristic"); 
        gatt.SetCharacteristicNotification(characteristic, true); 
        BluetoothGattDescriptor descriptor = new BluetoothGattDescriptor (Java.Util.UUID.FromString (BLEServices.CLIENT_CHARACTERISTIC_CONFIG), GattDescriptorPermission.Write | GattDescriptorPermission.Read); 
        characteristic.AddDescriptor (descriptor); 
        descriptor.SetValue (BluetoothGattDescriptor.EnableNotificationValue.ToArray()); 
        gatt.WriteDescriptor (descriptor); 
        _Adap.StartTimer(); 
       } 
      } 

     } else if (uuid.Equals (BLEServices.BatteryService.ToUpper())) { 
      _Adap.LogMessage ("BatteryService discovered"); 
      foreach (BluetoothGattCharacteristic characteristic in service.Characteristics) { 
       string c_uuid = characteristic.Uuid.ToString().ToUpper(); 
       _Adap.LogMessage (" BatteryService: " + c_uuid); 

       if (c_uuid.Equals (_Adap.useCharacteristic.ToUpper())) { 
        _Adap.LogMessage (" reading batteryCharacteristic"); 
        // This may only be reported when the battery level changes so get the level first by doing a read 
        gatt.ReadCharacteristic (characteristic); 

        //gatt.SetCharacteristicNotification (characteristic, true); 
        //BluetoothGattDescriptor descriptor = new BluetoothGattDescriptor (Java.Util.UUID.FromString (BLEServices.CLIENT_CHARACTERISTIC_CONFIG), GattDescriptorPermission.Write | GattDescriptorPermission.Read); 
        //characteristic.AddDescriptor (descriptor); 
        //descriptor.SetValue (BluetoothGattDescriptor.EnableNotificationValue.ToArray()); 
        //gatt.WriteDescriptor (descriptor); 
       } 
      } 
     } else if (uuid.Equals (BLEServices.DeviceInfoService.ToUpper())) { 
      _Adap.LogMessage ("DeviceInfoService discovered"); 
      foreach (BluetoothGattCharacteristic characteristic in service.Characteristics) { 
       string c_uuid = characteristic.Uuid.ToString().ToUpper(); 
       _Adap.LogMessage (" DeviceInfoService: " + c_uuid); 
       if (c_uuid.Equals (BLEServices.kModelNumberCharacteristicUuidString.ToUpper())) { 
        //gatt.ReadCharacteristic (characteristic); 
       } 
      } 
     } else if (uuid.Equals (BLEServices.kHxM2CustomServiceUuidString.ToUpper())) { 
      _Adap.LogMessage ("HxM2CustomService discovered"); 
      foreach (BluetoothGattCharacteristic characteristic in service.Characteristics) { 
       string c_uuid = characteristic.Uuid.ToString().ToUpper(); 
       _Adap.LogMessage (" HxM2CustomCharacteristic: " + c_uuid); 

       if (c_uuid.Equals (_Adap.useCharacteristic.ToUpper())) { 
        _Adap.LogMessage (" enabling HxM2 characteristic: "+_Adap.useCharacteristic); 
        gatt.SetCharacteristicNotification (characteristic, true); 
        BluetoothGattDescriptor descriptor = new BluetoothGattDescriptor (Java.Util.UUID.FromString (BLEServices.CLIENT_CHARACTERISTIC_CONFIG), GattDescriptorPermission.Write | GattDescriptorPermission.Read); 
        characteristic.AddDescriptor (descriptor); 
        descriptor.SetValue (BluetoothGattDescriptor.EnableNotificationValue.ToArray()); 
        gatt.WriteDescriptor (descriptor); 
        // Start a timer to make sure that we can recover if we never receive any data from the device 
        _Adap.StartTimer(); 
       } 

      } 
     } else { 
      _Adap.LogMessage ("Unknown Service "+uuid+" discovered"); 
     } 
    } 
} 

Quelqu'un peut-il expliquer ce que les lignes suivantes sont pour

BluetoothGattDescriptor descriptor = new BluetoothGattDescriptor (Java.Util.UUID.FromString (BLEServices.CLIENT_CHARACTERISTIC_CONFIG), GattDescriptorPermission.Write | GattDescriptorPermission.Read); 
characteristic.AddDescriptor (descriptor); 
descriptor.SetValue (BluetoothGattDescriptor.EnableNotificationValue.ToArray()); 
gatt.WriteDescriptor (descriptor); 
+1

Enfin, je trouve quelque chose qui fonctionne: http: // stackoverflow. com/questions/17910322/android-ble-api-gatt-notification-non-reçu http://stackoverflow.com/questions/21278993/android-ble-how-to-read-multiple-characteristics –

Répondre

2

A côté de votre solution trouvée: Sachez que vous ne pouvez pas écouter un nombre illimité de caractéristiques. Le maximum est limité codé en dur dans la source android à BTA_GATTC_NOTIF_REG_MAX.

Ainsi, votre application ne devrait pas compter sur plus de la nombre maximal de caractéristiques notificatrices de votre version android minimum pris en charge.

0

il y a plusieurs options re availble mais j'utilisé en dessous de la logique à mettre en œuvre pour ces caractéristiques et il travaille vraiment essayer s'il vous plaît:

public ConnectThread(BluetoothDevice device, BluetoothDeviceConnector deviceConnector) 
      { 
       _mmDevice = device; 
       BluetoothSocket tmp = null; 
       _deviceConnector = deviceConnector; 

       Log.Info(Tag, "calling device.createRfcommSocket with channel 1 ..."); 
       try 
       { 
        //tmp = device.CreateRfcommSocketToServiceRecord(UUID.FromString("00001101-0000-1000-8000-00805F9B34FB")); 
        //tmp = device.CreateRfcommSocketToServiceRecord(device.GetUuids()[0].Uuid); 
        deviceConnector.BluetoothAdapter.CancelDiscovery(); 

        var createRfcommSocket = JNIEnv.GetMethodID(device.Class.Handle, "createInsecureRfcommSocket", "(I)Landroid/bluetooth/BluetoothSocket;"); 
        var socket = JNIEnv.CallObjectMethod(device.Handle, createRfcommSocket, new JValue(1)); 
        tmp = GetObject<BluetoothSocket>(socket, JniHandleOwnership.TransferLocalRef); 

        var uuidList = device.GetUuids(); 
        if (uuidList != null) 
        { 
         foreach (var uuid in uuidList) 
         { 
          try 
          { 
           tmp = device.CreateInsecureRfcommSocketToServiceRecord(uuid.Uuid); 
           tmp.Connect(); 
           if (tmp.IsConnected) 
            break; 
          } 
          catch (Exception) 
          { 
           // ignored 
          } 
         } 
        } 

        Log.Info(Tag, "setting socket to result of createRfcommSocket"); 
       } 
       catch (Exception e) 
       { 
        Log.Error(Tag, e.Message, e); 
       } 
       _mmSocket = tmp; 
      }