蓝牙协议栈(四、协议)

BTstack是一种模块化双模蓝牙堆栈,支持蓝牙基本速率/增强日期速率(BR / EDR)以及蓝牙低功耗(LE)。BR / EDR技术也称为经典蓝牙,可在专为高数据速率设计的设备之间提供强大的无线连接。相比之下,LE技术具有更低的吞吐量,但能耗更低,连接设置更快,并且能够并行连接更多设备。

无论是Classic还是LE,蓝牙设备都会实现一个或多个蓝牙配置文件。蓝牙配置文件指定如何使用一个或多个蓝牙协议来实现其目标。例如,每个蓝牙设备都必须实现通用访问配置文件(GAP),它定义了设备如何找到彼此以及它们如何建立连接。该配置文件主要使用主机控制器接口(HCI)协议,该协议是堆栈层次结构中的最低协议,它实现了蓝牙芯片组的命令接口。

除了GAP之外,流行的经典蓝牙示例将是可以通过串行端口配置文件(SPP)连接的外围设备。SPP基本上指定兼容设备应提供包含RFCOMM信道号的服务发现协议(SDP)记录,该记录将用于实际通信。

类似地,对于每个LE设备,除了GAP之外,还必须实现通用属性配置文件(GATT)配置文件。GATT建立在属性协议(ATT)之上,定义了一个设备如何与远程设备上的GATT服务进行交互。

到目前为止,BTstack最受欢迎的用途是可通过SPP(Android 2.0或更高版本)和GATT(Android 4.3或更高版本以及iOS 5或更高版本)连接的外围设备。如果外围设备和iOS设备之间需要更高的数据速率,可以使用Made for iPhone程序的iAP1和iAP2协议代替GATT。有关BTstack和MFi的信息,请直接与我们联系。

下面描述的蓝牙协议和目前由BTstack实施的配置文件。在下文中,我们首先解释如何在BTstack中使用各种蓝牙协议。在下一章中,我们将介绍配置文件。

HCI - 主机控制器接口

HCI协议为蓝牙芯片组提供命令接口。在BTstack中,HCI实现还跟踪所有活动连接并处理更高层(L2CAP)数据包的碎片和重组。

请注意,应用程序很少需要自己发送HCI命令。相反,BTstack在GAP和自动使用HCI的更高级协议中提供便利功能。例如,要设置名称,请在启动之前调用gap_set_local_name()。应用程序中HCI命令的主要用途是在启动阶段配置尚未通过GAP API提供的特殊功能。以下部分介绍了如何发送自定义HCI命令。

定义自定义HCI命令模板

每个HCI命令被分配一个2字节的OpCode,用于唯一地标识不同类型的命令。OpCode参数分为两个字段,称为OpCode组字段(OGF)和OpCode命令字段(OCF),请参阅蓝牙规范 - 核心版本4.0,第2卷,E部分,第5.4章。

下面的清单显示了BTstack在文件src / hci.h中提供的OGF

#define OGF_LINK_CONTROL 0x01

#define OGF_LINK_POLICY 0x02

#define OGF_CONTROLLER_BASEBAND 0x03

#define OGF_INFORMATIONAL_PARAMETERS 0x04

#define OGF_LE_CONTROLLER 0x08

#define OGF_BTSTACK 0x3d

#define OGF_VENDOR 0x3f

对于所有现有的蓝牙命令及其OCF,请参阅蓝牙规范 - 核心版本4.0,第2卷,E部分,第7章。

在HCI命令包中,OpCode后跟参数总长度和实际参数。可以使用OPCODE宏计算命令的OpCode。BTstack提供hci_cmd_t 结构作为紧凑格式来定义HCI命令包,参见下面的清单,并 在源代码中包含/ btstack / hci_cmd.h文件。

// Calculate combined ogf/ocf value.#define OPCODE(ogf, ocf) (ocf | ogf << 10)

 

// Compact HCI Command packet description.typedef struct {

uint16_t opcode;

const char *format;

} hci_cmd_t;

下面的清单说明了库中的hci_write_local_name HCI命令模板:

// Sets local Bluetooth name

const hci_cmd_t hci_write_local_name = {

OPCODE(OGF_CONTROLLER_BASEBAND, 0x13), "N"

// Local name (UTF-8, Null Terminated, max 248 octets)

};

它使用OGF_CONTROLLER_BASEBAND作为OGF,0x13作为OCF,并且具有一个格式为“N”的参数,表示空终止的UTF-8字符串。表下面列出BTstack支持的格式说明。检查其他预定义的HCI命令及其参数信息。


格式说明符说明1,2,3,4一至四字节值A 31字节广告数据B蓝牙基带地址D 8字节数据块E扩展查询信息240个八位字节H HCI连接句柄N名称最多248个字符,UTF8字符串,null终止P 16字节配对码,例如PIN码或链接键S服务记录(数据元素序列)


表:HCI命令参数支持的格式说明符。

基于模板发送HCI命令

您可以使用hci_send_cmd函数根据模板和参数列表发送HCI命令。但是,有必要检查输出数据包缓冲区是否为空,并且蓝牙模块已准备好接收下一个命令 - 大多数现代蓝牙模块仅允许发送单个HCI命令。这可以通过调用hci_can_send_command_packet_now()函数来完成 ,如果可以发送,则返回true。

下面的清单说明了如何使用HCI Write Local Name命令手动设置设备名称。

if (hci_can_send_packet_now(HCI_COMMAND_DATA_PACKET)){

hci_send_cmd(&hci_write_local_name, "BTstack Demo");

}

请注意,应用程序很少需要自己发送HCI命令。相反,BTstack在GAP和自动使用HCI的更高级协议中提供便利功能。

L2CAP - 逻辑链路控制和适配协议

L2CAP协议支持更高级别的协议复用和数据包分段。它为RFCOMM和BNEP协议提供了基础。对于BTstack正式支持的所有配置文件,不需要直接使用L2CAP。为了测试或开发自定义协议,能够访问和提供L2CAP服务是有帮助的。

访问远程设备上的L2CAP服务

L2CAP基于渠道的概念。通道是基带连接之上的逻辑连接。每个通道以多对一的方式绑定到单个协议。多个通道可以绑定到同一个协议,但是一个通道不能绑定到多个协议。多个通道可以共享相同的基带连接。

到远程设备上与L2CAP服务进行通信,本地蓝牙设备上的应用程序启动用的L2CAP层 l2cap_init功能,然后创建传出L2CAP信道使用一个远程设备的PSM l2cap_create_channel 功能。如果l2cap_create_channel函数尚不存在,它将启动新的基带连接。作为L2CAP创建信道功能的输入参数给出的分组处理器将被分配给新的输出L2CAP信道。此处理程序接收L2CAP_EVENT_CHANNEL_OPENED和L2CAP_EVENT_CHANNEL_CLOSED事件和L2CAP数据包,如下面的清单

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值