BLE协议栈开发指南之(host 篇)1.0 ble host都有哪些协议

BLE协议栈开发指南汇总


1.BLE协议栈架构

从协议栈中,可以看出,BLE HOST主要有 GAP、GATT、ATT、L2CAP、SM。

2.BLE HOST层简介

2.1 GAP通用访问协议

GAP是与app或者profiles的通信接口,处理设备发现和连接的相关服务。

GAP控制Link layer的准备、广播、监听/扫描、初始化、连接五种状态的切换。

另外GAP还定义了两个重要的角色:外围设备和中心设备。

GAP更详细的看这里:

蓝牙核心规范(V5.3)7.3-深入详解之GAP

2.2 GATT通用属性协议

详细的可以查看这里

蓝牙核心规范(V5.3)7.6-深入详解之GATT(1)

蓝牙核心规范(V5.3)7.7-深入详解之GATT(2)

GATT协议的作用 如何使用属性协议来发现、读取、写和获取这些属性的指示,以及配置属性的广播。

 特征声明的格式

一个服务可以具有相同特征UUID的多个特征定义。

 2.3 ATT属性协议

属性协议允许被称为服务器的设备将一组属性及其关联的值,展示给其他的客户端设备。服务器公开的这些属性可以由客户端发现、读取和写入,并可以由服务器指示和通知。

在LE中,有一个ATT承载使用ACL连接建立后可用的固定通道。可以使用L2CAP建立额外的ATT载体。

2.4 SM协议

​安全管理器定义了配对和密钥分发的方法、这些方法的协议、安全工具箱,以及仅LE-only或BR/EDR/LE设备的其他部分都要使用。

在低功耗系统中,安全管理协议被移至主机部分,位于链路控制和适配协议之上,降低控制实现成本的同时提高了主机灵活性。

但是数据加密还是在控制器进行的。

le配对的过程的三个阶段:

第1阶段:配对功能交换

第2阶段(LE传统配对):短期密钥(STK)生成

第2阶段(LE安全连接):长期密钥(LTK)生成

第3阶段:传输特定密钥分配

2.5 L2CAP协议

为上层协议提供面向连接和无连接的数据服务,具有协议复用能力和分割和重组操作。

L2CAP的架构:

 更详细的看这里

蓝牙核心规范(V5.3)7.0-深入详解之L2CAP(1)(五星推荐☆☆☆☆☆)

蓝牙核心规范(V5.3)7.1-深入详解之L2CAP(2)

以下代码有什么错误static struct bflb_device_s uart0; extern void shell_init_with_task(struct bflb_device_s shell); static int btblecontroller_em_config(void) { extern uint8_t __LD_CONFIG_EM_SEL; volatile uint32_t em_size; em_size = (uint32_t)&__LD_CONFIG_EM_SEL; if (em_size == 0) { GLB_Set_EM_Sel(GLB_WRAM160KB_EM0KB); } else if (em_size == 321024) { GLB_Set_EM_Sel(GLB_WRAM128KB_EM32KB); } else if (em_size == 641024) { GLB_Set_EM_Sel(GLB_WRAM96KB_EM64KB); } else { GLB_Set_EM_Sel(GLB_WRAM96KB_EM64KB); } return 0; } void bt_enable_cb(int err) { if (!err) { bt_addr_le_t bt_addr; bt_get_local_public_address(&bt_addr); printf("BD_ADDR:(MSB)%02x:%02x:%02x:%02x:%02x:%02x(LSB) \n", bt_addr.a.val[5], bt_addr.a.val[4], bt_addr.a.val[3], bt_addr.a.val[2], bt_addr.a.val[1], bt_addr.a.val[0]); ble_cli_register(); } } int main(void) { board_init(); configASSERT((configMAX_PRIORITIES > 4)); uart0 = bflb_device_get_by_name("uart0"); shell_init_with_task(uart0); /* set ble controller EM Size / btblecontroller_em_config(); / Init rf */ if (0 != rfparam_init(0, NULL, 0)) { printf("PHY RF init failed!\r\n"); return 0; } // Initialize BLE controller #if defined(BL702) || defined(BL602) ble_controller_init(configMAX_PRIORITIES - 1); #else btble_controller_init(configMAX_PRIORITIES - 1); #endif // Initialize BLE Host stack hci_driver_init(); bt_enable(bt_enable_cb); vTaskStartScheduler();#define DEVICE_NAME "BL618_GATT" #define PROFILE_NUM 1 #define PROFILE_A_APP_ID 0 static void gap_event_handler(ble_event_t *event); static void gatt_event_handler(ble_event_t *event); int main(void) { bluetooth_init(gap_event_handler, gatt_event_handler); bluetooth_set_device_name(DEVICE_NAME); bluetooth_gatt_create_service(PROFILE_NUM); bluetooth_gatt_add_char(PROFILE_A_APP_ID, "CHAR_A", 0xFF01, 0x20, NULL); bluetooth_start_advertising(); while (1) { bluetooth_wait_for_event(); } return 0; } static void gap_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GAP_EVENT_ADV_IND: { ble_gap_connect(&event->gap_event.adv_ind.address); break; } case BLE_GAP_EVENT_CONNECTED: { // 连接成功,可以开始 GATT 操作 break; } case BLE_GAP_EVENT_DISCONNECTED: { // 断开连接,重新开始广播 bluetooth_start_advertising(); break; } default: break; } } static void gatt_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GATT_EVENT_READ: { // 处理读操作 break; } case BLE_GATT_EVENT_WRITE: { ble_err_t err = ble_gatt_server_send_indication(event->conn_handle, 0x1234, raw_data, sizeof(raw_data)); // 发送通知给主机 if (err != BLE_ERR_NONE) { // 发送失败,需要处理错误 break; } break; } default: break; } }
05-25
以下代码存在一些错误: 1. 在函数 `btblecontroller_em_config()` 中,函数的最后缺少一个右大括号 `}`。 2. 在函数 `main()` 中,代码缺少头文件引用,需要添加头文件 `bluetooth.h`、`ble_gap.h` 和 `ble_gatt.h`。 3. 在函数 `main()` 中,变量 `raw_data` 未定义,需要先定义并赋值。 4. 在函数 `main()` 中,调用 `bluetooth_set_device_name()` 函数和 `bluetooth_start_advertising()` 函数之前,需要先调用 `bluetooth_init()` 函数初始化蓝牙。 5. 函数 `gatt_event_handler()` 中,变量 `raw_data` 未定义,需要先定义并赋值。 修改后的代码如下: ```c #include "bluetooth.h" #include "ble_gap.h" #include "ble_gatt.h" static struct bflb_device_s uart0; extern void shell_init_with_task(struct bflb_device_s shell); static int btblecontroller_em_config(void) { extern uint8_t __LD_CONFIG_EM_SEL; volatile uint32_t em_size; em_size = (uint32_t)&__LD_CONFIG_EM_SEL; if (em_size == 0) { GLB_Set_EM_Sel(GLB_WRAM160KB_EM0KB); } else if (em_size == 321024) { GLB_Set_EM_Sel(GLB_WRAM128KB_EM32KB); } else if (em_size == 641024) { GLB_Set_EM_Sel(GLB_WRAM96KB_EM64KB); } else { GLB_Set_EM_Sel(GLB_WRAM96KB_EM64KB); } return 0; } void bt_enable_cb(int err) { if (!err) { bt_addr_le_t bt_addr; bt_get_local_public_address(&bt_addr); printf("BD_ADDR:(MSB)%02x:%02x:%02x:%02x:%02x:%02x(LSB) \n", bt_addr.a.val[5], bt_addr.a.val[4], bt_addr.a.val[3], bt_addr.a.val[2], bt_addr.a.val[1], bt_addr.a.val[0]); ble_cli_register(); } } #define DEVICE_NAME "BL618_GATT" #define PROFILE_NUM 1 #define PROFILE_A_APP_ID 0 static uint8_t raw_data[] = {0x01, 0x02, 0x03, 0x04, 0x05}; static void gap_event_handler(ble_event_t *event); static void gatt_event_handler(ble_event_t *event); int main(void) { board_init(); configASSERT((configMAX_PRIORITIES > 4)); uart0 = bflb_device_get_by_name("uart0"); shell_init_with_task(uart0); /* set ble controller EM Size */ btblecontroller_em_config(); /* Init rf */ if (0 != rfparam_init(0, NULL, 0)) { printf("PHY RF init failed!\r\n"); return 0; } // Initialize BLE controller #if defined(BL702) || defined(BL602) ble_controller_init(configMAX_PRIORITIES - 1); #else btble_controller_init(configMAX_PRIORITIES - 1); #endif // Initialize BLE Host stack hci_driver_init(); bluetooth_init(gap_event_handler, gatt_event_handler); bluetooth_set_device_name(DEVICE_NAME); bluetooth_gatt_create_service(PROFILE_NUM); bluetooth_gatt_add_char(PROFILE_A_APP_ID, "CHAR_A", 0xFF01, 0x20, NULL); bluetooth_start_advertising(); vTaskStartScheduler(); return 0; } static void gap_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GAP_EVENT_ADV_IND: { ble_gap_connect(&event->gap_event.adv_ind.address); break; } case BLE_GAP_EVENT_CONNECTED: { // 连接成功,可以开始 GATT 操作 break; } case BLE_GAP_EVENT_DISCONNECTED: { // 断开连接,重新开始广播 bluetooth_start_advertising(); break; } default: break; } } static void gatt_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GATT_EVENT_READ: { // 处理读操作 break; } case BLE_GATT_EVENT_WRITE: { ble_err_t err = ble_gatt_server_send_indication(event->conn_handle, 0x1234, raw_data, sizeof(raw_data)); // 发送通知给主机 if (err != BLE_ERR_NONE) { // 发送失败,需要处理错误 break; } break; } default: break; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心跳包

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值