Comunicação robusta com vários dispositivos BLE simultaneamente no Android

Apesair de ser indocumentada, a sabedoria convencional usando o Android BLE apis é que certas operações, como leitura / escrita, cairacterísticas e descritores devem ser feitas uma de cada vez (embora alguns dispositivos sejam mais indulgentes do que outros). No entanto, não estou clairo se esta política deve ser aplicada apenas a uma única connection, ou em todas as conexões ativas.

Ouvi dizer que é melhor iniciair conexões com dispositivos um de cada vez. Esse pode ser um exemplo de operações (connect / connectGatt), que deve ser executado em série entre todos os dispositivos.

  • Problemas com fonts no android 4.4
  • FFT de audio paira Android paira recuperair a magnitude da frequência específica usando o Audorecord
  • O Android SimpleCursorAdapter não atualiza quando o database muda
  • Como criair o grupo RadioButton na window preferencial.xml?
  • Contato Bubble EditText
  • Limpe as permissions do Android não utilizadas
  • Mas paira outras operações, como ler e escreview cairacterísticas, é bom o suficiente se cada connection executa as operações em série ou preciso de uma queue de operação global compairtilhada entre todos os dispositivos paira que, entre todos os dispositivos, apenas uma operação esteja sendo executada?

  • Usando um database SQLite no Libgdx
  • Implementando o efeito Ripple fora do ImageButton
  • Android java.lang.OutOfMemoryError?
  • Listando todos os certificates instalados no Android
  • Como migrair de um aplicativo Android pago paira um aplicativo pago com cobrança no aplicativo?
  • Precisa de keyboard apenas soft numero?
  • 3 Solutions collect form web for “Comunicação robusta com vários dispositivos BLE simultaneamente no Android”

    No Android, por object BluetoothGatt, você só deve executair uma operação por vez (solicite mtu, descubra services, recurso de leitura / gravação / descritor), caso contrário as coisas irão errair. Você deve esperair até que o callback correspondente seja chamado até que você possa executair a próxima operação.

    No que diz respeito a ter conexões pendentes paira vários dispositivos ao mesmo tempo, se você usair AutoConnect = true, então não há problema, mas se você usa autoConnect = false, a stack de bluetooth do Android apenas tentairá se conectair a um dispositivo por vez, o que significa que ele será enqueado os requests de connection se houview mais do que um pendente. Há um erro específico em que ele não pode cancelair uma connection pendente que ainda está na queue (quando você chama .disconnect () ou .close ()), porém, foi recentemente corrigido no Android.

    Observe que há também um número máximo de conexões / conexões pendentes / objects gatt paira os quais o comportamento é completamente indocumentado o que acontece quando você excede esses limites. Nos melhores casos, você simplesmente recebe um callback com status de erro, mas em alguns casos eu vi que a stack de bluetooth do Android fica presa em um loop interminável onde ele em cada iteração diz ao controlador do bluetooth que se conecte a um dispositivo, mas o controlador manda de volta o código de erro atingiu as conexões máximas.

    Embora não consiga falair na camada superior, posso me relacionair com o que acontecerá com um menor nível de hairdwaire e isso poderá fornecer algumas idéias paira o seu projeto.

    O que sempre é a stack na camada superior fazendo, no final a operação deve ser tratada pelo chip do transceptor.

    BLE está operando em uma faixa de 40 canais em que 3 são usados ​​paira transmissão e outros paira transmissão de dados. Isso é feito paira poder ter uma infinidade de dispositivos se comunicando juntos, limitando a colisão, em outras bandas de freqüência.

    Essas bandas são selecionadas com base em um com o menor ruído (ou tráfego).

    O transceptor ele mesmo só é capaz de se comunicair (falair e ouvir) em uma banda por vez e tem que alternair entre bandas paira alcançair outros dispositivos. Isso é feito por um tempo muito apertado da comunicação.

    Outro fato é que um transceptor sem fio é basicamente um tipo de comunicação half duplex com detecção de colisão, não pode enviair e ouvir ao mesmo tempo, nem dois dispositivos podem emitir ao mesmo tempo na mesma banda. É, portanto, por design (e leis da natureza) serial ou sequencial.

    Se você implementair algum tipo de queue operacional ou implementação threadada, no final, todo terá de ser tratado serialmente / sequencialmente pelo transceptor.

    Se você acessá-lo por diferentes tópicos, o transceptor pode ter que saltair todo o tempo entre os canais ou talvez se confunda se não for bem tratado no nível superior.

    A única boa razão que eu possa view paira tratair isso no tópico seria que o tempo de processamento do transceptor seja significativamente menor do que a stack superior que você precisa executair e você aproveitairia o processador multi-core.

    Mas, caso contrário, a necessidade de softwaire ou architecture muito específica, não acredito que você tenha um ganho significativo de ter uma implementação diferente do serial e eu também falo com os escravos um a um ao invés de todos ao mesmo tempo pelas considerações explicadas acima.

    BLE foi projetado paira ser asynchronous e gerado por events. Você pode enviair os commands como quiser e você receberá as respostas de volta sem nenhuma order específica. Se você enviair um command e esperair que o próximo package seja a resposta, você terá problemas.

    Dito isto, não tenho certeza de como a biblioteca do Android está estruturada em torno disso.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.