AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77674630
Accepted
Charles Nicholson
Charles Nicholson
Asked: 2023-12-17 21:46:09 +0800 CST2023-12-17 21:46:09 +0800 CST 2023-12-17 21:46:09 +0800 CST

O protocolo BLE garante a ordem de gravação em múltiplas características de um serviço?

  • 772

Se um serviço BLE contém múltiplas características de notificação nas quais um cliente GATT manifestou interesse, o protocolo BLE oferece alguma garantia sólida sobre a ordem em que os clientes GATT recebem os valores atualizados? Separadamente, há algum requisito em nível de protocolo sobre a ordem em que o cliente GATT entrega os dados recém-recebidos ao aplicativo?

Por exemplo: Digamos que o aplicativo altere os valores de duas características separadas no servidor GATT em rápida sucessão entre eventos de conexão durante o período de "silêncio". Durante o próximo evento de conexão, suponha que haja tempo e largura de banda suficientes para o servidor GATT transmitir totalmente ambos os valores de característica atualizados para o cliente GATT.

O protocolo BLE exige que o servidor GATT transmita os valores recém-alterados na ordem em que o aplicativo os alterou?

Além disso, o protocolo BLE exige que o cliente GATT preserve a ordem desses valores recém-alterados ao entregá-los ao aplicativo?

As pilhas BLE sobre as quais estou raciocinando suportam Bluetooth 5.0, mas também seria bom saber se algo disso mudou em relação às versões anteriores. Quaisquer citações específicas do próprio padrão do protocolo seriam muito úteis!

bluetooth-lowenergy
  • 1 1 respostas
  • 51 Views

1 respostas

  • Voted
  1. Best Answer
    Emil
    2023-12-18T02:00:43+08:002023-12-18T02:00:43+08:00

    Separadamente, há algum requisito em nível de protocolo sobre a ordem em que o cliente GATT entrega os dados recém-recebidos ao aplicativo?

    O protocolo BLE exige que o servidor GATT transmita os valores recém-alterados na ordem em que o aplicativo os alterou?

    Além disso, o protocolo BLE exige que o cliente GATT preserve a ordem desses valores recém-alterados ao entregá-los ao aplicativo?

    A resposta a todas estas perguntas acima é talvez surpreendentemente “Não aplicável”. Todo o conceito de uma biblioteca de software/sdk/api implementando a parte "principal" do GATT escrita por uma pessoa e depois tendo um aplicativo separado escrito por outra pessoa utilizando esta biblioteca/sdk/api simplesmente não existe quando você lê o padrão. O padrão Bluetooth é apenas um padrão de protocolo, ou seja, dita os requisitos de como dois dispositivos se comunicam entre si, e não de como um aplicativo é estruturado e implementado internamente. Consulte o diagrama de pilha de protocolos do capítulo GATT, seção 2.1 na especificação principal do Bluetooth (atualmente versão 5.4):

    PILHA DE PROTOCOLOS GATT

    Como você pode ver, GATT é o perfil da “aplicação” e ATT é o protocolo que sua aplicação fala. Se você possui uma biblioteca de software que gerencia filas internamente, envia comandos/notificações para o thread correto, etc. para facilitar seu trabalho, então isso não faz parte do padrão Bluetooth e qualquer erro estúpido de design nesta biblioteca limita o uso do protocolo /profile para o desenvolvedor do aplicativo final deve ser visto como um "recurso ausente" do que como uma violação de protocolo.

    Em algumas ocasiões, o padrão sugere alguns detalhes de implementação permitidos. No capítulo ATT, você pode ler, por exemplo, "Em um portador ATT não aprimorado, as notificações recebidas, mas que não podem ser processadas devido a buffer overflows, serão descartadas. Portanto, essas PDUs devem ser consideradas não confiáveis".

    Se um serviço BLE contém múltiplas características de notificação nas quais um cliente GATT manifestou interesse, o protocolo BLE oferece alguma garantia sólida sobre a ordem em que os clientes GATT recebem os valores atualizados?

    Para responder a esta pergunta, farei as mesmas suposições do padrão, ou seja, que a aplicação tenha acesso direto para enviar notificações GATT como pacotes ATT sempre que desejar para a camada inferior (L2CAP) e que o cliente GATT receba diretamente notificações ATT em na mesma ordem em que são recebidos da camada inferior (L2CAP).

    Nem o protocolo ATT nem o padrão de perfil do GATT mencionam nada sobre a entrega solicitada quando se trata de notificações. Em vez disso, ao raciocinar sobre a entrega ordenada, o protocolo subjacente normalmente é o que é levado em consideração.

    No Bluetooth 4.0-5.1, existia apenas o "portador ATT não aprimorado", que é um canal L2CAP fixo que entrega dados em ordem. Assim, você pode, pelo menos no nível do protocolo, esperar a entrega solicitada. O perfil HID, por exemplo, assume mais ou menos a entrega solicitada. Caso contrário, as teclas digitadas poderão terminar na ordem incorreta.

    No Bluetooth 5.2, foram introduzidos "portadores ATT aprimorados", para permitir mais de uma transação ATT simultânea (uma por canal de comunicação), com o objetivo de acelerar situações quando vários "aplicativos" em execução no mesmo dispositivo conversam com o mesmo dispositivo remoto . Observe que apenas uma solicitação de leitura ou uma solicitação de gravação poderia ser executada por vez e a próxima deverá ser enviada quando a resposta da anterior for recebida. Se ambos os dispositivos suportarem esse recurso e você tiver aberto vários portadores ATT para o mesmo dispositivo, não será possível assumir nenhuma ordem específica de entrega de notificações ao outro dispositivo se elas forem enviadas por meio de portadores ATT separados, pois eles têm seu próprio controle de fluxo. Portanto, se você precisar de entrega solicitada, basta usar o mesmo portador ATT para essas notificações.

    Na prática, todas as bibliotecas de software que implementam o GATT que conheço nunca reordenam notificações pertencentes à mesma característica. No Android, por exemplo, o mecanismo Binder é usado como camada IPC entre o daemon Bluetooth e cada aplicativo. Aqui, o retorno de chamada invocado quando uma notificação é recebida para um objeto BluetoothGatt específico não será chamado novamente até que uma invocação de método anterior para o mesmo objeto BluetoothGatt seja retornada.

    No entanto, no Windows, da última vez que verifiquei, toda vez que você começa a ouvir notificações, um novo thread é gerado no qual seu manipulador de eventos será executado sempre que uma notificação for recebida. Como você só pode especificar a escuta de uma característica ao ouvir notificações, será necessário configurar dois ouvintes separados se tiver duas características e, portanto, dois threads serão iniciados, cada um manipulando cada característica. E com dois threads é impossível sincronizar a ordem das notificações entregues, pois ambos os threads podem ser executados simultaneamente em dois núcleos de CPU diferentes. Este é um daqueles erros de design "burros" na minha opinião que limita o uso.

    Então, como sugestão, se você precisa de garantias de que as notificações serão entregues e processadas na mesma ordem em que são emitidas, use uma única característica e normalmente você estará bem.

    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve