#ifndef _API_BTSTACK_H #define _API_BTSTACK_H //工作模式 #define MODE_NORMAL 0 #define MODE_CBT_TEST 1 #define MODE_FCC_TEST 2 #define MODE_BQB_RF 3 #define MODE_BQB_PROFILE 4 //蓝牙功能 #define PROF_A2DP 0x0007 //蓝牙音乐功能 #define PROF_HID 0x0018 //蓝牙键盘功能 #define PROF_HFP 0x0060 //蓝牙通话功能 #define PROF_SPP 0x0080 //蓝牙串口功能 #define PROF_PBAP 0x0100 //蓝牙电话本功能 #define PROF_HSP 0x0200 #define PROF_MAP 0x0400 //蓝牙短息功能 //蓝牙特性 #define HFP_BAT_REPORT 0x01 //是否支持手机电量显示 #define HFP_3WAY_CALL 0x02 //是否支持三通电话 #define HFP_INBAND_RING_RONE 0x04 //是否支持手机来电铃声 #define HFP_CALL_PRIVATE 0x08 //是否打开强制私密接听 #define HFP_SIRI_CMD 0x10 //是否打开siri控制命令 #define HFP_EC_AND_NR 0x20 //是否打开手机端回音和降噪 #define HFP_RING_NUMBER_EN 0x40 //是否支持来电报号 #define A2DP_VOL_CTRL 0x01 //是否支持手机音量控制同步 #define A2DP_IOS_PLAY_STATUS 0x02 //是否支持IOS手机播放状态同步,注意打开后微信小视频会无声,蓝牙后台建议打开 #define A2DP_ANDROID_PLAY_STATUS 0x04 //是否支持ANDROID手机播放状态同步 #define A2DP_RESTORE_PLAYING 0x08 //是否支持掉线回连后恢复播放 #define A2DP_AVDTP_DELAY_REPORT 0x10 //是否支持AVDTP delay report功能 //蓝牙编解码 #define CODEC_SBC 0x01 #define CODEC_AAC 0x02 #define CODEC_MSBC 0x04 #define CODEC_PLC 0x08 //蓝牙状态 enum { BT_STA_OFF, //蓝牙模块已关闭 BT_STA_INITING, //初始化中 BT_STA_IDLE, //蓝牙模块打开,未连接 BT_STA_SCANNING, //扫描中 BT_STA_DISCONNECTING, //断开中 BT_STA_CONNECTING, //连接中 BT_STA_CONNECTED, //已连接 BT_STA_PLAYING, //播放 BT_STA_INCOMING, //来电响铃 BT_STA_OUTGOING, //正在呼出 BT_STA_INCALL, //通话中 BT_STA_OTA, //OTA升级中 }; //通话状态 enum { BT_CALL_IDLE, //空闲 BT_CALL_INCOMING, //来电响铃 BT_CALL_OUTGOING, //正在呼出 BT_CALL_ACTIVE, //通话中 BT_CALL_3WAY_CALL, //三通电话或两部手机通话 }; //蓝牙通知 enum { BT_NOTICE_INIT_FINISH, //蓝牙初始化完成 BT_NOTICE_CONNECT_START, //开始回连手机, param[0]=nouse, param[6:1]=bd_addr BT_NOTICE_CONNECT_FAIL, //回连手机失败, param[0]=reason, param[6:1]=bd_addr BT_NOTICE_DISCONNECT, //蓝牙断开, param[0]=feat, param[6:1]=bd_addr BT_NOTICE_LOSTCONNECT, //蓝牙连接丢失, param[0]=nouse, param[6:1]=bd_addr BT_NOTICE_CONNECTED, //蓝牙连接成功, param[0]=feat, param[6:1]=bd_addr BT_NOTICE_SCO_SETUP, BT_NOTICE_SCO_FAIL, BT_NOTICE_SCO_KILL, BT_NOTICE_RSSI_REPORT, //上报连接RSSI BT_NOTICE_INCOMING, //来电 BT_NOTICE_RING, //来电响铃 BT_NOTICE_OUTGOING, //去电 BT_NOTICE_CALL_NUMBER, //来电/去电号码 BT_NOTICE_INCALL, //建立通话 BT_NOTICE_ENDCALL, //结束通话 BT_NOTICE_NETWORK_CALL, //网络通话 BT_NOTICE_PHONE_CALL, //手机通话 BT_NOTICE_SET_SPK_GAIN, //设置通话音量 BT_NOTICE_MUSIC_PLAY, //蓝牙音乐开始播放 BT_NOTICE_MUSIC_STOP, //蓝牙音乐停止播放 BT_NOTICE_MUSIC_CHANGE_VOL, //改变蓝牙音乐音量 BT_NOTICE_MUSIC_SET_VOL, //设置蓝牙音乐音量 BT_NOTICE_HID_CONN_EVT, //HID服务连接事件 BT_NOTICE_SET_XOSC_CAP, //推出测试盒校准成功消息 ///PBAP相关消息 BT_NOTICE_PBAP_CONNECTED, BT_NOTICE_PBAP_GET_PHONEBOOK_SIZE_COMPLETE, //获取电话薄数量完成 BT_NOTICE_PBAP_PULL_PHONEBOOK_COMPLETE, //获取电话薄完成 BT_NOTICE_PBAP_DISCONNECT, BT_NOTICE_FAST_MUSIC_STATUS, //快速上报音乐播放暂停状态 }; //控制消息 enum { BT_CTL_VOL_CHANGE = 0, //音量调整 BT_CTL_PLAY_PAUSE, //切换播放、暂停 BT_CTL_LOW_LATENCY_ENABLE, //打开低延迟 BT_CTL_LOW_LATENCY_DISABLE, //关闭低延迟 BT_CTL_MSC_RES0, BT_CTL_MSC_RES1, BT_CTL_MSC_RES2, BT_CTL_MSC_RES3, BT_CTL_CALL_REDIAL, //回拨电话(最后一次通话) BT_CTL_CALL_REDIAL_NUMBER, //回拨电话(从hfp_get_outgoing_number获取号码) BT_CTL_CALL_ANSWER_INCOM, //接听来电(三通时挂起当前通话) BT_CTL_CALL_ANSWER_INCOM_REJ_OTHER, //接听来电(三通时挂断当前通话) BT_CTL_CALL_TERMINATE, //挂断通话或来电 BT_CTL_CALL_SWAP, //切换三通电话 BT_CTL_CALL_PRIVATE_SWITCH, //切换私密通话 BT_CTL_HFP_REPORT_BAT, //报告电池电量 BT_CTL_HFP_SPK_GAIN, //设置通话扬声器音量 BT_CTL_HFP_MIC_GAIN, //设置通话麦克风音量 BT_CTL_HFP_AT_CMD, //发送AT命令(从hfp_get_at_cmd获取命令) BT_CTL_HFP_SIRI_SW, //唤出/关闭siri BT_CTL_HFP_REMOTE_PHONE_NUM, BT_CTL_HFP_SWITCH_TO_PHONE, BT_CTL_HFP_SWITCH_TO_WATCH, BT_CTL_HFP_RES1, BT_CTL_HFP_RES2, BT_CTL_HFP_RES3, BT_CTL_HID_CONNECT, BT_CTL_HID_DISCONNECT, BT_CTL_BLE_ADV_DISABLE, //关闭BLE 广播 BT_CTL_BLE_ADV_ENABLE, //打开BLE 广播 BT_CTL_RES0, BT_CTL_RES1, BT_CTL_SWITCH_PALY, BT_CTL_GET_ID3_TAG, BT_CTL_GET_PLAY_STATUS_INFO, BT_CTL_A2DP_PROFILE_EN, BT_CTL_A2DP_PROFILE_DIS, BT_CTL_HFP_CONNECT, BT_CTL_HFP_DISCONNECT, BT_CTL_SEARCH_OS_CAPACITY, BT_CTL_MAX, BT_CTL_VOLUME_UP = 0xff0041, //音量加 BT_CTL_VOLUME_DOWN = 0xff0042, //音量减 BT_CTL_MUTE = 0xff0043, //MUTE BT_CTL_PLAY = 0xff0044, //播放 BT_CTL_STOP = 0xff0045, //停止 BT_CTL_PAUSE = 0xff0046, //暂停 BT_CTL_RECORD = 0xff0047, BT_CTL_REWIND = 0xff0048, //快退 BT_CTL_FAST_FORWARD = 0xff0049, //快进 BT_CTL_EJECT = 0xff004a, BT_CTL_FORWARD = 0xff004b, //下一曲 BT_CTL_BACKWARD = 0xff004c, //上一曲 BT_CTL_REWIND_END = 0xff00c8, //结束快退 BT_CTL_FAST_FORWARD_END = 0xff00c9, //结束快进 BT_CTL_NO = 0xffffff, }; enum bt_msg_comm_t { COMM_BT_CTL0, //无传参的消息 COMM_BT_SET_SCAN, //设置可被发现/可被连接 COMM_BT_CONNECT, //连接蓝牙 COMM_BT_DISCONNECT, //断开蓝牙 COMM_BT_DISC_SCO_LINK, //断开SCO链路 COMM_BT_SET_SCAN_INTV, //设置PAGE SCAN PARAM COMM_LE_AMS_REMOTE_CTRL, //LE AMS remote ctl COMM_BT_ABORT_RECONNECT, //终止回连 }; enum bt_msg_hid_t { HID_KEYBOARD, HID_CONSUMER, HID_TOUCH_SCREEN, HID_SIMPLE_KEYBOARD, }; enum bt_msg_pbap_t { BT_PBAP_CTRL, BT_PBAP_SELECT_PHONEBOOK, BT_PBAP_GET_PHONEBOOK_SIZE, BT_PBAP_PULL_PHONEBOOK, }; //蓝牙消息 enum bt_msg_t { BT_MSG_CTRL = 0, //蓝牙控制消息 BT_MSG_COMM, BT_MSG_RES1, BT_MSG_RES2, BT_MSG_ADV0, BT_MSG_A2DP, //A2DP消息 BT_MSG_HFP, //HFP消息 BT_MSG_HSP, //HSP消息 BT_MSG_HID, //HID消息,KEYPAD按键/CONSUMER按键/触摸屏 BT_MSG_PBAP, //PBAP消息 BT_MSG_LECLT, //BLE CLIENT消息 BT_MSG_MAP, //MAP消息 获取时间 BT_MSG_MAX, BT_MSG_RES = 0xf0, //0xf0~0xff保留给传参较多的api }; enum sync_info_enum { SYNC_INFO_SETTING, //VOL/LANG/EQ/BAT/... SYNC_INFO_LEDCNT, //同步 led cnt SYNC_INFO_EQPARAM, }; //LE Addr Type, public or random(static or non resolvable or resolvable) enum { GAP_RANDOM_ADDRESS_TYPE_OFF = 0, //Public GAP_RANDOM_ADDRESS_TYPE_STATIC, GAP_RANDOM_ADDRESS_NON_RESOLVABLE, GAP_RANDOM_ADDRESS_RESOLVABLE, }; //LE状态 enum { LE_STA_STANDBY, LE_STA_ADVERTISING, //正在广播 LE_STA_CONNECTION, //已连接 }; //LE 通知 typedef enum{ LE_NOTICE_CONNECTED, //连接成功 LE_NOTICE_DISCONNECT, //断开成功 LE_NOTICE_CONN_PARAM_UPDATE, //连接参数更新 LE_NOTICE_DATA_LEN_CHANGE, //收发长度改变 LE_NOTICE_CLINET_CFG, //客户端配置特性 LE_NOTICE_ANCS_CONN_EVT, //ancs client连接事件 LE_NOTICE_AMS_CONN_EVT, //ams client连接事件 }ble_cb_enum; //LE GATT 服务相关 /** BLE GATTS ERR return */ #define BLE_GATTS_SUCCESS 0x00 #define BLE_GATTS_SRVC_TYPE_ERR 0x01 #define BLE_GATTS_SRVC_RULES_ERR 0x02 #define BLE_GATTS_SRVC_PROPS_ERR 0x03 #define BLE_GATTS_SRVC_ATT_FULL_ERR 0x04 #define BLE_GATTS_SRVC_PROFILE_FULL_ERR 0x05 /** att property flag */ #define ATT_BROADCAST 0x01 #define ATT_READ 0x02 #define ATT_WRITE_WITHOUT_RESPONSE 0x04 #define ATT_WRITE 0x08 #define ATT_NOTIFY 0x10 #define ATT_INDICATE 0x20 #define ATT_AUTHENTICATED_SIGNED_WRITE 0x40 #define ATT_EXTENDED_PROPERTIES 0x80 #define ATT_DYNAMIC 0x100 #define ATT_UUID128 0x200 #define ATT_AUTHENTICATION_REQUIRED 0x400 #define ATT_AUTHORIZATION_REQUIRED 0x800 /** define group GATT Server Service Types */ typedef enum { BLE_GATTS_SRVC_TYPE_PRIMARY = 0x00, //Primary Service BLE_GATTS_SRVC_TYPE_SEVONDARY= 0x01, //Secondary Service BLE_GATTS_SRVC_TYPE_INCLUDE = 0x02, //include Type } ble_gatts_service_type; /** define group GATT Server UUID Types */ typedef enum { BLE_GATTS_UUID_TYPE_16BIT = 0x00, //UUID 16BIT BLE_GATTS_UUID_TYPE_128BIT = 0x01, //UUID 128BIT } ble_gatts_uuid_type; /** define GATT handler callback con_handle: connect handle handle : attribute handle flag : call back flag */ #define ATT_CB_FALG_OFFSET (0xffff) #define ATT_CB_FALG_DIR_WRITE (0x10000) typedef int (*ble_gatt_callback_func)(uint16_t con_handle, uint16_t handle, uint32_t flag, uint8_t *ptr, uint16_t len); /** define GATT service base */ typedef struct gatts_service_base{ uint16_t handle; } gatts_service_base_st; /** define GATT service uuid */ typedef struct gatts_uuid_base{ uint16_t props; uint8_t type; const uint8_t *uuid; } gatts_uuid_base_st; /** define GATT service call back info */ typedef struct { uint16_t client_config; // att config, 1:notify enable; 2:indicate enable; uint16_t value_len; ble_gatt_callback_func att_write_callback_func; // 特征值的写操作回调 ble_gatt_callback_func att_read_callback_func; // 特征值的读操作回调, 注意要设置value_len uint8_t *value; // read return data, when att_read_callback_func is NULL } ble_gatt_characteristic_cb_info_t; #define GATT_CLIENT_CONFIG_NOTIFY 1 #define GATT_CLIENT_CONFIG_INDICATE 2 /** define group GATT Server profile struct */ typedef struct gatts_profile_list{ void *item; uint16_t profile_start_handle; uint16_t profile_end_handle; const uint8_t *profile_date; uint16_t profile_date_size; } ble_gatts_profile_list_st; #define BD_ADDR_LENGTH 6 typedef uint8_t bd_addr_t[BD_ADDR_LENGTH]; extern uint8_t cfg_bt_work_mode; extern uint8_t cfg_bt_max_acl_link; extern bool cfg_bt_dual_mode; extern bool cfg_bt_scan_ctrl_mode; extern bool cfg_bt_simple_pair_mode; extern bool cfg_bt_voip_reject_en; extern uint16_t cfg_bt_support_profile; extern uint16_t cfg_bt_support_codec; extern uint8_t cfg_bt_hid_type; extern uint16_t cfg_bt_def_connect_times; extern uint16_t cfg_bt_sup_to_connect_times; extern uint8_t cfg_bt_rf_def_txpwr; extern uint8_t cfg_bt_page_inq_txpwr; extern uint8_t cfg_bt_a2dp_feature; extern uint8_t cfg_bt_hfp_feature; extern uint8_t cfg_bt_sniff_clk_sel; #define bt_a2dp_is_vol_ctrl() (cfg_bt_a2dp_feature & A2DP_VOL_CTRL) #define bt_a2dp_is_ios_play_status() (cfg_bt_a2dp_feature & A2DP_IOS_PLAY_STATUS) //control void bt_fcc_init(void); void bt_init(void); //初始化蓝牙变量 int bt_setup(void); //打开蓝牙模块 void bt_off(void); //关闭蓝牙模块 void bt_wakeup(void); //唤醒蓝牙模块 void bt_send_msg_do(uint msg); //蓝牙控制消息,参数详见bt_msg_t void bt_audio_bypass(void); //蓝牙SBC/SCO通路关闭 void bt_audio_enable(void); //蓝牙SBC/SCO通路使能 void bt_set_sco_far_delay(void *buf, uint size, uint delay); void bt_set_scan(u8 iscan, u8 pscan); //打开/关闭可被发现和可被连接 void bt_set_scan_param(uint param); //pscan int = 0x100*((param >> 8)&0xff) + 1), iscan int = 0x100*((param&0xff) + 1) uint8_t bt_get_scan(void); //获取设置的可被发现可被连接状态 void bt_connect(uint times); //蓝牙设备回连, times: 重试次数(每次6s) void bt_disconnect(uint reason); //蓝牙设备断开, reason: 0=单独断开(入仓),1=断开并同步关机(按键/自动关机) void bt_hid_connect(void); //蓝牙HID服务回连 void bt_hid_disconnect(void); //蓝牙HID服务断开 uint32_t bt_sleep_proc(void); void bt_enter_sleep(void); void bt_exit_sleep(void); void updata_bt_name(char *bt_name); //status uint bt_get_disp_status(void); //获取蓝牙的当前显示状态 uint bt_get_status(void); //获取蓝牙的当前状态 uint bt_get_call_indicate(void); //获取通话的当前状态 uint bt_get_siri_status(void); //获取SIRI当前状态, 0=SIRI已退出, 1=SIRI已唤出 bool bt_is_calling(void); //判断是否正在通话 bool bt_is_playing(void); //判断是否正在播放 bool bt_is_ring(void); //判断是否正在响铃 bool bt_is_testmode(void); //判断当前蓝牙是否处于测试模式 bool bt_is_sleep(void); //判断蓝牙是否进入休眠状态 bool bt_is_connected(void); //判断蓝牙是否已连接 bool bt_is_ios_device(void); //判断当前播放的是否ios设备 bool sco_is_connected(void); //判断当前SCO链路是否连接 bool bt_sco_is_msbc(void); //判断当前通话是否是宽带通话 bool bt_a2dp_is_connected(void); //判断蓝牙A2DP是否已连接 bool bt_hfp_is_connected(void); //判断蓝牙HFP是否已连接 int bt_hid_is_connected(void); //判断蓝牙hid是否已连接 bool bt_hid_is_ready_to_discon(void); bool sbc_is_bypass(void); bool bt_sync_tick(void); //根据蓝牙时钟同步到50ms,误差为5ms void bt_reset_addr(void); //重置bt地址, 值通过bt_get_local_bd_addr设置; void bt_read_conn_rssi(void); //获取当前连接RSSI //info bool bt_get_link_btname(uint8_t index, char *name, uint8_t max_size); //index: 0=link0, 1=link1, 0xff=auto(default link0) bool bt_nor_get_link_info(uint8_t *bd_addr); //获取手机配对信息,bd_addr=NULL时仅查询是否存在回连信息 bool bt_nor_get_link_info_addr(uint8_t *bd_addr, uint8_t order); //获取第n个手机配对信息,bd_addr=NULL时仅查询是否存在回连信息 void bt_nor_delete_link_info(void); //删除手机配对信息 bool bt_nor_get_link_info_addr_ex(void); #define bt_send_msg(ogf, ocf) bt_send_msg_do((ogf<<24) | (ocf)) #define bt_ctrl_msg(msg) bt_send_msg(BT_MSG_CTRL, msg) #define bt_comm_msg(msg, param) bt_send_msg(BT_MSG_COMM, (msg<<16) | (u16)param) #define bt_hid_msg(msg, param) bt_send_msg(BT_MSG_HID, (msg<<16) | (u16)param) #define bt_pbap_msg(msg, param) bt_send_msg(BT_MSG_PBAP, (msg<<16) | (u16)param) //蓝牙连接 #define bt_scan_enable() bt_set_scan(1, 1) //打开扫描 #define bt_scan_disable() bt_set_scan(0, 0) //关闭扫描 #define bt_search_os_capacity() bt_ctrl_msg(BT_CTL_SEARCH_OS_CAPACITY) //主动发起查询当前连接的设备是否IOS,发起查询后,调用判断bt_is_ios_device(),连接2个手机此函数无效 #define bt_abort_reconnect() bt_comm_msg(COMM_BT_ABORT_RECONNECT, 0xffff) //终止回接 //蓝牙音乐 #define bt_music_play() bt_ctrl_msg(BT_CTL_PLAY) //播放 #define bt_music_pause() bt_ctrl_msg(BT_CTL_PAUSE) //暂停 #define bt_music_play_pause() bt_ctrl_msg(BT_CTL_PLAY_PAUSE) //切换播放/暂停 #define bt_music_stop() bt_ctrl_msg(BT_CTL_STOP) //停止 #define bt_music_prev() bt_ctrl_msg(BT_CTL_BACKWARD) //上一曲 #define bt_music_next() bt_ctrl_msg(BT_CTL_FORWARD) //下一曲 #define bt_music_rewind() bt_ctrl_msg(BT_CTL_REWIND) //开始快退 #define bt_music_rewind_end() bt_ctrl_msg(BT_CTL_REWIND_END) //结束快退 #define bt_music_fast_forward() bt_ctrl_msg(BT_CTL_FAST_FORWARD) //开始快进 #define bt_music_fast_forward_end() bt_ctrl_msg(BT_CTL_FAST_FORWARD_END) //结束快进 #define bt_music_vol_change() bt_ctrl_msg(BT_CTL_VOL_CHANGE) //通知手机音量已调整 #define bt_2acl_switch_music_play() bt_ctrl_msg(BT_CTL_SWITCH_PALY); #define bt_music_get_id3_tag() bt_ctrl_msg(BT_CTL_GET_ID3_TAG); //主动查询id3 tag信息 #define bt_music_paly_status_info() bt_ctrl_msg(BT_CTL_GET_PLAY_STATUS_INFO);//获取歌曲时长单位ms,当前播放位置,播放状态信息 //蓝牙通话 #define bt_call_redial_last_number() bt_ctrl_msg(BT_CTL_CALL_REDIAL) //电话回拨(最后一次通话) #define bt_call_answer_incoming() bt_ctrl_msg(BT_CTL_CALL_ANSWER_INCOM) //接听电话,三通时挂起当前通话 #define bt_call_answer_incom_rej_other() bt_ctrl_msg(BT_CTL_CALL_ANSWER_INCOM_REJ_OTHER) //接听电话,三通时挂断当前通话 #define bt_call_terminate() bt_ctrl_msg(BT_CTL_CALL_TERMINATE) //挂断电话 #define bt_call_swap() bt_ctrl_msg(BT_CTL_CALL_SWAP) //切换三通电话 #define bt_call_private_switch() bt_ctrl_msg(BT_CTL_CALL_PRIVATE_SWITCH) //切换私密通话 #define bt_call_redial_number() bt_ctrl_msg(BT_CTL_CALL_REDIAL_NUMBER) #define bt_call_get_remote_phone_number() bt_ctrl_msg(BT_CTL_HFP_REMOTE_PHONE_NUM) //获取远端号码 #define bt_hfp_siri_switch() bt_ctrl_msg(BT_CTL_HFP_SIRI_SW) //开关SIRI, android需要在语音助手中打开“蓝牙耳机按键启动”, ios需要打开siri功能 #define bt_hfp_report_bat() bt_ctrl_msg(BT_CTL_HFP_REPORT_BAT) #define bt_hfp_set_spk_gain() bt_ctrl_msg(BT_CTL_HFP_SPK_GAIN) #define bt_hfp_send_at_cmd() bt_ctrl_msg(BT_CTL_HFP_AT_CMD) #define bt_hfp_switch_to_phone() bt_ctrl_msg(BT_CTL_HFP_SWITCH_TO_PHONE) //通话切到手机 #define bt_hfp_switch_to_watch() bt_ctrl_msg(BT_CTL_HFP_SWITCH_TO_WATCH) //通话切在手表 //服务控制 #define bt_a2dp_profile_en() bt_ctrl_msg(BT_CTL_A2DP_PROFILE_EN) //打开A2DP服务 #define bt_a2dp_profile_dis() bt_ctrl_msg(BT_CTL_A2DP_PROFILE_DIS) //关闭A2DP服务 #define bt_hfp_profile_en() bt_ctrl_msg(BT_CTL_HFP_CONNECT) //打开HFP服务 #define bt_hfp_profile_dis() bt_ctrl_msg(BT_CTL_HFP_DISCONNECT) //关闭HFP服务 //PBAP #define bt_pbap_connect() bt_pbap_msg(BT_PBAP_CTRL, 1) #define bt_pbap_disconnect() bt_pbap_msg(BT_PBAP_CTRL, 0) #define bt_pbap_select_phonebook(book, sim) bt_pbap_msg(BT_PBAP_SELECT_PHONEBOOK, (sim<<8) | (u8)book) // sim - 1:选择SIM卡,0:本机 // book- 0:pb, 1:fav, 2-ich, 3:och, 4-mch, 5-cch, 6-spd // 若不配置,则选择默认值为本机pb #define bt_pbap_get_phonebook_size() bt_pbap_msg(BT_PBAP_GET_PHONEBOOK_SIZE, 0) #define bt_pbap_pull_phonebook_whole() bt_pbap_msg(BT_PBAP_PULL_PHONEBOOK, 0) #define bt_pbap_pull_phonebook_single(idx) bt_pbap_msg(BT_PBAP_PULL_PHONEBOOK, idx) // 按编号获取联系人信息 // idx不为零,如果为零则直接获取整个电话本信息 void bt_pbap_lookup_number(char *phone_number); //pkt typedef void (*kick_func_t)(void); struct txbuf_tag { uint8_t *ptr; uint16_t len; uint16_t handle; } __attribute__ ((packed)) ; struct txpkt_tag { struct txbuf_tag *buf; uint16_t buf_size; uint8_t total; volatile uint8_t cnt; uint8_t rptr; volatile uint8_t wptr; kick_func_t send_kick; }; extern struct txpkt_tag notify_tx; uint32_t txpkt_init(struct txpkt_tag *txpkt, void *mem_pool, uint8_t total, uint16_t buf_size); void spp_init(void); void hfp_hf_init(void); void a2dp_init(void); void aap_init(void); uint8_t sdp_add_service(void *item); void sdp_rmv_service(uint32_t service_record_handle); uint bt_get_hfp_feature(void); int bt_spp_tx(uint8_t *packet, uint16_t len); //hid void hid_device_init(void); bool bt_hid_send(void *buf, uint len, bool auto_release); //自定义HID数组 bool bt_hid_send_key(uint type, uint keycode); //标准HID按键 #define bt_hid_key(keycode) bt_hid_send_key(HID_KEYBOARD, keycode) //标准HID键, 如Enter #define bt_hid_consumer(keycode) bt_hid_send_key(HID_CONSUMER, keycode) //自定义HID键, 如VOL+ VOL- #define bt_hid_touch_screen(keycode) bt_hid_send_key(HID_TOUCH_SCREEN, keycode) //触屏 bool bt_hid_touch_screen_set_key(void *ts); #define bt_hid_finger_select_ios() bt_hid_msg(HID_TOUCH_SCREEN, 1) //抖音视频选择IOS系统, 需要在bt连接前调用区分 #define bt_hid_finger_select_andriod() bt_hid_msg(HID_TOUCH_SCREEN, 2) //抖音视频选择andriod系统, 需要在bt连接前调用区分 /** * @brief 模拟触点函数 注意:IOS 范围是-2047-2048 ,安卓是0-4096; IOS设备,x,y是相对位置,比如10,10是相对当前位置移动10,10; 安卓设备,x,y是绝对位置,10,10是在手机10,10的位置上; * @param is_press 1按下,0抬起 * @param x 模拟触点横坐标 * @param y 模拟触点纵坐标 **/ void bt_hid_point_pos(bool is_press, s16 x, s16 y); //goep void goep_client_init(void); //pbap void pbap_client_init(void); //map void map_client_init(void); void bt_map_start(void); //MAP的获取 void bt_map_abort(void); //终止MAP的获取 //hsp void hsp_hs_init(void); void hsp_hs_init_var(void); void bt_hsp_call_switch(void); //挂断/接听 void bt_hsp_sco_conn(void); //建立HSP SCO连接 void bt_hsp_sco_disconn(void); //断开HSP SCO连接 /***************************************************************************** * SIMPLE KEYBOARD API *****************************************************************************/ #define bt_hid_simple_keyboard(keycode) bt_hid_send_key(HID_SIMPLE_KEYBOARD, keycode) //简易键盘 #define SIMPLE_KEYBOARD_VOL_UP 0x01 #define SIMPLE_KEYBOARD_VOL_DOWN 0x02 #define SIMPLE_KEYBOARD_NEXT 0x10 #define SIMPLE_KEYBOARD_PREV 0x20 #define SIMPLE_KEYBOARD_PLAY 0x88 #define SIMPLE_KEYBOARD_PLAY_UP 0x66 #define SIMPLE_KEYBOARD_RELEASE 0x00 void btstack_hid_simple_keyboard(uint); /***************************************************************************** * BLE API *****************************************************************************/ #define ble_adv_dis() bt_ctrl_msg(BT_CTL_BLE_ADV_DISABLE) #define ble_adv_en() bt_ctrl_msg(BT_CTL_BLE_ADV_ENABLE) void ble_send_sm_req(void); void ble_set_gap_name(char *gap_name, u8 len); u16 ble_get_conn_interval(void); //N*1.25ms u16 ble_get_conn_latency(void); u16 ble_get_conn_timeout(void); //N*10ms u16 ble_get_adv_interval(void); //N*625us //init gatt //profile_table: profile cache buf //cb_info_table_p: call back info cache /***************************************************************************** * BLE连接相关(通道1,与BLE无连接广播相互独立) *****************************************************************************/ void ble_send_kick(void); /** * @brief 主动请求mtu * @return void * **/ void ble_exchange_mtu_request(void); /** * @brief 获取BLE的状态 * @return 3种状态的一种 LE_STA_STANDBY, //standby LE_STA_ADVERTISING, //正在广播 LE_STA_CONNECTION, //已连接 * **/ u8 ble_get_status(void); /** * @brief 判断BLE是否已经链接 * @return true表示已连接,false断开 * **/ bool ble_is_connect(void); /** * @brief 获取当前MTU值 * @return 返回MTU * **/ u16 ble_get_gatt_mtu(void); /** * @brief 设置广播间隔时间 * 注意单位是625us * @param[in] interval 参数数据,范围是32 到 16384 * **/ void ble_set_adv_interval(u16 interval); /** * @brief 使能广播 * * **/ void ble_enable_adv(void); /** * @brief 关闭广播 * * **/ void ble_disable_adv(void); /** * @brief 断开BLE连接 * * **/ void ble_disconnect(void); /** * @brief 往手机(client)端发送数据 注: 发送的数据长度不能超过MTU设置,可以通过ble_get_gatt_mtu函数获取。 * @param[in] index GATT初始化的时候返回的一个ID,在ble_gatts_characteristic_add_do函数里有返回 * @param[in] buf 发送数据的buff * @param[len] buf 发送数据的长度 * @return[int] 0: 成功 0x0C: APP没打开client_config,或发送的数据大于MTU,或BLE没连接 0x57: 内部缓存已满 0x56:发送数据为空指针;或发送数据大小超过init设置的(txpkt_init函数的buf_size参数) * **/ int ble_tx_notify(u8 index, u8* buf, u16 len); /** * @brief 更新连接间隔 注: * @param[in] interval 连接间隔,1.25ms为单位;最大和最小连接间隔设置为一样了 * @param[in] latency 潜伏时间 可跳过多少事件 * @param[len] timeout 超时时间 10ms为单位 * **/ void ble_update_conn_param(u16 interval, u16 latency, u16 timeout); /** * @brief 主动设置广播数据 注: 意思可以在广播过程中,更改广播数据 * @param[in] adv_buf 广播数据buff * @param[in] size 数据大小最大31字节 * return : ture 成功 **/ bool ble_set_adv_data(const u8 *adv_buf, u32 size); /** * @brief 主动设置扫描响应数据 注: 意思可以在广播过程中,更改扫描相应 * @param[in] scan_rsp_buf 数据buff * @param[in] size 数据大小最大31字节 * return : ture 成功 **/ bool ble_set_scan_rsp_data(const u8 *scan_rsp_buf, u32 size); /** * @brief 添加服务初始化函数 客户一般不需要直接调用,SDK默认引用好了 * @param[in] profile_table : 存储profile的buuff * @param[in] profile_table_size : profile_table大小 * @param[in] cb_info_table_p:回调结构体 * @param[in] gatt_max_att:GATT数量的最多需求 **/ void ble_gatts_init(uint8_t *profile_table, uint16_t profile_table_size, ble_gatt_characteristic_cb_info_t **cb_info_table_p, uint16_t gatt_max_att); /** * @brief 添加服务函数 * @param[in] service_type BLE_GATTS_SRVC_TYPE_PRIMARY BLE_GATTS_SRVC_TYPE_SEVONDARY BLE_GATTS_SRVC_TYPE_INCLUDE一种 * @param[in] service_uuid UUID数据 * @param[in] uuid_type UUID类型,指16bit还是128bit类型 * @param[in] service_handle 用这个位置去获取当前分配的handle **/ int ble_gatts_service_add(ble_gatts_service_type service_type, const uint8_t *service_uuid, ble_gatts_uuid_type uuid_type, uint8_t *service_handle); /** * @brief 添加特征值函数 * @param[in] att_uuid GATT的UUID * @param[in] uuid_type UUID类型,指16bit还是128bit类型 * @param[in] props 读写权限 * @param[in] att_handle 用这个位置去获取当前分配的handle, 可以填NULL * @param[in] cb_info: 回调信息,存放读写回调函数等 **/ int ble_gatts_characteristic_add( const uint8_t *att_uuid, ble_gatts_uuid_type uuid_type, uint16_t props, uint16_t *att_handle, ble_gatt_characteristic_cb_info_t *cb_info); /** * @brief 检测BLE Notify的缓存是否满了 * @param[in] rsvd_num 这个参数的意思是这样的,比如您设置1,如果蓝牙底层可以用来缓存的数量小于或等于1,就返回1表示满了。 * 这个作用的目的是方便客户预留固定数量的force数量;举个栗子:有两个GATT,一个是Notify状态的,一个是Notfiy 音频数据的,由于音频数据大 * 会有机会把协议栈填满导致没有buff给Notify状态使用了,所以就引出这个函数用来给音频发送前使用,设置为1则可以保证每次至少有1个buff给Notify那边 * 而不至于阻塞; * return : 1表示设置数量满了,0没满 **/ bool is_le_buff_full(uint rsvd_num); /** * @brief ams复位,设备端控制手机端播放暂停等 * opcode: 0播放,1暂停,2播放暂停,3下一曲,4上一去,5音量+,6音量-,详细参考AMS服务 */ void ble_ams_remote_ctrl(uint8_t opcode); /** * @brief 发起ancs连接(不可与ble_bt_connect交叉使用) */ void ble_ancs_start(void); /** * @brief 断开ancs连接(不可与ble_bt_connect交叉使用) */ void ble_ancs_stop(void); /** * @brief ANCS Pefrom Notifction Action * 控制手机端的操作,比如来电可以控制是否接听,拒接等 * uid: 通信连接ID,可以通过ANCS回调获取,用于保证是在同一个事件上 * opcode: 0 确认(接听) 1否定(拒接) */ void ble_ancs_remote_action(uint32_t uid, bool opcode); // HFP相关接口 bool hfp_hf_is_company_apple(void); //判断当前连接设备是否为Apple /***************************************************************************** * BLE无连接广播相关(通道0,与BLE连接相互独立) *****************************************************************************/ #define BLE_ADV0_EN_BIT 0x01 #define BLE_ADV0_MS_VAR_BIT 0x02 #define BLE_ADV0_ADDR_PUBIC_BIT 0x04 uint8_t ble_adv0_get_adv_en(void); void ble_adv0_set_ctrl(uint opcode); //0=关闭广播, 1=打开广播, 2=更新广播数据(打开时直接广播,关闭时仅更新buffer) #endif