2016-01-02 93 views
3

我正在開發使用BLE的Android到iOS, 的聊天應用程序現在我用下面兩個庫的參考BLE外設和BLE中央

https://github.com/izumin5210/Bletia

https://github.com/captain-miao/bleYan

問題,我是當外圍設備編寫任何特性時,面向BLE的中央設備(Android)不會調用BLECallback。

我的回調代碼

private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     BleLog.i(TAG, "onConnectionStateChange: State = " + BleUtils.getBleConnectStatus(status) 
       + " newState = " + BleUtils.getBleConnectStatus(newState)); 

     if (newState == BluetoothProfile.STATE_CONNECTED) { 
      updateState(BleConnectState.CONNECTED); 
      //開始發現服務 
      BleLog.i(TAG, "gatt.discoverServices()"); 
      gatt.discoverServices(); 
     } else if (newState == BluetoothProfile.STATE_CONNECTING) { 
      updateState(BleConnectState.CONNECTING); 
     } else if (newState == BluetoothProfile.STATE_DISCONNECTING) { 
      updateState(BleConnectState.DISCONNECTING); 
     } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
      //斷開了,需要做什麼處理? 
      sIsWriting = false; 
      sWriteQueue.clear(); 
      updateState(BleConnectState.DISCONNECTED); 
     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 

     if (status == BluetoothGatt.GATT_SUCCESS) { 
      onDiscoverServices(gatt); 
      //需要返回 gatt 
      updateState(BleConnectState.SERVICE_IS_DISCOVERED); 
     } else { 
      BleUtils.refreshDeviceCache(mGatt); 
      //失敗 需要做何處理 129 
      if(mState != BleConnectState.SERVICE_IS_NOT_DISCOVERED) { 
       updateState(mState); 
      } 
     } 

     //MSG_BLE_ID_SERVICES_DISCOVERED 
     Message msg = Message.obtain(); 
     msg.what = BleConstants.MSG_BLE_ID_SERVICES_DISCOVERED; 
     msg.arg1 = status; 
     msg.obj = gatt; 
     notifyAllBleClients(msg); 
     BleLog.i(TAG, "onServicesDiscovered: " + BleUtils.getGattStatus(status)); 
    } 

    @Override 
    public void onCharacteristicWrite(BluetoothGatt gatt, 
      BluetoothGattCharacteristic characteristic, int status) { 
     BleLog.i(TAG, "onCharacteristicWrite: " + BleUtils.getGattStatus(status)); 
     UUID uuid = characteristic.getUuid(); 
     sendBleMessage(BleConstants.MSG_BLE_ID_CHARACTERISTIC_WRITE, status, uuid); 
     onNextWrite(); 
    } 

    @Override 
    public void onDescriptorWrite(BluetoothGatt gatt, 
      BluetoothGattDescriptor descriptor, int status) { 
     BleLog.i(TAG, "onDescriptorWrite: " + BleUtils.getGattStatus(status)); 
     UUID uuid = descriptor.getUuid(); 

     sendBleMessage(BleConstants.MSG_BLE_ID_DESCRIPTOR_WRITE, status, uuid); 
     onNextWrite(); 
    } 

    @Override 
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { 
     final byte[] data = characteristic.getValue(); 
     BleLog.i(TAG, "onCharacteristicChanged: " + HexUtil.encodeHexStr(data)); 
     UUID uuid = characteristic.getUuid(); 

     sendBleMessage(BleConstants.MSG_BLE_ID_CHARACTERISTIC_NOTIFICATION, BluetoothGatt.GATT_SUCCESS, data, uuid); 
     onNextWrite(); 
    } 

    @Override 
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { 
     final byte[] data = characteristic.getValue(); 
     System.out.println(TAG +" onCharacteristicRead: " + data); 

     if(data != null) { 
      final StringBuilder stringBuilder = new StringBuilder(data.length); 
      for (byte byteChar : data) 
       stringBuilder.append(String.format("%02X ", byteChar)); 

      final String values = stringBuilder.toString(); 

      BleLog.i(TAG, "onCharacteristicRead: " + new String(data)); 
     }else{ 
      BleLog.i(TAG, " onCharacteristicRead: " + "NULL"); 
     } 

     UUID uuid = characteristic.getUuid(); 

     sendBleMessage(BleConstants.MSG_BLE_ID_CHARACTERISTIC_READ, status, data, uuid); 
     onNextWrite(); 
    } 

    @Override 
    public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { 
     final byte[] data = descriptor.getValue(); 

     if(data != null) { 
      final StringBuilder stringBuilder = new StringBuilder(data.length); 
      for (byte byteChar : data) 
       stringBuilder.append(String.format("%02X ", byteChar)); 

      final String values = stringBuilder.toString(); 

      BleLog.i(TAG, "onDescriptorRead: " + new String(data, Charset.defaultCharset())); 
     }else{ 
      BleLog.i(TAG, " onDescriptorRead: " + "NULL"); 
     } 
     UUID uuid = descriptor.getUuid(); 

     sendBleMessage(BleConstants.MSG_BLE_ID_DESCRIPTOR_READ, status, data, uuid); 
     onNextWrite(); 
    } 

    @Override 
    public void onReliableWriteCompleted(BluetoothGatt gatt, int status) { 
     BleLog.i(TAG, "onReliableWriteCompleted: " + BleUtils.getGattStatus(status)); 

     Message msg = Message.obtain(); 
     msg.what = BleConstants.MSG_BLE_ID_RELIABLE_WRITE_COMPLETED; 
     msg.arg1 = status; 
     notifyAllBleClients(msg); 
     onNextWrite(); 
    } 

    @Override 
    public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { 
     BleLog.i(TAG, "onReadRemoteRssi: " + rssi + " status:" + BleUtils.getGattStatus(status)); 

     Message msg = Message.obtain(); 
     msg.what = BleConstants.MSG_BLE_ID_READ_REMOTE_RSSI; 
     msg.arg1 = status; 
     msg.arg2 = rssi; 
     notifyAllBleClients(msg); 
     onNextWrite(); 
    } 

    @Override 
    public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) { 
     BleLog.i(TAG, "onMtuChanged: " + BleUtils.getGattStatus(status)); 

     Message msg = Message.obtain(); 
     msg.what = BleConstants.MSG_BLE_ID_MTU_CHANGED; 
     msg.arg1 = status; 
     msg.arg2 = mtu; 
     notifyAllBleClients(msg); 
     onNextWrite(); 
    } 
}; 

iOS的通知代碼

if (myPeripheral.connectedToPeer) 
    { 
     CBCharacteristic *peerAvailable = [myPeripheral findCharacteristicFromUUID:myPeripheral.notifyPeerAvailableUUID]; 
     if (peerAvailable && !peerAvailable.isNotifying) { 
      [myPeripheral.cbPeripheral setNotifyValue:YES forCharacteristic:peerAvailable]; 
     } 

     CBCharacteristic *peerReceiveMessage = [myPeripheral findCharacteristicFromUUID:myPeripheral.peerSendToCentralFromPeripheralUUID]; 
     if (peerReceiveMessage && !peerReceiveMessage.isNotifying) { 
      [myPeripheral.cbPeripheral setNotifyValue:YES forCharacteristic:peerReceiveMessage]; 
     } 

    } 

回答

2

外圍設備應該通知該特性產生了變化,通過使用bluetoothGattServer.notifyCharacteristicChanged

Android的中央裝置應訂閱通知。

if (characteristic != null) { 
         //SetNotification 
         Log.i(TAG, "SetNotification"); 
         gatt.setCharacteristicNotification(characteristic, true); 
         for (BluetoothGattDescriptor descriptor : characteristic.getDescriptors()) { 
          descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); 
          gatt.writeDescriptor(descriptor); 
         } 
+0

@Abhinav的iOS設備呢,我正在開發唯一的中央設備在Android。 – Arun

+0

你也可以看看iOS代碼的通知更新到問題。 – Arun

+1

也許你需要訂閱通知。 – Andy

1

在外圍,你寫的應該有NOTIFY財產的特點,中央應使用setCharacteristicNotification功能收聽的特性的變化。當值改變時,onCharacteristicChanged回調將被觸發。