linux下bluetooth编程(三)HCI层编程

本文详细介绍了Linux环境下Bluetooth编程中的HCI层,包括HCI层的作用、Command和Event的结构、不同类型的传输以及如何通过HCI进行通信。还探讨了如何通过HCI命令控制蓝牙设备,如获取Dongle信息、打开或关闭蓝牙设备,并提供了BlueZ库中用于HCI编程的接口和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. HCI层协议概述:

HCI提供一套统一的方法来访问Bluetooth底层。如图所示:

<wbr></wbr>

<wbr></wbr>

从图上可以看出,Host Controller Interface(HCI)<wbr><wbr>就是用来沟通Host和Module。Host通常就是PC, Module则是以各种物理连接形式(USB,serial,pc-card等)连接到PC上的bluetooth Dongle。</wbr></wbr>

在Host这一端:application,SDP,L2cap等协议都是软件形式提出的(Bluez中是以kernel层程序)。在Module这一端:Link Manager, BB, 等协议都是硬件中firmware提供的。

而HCI则比较特殊,它一部分在软件中实现,用来给上层协议和程序提供访问接口(Bluez中,hci.c hci_usb.c,hci_sock.c等).另一部分也是在Firmware中实现,用来将软件部分的指令等用底层协议明白的方式传递给底层。

<wbr></wbr>

居于PC的上层程序与协议和居于Modules的下层协议之间通过HCI沟通,有4种不同形式的传输:Commands, Event, ACL Data, SCO/eSCO Data。

<wbr></wbr>

1.1. HCI Command:

HCI Command是Host向Modules发送命令的一种方式。HCI Command Packet结构如下:

OpCode用来唯一标识HCI Command.它由2部分组成,10bit的Opcode Command. 6bit的Opcode Group。

<wbr></wbr>

1.1.1: OpCode Group:

Linux Kernel(BlueZ)中,~/include/net/bluetooth/hci.h中定义了OpCode Group。

#define OGF_LINK_CTL<wbr>0x01</wbr>

#define OGF_LINK_POLICY<wbr>0x02<wbr><wbr></wbr></wbr></wbr>

#define OGF_HOST_CTL<wbr>0x03</wbr>

#define OGF_INFO_PARAM<wbr>0x04</wbr>

#define OGF_STATUS_PARAM<wbr>0x05</wbr>

它们代表了不同的Command Group:

<wbr></wbr>

OGF_LINK_CTL: Link control,这个Command Group中的Command允许Host控制与其它bluetooth device 的连接。

OGF_LINK_POLICY<wbr>:Link Policy。这个Command Group中的Command允许调整Link Manager control.</wbr>

OGF_HOST_CTL: Control and Baseband.

<wbr></wbr>

1.1.2: Opcode Command:<wbr></wbr>

用来在同一个Group内唯一识别Command。~/include/net/bluetooth/hci.h中定义。

<wbr></wbr>

<wbr></wbr>

1.2: HCI Event:

Modules向Host发送一些信息,使用HCI Event。Event Packet结构如下:

HCI Event分3种:Command complete Event, Command States Event,Command Subsequently Completend.

Command complete Event: 如果Host发送的Command可以立刻有结果,则会发送此类Event。也就是说,如果发送的Command只与本地Modules有关,不与remote设备打交道,则使用Command complete Event。例如:HCI_Read_Buffer_Size.

Command States Event:如果Host发送的Command不能立刻得知结果,则发送此类Event。Host发送的Command执行要与Remote设备打交道,则必然无法立刻得知结果,所以会发送Command States Event.例如:

HCI Connect。

Command Subsequently Completend:Command延后完成Event。例如:连接已建立。

<wbr></wbr>

下图是一个Command-Event例子:

从这里可以看出,如果Host发送的Command是与Remote device有关的,则会先发送Command States Event<wbr>。等动作真正完成了,再发送<strong>Command Subsequentl

### 如何使用Docker启动Linux容器 #### 创建并运行基础的Ubuntu容器 为了展示如何使用 Docker 启动 Linux 容器,这里以 Ubuntu 镜像为例来创建启动一个简单的容器。 ```bash docker run -it ubuntu:latest /bin/bash ``` 这条命令会拉取最新的官方 Ubuntu 镜像,并启动一个新的交互式的 Bash shell 实例[^1]。 #### 使用特定版本的基础镜像 如果需要指定某个具体版本的 Linux 发行版作为基础镜像,则可以在 `run` 命令中指明标签名: ```bash docker pull centos:7 docker run -d --name mycentos centos:7 sleep infinity ``` 上述例子展示了怎样下载 CentOS 7 版本的镜像以及以后台模式启动它。注意这里的 `-d` 参数表示守护进程方式运行;而 `sleep infinity` 是为了让容器保持活动状态而不立即退出。 #### 构建自定义应用环境 对于更复杂的应用场景来说,通常还需要安装额外软件服务到基本操作系统之上。这时可以编写 Dockerfile 文件来自动生成带有预配置应用程序栈的新镜像。 例如,在 Tomcat 场景下,先在主机上准备好的项目根目录里新建名为 `Dockerfile` 的文本文件,编辑其内容如下所示[^2]: ```Dockerfile FROM tomcat:9.0 COPY ./webapps/ROOT.war /usr/local/tomcat/webapps/ EXPOSE 8080 CMD ["catalina.sh", "run"] ``` 接着在同一路径执行构建操作: ```bash docker build -t custom-tomcat . ``` 最后就可以通过下面的方式启动这个定制化的 Web 应用了: ```bash docker run -p 8080:8080 --name webapp-container custom-tomcat ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值