完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
TG6101开发实战:蓝牙开发
1.概述 TG6101 SDK中使用bluedroid栈(4.0)实现对BR/BLE的开发,其中BR主要应用为蓝牙广播和蓝牙协议,BLE主要应用为蓝牙辅助配网。 2.名词解释 BR/EDR(基本速率/增强数据速率) BLE (Bluetooth Low Energ) 低功耗蓝牙 A2DP (Advanced Audio Distribution Profile) 蓝牙音频传输协议 AVRCP (Audio Video Remote Control Profile) 音视频远程控制协议 HFP (Hands-freeProfile) 免提协议 GATT(通用属性配置文件)通用属性协议 3.应用 在进行实际应用之前,进行初始化以及bluedroid协议栈初始化与使能。 app_bt_init() { rtl8723ds_bt_config 配置 = { .uart_id = BT_UART_IDX, .bt_dis_pin = BT_DIS_PIN, }; bt_rtl8723ds_register(&config); yoc_bluedroid_init(); yoc_bluedroid_enable(); yoc_bt_gap_register_callback(_bt_gap_cb); } /*设置蓝牙名称*/ app_bt_gap_set_device_name(name); /*设置设备可发现、可连接*/ app_bt_gap_set_scan_mode(1); 3.1 蓝牙播歌 蓝牙广播歌主要使用蓝牙协议栈中的A2DP以及AVRCP协议,A2DP Profile定义了音频数据传输的协议和过程。AVRCP控制器实现对目标设备的(开始、暂停、上一首、上一首、下一首设备的控制)等)。 A2DP定义了两个角色,SRC:音频数据流的源;SNK:音频数据流的接收者,本应用中设备端A2DP SNK端。AVRCP定义了CT(控制器)和TG(目标)两个对象,本应用中设备端作为CT端,手机作为TG端。 A2DP、AVRCP协议的初始化和回调注册: /* A2DP AVRCP 初始化初始化 */ app_bt_a2dp_init() { yoc_a2d_register_callback(_bt_app_a2d_cb); yoc_a2d_sink_register_data_callback(_tg_bt_app_a2d_data_cb); yoc_a2d_sink_init(); yoc_avrc_ct_init(); yoc_avrc_ct_register_callback(_bt_app_avrcp_ct_cb); yoc_avrc_tg_init(); yoc_avrc_tg_register_callback(_bt_app_avrcp_tg_cb); } / bt_callback 为供用户使用的回调, 可以调用、连接、断连播放、播放开始、重量改变等事件 * app_bt_register_cb(bt_callback);static void bt_callback* *param ) { switch (event) { case APP_BT_PAIRED : break; 案例 APP_BT_A2DP_CONNECTED : 中断; 案例 APP_BT_A2DP_DISCONNECTED : 中断; 案例 APP_BT_A2DP_CONNECTING : 中断; 案例 APP_BT_A2DP_LINK_LOSS : 中断; 案例 APP_BT_A2DP_PLAY_STATUS_STOPPED : 中断; 案例 APP_BT_A2DP_PLAY_STATUS_PLAYING : 中断; 案例 APP_BT_A2DP_PLAY_STATUS_PAUSEED : 中断; 案例 APP_BT_AVRCP_STATUS_PAUSEED : 中断; 案例 APP_BT_AVRCP_STATUS_STOPPED : 中断; 案例 APP_BT_AVRCP_STATUS_PLAYING : 中断; 案例 APP_BT_AVRCP_GET_PLAY_STATUS: 中断; 案例 APP_BT_A2DP_VOLUME_CHANGE : 休息; 案例 APP_BT_A2DP_CMD : 中断; 默认: 中断; } } 蓝牙播音相关api /*a2dp根据mac地址连接指定设备*/ int app_bt_a2dp_connect(uint8_t remote_addr[BT_BD_ADDR_LEN]); /*a2dp断连指定设备*/ int app_bt_a2dp_disconnect(uint8_t remote_addr[BT_BD_ADDR_LEN]); /*发送AVRCP指令*/ int app_bt_avrcp_send_passthrouth_cmd(app_avrcp_cmd_type_t cmd_type); /*改变重量*/ int app_bt_avrcp_change_vol(uint8_t vol); /*获取当前a2dp状态*/ int app_bt_a2dp_get_status(void); /*获取当前播放状态、显示条等*/ void app_bt_avrc_get_play_status(void); 3.2 问候 货物仓库中的HFP协议主要使用。 /*HFP协议初始化*/ app_bt_hfp_init() { yoc_hf_client_register_callback(bt_app_hf_client_cb); yoc_hf_client_init(); } 邮政编码相关api /** * @brief connect hf * @param[in] mac:要断开连接的设备 MAC 地址 * @return:成功或错误代码为零 */ int32_t app_bt_hfp_connect(const char *mac); /** * @brief Disconnect hfp * @param[in] mac:要断开的设备mac地址 * @return:成功或错误代码为零 */ int32_t app_bt_hfp_disconnect(const char *mac); /** * @brief 连接 hfp 音频 * @param[in] mac:要断开连接的设备 MAC 地址 * @return:成功或错误代码为零 */ int32_t app_bt_hfp_connect_audio(const char *mac); /** * @brief 断开 hfp 音频 * @param[in] mac:要断开连接的设备 MAC 地址 * @return:成功或错误代码为零 */ int32_t app_bt_hfp_disconnect_audio(const char *mac); /** * @brief hfp 发送命令 * @param[in] 命令:命令类型 * @return:成功或错误代码为零 */ int32_t app_bt_hfp_send_command(APP_BT_HFP_COMMAND_T command); /** * @brief hfp 拨打电话 * @param[in] number:电话号码字符串 * @return:成功或错误代码为零 */ int32_t app_bt_hfp_dial(const char *number); /** * @brief hfp 获取通话状态 * @param[in]: 无。 * @return: 调用状态 */ int32_t app_bt_hfp_get_call_status(void); /** * @brief hfp 设置音量 * @param[in]: type: 0-speaker, 1-microphone * @param[in]: volume: : 音量增益范围从 0 到 15 */ int32_t app_bt_hfp_volume_update(int type,整数卷); 3.3 ble辅助配网 作为服务端,gatts需要创建服务,添加特性和属性。并且需要开启广播,处理可连接状态。作为客户端, gattc需要开启扫描,当扫描到需要连接的设备时,就可以连接设备,并与服务端进行数据交换。 SDK中实现的方案为设备端作为GATTS端,利用手机云智能APP进行配网。 配网排序 BLE GATT、GAP 相关api /** * @brief 调用该函数发生gap事件,如扫描结果 */ bt_err_t yoc_ble_gap_register_callback(yoc_gap_ble_cb_t callback); /** * @brief 这个函数被调用来覆盖 BTA 默认的 ADV 参数。 */ bt_err_t yoc_ble_gap_config_adv_data (yoc_ble_adv_data_t *adv_data); /** * @brief 调用该函数设置扫描参数 */ bt_err_t yoc_ble_gap_set_scan_params(yoc_ble_scan_params_t *scan_params); /** * @brief 此过程保持设备扫描广播中广播的对等设备 */ bt_err_t yoc_ble_gap_start_scanning(uint32_t duration); /** * @brief 该函数调用停止设备扫描广播中的对等设备 */ bt_err_t yoc_ble_gap_stop_scanning(void); /** * @brief 调用此函数开始广告。 */ bt_err_t yoc_ble_gap_start_advertising (yoc_ble_adv_params_t *adv_params); /** * @brief 这个函数被调用来停止广告。 */ bt_err_t yoc_ble_gap_stop_advertising(void); /** * @brief 更新连接参数,只能在连接成功时使用。 */ bt_err_t yoc_ble_gap_update_conn_params(yoc_ble_conn_update_params_t *params); /** * @brief 设置设备名称为本地设备 */ bt_err_t yoc_ble_gap_set_device_name(const char *name); /** * @brief 调用此函数以获取特定类型的 ADV 数据。 */ uint8_t *yoc_ble_resolve_adv_data(uint8_t *adv_data, uint8_t type, uint8_t *length); /** * @brief 调用此函数来设置原始广告数据。用户需 自行填写* ADV 数据。 */ bt_err_t yoc_ble_gap_config_adv_data_raw(uint8_t *raw_data, uint32_t raw_data_len); /** * @brief 调用此函数来设置原始扫描响应数据。*用户需 自行填写扫描响应数据。 */ bt_err_t yoc_ble_gap_config_scan_rsp_data_raw(uint8_t *raw_data, uint32_t raw_data_len); /** * @brief 调用这个函数来读取远程设备的RSSI。 * 链接策略结果的地址在间隙回调函数中通过 * YOC_GAP_BLE_READ_RSSI_COMPLETE_EVT 事件返回。 */ bt_err_t yoc_ble_gap_read_rssi(yoc_bd_addr_t remote_addr); /** * @brief 设置 GAP 安全参数值。覆盖默认值。 */ bt_err_t yoc_ble_gap_set_security_param(yoc_ble_sm_param_t param_type, void *value, uint8_t len); /** * @brief 从对等设备的安全数据库列表中删除一个 设备。它在连接时管理取消配对事件。 */ bt_err_t yoc_ble_remove_bond_device(yoc_bd_addr_t bd_addr); /** * @brief 从对端设备的安全数据库列表中获取设备号。 * 它会立即返回设备绑定号码。 */ int yoc_ble_get_bond_device_num(void); /** * @brief 从对等设备的安全数据库列表中获取设备。 * 它会立即返回设备绑定信息。 */ bt_err_t yoc_ble_get_bond_device_list(int *dev_num, yoc_ble_bond_dev_t *dev_list); /** * @brief 该功能是断开对端设备的物理连接 * gattc 注册多个app_id 时可能有多个虚拟GATT 服务器连接。 * yoc_ble_gattc_close (yoc_gatt_if_t gattc_if, uint16_t conn_id) 只关闭一个虚拟 GATT 服务器连接。 * 如果存在其他虚拟 GATT 服务器连接,则不会断开物理连接。 * yoc_ble_gap_disconnect(yoc_bd_addr_t remote_device) 直接断开物理连接。 */ bt_err_t yoc_ble_gap_disconnect(yoc_bd_addr_t remote_device); /** * @brief 调用这个函数来读取连接 * 设备的参数信息 */ bt_err_t yoc_ble_get_current_conn_params(yoc_bd_addr_t bd_addr, yoc_gap_conn_params_t *conn_params);/** * @brief 调用此函数以向 BTA GATTS 模块注册应用程序回调 *。 */ bt_err_t yoc_ble_gatts_register_callback(yoc_gatts_cb_t 回调); /** * @brief 调用该函数注册应用标识符 */ bt_err_t yoc_ble_gatts_app_register(uint16_t app_id); /** * @brief 注销 GATT 服务器。 */ bt_err_t yoc_ble_gatts_app_unregister(yoc_gatt_if_t gatts_if); /** * @brief 创建服务。服务创建完成后,将调用回调 * 事件 BTA_GATTS_CREATE_SRVC_EVT 以向配置文件报告状态 * 和服务 ID。* 回调函数中获取的服务ID,在添加包含的服务和特征/描述符 时需要用到。*/ bt_err_t yoc_ble_gatts_create_service(yoc_gatt_if_t gatts_if, yoc_gatt_srvc_id_t *service_id, uint16_t num_handle); /** * @brief 创建服务属性选项卡。*/ bt_err_t yoc_ble_gatts_create_attr_tab(const yoc_gatts_attr_db_t *gatts_attr_db, yoc_gatt_if_t gatts_if, uint8_t max_nb_attr, uint8_t srvc_inst_id); /** * @brief 调用此函数将特征添加到服务中。 */ bt_err_t yoc_ble_gatts_add_char(uint16_t service_handle, yoc_bt_uuid_t *char_uuid, yoc_gatt_perm_t perm, yoc_gatt_char_prop_t 属性, yoc_attr_value_t *char_val, yoc_attr_control_t *control); /** * @brief 调用这个函数来添加特征描述符。什么时候 * 完成,调用回调事件 BTA_GATTS_ADD_DESCR_EVT * 报告此描述符的状态和 ID 号。 */ bt_err_t yoc_ble_gatts_add_char_descr (uint16_t service_handle, yoc_bt_uuid_t *descr_uuid, yoc_gatt_perm_t perm, yoc_attr_value_t *char_descr_val, yoc_attr_control_t *control); /** * @brief 这个函数被调用来启动一个服务。 */ bt_err_t yoc_ble_gatts_start_service(uint16_t service_handle); /** * @brief 调用此函数来停止服务。 */ bt_err_t yoc_ble_gatts_stop_service(uint16_t service_handle); /** * @brief 向 GATT 客户端发送指示或通知。 * 将参数 need_confirm 设置为 false 将发送通知,否则指示。 */ bt_err_t yoc_ble_gatts_send_indicate(yoc_gatt_if_t gatts_if, uint16_t conn_id, uint16_t attr_handle, uint16_t value_len, uint8_t *value, bool need_confirm); /** * @brief 调用此函数来发送对请求的响应。 */ bt_err_t yoc_ble_gatts_send_response(yoc_gatt_if_t gatts_if, uint16_t conn_id, uint32_t trans_id, yoc_gatt_status_t status, yoc_gatt_rsp_t *rsp); /** * @brief 这个函数被应用程序调用来设置属性值 */ bt_err_t yoc_ble_gatts_set_attr_value(uint16_t attr_handle, uint16_t length, const uint8_t *value); /** * @brief 检索属性值 */ yoc_gatt_status_t yoc_ble_gatts_get_attr_value(uint16_t attr_handle, uint16_t *length, const uint8_t **value); 文章转载自:平头哥芯片开放社区作者:沐羽 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
【平头哥Sipeed LicheeRV 86开发板试用体验】Waft初体验
15702 浏览 1 评论
13758 浏览 4 评论
【平头哥Sipeed LicheeRV 86开发板试用体验】四、烧写waft系统&搭建waft测试环境
19680 浏览 2 评论
59121 浏览 19 评论
【限时福利】加入芯片开发社区,领100G电子工程师资料大礼包
88163 浏览 121 评论
邀请函 | 3月2日 来上海参加平头哥“玄铁RISC-V生态大会”
784浏览 0评论
读书分享会 | 玄铁RISC-V处理器入门与实战电子书免费下载!
682浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 07:56 , Processed in 0.627608 second(s), Total 55, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号