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层编程相关推荐

  1. Linux 蓝牙读写,实战Linux Bluetooth编程(三) HCI层编程

    作者:Sam (甄峰) (HCI协议简介,HCI 在BlueZ中的实现以及HCI编程接口) 1. HCI层协议概述: HCI提供一套统一的方法来访问Bluetooth底层.如图所示: 从图上可以看出, ...

  2. Linux蓝牙系统(3) Linux 命令

    Linux蓝牙系统(3) Linux 命令 2010-09-27 10:45:44 分类: LINUX Andrew Haung bluedrum@163.com 一.Linux对于蓝牙的支持 --- ...

  3. linux 蓝牙脚本,arm linux串口蓝牙工具移植及使用(示例代码)

    ap6212中串口蓝牙在linux下的使用记录 一.linux蓝牙工具移植 主要使用到的工具及相关库如下: bluez-libs-3.36 libxml2-2.7.4 dbus-1.0.2 glib- ...

  4. linux 内核优化实战,Linux编译优化必须掌握的几个姿势总结

    01.编译选项和内核编译 Linux内核(英语:linux kernel),是一种计算机操作系统内核,已C语言和汇编语言写成,匹配POSIX标准,以GNU通用公共许可证发布.从技术上说Linux只是一 ...

  5. linux蓝牙储备,储备 linux tty pty 虚拟终端

    基本概念: 1. tty(终端设备的统称): tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被 ...

  6. 《Java并发编程实战》【第三部分 活跃性、性能与测试】

    文章目录 第10章 避免活跃性危险 10.1 死锁 10.1.1 锁顺序死锁 10.1.2 动态的锁顺序死锁 10.1.3 在协作对象之间发生的死锁 10.1.4 开放调用 10.1.5 资源死锁 1 ...

  7. linux蓝牙模块调试,Ubuntu Bluetooth Driver 调试

    kernel源码:Linux-3.2.16 升级Linux-3.2.16源码(参照:Linux-3.2.6内核升级).bluetooth驱动模块代码位于linux-3.2.16/net/bluetoo ...

  8. 《Linux内核技术实战课》总结三:网络

    TCP配置项 连接过程: 断开过程: TCP收发包配置项 发送: TCP 发送缓冲区太小,导致业务延迟很大的问题可以使用 systemtap 之类的工具在内核里面打点来进行观察,如果观察到 sk_st ...

  9. python数据可视化编程实战 第2版 github_Python数据可视化编程实战(三):在Mac OS X上安装matplotlib...

    1.4在Mac OS X上安装matplotlib 在Mac OS X上获取matplotlib最简便的方式是使用预打包的python发布版本,例如Enthought Python Distribut ...

最新文章

  1. python使用matplotlib可视化、使用matplotlib可视化scipy.misc图像、自定义使用grey灰色映射、将不同亮度映射到不同的色彩、并添加颜色标尺
  2. 遇到的问题和解决方案
  3. Bash的循环结构(for和while)
  4. Android项目实战视频教程_快递轨迹查询应用开发
  5. JEECG社区第六期架构培训班报名
  6. pandas将字符串转换成时间_pandas入门: 时间字符串转换为年月日
  7. Android对话框动态加载布局
  8. 初识Visual Studio 2010(四)—— 创建ASP.NET网站
  9. 开始学习 limodou 的 Django step by step 了
  10. JavaSE JDK搭建
  11. 绝对值编码器 c语言,绝对式光电编码器
  12. 使用PHP求解二元一次方程,二元一次方程求解
  13. html中画分割线的代码,各种分割线Html代码
  14. 一个视频发布在三个平台上,可以赚三份收益,自媒体如何发布视频
  15. css3的高级特效 2D
  16. unix_timestamp时间比较引发的问题
  17. 抖音直播带货变现,带货脚本文案怎么制作?丨国仁网络资讯
  18. 游戏服务器是什么 游戏服务器的特点 游戏服务器选择配置
  19. scrapy框架菜鸟学习记录
  20. stm32f407VE+enc28j60+lwip2.0.2

热门文章

  1. 7.2.3 使用RenderTargetBitmap类生成图片
  2. C++静态库与动态库(简介)
  3. 1个多月就能看到效果的减肥大法 - 生活至上,美容至尚!
  4. C++里如何使用功能键(F1、F2·····)进行操纵?
  5. Chrome用户请尽快更新:谷歌发现两个严重的零日漏洞
  6. 人脸识别的灵魂拷问:变胖了怎么办?
  7. 因为你组织的安全策略阻止未经身份验证的来宾(试了很多种办法都不行)
  8. linux sublime 输入中文,Linux中Sublime Text无法输入中文怎么办
  9. python方法和函数的格式是完全一样的_【python基础语法】常用内置函数、关键字、方法和之间的区别(小结)...
  10. Oracle 序列和触发器