2016-02-14 2 views
3

Добрый день. Я разрабатываю приложение для Android, которое подключается к устройству BLE и читает характеристики Gatt Services и Gatt. Я использовал образец образца BluetoothLeGatt с сайта разработки Android в качестве моей ссылки. До сих пор я мог программно подключиться к устройству (я принял к сведению адрес моего устройства, чтобы это сделать) и отфильтровать конкретную Gatt-службу, которую я хочу прочитать, и конкретные характеристики служб, приняв к сведению UUID как Сервиса, так и характеристик. Образец, предоставленный Google, также обновляется всякий раз, когда на мое приложение для Android отправляется сообщение с моего устройства BLE. В целом у меня нет проблем с этой целью.Android BLE - Подключение сразу к нескольким устройствам

Однако, прочитав далее GATT, я обнаружил, что можно подключаться к нескольким устройствам BLE (все подчиненные или серверы - те, которые отправляют данные), используя одно приложение для Android (в качестве главного ИЛИ клиента - как тот, кто получает указанные данные). Так что я пытался сделать, это иметь 2 устройства BLE (другой адрес), принял к сведению их адрес, а затем мое приложение пытается подключиться к ним, как только приложение увидит, что эти 2 адреса запущены и работают.

В коде, я называю эту функцию, когда я вижу, мои 2 BLE устройств:

private void connectToDevice(){ 

    mDeviceName = deviceList.get(currentIndex).getName(); 
    mDeviceAddress = deviceList.get(currentIndex).getAddress(); 

    Log.e(TAG, "connecting to device name = " + mDeviceName); 

    mBluetoothLeService.connect(mDeviceAddress); 
} 

Где currentIndex изначально установлен на ноль. Затем, когда я получаю сообщение об успешном подключении я:

private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 
     if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) { 
      Log.e(TAG, "connected"); 
      mConnected = true; 

      if(currentIndex < deviceList.size()-1) currentIndex ++; 
      connectToDevice(); 

     } 
    } 
}; 

Где я могу проверить, если я до сих пор есть устройства для подключения в моем deviceList, если да, то увеличиваем мой счетчик, а затем подключить, пока я не исчерпывают все в моем списке.

Однако, я, похоже, не добился успеха, используя этот метод.

Обратите внимание на то, что коммутирующее соединение (круглая шина) между моими устройствами не является вариантом. Это будет проблемой, когда у меня будет много устройств, и важно получать сообщения в реальном времени без задержек. Это говорит о том, что я должен подключиться к своим устройствам.

Кто-нибудь пытался подключиться к нескольким устройствам BLE на Android? На данный момент я не уверен, как это сделать, любая помощь или выводы очень ценятся.

+0

Да вы можете и я сделал используя простой цикл. Что я делаю, сначала сканирую устройства, как только они будут найдены. Я поместил его в arraylist и вызвал этот метод подключения. Чтобы успешно установить соединение, вам также понадобится механизм блокировки и ожидания, так как вы хотите попытаться установить второе соединение после первого. – Gautam

+0

@ Gautam, не могли бы вы опубликовать свой код, который заставил бы его работать? Я был бы признателен за любые выводы по этой теме. – Razgriz

ответ

1

Действительно можно подключиться к нескольким peripheral с вашего устройства Android. Однако это сделает ваш код намного более сложным, так как вам нужно будет управлять каждым соединением и ответами.

Для каждого соединения вам необходимо будет установить BluetoothGatt с его callbacks. Я тестировал его много месяцев назад с фиктивным тестом, и, как я уже сказал, он работал хорошо, и я смог подключиться к различным периферийным устройствам. Однако, если вы связываете множество команд, то, похоже, есть некоторые перекрывающиеся проблемы, описанные в this thread. попросил здесь

+0

Неужели у вас все еще есть код из многих месяцев назад? Честно говоря, все, что я делаю, - это дождаться сообщений с моих устройств, и на самом деле мне не нужно отправлять сообщения, поэтому я не буду беспокоиться о командах цепочки. – Razgriz

+0

К сожалению, нет, это был быстрый PoC для рабочего проекта, и как только я протестировал и доказал это, из-за его простоты он пошел прямо на мусор. – GoRoS

+0

Жесткая удача для меня тогда. Не могли бы вы вспомнить, если вы использовали индивидуальную «BluetoothLeService» для каждого устройства, к которому вы должны были подключиться? Или вы просто использовали несколько BluetoothGatt и обрабатывали свои обратные вызовы индивидуально? – Razgriz

0

Как соответствующий код: (Здесь ArrayList содержит обоснованные периферийные устройства)

for(int i=0;i< Utility.selectedDeviceList.size();i++) { 
      Log.d(Utility.TAG,"state"+ Utility.selectedDeviceList.get(i).getmConnectionState()); 
      if (Utility.selectedDeviceList.get(i).getmConnectionState() != Utility.CONNECTED) { 
       Log.d(Utility.TAG,"Connecting LeSerive::" + Utility.selectedDeviceList.get(i).getAddress()); 
       Utility.mBluetoothLeService.connect(i, Utility.selectedDeviceList.get(i).getAddress()); 
      } 

     } 

Этого цикла является часть работоспособного интерфейса, который называется внутри обработчик, имеющим петлитель.

public void run() { 
    Looper.prepare(); 
    Looper mLooper = Looper.myLooper(); 
    Log.d(Utility.TAG,"BLE Thread Started::"); 
    mHandler = new Handler(mLooper) { 

     @Override 
     public void handleMessage(Message msg) { 

      switch (msg.what) { 
       case Utility.BLE_SYNC: 
        Log.d(Utility.TAG,"BLE Sync Connecting::"); 
        mHandler.post(SynState); 
        break; 
     } 
    }; 
    Looper.loop(); 
} 

Я использовал этот подход, потому что их много между периферийными устройствами для отправки и получения данных от них.

Это Соединит метод, который внутри службы:

public boolean connect(int tag,final String address) { 
    if (mBluetoothAdapter == null || address == null) { 
     Log.w(Utility.TAG, "BluetoothAdapter not initialized or unspecified address."); 
     return false; 
    } 

    Utility.selectedDeviceList.get(tag).setmConnectionState(Utility.CONNECTING); 

    if(Utility.selectedDeviceList.get(tag).getmBluetoothGatt()==null){ 
     Log.w(Utility.TAG, "new connect :: "+ Utility.selectedDeviceList.get(tag).getAddress()); 

     BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); 
     if (device == null) { 
      Log.w(Utility.TAG, "Device not found. Unable to connect."); 
      return false; 
     } 
     try { 
      Utility.selectedDeviceList.get(tag).setmBluetoothGatt(device.connectGatt(this, false, mGattCallback)); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      Log.d(Utility.TAG,"ConnectGatt exception caught"); 
     } 
    } 

    return true; 
} 

Это mGattCallBack:

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 

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

    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
     Log.d(Utility.TAG, "onServicesDiscovered"); 

    } 

    @Override 
    public void onCharacteristicRead(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic,int status) { 


    } 
    @Override 
    public void onCharacteristicWrite(BluetoothGatt gatt, 
             BluetoothGattCharacteristic characteristic, int status) { 
     super.onCharacteristicWrite(gatt, characteristic, status); 
     Log.d(Utility.TAG,">>onCharacteristicWrite"); 

    } 
    @Override 
    public void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic) { 

    } 
}; 

Надеется, что это очищает несколько вещей для вас

+0

Я попытался сделать несколько соединений, обработчиков и обратных вызовов, чтобы попытаться подключиться к моим двум устройствам одновременно. Однако, похоже, это не работает. Я разместил здесь новый вопрос: http://stackoverflow.com/questions/35406168/android-ble-connecting-to-multiple-devices-seem-to-fail-and-gatt-response-is-t и он помогло бы, если бы вы могли посмотреть мой код там. Спасибо! – Razgriz

Смежные вопросы