如何获取并分析Bluetooth HCI层Command Packet和Event Packet包

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

         我们知道,通过HCI Packet包括四种,即CommandEventACLSCO/eSCO,对应到MS-Stack中的定义,即为COMMAND_PACKET EVENT_PACKETDATA_PACKET_ACLDATA_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写入到ControllerEVENT_PACKETController发送给Host,即单向的数据。而DATA_PACKET_ACLDATA_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包的结构:

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

         For exampleHCI_DisconnectMS-Stack的定义值为0x0406,具体参照文件bt_ddi.h。而其OCF域,也即bit0bit90x006,对应的OGF域,也即bit10bit15域为0x01。根据BlueCore Spec的定义,OGF1表示Link Control Command。所有HCI Packet的定义在Volume 2-Core System Packet Part E-Host Controller InterfaceChapter 7th-HCI Command and Events中定义(以BlueCore Spec2.1为例),查询7.1th-Link Control Command一节,对应的Command Code0x006,其对应的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

         首先看OCFbit[0~9])为0x0b,而OGFbit[10~15])为0x01,对照BlueCore Spec,则该条命令应该为Link Controller Command域中的HCI_LINK_KEY_REQUEST_REPLY0x0b),Parameter Total Lengthbit16230x16,为该命令的解释如下:

 

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

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

>> Event Packet

         首先,来看Event Packet的结构:

 

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

Read(5, 8):

 17 06 77 89 39 98 22 00

         很容易可以看出,Event Code0x17Parameter Total Length0x06。由于Event没有域之说,可以直接拿着0x17BlueCore Spec中的Events中去查找对应Event Link Key Request,如下:

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Metadata Service 架构详解 - 每天5分钟玩转 OpenStack(165)

下面是 Metadata Service 的架构图,本节我们详细讨论各个组件以及它们之间的关系。 nova-api-metadata nova-api-metadata 是 nova-api 的一个子服务,它是 metadata 的提供者,instance 可以通过 nova-api-metadata 的 REST API 来获取 metada…

hi3531交叉编译环境arm-hisiv100nptl-linux搭建过程

安装SDK 1、Hi3531 SDK包位置 在"Hi3531_V100R001***/01.software/board"目录下,您可以看到一个 Hi3531_SDK_Vx.x.x.x.tgz 的文件, 该文件就是Hi3531的软件开发包。 2、解压缩SDK包 在linux服务器上(或者一台装有linux的PC上&…

不重叠序列检测

不重叠序列检测 题目描述 请编写一个序列检测模块,检测输入信号(a)是否满足011100序列, 要求以每六个输入为一组,不检测重复序列,例如第一位数据不符合,则不考虑后五位。一直到第七位数据即下一…

首付贷换了马甲,又重现江湖了

据《每日经济新闻》报道,广州某小贷公司通过无抵押信用贷款,一个月入万元左右的普通市民可以获得30万元贷款,高者可获得50万元无抵押信用贷款用于垫付首付款。首付贷以“消费贷”的名义,换了马甲又重现江湖了。根据《每日经济新闻…

获取 metadata 的完整例子 - 每天5分钟玩转 OpenStack(166)

我们将通过实验详细分析 instance 从 nova-api-metadata 获取信息的完整过程。 环境介绍 1. 一个 all-in-one 环境(多节点类似)。 2. 已创建 neutron 网络 test_net,DHCP 已启动。在这个 metadata 实验中, test_net 的 type 不重…

输入序列不连续的序列检测

输入序列不连续的序列检测 题目描述 请编写一个序列检测模块,输入信号端口为data,表示数据有效的指示信号端口为data_valid。当data_valid信号为高时,表示此刻的输入信号data有效,参与序列检测;当data_valid为低时&am…

这些贷款合同陷阱你知道多少?

贷款合同可以是正式的贷款协议书,可以包括收条,也可以是个人借条。无论是哪一种方式,都有可能存在陷阱。我们先来看一个案例:王先生去找一家贷款机构办理贷款,因为王先生的资质比较好,很多贷款机构都希望能…

一个人到底申请几张信用卡最合适?

一个到底有几张信用卡最合适呢?这个问题估计很多朋友都没有好好的想过,以至于信用卡办办办,结果信用卡一大推,一不小心就走上了不归路。我们先来看下一个网友的真实情况:“每个月信用卡利息都要还好多,工资…

Fedora20配置tftp服务器

http://bbs.52dtv.com/thread-25392-1-1.html TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69…

数据串转并电路

数据串转并电路 题目描述 实现串并转换电路,输入端输入单bit数据,每当本模块接收到6个输入数据后,输出端输出拼接后的6bit数据。本模块输入端与上游的采用valid-ready双向握手机制,输出端与下游采用valid-only握手机制。数据拼接…

获取 metadata 过程详解 - 每天5分钟玩转 OpenStack(167)

接上节,启动 neutron router 后 instance c1 终于拿到了 metadata, 从下面 c1 的启动日志可知: c1 所认为的 metadata 服务地址是 169.254.169.254,端口为 80。我们在 c1 中尝试访问一下 metadata。 确实能够拿到 metadata。但我们知道 nova-…

月息2%的贷款算高利贷吗?

对于贷款的朋友来说,贷款利息应该是最关心的一个话题了,大家都希望贷款的利息越低越好,如果免息那当然是最好的了!但是市面上大部分接触到的小贷公司利息基本都是在月息2%以上,有高的甚至可以达到月息5%以上。这个利息…

数据累加输出

数据累加输出 题目描述 实现串行输入数据累加输出,输入端输入8bit数据,每当模块接收到4个输入数据后,输出端输出4个接收到数据的累加结果。输入端和输出端与上下游的交互采用valid-ready双向握手机制。要求上下游均能满速传输时,…

第一张信用卡,该选哪家的?

网友A:贷款教授你好,说一下我的情况,本人25岁工作2年,没有信用卡想办一张。但是现在的信用卡五花八门,也不知道怎么选择。所以请你帮我支支招。网友A:再说一下要求吧:1.不想第一张信用卡就给年费2.超市、购物、看电影、…

为什么你总办不到大额信用卡?

通常的信用卡,额度都是1-2万,大额的信用卡标准是5万及以上,有时候一张大额的信用卡能顶3张一般的信用卡,从卡片管理到额度来说都是大额信用更受到人们的青睐。但是,为什么自己总是办不到银行的大额信用卡呢&#xff1f…

非整数倍数据位宽转换24to128

非整数倍数据位宽转换24to128 题目描述 实现数据位宽转换电路,实现24bit数据输入转换为128bit数据输出。其中,先到的数据应置于输出的高bit位。 电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性,valid_out用来指示数据输出…

通过 dhcp-agent 访问 Metadata - 每天5分钟玩转 OpenStack(168)

OpenStack 默认通过 l3-agent 创建和管理 neutron-ns-metadata-proxy,进而与 nova-metadata-api 通信。但不是所有环境都有 l3-agent,比如直接用物理 router 的场景。这时就需要走另一条路:让 dhcp-agent 来创建和管理 neutron-ns-metadata-p…

乱查征信,贷款不想要了吗?

前几天接待了一个客户,客户自己是做皮具批发的,想要贷款50万,他个人在深圳有房有车,公司月营业额100多万,目前有120万的贷款,信用记录最近两年有过1次逾期,只是逾期了几天,不算严重。…

非整数倍数数据位宽转换8to12

非整数倍数数据位宽转换8to12 题目描述 实现数据位宽转换电路,实现8bit数据输入转换为12bit数据输出。其中,先到的数据应置于输出的高bit位。 电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性,valid_out用来指示数据输出da…

instance 怎么获得自己的 Metadata - 每天5分钟玩转 OpenStack(169)

要想从 nova-api-metadata 获得 metadata,需要指定 instance 的 id。但 instance 刚启动时无法知道自己的 id,所以 http 请求中不会有 instance id 信息,id 是由 neutron-metadata-agent 添加进去的。针对 l3-agent 和 dhcp-agent 这两种情况…