文档章节

蓝牙HCI

h
 houj
发布于 2014/09/30 16:41
字数 1234
阅读 128
收藏 1

蓝牙HCI

数据结构

1、HCI_EVENT

表示蓝牙控制器硬件的状态。
enum HCI_EVENT {
  DEVICE_UP,        //设备开启
  DEVICE_DOWN,      //设备关闭
  DEVICE_ERROR      //设备出现错误
};
//头文件:bt_hcip.h

2、HCI_TYPE


表示数据包的类型
enum HCI_TYPE {
  COMMAND_PACKET = 1,     //命令包
  DATA_PACKET_ACL = 2,    //访问控制列表数据
  DATA_PACKET_SCO = 3,    // 面向连接同步数据
  EVENT_PACKET = 4,       //事件
  ETYPE_FINISH = 5        //包的结束标志
};
//头文件:bt_hcip.h

3、HCI_PARAMETERS

//表示HCI传输的接口
typedef struct __hci_parameters {
  unsigned int uiSize;
  unsigned int fInterfaceVersion;       //传输层驱动的版本号
  int iMaxSizeRead;                     //缓冲区大小,不包含头和尾
  int iMaxSizeWrite;
  int iReadBufferHeader;                //预设值
  int iReadBufferTrailer;               
  int iWriteBufferHeader;               //0到start间的字节数
  int iWriteBufferTrailer;              //end到size间的字节数
  int uiFlags;                                   //取非有效,否则无效
  int fHardwareVersion;                 //0/1/2
  unsigned int uiResetDelay;            //reset命令发出到下一命令执行之前的时间间隔
  unsigned int uiWriteTimeout;          //写超时时间
  unsigned int uiDriftFactor;           //时间
  int iScoWriteLowNumPackets;           // 0
  int iScoWriteNumPackets;              //0
  int iScoWritePacketSize;              //0/-1
  int iScoSampleSize;                   //8/16
} HCI_PARAMETERS;               
//头文件:bt_hcip.h

API函数

1、HCI_CloseConnection

void HCI_CloseConnection(void);
//功能:关闭栈和HCI传输之间的连接
//注意:调用这个函数将会解锁读和写,硬件未初始化,释放所有资源空间包括缓冲区。如果驱动在DLL中,当函数返回时会被卸载。

2、HCI_OpenConnection(void);

int HCI_OpenConnection(void);
//功能:在栈中的HCI层和蓝牙硬件建立连接,返回成功代表传输启动,这种情况发生时,栈会调用HCI_ReadHciParamerters函数。
//注意:这个函数是用来开启硬件,初始化硬件,和硬件建立连接。返回true代表成功建立连接。这是个阻塞函数

3、HCI_ReadHciParameters

int HCI_ReadHciParameters(HCI_PARAMETERS* pParms);
//功能:获取蓝牙控制器的硬件特征,返回true表示成功完成,false表示发生错误。如果返回false,栈接口立即调用HCI_CloseConnection。
//注意:这个函数可以先于打开一个连接被调用。

4、HCI_ReadPacket

int HCI_ReadPacket(HCI_TYPE* peType, BD_BUFFER* pInBuffer);
//功能:从连接的设备上读包,返回true表示成功完成,false表示发生错误。如果返回false,栈接口立即调用HCI_CloseConnection。
//注意:只有包被读或者发生错误才会返回,读的时候函数被阻塞,如果错误发生,蓝牙协议栈将会关闭。这个函数必须解锁并返回错误在调用HCI_CloseConnection后。

5、HCI_WritePacket

int HCI_WritePacket(HCI_TYPE eType, BD_BUFFER* pOutBuffer);
//功能:向连接的设备发送包,返回true表示成功完成,false表示发生错误。如果返回false,栈接口立即调用HCI_CloseConnection。
//注意:这个函数要申请一个空的缓冲区为包头和包尾预留足够的空间,这个空间是HCI_ReadHciParameters中要求的。发送的时候函数被阻塞,如果错误发生,蓝牙协议栈将会关闭。这个函数必须解锁并返回错误在调用HCI_CloseConnection后。

6、HCI_StartHardware

int HCI_StartHardware(void);
//功能:初始化蓝牙硬件
//注意:为了确保硬件开启,蓝牙栈可以调用此函数。驱动可能会重新尝试初始化硬件。这个函数必须调用回调函数HCI_TransportCallback来确认设备开启状态并且解除临时标志标识硬件能用性。

7、HCI_StopHardware

int HCI_StopHardware(void);
//功能:释放蓝牙硬件
//注意:这个函数被调用是用来解除存在的硬件连接,并且暂时地不提示硬件设备的到来。这个函数必须调用回调函数HCI_TransportCallback来确认设备关闭状态并且直到HCI_StartHardware被调用竖起临时标志标识硬件能用性。

8、HCI_SetCallback

typedef int (*HCI_TransportCallback)(HCI_EVENT eEvent, void* pEvent);
  int HCI_SetCallback(
  HCI_TransportCallback pfCallback
);
//功能:获取HCI参数
//注意:如果pfCallback是空,驱动必须准备卸载。这个函数只有栈当前的连接被关闭的时候才被调用并且设置pfCallback为空。如果这个参数不为空,就代表有硬件插入或者拔出。如果检测到硬件的插入或者拔出,传输层就会调用此函数为上层提供服务。
//头文件:bt_hcip.h
//包:Btd.lib



蓝牙传输管理器首先搜索PNP设备,像:PCMCIA,USB等。如果没有发现PNP设备,它会搜索注册表中已有的设备。
  默认寄存器设置

HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\Transports BuiltIn\1 这个注册键指示了内置的传输驱动的设置,1代表优先级

HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\Transports\PnP\<GUID>这个指出PNP传输驱动的设置

GUID键代表了传输驱动IClass注册键值。这个值是BthUniv关于传输的寄存器的设置。在打开一个设备连接前,这些设置将会被拷贝到HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\HCI目录下。
如果通过设定合适的编译变量来指定传输驱动,如SYSGEN_BTH_USB_ONLY,那么在os设计中,BthUniv就用不到了。在这种情况下,那个合适的传输驱动的注册器设置将会自动地拷贝到HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\HCI。

© 著作权归作者所有

h
粉丝 9
博文 81
码字总数 57985
作品 0
长沙
技术主管
私信 提问
Android Bluetooth HCI log 详解

0. 引子 对于蓝牙开发者来说,通过HCI log可以帮助我们更好地分析问题,理解蓝牙协议,就好像网络开发一定要会使用Wireshark分析网络协议一样。 本篇主要介绍HCI log的作用、如何抓取一份HCI...

伤口不该结疤
2017/04/18
0
0
Bluedroid与BluZ,蓝牙测试方法的变动(基于bludroid和BlueZ的对比)

android4.2以后,增加了bludroid,在做测试时,会发现与之前的bluez的测试,有着较大的变动。下面罗列一些bluedroid的不同点,以及之前bluez的测试命令验证(该部分是用bluez做的测试,针对b...

sflfqx
2014/08/12
3.2K
0
介绍Bluetooth的系统构成

Bluetooth的系统构成 1、无线射频单元(Radio):负责数据和语音的发送和接收,特点是短距离、低功耗。蓝牙天线一般体积小、重量轻,属于微带天线。 2、基带或链路控制单元(LinkController):进...

昇润科技
2018/05/28
0
0
linux蓝牙驱动代码阅读笔记

昨天看了一下介绍蓝牙协议文档,今天索性对照看了看kernel里的代码(bluez),这里记点笔记,还是继承了老毛病,只关注整体流程而忽略细节,先了解个大概,等真正需要时再仔细分析。 net/hci_...

天王盖地虎626
2018/12/28
4
0
Android之蓝牙驱动开发总结

一Bluetooth基本概念 3 二AndroidBluetooth架构 3 2.1Bluetooth架构图 3 2.2Bluetooth代码层次结构 3 三Bluetooth协议栈分析 4 3.1蓝牙协议栈 4 3.2Android与蓝牙协议栈的关系 6 四Bluetooth...

球球
06/11
55
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
6
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部