一. APP藍牙代碼文件說明
APP代碼位于apps\ap_btspeaker目錄下,其中每個profile為一個單獨的.c和.h文件,目前支持的profile及版本列表為:HFP 1.5,A2DP ,AVRCP,SPP,PBAP,MAP,HID,OPP
具體介紹如下:
1. ap_a2dp.h,ap_a2dp.c:
此文件包含了藍牙立體聲音樂的代碼,以5856項目為例,若想使用此功能,需打開target\5856_nolcd\include目錄下的tgt_app_cfg.h文件,將宏APP_SUPPORT_A2DP置1。
2. ap_avrcp.h,ap_avrcp.c:
此文件包含了藍牙立體聲音樂控制播放的代碼,以5856項目為例,若想使用此功能,需打開target\5856_nolcd\include目錄下的tgt_app_cfg.h文件,將宏APP_SUPPORT_AVRCP置1。
3. ap_hfp.h,ap_hfp.c:
此文件包含了藍牙免持設備的代碼,以5856項目為例,若想使用此功能,需打開target\5856_nolcd\include目錄下的tgt_app_cfg.h文件,將宏APP_SUPPORT_HFP置1。
4. ap_spp.h,ap_spp.c:
此文件包含了藍牙模擬串口的代碼,以5856項目為例,若想使用此功能,需打開target\5856_nolcd\include目錄下的tgt_app_cfg.h文件,將宏APP_SUPPORT_SPP置1。
5. ap_pbap.h,ap_pbap.c:
此文件包含了藍牙同步電話本的代碼,以5856項目為例,若想使用此功能,需打開target\5856_nolcd\include目錄下的tgt_app_cfg.h文件,將宏APP_SUPPORT_PBAP置1。
6. ap_map.h,ap_map.c:
此文件包含了藍牙同步手機短信的代碼,以5856項目為例,若想使用此功能,需打開target\5856_nolcd\include目錄下的tgt_app_cfg.h文件,將宏APP_SUPPORT_MAP置1。
7. ap_bt_common.h,ap_bt_common.c:
此文件包含了一些藍牙基本功能的代碼,如藍牙激活關閉,藍牙查找設備,主動連接斷開設備,profile的消息匯總等,設備的通用數據結構也在這里定義,可以通過target\5856_nolcd\include目錄下的tgt_app_cfg.h文件,將宏APP_SUPPORT_BLUETOOTH置1來打卡藍牙功能
二. 藍牙代碼結構說明
每個profile源文件均由若干API和一個消息處理函數組成,API為提供給用戶使用的功能接口,消息處理函數內處理的消息為藍牙庫上報給APP的一些消息,用戶可在這些消息處理代碼里增加自己的處理函數。
每個profile頭文件里定義了一些關鍵數據結構,這些數據結構是根據藍牙庫上報的內容來定義的,用戶不能自行修改,否則會導致運行出錯。
三. API及消息說明
1. HFP
API說明:
void app_connect_hfp(t_bdaddr *pAddr)
作用:發起一個HFP連接請求
參數:pAddr 目標藍牙設備地址
---------------------------------------------------------------------------------------------------------------------
void app_disconnect_hfp(t_bdaddr *pAddr)
作用:發起一個HFP斷開連接請求
參數:pAddr 目標藍牙設備地址
---------------------------------------------------------------------------------------------------------------------
void app_hfp_call_answer_req(t_bdaddr *pAddr, u_int8 call_status)
作用:當HFP有電話來時,用來回復是否要接聽
參數:pAddr目標設備藍牙地址
call_status是否接聽選項,HFP_CALL_REQ_REJECT表示拒絕接聽,HFP_CALL_REQ_ACCEPT表示接聽
---------------------------------------------------------------------------------------------------------------------
void app_hfp_call_req(t_bdaddr *pAddr, u_int8 call_type, u_int8 *phone_number)
作用:發起一個通話請求
參數:pAddr 目標設備藍牙地址
call_type 請求通話類型,HFP_CALL_REQ_REDIAL為直接重撥最后一次通話的號碼,此時phone_number參數無用;HFP_CALL_REQ_OUTGONING為撥打指定電話號碼,phone_number為要通話的對方號碼
phone_number 要通話的對方號碼
---------------------------------------------------------------------------------------------------------------------
void app_hfp_get_adp_info_req(void)
作用:請求獲取藍牙中間層數據,若獲取成功,則藍牙庫會上報一個RDABT_HFP_ADP_INFO_MSG消息
參數:無
---------------------------------------------------------------------------------------------------------------------
消息說明:
RDABT_HFP_CONNECTED_IND_MSG
此消息說明有設備HFP連接成功,用戶可使用hfp頭文件里定義的RDABT_HFP_MSG_INFO結構來獲取消息參數,msg_param在不同的消息里有不同的意義,在此消息里,msg_param里存放了狀態值,表示連接是否成功,正常連接成功的值為RDABT_NOERROR,其他返回值參見bt.h頭文件定義。
hfp_addr里存放了連接設備的藍牙地址。
typedef struct
{
t_bdaddr hfp_addr;
u_int32 msg_param;
}RDABT_HFP_MSG_INFO;
---------------------------------------------------------------------------------------------------------------------
RDABT_HFP_ACL_DISCONNECT_IND_MSG
此消息說明有設備HFP連接斷開,用戶可使用hfp頭文件里定義的RDABT_HFP_MSG_INFO結構來獲取消息參數,hfp_addr里存放了斷開設備的藍牙地址
---------------------------------------------------------------------------------------------------------------------
RDABT_HFP_CALL_STATUS_IND_MSG
此消息說明有電話信息,hfp_addr里存放了設備的藍牙地址,msg_param里存放了電話信息,定義如下
#define BT_CALL_STATUS_NONE 0x0000
表示沒有電話狀態
#define BT_CALL_STATUS_INCOMING 0x0100
表示有來電
#define BT_CALL_STATUS_OUTGOING 0x0200
表示有去電
#define BT_CALL_STATUS_ALERT 0x0300
表示來電正在振鈴
#define BT_CALL_STATUS_ACTIVE 0x0001
表示電話已接通
#define BT_CALL_STATUS_END 0x0400
表示電話已掛斷
---------------------------------------------------------------------------------------------------------------------
RDABT_HFP_RING_IND_MSG
此消息說明有來電進入,正在振鈴
---------------------------------------------------------------------------------------------------------------------
RDABT_HFP_ADP_INFO_MSG
此消息說明中間層數據已上報,數據格式如下
typedef struct
{
t_bdaddr hfp_addr;
u_int16 hfp_call_status;
}RDABT_HFP_DEVICE_INFO;
typedef struct
{
RDABT_HFP_DEVICE_INFO *hfp_device_info_list;
UINT8 hfp_max_device_num;
}RDABT_HFP_ADP_INFO;
hfp_device_info_list是當前已連接設備的列表,每個設備內存放了地址和電話狀態信息,hfp_max_device_num是可提供連接的最大設備數,這個值與用戶在target\5856_nolcd\include目錄下的tgt_app_cfg.h文件里配置的max_device_nb值一致。
2. A2DP
API說明:
void app_connect_a2dp(t_bdaddr *pAddr)
作用:發起一個A2DP連接請求
參數:目標藍牙設備地址
---------------------------------------------------------------------------------------------------------------------
void app_disconnect_a2dp(t_bdaddr *pAddr)
作用:發起一個A2DP斷開連接請求
參數:目標藍牙設備地址
---------------------------------------------------------------------------------------------------------------------
void app_a2dp_get_adp_info_req(void)
作用:請求獲取藍牙中間層數據,若獲取成功,則藍牙庫會上報一個RDABT_A2DP_ADP_INFO_MSG消息
參數:無
---------------------------------------------------------------------------------------------------------------------
消息說明:
RDABT_A2DP_SIGNAL_CONNECTED_CNF_MSG
此消息說明有設備A2DP連接成功,用戶可使用a2dp頭文件里定義的RDABT_A2DP_MSG_INFO結構來獲取消息參數,msg_param在不同的消息里有不同的意義,在此消息里,msg_param里存放了狀態值,表示連接是否成功,正常連接成功的值為RDABT_NOERROR,其他返回值參見bt.h頭文件定義。
a2dp_addr里存放了連接設備的藍牙地址。
RDABT_A2DP_SIGNAL_DISCONNECTED_IND_MSG
RDABT_A2DP_SIGNAL_DISCONNECTED_CNF_MSG
這兩個消息說明有設備A2DP斷開,區別在于RDABT_A2DP_SIGNAL_DISCONNECTED_CNF_MSG是RDA藍牙發起斷開請求的,RDABT_A2DP_SIGNAL_DISCONNECTED_IND_MSG是對方藍牙發起斷開請求的
RDABT_A2DP_MEDIA_DATA_IND_MSG
此消息說明有A2DP數據到達,參數是數據地址
---------------------------------------------------------------------------------------------------------------------
RDABT_A2DP_SEND_SEP_START_IND_MSG
此消息說明A2DP開始播放
---------------------------------------------------------------------------------------------------------------------
RDABT_A2DP_ADP_INFO_MSG
此消息說明庫已上報A2DP中間層數據
3. AVRCP
API說明:
void app_connect_avrcp(t_bdaddr *pAddr)
作用:發起AVRCP連接請求
參數:對方設備藍牙地址
void app_disconnect_avrcp(t_bdaddr *pAddr)
作用:斷開AVRCP連接請求
參數:對方設備藍牙地址
void app_avrcp_get_adp_info_req ()
作用:獲取AVRCP中間層數據,若獲取成功則會收到RDABT_AVRCP_ADP_INFO_MSG消息
參數:無
void app_avrcp_send_key(u_int8 key)
作用:發送AVRCP鍵值
參數:鍵值,定義在ap_avrcp.h中,常用的有OPID_PLAY,OPID_STOP,OPID_PAUSE
---------------------------------------------------------------------------------------------------------------------
消息說明:
RDABT_AVRCP_CONNECT_CNF_MSG
RDABT_AVRCP_CONNECT_IND_MSG
這兩個消息都是表示收到AVRCP連接,RDABT_AVRCP_CONNECT_CNF_MSG是RDA藍牙發起的連接,RDABT_AVRCP_CONNECT_IND_MSG是對方藍牙發起的連接
---------------------------------------------------------------------------------------------------------------------
RDABT_AVRCP_ADP_INFO_MSG
此消息說明收到了藍牙庫上報的中間層數據,可用RDABT_AVRCP_ADP_INFO結構來獲取
---------------------------------------------------------------------------------------------------------------------
RDABT_AVRCP_PLAYER_STATUS_IND_MSG
此消息說明對方設備的播放器狀態有了變化,當播放器開始播放或者在播放時暫停都會上報此消息
---------------------------------------------------------------------------------------------------------------------
RDABT_AVRCP_NOTIFICATION_IND_MSG
---------------------------------------------------------------------------------------------------------------------
RDABT_AVRCP_VENDOR_DATA_IND_MSG
---------------------------------------------------------------------------------------------------------------------
RDABT_AVRCP_BROWSING_DATA_IND_MSG
---------------------------------------------------------------------------------------------------------------------
4. SPP
API說明:
void app_spp_connect_req(t_bdaddr *pAddr)
作用:發起SPP連接
參數:對方設備藍牙地址
---------------------------------------------------------------------------------------------------------------------
void app_spp_disconnect_req(t_bdaddr *pAddr)
作用:斷開SPP連接
參數:對方設備藍牙地址
---------------------------------------------------------------------------------------------------------------------
void app_spp_get_adp_info_req(void)
作用:獲取SPP中間層數據
參數:無
---------------------------------------------------------------------------------------------------------------------
void app_spp_send_data_req(RDABT_SPP_SEND_DATA_STRUCT *spp_sd_struct)
作用:發送SPP數據
參數:
typedef struct
{
u_int8 *data;
u_int16 data_length;
u_int16 spp_port;
}RDABT_SPP_SEND_DATA_STRUCT;
data為要發送的數據buffer,data_length為要發送的數據的長度,spp_port為spp端口號,這個端口號在收到RDABT_SPP_CONNECTED_IND_MSG或RDABT_SPP_CONNECTED_CNF_MSG消息的時候會得到,用戶需要自行保存
---------------------------------------------------------------------------------------------------------------------
消息說明:
RDABT_SPP_CONNECTED_IND_MSG
RDABT_SPP_CONNECTED_CNF_MSG
這兩個消息都是表示有新SPP連接,RDABT_SPP_CONNECTED_IND_MSG是對方設備發起的SPP連接,RDABT_SPP_CONNECTED_CNF_MSG為RDA藍牙發起的連接
---------------------------------------------------------------------------------------------------------------------
RDABT_SPP_DISCONNECTED_IND_MSG
RDABT_SPP_DISCONNECTED_CNF_MSG
這兩個消息都是表示SPP連接已斷開,RDABT_SPP_DISCONNECTED_IND_MSG是對方設備發起的斷開SPP連接,RDABT_SPP_DISCONNECTED_CNF_MSG為RDA藍牙發起的斷開連接
---------------------------------------------------------------------------------------------------------------------
RDABT_SPP_ADP_INFO_MSG
表示藍牙庫已上報SPP中間層數據,可用RDABT_SPP_ADP_INFO結構來獲取
---------------------------------------------------------------------------------------------------------------------
RDABT_SPP_DATA_IND_MSG
表示收到了SPP數據,可用RDABT_SPP_SEND_DATA_STRUCT結構來獲取,注意,使用完數據后要發送RDABT_SPP_FREE_DATA_REQ消息給藍牙庫以釋放內存,否則會造成內存泄露
---------------------------------------------------------------------------------------------------------------------
RDABT_SPP_FLOWCTRL_IND_MSG
表示有流控,造成流控的原因一般是對方的接收buf滿或者本地的buf滿
流控消息參數有2個,SPP_FLOW_STOP表示要停止發送,SPP_FLOW_GO表示流控解除,可以繼續發送數據
---------------------------------------------------------------------------------------------------------------------
5. PBAP
同步電話本分為兩步,第一步是要獲取對方通訊錄內電話本的條目數,第二步是真正去獲取電話本內容
API說明:
void app_get_pbap_size(t_bdaddr *pAddr)
作用:獲取對方設備上電話本的條目數
參數:對方設備藍牙地址
---------------------------------------------------------------------------------------------------------------------
void app_get_call_recends_size(t_bdaddr *pAddr)
作用:獲取對方設備上通話記錄的條目數
參數:對面設備藍牙地址
---------------------------------------------------------------------------------------------------------------------
void app_get_pbap_data(u_int32 size)
作用:獲取對方設備上電話本內容
參數:要獲取的條目數量,注意,獲取的條目在庫里是自動遷移的,例如第一次獲取的數量為4,那么返回的就是手機上第一條到第四條的內容,第二次獲取的數量也是4,那么返回的就是手機上第五條到第八條的內容
---------------------------------------------------------------------------------------------------------------------
void app_get_call_recends_data(u_int32 size)
作用:獲取對方設備上通話記錄內容
參數:要獲取的條目數量,解釋同上
---------------------------------------------------------------------------------------------------------------------
void app_pbap_deal_pb_data(u_int8 *data)
作用:解析獲取到的電話本數據,用戶可自行利用這個函數內部解析出的姓名和號碼等信息
參數:藍牙庫上報的電話本數據地址
---------------------------------------------------------------------------------------------------------------------
消息說明:
RDABT_PBAP_GET_SIZE_IND
表示獲取到了對方設備上電話本的條目
---------------------------------------------------------------------------------------------------------------------
RDABT_PBAP_DATA_IND
表示獲取到了對方設備上電話本的內容
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
6. MAP
API說明:
void app_get_map_size(t_bdaddr *pAddr)
作用:獲取對方設備上的短信條目數
參數:對方設備藍牙地址
---------------------------------------------------------------------------------------------------------------------
void app_get_map_data(u_int32 size)
作用:獲取對方設備上的短信內容
參數:要獲取的短信條數,具體解釋同電話本
---------------------------------------------------------------------------------------------------------------------
Rdabt_map_info rdabt_map_deal_msglist_data(u_int8 *msg_data)
作用:解析藍牙庫上報的短信內容
參數:藍牙庫上報的短信內容地址
返回值:
typedef struct
{
char msg_time[MAP_LENGTH];
char msg_name[MAP_LENGTH * 2];
char msg_num[MAP_LENGTH];
u_int16 msg_handle;
}Rdabt_map_info;
解析出的信息都填寫在這個結構里,包括短信的收發時間,發送者姓名,發送者號碼等
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
消息說明:
RDABT_MAP_GET_SIZE_IND
表示獲取到了設備上的短信條目數
---------------------------------------------------------------------------------------------------------------------
RDABT_MAP_GET_DATA_IND
表示獲取到了設備上的短信內容
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
7. 其他
API說明:
void app_bt_inquiry_req(unsigned char max_result)
作用:發起搜索設備請求
參數:要搜索的最大設備數
此函數使用了如下結構
typedef struct
{
APP_MGR_DEVICE_INFO *inquiry_device_list;
u_int8 max_inquiry_num;
u_int8 inquiry_device_count;
}Rdabt_inquiry_data;
用戶無需修改此結構,只需要在函數內給inquiry_device_list分配內存,同時將inquiry_device_list內存部分置0,然后填寫max_inquiry_num即可。當搜索到設備時,會上報RDABT_DISCOVERY_RESULT_IND消息。
---------------------------------------------------------------------------------------------------------------------
消息說明:
RDABT_DISCOVERY_RESULT_IND
收到這個消息表示新搜索到一個藍牙設備,用戶可以使用消息參數內的結構體指針來獲取設備名稱,設備類型,設備地址等信息。設備信息會自動保存在inquiry_device_list里,它是一個單向鏈表。
---------------------------------------------------------------------------------------------------------------------
RDABT_DISCOVERY_RESULT_CNF
收到這個消息表示搜索已完成,用戶需要在這里釋放inquiry_device_list,否則會造成內存泄露。
全部資料51hei下載地址:
http://www.zg4o1577.cn/bbs/dpj-135991-1.html
|