首先,如何来确定什么样的包为Command/Event Packet呢?

我们知道,通过HCI Packet包括四种,即Command,Event,ACL和SCO/eSCO,对应到MS-Stack中的定义,即为COMMAND_PACKET ,EVENT_PACKET,DATA_PACKET_ACL和DATA_PACKET_SCO。

如下(详细参照bt_hcip.h):

enum HCI_TYPE {

COMMAND_PACKET  = 1,

DATA_PACKET_ACL = 2,

DATA_PACKET_SCO = 3,

EVENT_PACKET    = 4,

ETYPE_FINISH    = 5

};

需要指出的是COMMAND_PACKET方向是从Host写入到Controller,EVENT_PACKET为Controller发送给Host,即单向的数据。而DATA_PACKET_ACL和DATA_PACKET_SCO为双向的数据,即可以HostàController,也可以ControlleràHost。

接下来看两个与发包和收包相关的函数的定义,如下:

int HCI_WritePacket(HCI_TYPE eType, BD_BUFFER *pBuff)

int HCI_ReadPacket(HCI_TYPE *peType, BD_BUFFER *pBuff)

其第一个参数etype就是用来表示R/W Packet的类型,第二个参数为包的具体数据,通过串口输出我们就可以获取到完整的HCI包的数据。

所以通过在HCI_WritePacket()/HCI_ReadPacket()中对eType值的判断,很容易知道是Command Packet,还是Event Packet。

>> Command Packet

首先来看HCI包的结构:

其中低10个bit用来表示HCI Command的OCF域,可以拿着这个值到BlueCore Spec中去查询对应的命令,而bit10~bit15用来表示OGF域。对于OGF即使HCI命令的种类,具体的种类包括Link control, Link PolicyController&BaseBand以及Information等。

For example,HCI_Disconnect在MS-Stack的定义值为0x0406,具体参照文件bt_ddi.h。而其OCF域,也即bit0~bit9为0x006,对应的OGF域,也即bit10~bit15域为0x01。根据BlueCore Spec的定义,OGF为1表示Link Control Command。所有HCI Packet的定义在Volume 2-Core System Packet Part E-Host Controller Interface的Chapter 7th-HCI Command and Events中定义(以BlueCore Spec2.1为例),查询7.1th-Link Control Command一节,对应的Command Code为0x006,其对应的Command应该是HCI_Disconnect,如下所示:

下面举一个具体的Command Packet分析过程:

Write(1, 25):

0B 04 16 77 89 39 98 22 00 54 0B 3F 42 F8 38 EE

90 09 BC 1D 1C 1E D1 E2 61

G=0x1, code=0xb

首先看OCF(bit[0~9])为0x0b,而OGF(bit[10~15])为0x01,对照BlueCore Spec,则该条命令应该为Link Controller Command域中的HCI_LINK_KEY_REQUEST_REPLY(0x0b),Parameter Total Length(bit16~23)0x16,为该命令的解释如下:

根据该命令的详细解释,其参数包括两部分BT_ADDR和Link_key,分别占用6字节和16字节,所以BT_ADDR为77 89 39 98 22 00,而Link_key为54 0B 3F 42 F8 38 EE 90 09 BC 1D 1C 1E D1 E2 61。

所以,可以看到分析Command Packet的关键在于两点,第一点是根据Packet找到OCF,OGF以及total parameter length,然后找到该command的详细解释,即包含了那些参数以及每一个参数的具体长度,就可以来对Command Packet进行解析了。

>> Event Packet

首先,来看Event Packet的结构:

下面以一个具体的Event Packet来进行分析:

Read(5, 8):

17 06 77 89 39 98 22 00

很容易可以看出,Event Code为0x17,Parameter Total Length为0x06。由于Event没有域之说,可以直接拿着0x17去BlueCore Spec中的Events中去查找对应Event Link Key Request,如下:

根据该Event的详细解释,其参数为BT_ADDR,共占用6个字节,即为77 89 39 98 22 00。

如何获取并分析Bluetooth HCI层Command Packet和Event Packet包相关推荐

  1. Android Bluetooth hci 命令分析

    Android在连接BLE设备的时候,遇到连接没多久就自动断开的情况.通过HCI来分析一下. BLE设备发送连接参数更新请求 3909 15:53:01.224737 TexasIns_f0:d3:4 ...

  2. linux 蓝牙编程,实战Linux Bluetooth编程(三) HCI层编程

    1. HCI层协议概述: HCI提供一套统一的方法来访问Bluetooth底层.如图所示: 从图上可以看出,Host Controller Interface(HCI)  就是用来沟通Host和Mod ...

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

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

  4. 三 蓝牙低功耗(BLE)协议栈 之 HCI层

    一 HCI介绍 HCI (Host Controller interface), 为Host访问Controller提供一组标准的接口. 主要完成3个任务: Host通过HCI发送命令给Control ...

  5. datastage(IBM InfoSphere Information Server )日志的获取和分析

    在使用 IBM InfoSphere Information Server 的过程中我们经常会遇到一些问题,但如何来查找和诊断问题,对于一个刚刚使用 IBM InfoSphere Informatio ...

  6. android 4.4 电池电量管理底层分析(C\C++层)

    参考文献:http://blog.csdn.net/wlwl0071986/article/details/38778897 简介: Linux电池驱动用于和PMIC交互.负责监听电池产生的相关事件, ...

  7. Binder源码分析之Java层(原)

    前面的几节中我们介绍了Native层Binder通讯的原理和用法,那么在Java层如何使用Binder通讯呢?其原理又与Native层的Binder有什么关系呢?         与Native层的S ...

  8. 《软件工程》实验报告——需求获取与分析

    一.实验目的 掌握基本的需求获取与分析方法: 掌握用例图.类图.活动图.顺序图的画法: 熟悉一种UML绘图软件的基本用法: 二.实验内容 1.按照以下关于电子商务网站的描述,绘制一个用例图:绘制一个类 ...

  9. 影院管理系统的需求获取与分析

    作业报告 课程名称 软件需求分析与建模 班级 18软件工程5班 作业名称 需求获取与分析 教导教师 董瑞生 陈丹 1814080902539 李林 1814080902502 日期 2020.10.1 ...

最新文章

  1. 目标检测推理部署:优化和部署
  2. day7 面向对象进阶、socket套接字
  3. [ORACLE错误]oracle 不能更新 PL/SQL 点击“edit data”报“ these query results are not updateable”...
  4. 51CTO,什么情况?
  5. 给Java程序员的Golang教程
  6. python中的赋值、浅拷贝和深拷贝
  7. 感知算法论文(十):Towards Universal Object Detection by Domain Attention(2019)
  8. 计算机的doc命令怎么学,cmd命令提示符大全:想成为电脑高手必学CMD命令大全
  9. 关系抽取(分类)总结【转载】
  10. 获取小程序页面跳转链接
  11. 声学模型(一) hmm声学训练流程
  12. 对51job网页招聘信息的简单爬取
  13. 复习单片机:点亮LED(内含实物图+硬件设计+软件编程+原始代码)
  14. word中如何删除最后一页且不影响前面一页的格式
  15. 如何修改Bash Shell的提示符的格式和配色
  16. win10 和ubuntu双系统设置启动顺序和时间
  17. Hyperledger Explorer 区块链浏览器
  18. 架构师必须了解的 5 种最佳软件架构模式
  19. 一个好用的在线画图工具 - 图表秀
  20. lm283_飞利浦Tango LED泛光灯BVP283-普照网

热门文章

  1. extjs 页面打开时表格自动加载后台传来的json数据
  2. Ubuntu 中设置源的几种方法
  3. vmware安装ubuntu13版本的vm tools时遇到的错误解决
  4. win10桌面倒计时插件_win10 桌面如何做到清爽好看?这篇教程给你答案
  5. mysql 存储引擎接口_MySQL 的基础一(连接池, SQL接口, 查询解析器, 查询优化器, 存储引擎接口, 执行器,)...
  6. Governing sand(权值线段树/主席树)
  7. TCP文件上传Java_java 基于TCP协议的文件上传
  8. 数模笔记_单变量最优化
  9. canvas 圆角矩形填充_View绘制系列(9)Canvas八卦图绘制
  10. java接口有非抽象方法_如果一个类没有实现Java接口的所有抽象方法,会发生什么?...