linux 蓝牙编程,实战Linux Bluetooth编程(三) HCI层编程
1. HCI层协议概述:
HCI提供一套统一的方法来访问Bluetooth底层。如图所示:
从图上可以看出,Host Controller Interface(HCI) 就是用来沟通Host和Module。Host通常就是PC, Module则是以各种物理连接形式(USB,serial,pc-card等)连接到PC上的bluetooth Dongle。
在Host这一端:application,SDP,L2cap等协议都是软件形式提出的(Bluez中是以kernel层程序)。在Module这一端:Link Manager, BB, 等协议都是硬件中firmware提供的。
而HCI则比较特殊,它一部分在软件中实现,用来给上层协议和程序提供访问接口(Bluez中,hci.c hci_usb.c,hci_sock.c等).另一部分也是在Firmware中实现,用来将软件部分的指令等用底层协议明白的方式传递给底层。
居于PC的上层程序与协议和居于Modules的下层协议之间通过HCI沟通,有4种不同形式的传输:Commands, Event, ACL Data, SCO/eSCO Data。
1.1. HCI Command:
HCI Command是Host向Modules发送命令的一种方式。HCI Command Packet结构如下:
OpCode用来唯一标识HCI Command.它由2部分组成,10bit的Opcode Command. 6bit的Opcode Group。
1.1.1: OpCode Group:
Linux Kernel(BlueZ)中,~/include/net/bluetooth/hci.h中定义了OpCode Group。
#define OGF_LINK_CTL 0x01
#define OGF_LINK_POLICY 0x02
#define OGF_HOST_CTL 0x03
#define OGF_INFO_PARAM 0x04
#define OGF_STATUS_PARAM 0x05
它们代表了不同的Command Group:
OGF_LINK_CTL: Link control,这个Command Group中的Command允许Host控制与其它bluetooth device 的连接。
OGF_LINK_POLICY :Link Policy。这个Command Group中的Command允许调整Link Manager control.
OGF_HOST_CTL: Control and Baseband.
1.1.2: Opcode Command:
用来在同一个Group内唯一识别Command。~/include/net/bluetooth/hci.h中定义。
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发送
linux 蓝牙编程,实战Linux Bluetooth编程(三) HCI层编程相关推荐
- Linux 蓝牙读写,实战Linux Bluetooth编程(三) HCI层编程
作者:Sam (甄峰) (HCI协议简介,HCI 在BlueZ中的实现以及HCI编程接口) 1. HCI层协议概述: HCI提供一套统一的方法来访问Bluetooth底层.如图所示: 从图上可以看出, ...
- Linux蓝牙系统(3) Linux 命令
Linux蓝牙系统(3) Linux 命令 2010-09-27 10:45:44 分类: LINUX Andrew Haung bluedrum@163.com 一.Linux对于蓝牙的支持 --- ...
- linux 蓝牙脚本,arm linux串口蓝牙工具移植及使用(示例代码)
ap6212中串口蓝牙在linux下的使用记录 一.linux蓝牙工具移植 主要使用到的工具及相关库如下: bluez-libs-3.36 libxml2-2.7.4 dbus-1.0.2 glib- ...
- linux 内核优化实战,Linux编译优化必须掌握的几个姿势总结
01.编译选项和内核编译 Linux内核(英语:linux kernel),是一种计算机操作系统内核,已C语言和汇编语言写成,匹配POSIX标准,以GNU通用公共许可证发布.从技术上说Linux只是一 ...
- linux蓝牙储备,储备 linux tty pty 虚拟终端
基本概念: 1. tty(终端设备的统称): tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被 ...
- 《Java并发编程实战》【第三部分 活跃性、性能与测试】
文章目录 第10章 避免活跃性危险 10.1 死锁 10.1.1 锁顺序死锁 10.1.2 动态的锁顺序死锁 10.1.3 在协作对象之间发生的死锁 10.1.4 开放调用 10.1.5 资源死锁 1 ...
- linux蓝牙模块调试,Ubuntu Bluetooth Driver 调试
kernel源码:Linux-3.2.16 升级Linux-3.2.16源码(参照:Linux-3.2.6内核升级).bluetooth驱动模块代码位于linux-3.2.16/net/bluetoo ...
- 《Linux内核技术实战课》总结三:网络
TCP配置项 连接过程: 断开过程: TCP收发包配置项 发送: TCP 发送缓冲区太小,导致业务延迟很大的问题可以使用 systemtap 之类的工具在内核里面打点来进行观察,如果观察到 sk_st ...
- python数据可视化编程实战 第2版 github_Python数据可视化编程实战(三):在Mac OS X上安装matplotlib...
1.4在Mac OS X上安装matplotlib 在Mac OS X上获取matplotlib最简便的方式是使用预打包的python发布版本,例如Enthought Python Distribut ...
最新文章
- python使用matplotlib可视化、使用matplotlib可视化scipy.misc图像、自定义使用grey灰色映射、将不同亮度映射到不同的色彩、并添加颜色标尺
- 遇到的问题和解决方案
- Bash的循环结构(for和while)
- Android项目实战视频教程_快递轨迹查询应用开发
- JEECG社区第六期架构培训班报名
- pandas将字符串转换成时间_pandas入门: 时间字符串转换为年月日
- Android对话框动态加载布局
- 初识Visual Studio 2010(四)—— 创建ASP.NET网站
- 开始学习 limodou 的 Django step by step 了
- JavaSE JDK搭建
- 绝对值编码器 c语言,绝对式光电编码器
- 使用PHP求解二元一次方程,二元一次方程求解
- html中画分割线的代码,各种分割线Html代码
- 一个视频发布在三个平台上,可以赚三份收益,自媒体如何发布视频
- css3的高级特效 2D
- unix_timestamp时间比较引发的问题
- 抖音直播带货变现,带货脚本文案怎么制作?丨国仁网络资讯
- 游戏服务器是什么 游戏服务器的特点 游戏服务器选择配置
- scrapy框架菜鸟学习记录
- stm32f407VE+enc28j60+lwip2.0.2
热门文章
- 7.2.3 使用RenderTargetBitmap类生成图片
- C++静态库与动态库(简介)
- 1个多月就能看到效果的减肥大法 - 生活至上,美容至尚!
- C++里如何使用功能键(F1、F2·····)进行操纵?
- Chrome用户请尽快更新:谷歌发现两个严重的零日漏洞
- 人脸识别的灵魂拷问:变胖了怎么办?
- 因为你组织的安全策略阻止未经身份验证的来宾(试了很多种办法都不行)
- linux sublime 输入中文,Linux中Sublime Text无法输入中文怎么办
- python方法和函数的格式是完全一样的_【python基础语法】常用内置函数、关键字、方法和之间的区别(小结)...
- Oracle 序列和触发器