Zero. Visão geral
Apresentar principalmente o processo de transmissão de baixa energia do Bluetooth e o processo de implementação da pilha de protocolo sob a pilha bluetooth (pilha bluetooth), fluxo de publicidade BLE
btsnoop e o processo nos dados ... \ STM32_UBUNTU_BLUETOOTH \ 2-Bluetooth data \ Bluetooth protocol analysis \ BLE broadcast.log
1. Declaração
Continuaremos atualizando esta coluna de maneira serializada. O conteúdo atualizado desta coluna é planejado da seguinte maneira:
O primeiro artigo: introdução abrangente ao Bluetooth, apresenta principalmente alguns conceitos de Bluetooth, histórico, trilha de desenvolvimento, introdução do Bluetooth no mercado e introdução da placa de desenvolvimento Bluetooth.
Parte 2: Introdução à camada de Transporte, apresenta principalmente a pilha de protocolos Bluetooth e o protocolo de transmissão de hardware antes do chip Bluetooth, como H4, H5, BCSP baseado em UART, H2 baseado em USB, etc.
O terceiro capítulo: Introdução ao controlador Bluetooth tradicional, apresenta principalmente a introdução de chips Bluetooth tradicionais, incluindo camada de radiofrequência (RF), camada de banda base (banda base), camada de gerenciamento de link (LMP), etc.
Capítulo 4: Introdução ao host Bluetooth tradicional, apresenta principalmente a pilha de protocolos do Bluetooth tradicional, como HCI, L2CAP, SDP, RFCOMM, HFP, SPP, HID, AVDTP, AVCTP, A2DP, AVRCP, OBEX, PBAP, MAP, etc. Faça um acordo.
Capítulo 5: Introdução ao controlador de baixa energia Bluetooth, apresenta principalmente chips Bluetooth de baixa energia, incluindo camada física (PHY), camada de link (LL)
Capítulo 6: Introdução ao host Bluetooth de baixa potência, introdução à pilha de protocolos Bluetooth de baixa potência, incluindo HCI, L2CAP, ATT, GATT, SM, etc.
Capítulo 7: Introdução aos chips Bluetooth, apresenta principalmente o processo de inicialização de alguns chips Bluetooth, com base na extensão do comando do fornecedor HCI
O oitavo capítulo: apêndice, apresenta principalmente a introdução dos termos comuns acima e a introdução de alguns processos especiais.
Além disso, a placa de desenvolvimento é mostrada abaixo, que é o melhor conjunto de mãos para quem deseja aprender a pilha de protocolos Bluetooth. Para aprender melhor a pilha de protocolos Bluetooth, acredite em mim, depois de aprender este conjunto de vídeos, você terá a capacidade de modificar qualquer pilha de protocolos (como bluez no Linux, bluedroid no Android).
-------------------------------------------------- -------------------------------------------------- ---------------------
Link da faculdade CSDN (entre para escolher o curso que deseja aprender): https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144
Grupo de botões de troca de Bluetooth: 970324688
Código Github: https://github.com/sj15712795029/bluetooth_stack
Obtenha a placa de desenvolvimento: https://item.taobao.com/item.htm?spm=a1z10.1-cs.w4004-22329603896.18.5aeb41f973iStr&id=622836061708
Catálogo de aprendizagem Bluetooth : https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900
-------------------------------------------------- -------------------------------------------------- ----------------------
2. Comando de transmissão BLE e evento
Todo o processo é o seguinte (observe que há etapas omitidas durante a inicialização, apenas as etapas principais da inicialização são listadas)
Vamos dar uma olhada no processo ellisys (é basicamente o mesmo que a tela do Wireshark, principalmente porque ellisys vem com sua própria análise no processo, então eu também vou postá-la)
Observe que apenas interceptamos dois comandos e eventos ao inicializar a captura de tela. Um é a máscara de evento definida, que é diferente do Bluetooth tradicional, o outro é compatível com o host de gravação e o outro pode se referir à inicialização do Bluetooth tradicional. As etapas são as seguintes:
Etapa 1) Envie o comando (definir máscara de evento) para definir a máscara de evento e receber o evento commnd complete
Etapa 2) Envie o comando (write le host support) para definir o suporte BLE e receber o comando complete event
Etapa 3) Envie o comando BLE (LE Set Advertising Parameters) para definir os parâmetros de transmissão
Etapa 4) Envie o comando (LE Set Advertising Data) de dados de transmissão de configuração de BLE
Etapa 5) Envie o comando (LE Set Advertising Enable) para habilitar a transmissão BLE
Etapa 6) Receba o comando completo da etapa 4) 5) 6)
Etapa 7) Enviar comando de transmissão de fechamento de BLE (habilitar publicidade para definir LE) e receber evento de conclusão de envio
Vamos falar sobre cada etapa em detalhes abaixo
Etapa 1) Envie o comando (definir máscara de evento) para definir a máscara de evento e receber o evento commnd complete
Esta parte foi introduzida na seção anterior durante a busca por transmissão, então não vou repeti-la
Etapa 2) Envie o comando (write le host support) para definir o suporte BLE e receber o comando complete event
Esta parte foi introduzida na seção anterior durante a busca por transmissão, então não vou repeti-la
Etapa 3) Envie o comando BLE (LE Set Advertising Parameters) para definir os parâmetros de transmissão
Vejamos o formato deste comando:
Vamos dar uma olhada diretamente no btsnoop
O código correspondente é o seguinte:
err_t hci_le_set_adv_param(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type,
uint8_t own_address_typ, uint8_t peer_address_type,struct bd_addr_t *peer_address, uint8_t channel_map, uint8_t filter_policy)
{
struct bt_pbuf_t *p;
uint8_t offset = 0;
if((p = bt_pbuf_alloc(BT_TRANSPORT_TYPE, HCI_SET_LE_ADV_PARAM_PLEN, BT_PBUF_RAM)) == NULL)
{
BT_HCI_TRACE_ERROR("ERROR:file[%s],function[%s],line[%d] bt_pbuf_alloc fail\n",__FILE__,__FUNCTION__,__LINE__);
return BT_ERR_MEM;
}
/* Assembling command packet */
p = hci_cmd_ass(p, HCI_LE_SET_ADV_PARAM, HCI_LE, HCI_SET_LE_ADV_PARAM_PLEN);
offset += 3;
bt_le_store_16((uint8_t *)p->payload,offset,adv_int_min);
offset += 2;
bt_le_store_16((uint8_t *)p->payload,offset,adv_int_max);
offset += 2;
((uint8_t *)p->payload)[offset] = adv_type;
offset += 1;
((uint8_t *)p->payload)[offset] = own_address_typ;
offset += 1;
((uint8_t *)p->payload)[offset] = peer_address_type;
offset += 1;
memcpy(((uint8_t *)p->payload)+offset, peer_address->addr, BD_ADDR_LEN);
offset += BD_ADDR_LEN;
((uint8_t *)p->payload)[offset] = channel_map;
offset += 1;
((uint8_t *)p->payload)[offset] = filter_policy;
phybusif_output(p, p->tot_len,PHYBUSIF_PACKET_TYPE_CMD);
bt_pbuf_free(p);
return BT_ERR_OK;
}
Etapa 4) Envie o comando (LE Set Advertising Data) de dados de transmissão de configuração de BLE
Vejamos o formato do comando HCI:
Este comando é para definir os dados de transmissão. O formato dos dados de transmissão foi mencionado na seção anterior. Ao pesquisar a transmissão, não iremos repeti-la. Vamos dar uma olhada no código que definimos e btsnoop.
Para tornar o teste simples, eu também transmito um nome de Bluetooth, e os dados de transmissão são os seguintes:
A chamada de transmissão é a seguinte:
A implementação é a seguinte:
err_t hci_le_set_adv_data(uint8_t adv_len,uint8_t *adv_data)
{
struct bt_pbuf_t *p;
uint8_t offset = 0;
if((p = bt_pbuf_alloc(BT_TRANSPORT_TYPE, HCI_SET_LE_ADV_DATA_PLEN, BT_PBUF_RAM)) == NULL)
{
BT_HCI_TRACE_ERROR("ERROR:file[%s],function[%s],line[%d] bt_pbuf_alloc fail\n",__FILE__,__FUNCTION__,__LINE__);
return BT_ERR_MEM;
}
/* Assembling command packet */
p = hci_cmd_ass(p, HCI_LE_SET_ADV_DATA, HCI_LE, HCI_SET_LE_ADV_DATA_PLEN);
offset += 3;
((uint8_t *)p->payload)[offset] = adv_len;
offset += 1;
memset(((uint8_t *)p->payload) + offset,0,HCI_SET_LE_ADV_DATA_PLEN-offset);
memcpy(((uint8_t *)p->payload)+offset, adv_data, adv_len);
phybusif_output(p, p->tot_len,PHYBUSIF_PACKET_TYPE_CMD);
bt_pbuf_free(p);
return BT_ERR_OK;
}
O que deve ser observado nesta parte é que não importa quais sejam seus dados de transmissão, eles devem ser preenchidos com 31 bytes. O primeiro parâmetro de dados de transmissão é a duração real de sua transmissão
Finalmente, olhe para btsnoop:
Etapa 5) Envie o comando (LE Set Advertising Enable) para habilitar a transmissão BLE
Vejamos o formato do comando:
Os parâmetros são muito simples, ou seja, basta ligar e desligar
Vejamos a implementação do código:
err_t hci_le_set_adv_enable(uint8_t enable)
{
struct bt_pbuf_t *p;
uint8_t offset = 0;
if((p = bt_pbuf_alloc(BT_TRANSPORT_TYPE, HCI_SET_LE_ADV_ENABLE_PLEN, BT_PBUF_RAM)) == NULL)
{
BT_HCI_TRACE_ERROR("ERROR:file[%s],function[%s],line[%d] bt_pbuf_alloc fail\n",__FILE__,__FUNCTION__,__LINE__);
return BT_ERR_MEM;
}
/* Assembling command packet */
p = hci_cmd_ass(p, HCI_LE_SET_ADV_ENABLE, HCI_LE, HCI_SET_LE_ADV_ENABLE_PLEN);
offset += 3;
((uint8_t *)p->payload)[offset] = enable;
phybusif_output(p, p->tot_len,PHYBUSIF_PACKET_TYPE_CMD);
bt_pbuf_free(p);
return BT_ERR_OK;
}
Finalmente, olhamos para btsnoop:
Etapa 6) Receba o comando completo da etapa 4) 5) 6)
Já introduzimos este comando no Bluetooth HCI tradicional, eu posto diretamente estes 3 eventos completos de comando
Etapa 7) Enviar comando de transmissão de fechamento de BLE (habilitar publicidade para definir LE) e receber evento de conclusão de envio
Isso foi introduzido na etapa 5), vamos tirar uma captura de tela do btsnoop diretamente