Implementação L2CAP no Android

Apr 05 2023
Parte 1: https://medium.com/@girishby90/android-ble-l2cap-tutorial-3b8ff0994ec8 Se você não leu a primeira parte, sugiro que a leia uma vez.

Parte 1:https:///@girishby90/android-ble-l2cap-tutorial-3b8ff0994ec8

Se você não leu a primeira parte, sugiro que a leia uma vez. Dá uma ideia básica sobre o conceito BLE no Android

O que é L2CAP?

Logical Link Control and Adaptation Protocol (L2CAP) é um protocolo usado no padrão Bluetooth que fornece adaptação entre as camadas superiores e a camada de banda base da pilha Bluetooth .

O Logical Link Control and Adaptation Protocol (L2CAP) é uma camada na pilha Bluetooth que fornece serviços cruciais para comunicação entre dispositivos Bluetooth. O L2CAP oferece serviços de segmentação e remontagem para grandes pacotes a serem transmitidos por links Bluetooth e também permite a multiplexação de protocolos e serviços de camada superior.

Funções da camada L2CAP

1. Aceita pacotes de até 64 kB das camadas superiores e os divide em quadros menores para transmissão. Esses quadros são então remontados em pacotes novamente na extremidade receptora.

2. O L2CAP gerencia a multiplexação e desmultiplexação de várias fontes de pacotes. Depois que um pacote é remontado, a camada L2CAP determina para qual protocolo da camada superior ele deve ser passado, como comunicação de RF ou telefonia.

3. O L2CAP também lida com requisitos de qualidade de serviço, tanto durante o estabelecimento do link quanto durante a operação normal. Isso inclui negociar o tamanho máximo da carga para evitar que os dispositivos de pacotes grandes sobrecarreguem os dispositivos de pacotes pequenos. Isso é importante porque nem todos os dispositivos podem lidar com o tamanho máximo de pacote de 64 kB. A camada L2CAP corresponde à camada de enlace de dados 802, que normalmente é responsável pela transmissão, enquadramento e controle de erros em um determinado enlace. Como tal, o L2CAP sobrepõe a tarefa do controlador de link e a extremidade de controle da banda base, incluindo verificação e correção de erros.

No protocolo L2CAP, existem três campos específicos que são usados ​​para transferir dados:

O campo Length é um campo de 16 bits que define o tamanho dos dados, em bytes, provenientes das camadas superiores.

O campo Channel ID (CID) é um campo de 16 bits que serve como um identificador exclusivo para o canal virtual criado neste nível.

O campo Dados é onde a carga real é colocada. O tamanho máximo dos dados neste campo é 65535 bytes.

Vamos dar uma olhada na parte do código.

3 funções principais serão usadas para transferir os dados entre os dois dispositivos.

1. available()
2. read()
3. write(byte b[])

Etapa 1: inicializar o soquete Bluetooth

private lateinit var l2capSocket: BluetoothSocket
l2capSocket = device.createInsecureL2capChannel(int psm) // pass an intereger PSM value
l2capSocket.connect()

Connect() fará uma tentativa de se conectar a um dispositivo remoto.

Etapa 2: verifique os bytes disponíveis do InputStream

val avail = l2capSocket.inputStream.available()

Etapa 3: ler o fluxo de entrada

val tempBuf = ByteArray(avail)
l2capSocket.inputStream.read(tempBuf)

Lê um certo número de bytes do fluxo de entrada e os armazena na matriz de buffer tempBuf. O número de bytes realmente lidos é retornado como um inteiro. Esse método é bloqueado até que os dados de entrada estejam disponíveis, o fim do arquivo seja detectado ou uma exceção seja lançada.

Se o comprimento de tempBuf for zero, nenhum byte será lido e 0 será retornado; caso contrário, há uma tentativa de ler pelo menos um byte. Se nenhum byte estiver disponível porque o stream está no final do arquivo, o valor -1 é retornado; caso contrário, pelo menos um byte é lido e armazenado em tempBuf.
O primeiro byte lido é armazenado no elemento tempBuf[0], o próximo em tempBuf[1] e assim por diante. O número de bytes lidos é, no máximo, igual ao comprimento de tempBuf.

Etapa 3: gravar no fluxo de saída

l2capSocket.outputStream.write(bytes) // pass bytess array which you want to write

É sempre uma prática recomendada fechar a conexão do soquete assim que seu trabalho estiver concluído

Etapa 4: fecha esse fluxo e libera todos os recursos do sistema associados a ele.

l2capSocket.close()