資料結構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。