Implementação L2CAP no Android
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()




































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)