蓝牙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。