本文章只介绍桃芯特有的蓝牙协议架构,基础蓝牙概念不作过多介绍
目录
桃芯的蓝牙协议栈架构
两个任务(两个线程):Controller、Host
Host 的架构
Host 的架构如图 2.1 所示,主要通过 GAP
、
ATT
、
GATT Client
、
SM
等
4
个
模块为开发者提供操作接口。
消息驱动
Host 任务是由各种消息驱动的
消息类型
来自 Controller 的事件、
ACL
数据,也包含软件定时器消息和用户发送的消息(btstack_push_user_msg)。
消息处理
在Switch case语句中调用各种
回调函数
回调函数事件包
协议栈的各种回调函数遵循类似的原型,其输入称为事件包:
typedef void (*btstack_packet_handler_t) (
// 事件包类型
uint8_t packet_type,
// 关联的信道(一般指蓝牙连接句柄)
uint16_t channel,
// 事件包内容
const uint8_t *packet,
// 事件包内容的长度
uint16_t size);
第一个参数:packet_type 的四种类型
HCI_EVENT_PACKET:
HCI 事件包(
常用)
这个类型的事件包是个 “大杂烩
”,多个模块弹出的事件包都会使用这个类型。
• HCI_ACL_DATA_PACKET
:
Controller 上报的
ACL 数据
这个类型的事件包只会被通过 hci_register_acl_packet_handler 注册的
ACL 数据回调
函数收到。
• HCI_COMPLETED_SDU_PACKET
:
来自 LE
信用信道的完整 SDU
这个类型的事件包只会被通过 l2cap_register_service 注册的
L2CAP 服务回调函数收
到。
• L2CAP_EVENT_PACKET
:
来自 L2CAP 的事件包
这个类型的事件包只会被通过 l2cap_add_event_handler 注册的
L2CAP 事件回调函数
收到。
事件包解析:HCI_EVENT_PACKET
回调函数第一个参数
packet_type 的第一种类型 HCI_EVENT_PACKET 的事件包解析
可以使用hci_event_packet_get_type(packet) 获取
事件代码
事件代码(常用6种):
1. BTSTACK_EVENT_STATE:蓝牙协议栈事件
一般用于响应协议栈初始化:
2. HCI_EVENT_LE_META:BLE 元事件
这个元事件下辖多个子事件。先通过 hci_event_le_meta_get_subevent_code(packet)
获
得子事件代码,然后通过
decode_hci_le_meta_event(packet, sub_event_type)
宏得到
子事件的内容。
sub_event_type
为子事件内容对应的数据类型,各字段与蓝牙核心规范
里的定义一致
。
具体各种子事件可查看桃芯
pg_ble_stack.pdf文件
3. HCI_EVENT_DISCONNECTION_COMPLETE:连接断开事件
获得断开原因等信息:
使用decode_hci_event_disconn_complete(packet)解码获得内容
typedef struct event_disconn_complete
{
// 状态码
uint8_t status;
// 连接句柄
uint16_t conn_handle;
// 原因
uint8_t reason;
} event_disconn_complete_t;
4. HCI_EVENT_COMMAND_COMPLETE:HCI 命令完成事件
通过
hci_event_command_complete_get_command_opcode(packet)
获得
HCI
命令码。
通过 hci_event_command_complete_get_return_parameters(packet) 获得
Controller
返回
的参数
第
1
个字节为命令完成的状态,
0 表示没有错误,其他状态见
pg_ble_stack.pdf文件中的
Controller错误码解析
5. HCI_EVENT_COMMAND_STATUS:HCI 命令状态事件
立即完成的HCI命令,controller回复
HCI_EVENT_COMMAND_COMPLETE
无法
立即完成的HCI命令,controller回复
HCI_EVENT_COMMAND_STATUS
(如连接蓝牙命令)
6. BTSTACK_EVENT_USER_MSG:来自 btstack_push_user_msg 的用户消息
用户自定义消息