第 2 章 APP 使用说明
1、APP概述
本章旨在介绍常见的蓝牙应用方案,从最接近目标产品的APP开始,指导用户开发。AC63N_BT_SDK系列集成了蓝牙应用App,具有丰富的板级配置、外设驱动以及蓝牙数据库等,并将持续集成更多通用蓝牙方案。
2、APP-Bluetooth Dual-Mode SPP-BLE
2.1 概述
支持蓝牙双模透传传输功能。CLASSIC蓝牙使用标准串口SPP profile协议,BLE蓝牙使用自定义的profile协议,提供ATT的WRITE、WRITE_WITHOUT_RESPONSE,NOTIFY和INDICATE等属性传输收发数据。
2.2 工程配置
代码工程 apps\spp_and_le\board\bd19\AC632N_spp_and_le.cbp
。
1)先配置板级 board_config.h
和对应配置文件中蓝牙双模使能。
/*
* 板级配置选择
*/
#define CONFIG_BOARD_AC632N_DEMO
// #define CONFIG_BOARD_AC6321A_DEMO
#include "board_ac632n_demo_cfg.h"
#include "board_ac6321a_demo_cfg.h"
在 board_ac632n_demo_cfg.h
中配置打开 edr 和 ble 模块。
#define TCFG_USER_BLE_ENABLE 1 //BLE功能使能
#define TCFG_USER_EDR_ENABLE 1 //EDR功能使能
2)配置对应case需求: app_config.h
。
//apps example 选择,只能选1个,要配置对应的board_config.h
#define CONFIG_APP_SPP_LE 1 //SPP + LE or LE's client
#define CONFIG_APP_MULTI 0 //蓝牙LE多连 + spp
#define CONFIG_APP_DONGLE 0 //usb + 蓝牙(ble 主机),PC hid设备
#define CONFIG_APP_CENTRAL 0 //ble client,中心设备
#define CONFIG_APP_LL_SYNC 0 //腾讯连连
#define CONFIG_APP_BEACON 0 //蓝牙BLE ibeacon
#define CONFIG_APP_NONCONN_24G 0 //2.4G 非连接收发
#define CONFIG_APP_TUYA 0 //涂鸦协议
#define CONFIG_APP_AT_COM 0 //AT com HEX格式命令
#define CONFIG_APP_AT_CHAR_COM 0 //AT com 字符串格式命令
#define CONFIG_APP_IDLE 0 //空闲任务
3)配置对应case需求:app_config.h
。
#if CONFIG_APP_SPP_LE
//配置双模同名字,同地址
#define DOUBLE_BT_SAME_NAME 0 //同名字
#define DOUBLE_BT_SAME_MAC 0 //同地址
#define CONFIG_APP_SPP_LE_TO_IDLE 0 //SPP_AND_LE To IDLE Use
4)蓝牙的BLE配置,保护GATT和SM的配置。
//蓝牙BLE配置
#define CONFIG_BT_GATT_COMMON_ENABLE 1 //配置使用gatt公共模块
#define CONFIG_BT_SM_SUPPORT_ENABLE 0 //配置是否支持加密
#define CONFIG_BT_GATT_CLIENT_NUM 0 //配置主机client个数 (app not support)
#define CONFIG_BT_GATT_SERVER_NUM 1 //配置从机server个数
#define CONFIG_BT_GATT_CONNECTION_NUM (CONFIG_BT_GATT_SERVER_NUM + CONFIG_BT_GATT_CLIENT_NUM) //配置连接个数
2.3 SPP数据通信
推荐使用手机测试工具:“SPP蓝牙串口”。
SPP数据通信的代码文件为 spp_trans.c
。
2.3.1接口说明: spp_trans.c
1)SPP模块初始化。
void transport_spp_init(void)
{
log_info("trans_spp_init\n");
log_info("spp_file: %s", __FILE__);
#if (USER_SUPPORT_PROFILE_SPP==1)
spp_state = 0;
spp_get_operation_table(&spp_api);
spp_api->regist_recieve_cbk(0, transport_spp_recieve_cbk);
spp_api->regist_state_cbk(0, transport_spp_state_cbk);
spp_api->regist_wakeup_send(NULL, transport_spp_send_wakeup);
#endif
#if TEST_SPP_DATA_RATE
spp_timer_handle = sys_timer_add(NULL, test_timer_handler, SPP_TIMER_MS);
#endif
}
2)SPP连接和断开事件处理。
static void transport_spp_state_cbk(u8 state)
{
spp_state = state;
switch (state) {
case SPP_USER_ST_CONNECT:
log_info("SPP_USER_ST_CONNECT ~~~\n");
break;
case SPP_USER_ST_DISCONN:
log_info("SPP_USER_ST_DISCONN ~~~\n");
spp_channel = 0;
break;
default:
break;
}
}
3)SPP发送数据接口,发送前先调用接口transport_spp_send_data_check检查。
int transport_spp_send_data(u8 *data, u16 len)
{
if (spp_api)
{
log_info("spp_api_tx(%d) \n", len);
/* log_info_hexdump(data, len); */
/* clear_sniff_cnt(); */
bt_comm_edr_sniff_clean();
return spp_api->send_data(NULL, data, len);
}
return SPP_USER_ERR_SEND_FAIL;
}
4)SPP检查是否可以往协议栈发送数据。
int transport_spp_send_data_check(u16 len)
{
if (spp_api) {
if (spp_api->busy_state())
{
return 0;
}
}
return 1;
}
5)SPP发送完成回调,表示可以继续往协议栈发数,用来触发继续发数。
static void transport_spp_send_wakeup(void)
{
putchar('W');
}
6)SPP接收数据接口。
static void transport_spp_recieve_cbk(void *priv, u8 *buf, u16 len)
{
spp_channel = (u16)priv;
log_info("spp_api_rx(%d) \n", len);
log_info_hexdump(buf, len);
}
2.3.2 收发测试: spp_trans.c
代码已经实现收到手机的SPP数据后,会主动把数据回送,测试数据收发。
//loop send data for test
if (transport_spp_send_data_check(len))
{
log_info("-loop send\n");
transport_spp_send_data(buf, len);
}
3、APP-Bluetooth Dual-Mode AT Moudle
概述
主要功能是在普通数传BLE和EDR的基础上增加了由上位机或其他MCU可以通过UART对接蓝牙芯片进行基本配置、状态获取、控制扫描、连接断开以及数据收发等操作。AT控制透传支持从机模式和主机模式, 编译的时候只能二选一, 从机模式支持双模, 主机模式只支持BLE。定义一套串口的控制协议,具体请查看附录A 《蓝牙AT协议》。
工程配置
代码工程:apps\spp_and_le\board\bd29\AC631N_spp_and_le.cbp
。
配置描述
1)先配置板级 board_config.h
和对应配置文件中蓝牙双模使能。
/*
* 板级配置选择
*/
#define CONFIG_BOARD_AC630X_DEMO
// #define CONFIG_BOARD_AC6311_DEMO
// #define CONFIG_BOARD_AC6313_DEMO
// #define CONFIG_BOARD_AC6318_DEMO
// #define CONFIG_BOARD_AC6319_DEMO
2)配置对应的 board_acxxx_demo_cfg.h
文件使能BLE或EDR(主机不支持EDR), 以 board_ac630x_demo_cfg.h
为例。
#define TCFG_USER_BLE_ENABLE 1 //BLE功能使能
#define TCFG_USER_EDR_ENABLE 1 //EDR功能使能
4、APP-Bluetooth Dual-Mode Central
概述
Central中心设备是使用GATT的client角色,在SDK中是以主机Master的方式实现,主动发起搜索和连接其他BLE设备。连接成功后遍历从机GATT的Services信息数据。最大支持16个Sevices遍历。SDK的例子是以杰理的数传SDK的BLE的设备中Services为搜索目标,用户根据需求也可自行搜索过滤其他的Services。
工程配置
代码工程:apps\spp_and_le\board\bd19\AC632N_spp_and_le.cbp
1)先配置板级board_config.h和对应配置文件中蓝牙双模使能。
配置只支持ble模块,如下代码:
#define TCFG_USER_BLE_ENABLE 1 //BLE功能使能
#define TCFG_USER_EDR_ENABLE 0 //EDR功能使能
5、APP-Bluetooth Dual-Mode Dongle
概述
蓝牙dongle符合USB和BLE或EDR传输标准,具有即插即用,方便实用的特点。它可用于蓝牙设备之间的数据传输,让电脑能够和周边的蓝牙设备进行无线连接和数据的通讯,自动发现和管理远程蓝牙设备、资源和服务,实现蓝牙设备之间的绑定和自动连接。蓝牙dongle支持BLE和2.4G两种连接模式;支持连接指定蓝牙名或mac地址;应用示例是连接杰理的鼠标。蓝牙dongle支持EDR,支持连接指定蓝牙名或mac地址,连接杰理的键盘设备。蓝牙双模dongle不建议同时打开,会降低搜索效率。
工程配置
代码工程:apps\spp_and_le\board\bd19\AC632N_spp_and_le.cbp
1)APP选择,配置app_config.h。
//app case 选择,只能选1个,要配置对应的board_config.h
2)使用EDR模式,还必先打印如下主机搜索使能。
#define EDR_EMITTER_EN 1 //蓝牙(edr主机)
3)板级选择, 配置board_config.h。目前只有AC6328a_DONGLE板子支持蓝牙dongle。
//#define CONFIG_BOARD_AC636N_DEMO
#define CONFIG_BOARD_AC6368B_DONGLE //CONFIG_APP_DONGLE
// #define CONFIG_BOARD_AC6363F_DEMO
主要代码说明
蓝牙dongle实现文件 app_dongle.c和ble_dg_central,负责模块初始化、处理协议栈事件和命令数据控制发送等。
1)HID描述符, 描述为一个鼠标。
static const u8 sHIDReportDesc[] = { 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 0x09, 0x02, // Usage (Mouse) 0xA1, 0x01, // Collection (Application) 0x85, 0x01, // Report ID (1) 0x09, 0x01, // Usage (Pointer)
2)使用指定的uuid与从机通信, 需要与从机配合, 省掉了搜索uuid的时间。
static const target_uuid_t dongle_search_ble_uuid_table[] = { { .services_uuid16 = 0x1812, .characteristic_uuid16 = 0x2a4d, .opt_type = ATT_PROPERTY_NOTIFY, }, { .services_uuid16 = 0x1812, .characteristic_uuid16 = 0x2a33, .opt_type = ATT_PROPERTY_NOTIFY, }, { .services_uuid16 = 0x1801, .characteristic_uuid16 = 0x2a05, .opt_type = ATT_PROPERTY_INDICATE, }, }; /* 确定留给从机发数据的3个notify handle */ static const u16 mouse_notify_handle[3] = {0x0027, 0x002b, 0x002f};
6、APP - Bluetooth DualMode Keyboard
概述
本案例为基于HID的键盘设备,可以用来媒体播放,上下曲暂停音量的控制,支持安卓和IOS的双系统,并且支持BLE和EDR两种工作模式。
工程配置
代码工程:
apps\hid\board\br19\AC632N_hid.cbp
1)先进行APP选择配置(apps\hid\include\app_config.h
)。
//app case 选择,只选1,要配置对应的board_config.h #define CONFIG_APP_KEYBOARD 1//hid按键 ,default case #define CONFIG_APP_KEYFOB 0//自拍器,board_ac6368a,board_6318 #define CONFIG_APP_MOUSE 0//mouse, board_mouse #define CONFIG_APP_STANDARD_KEYBOARD 0//标准HID键盘,board_ac6351d #define CONFIG_APP_KEYPAGE 0//翻页器
2)配置板级board_config.h(`` appshidboardbd19board_config.h ``),下图为选择AC632n板级,也可以选择ac6321a板级。
/* * 板级配置选择 */ #define CONFIG_BOARD_AC632N_DEMO // CONFIG_APP_KEYBOARD,CONFIG_APP_PAGE_TURNER // #define CONFIG_BOARD_AC6321_DEMO // CONFIG_APP_KEYBOARD,CONFIG_APP_PAGE_TURNER #include "board_ac6321a_demo_cfg.h" #include "board_ac6323a_mouse_cfg.h" #include "board_ac6328a_mouse_cfg.h" #include "board_ac6329b_demo_cfg.h" #include "board_ac6329c_demo_cfg.h" #endif
7、APP - Bluetooth DualMode Keyfob
概述
本案例主要用于蓝牙自拍器实现,进行以下配置后,打开手机蓝牙连接设备可进行对应的拍照操作。由于自拍器的使用会用到LED所以本案例也要对LED进行对应的设置,自拍器设备上电以后没有连接蓝牙之前,LED以一定的频率闪烁,直到连接或者是进入sleep模式时熄灭。蓝牙连接以后LED熄灭,只有按键按下的时候LED会同时接通过,可以通过LED的状态来判断自拍器的工作状态。
工程配置
代码工程:apps\hid\board\bd19\AC632N_hid.cbp
1)配置app选择(apps\hid\include\app_config.h
),如下代码选择对应的自拍器应用。
//app case 选择,只选1,要配置对应的board_config.h #define CONFIG_APP_KEYFOB 1//自拍器, board_ac6328a,board_6328
2)先配置板级board_config.h(apps\hid\board\bd19\board_config.h
),选择对应的开发板。
//#define CONFIG_BOARD_AC632N_DEMO // CONFIG_APP_KEYBOARD,CONFIG_APP_PAGE_TURNER // #define CONFIG_BOARD_AC6321A_MOUSE // CONFIG_APP_MOUSE #define CONFIG_BOARD_AC632X_DEMO // CONFIG_APP_KEYFOB #include "board_ac632n_demo_cfg.h" #include "board_ac6321a_demo_cfg.h"
8、APP - Bluetooth DualMode KeyPage
概述
本APP基于HID开发,主要用于浏览当下火爆的抖音等小视频的上下翻页、左右菜单切换、暂停等操作。首先选择需要用到的应用本案例选择,然后进行对应的支持板级选择,具体参考下文的步骤。通过软件编译下载到对应的开发板,打开手机蓝牙进行连接,进入视频浏览界面操作对应按键即可。
工程配置
代码工程:apps\hid\board\bd19\AC632N_hid.cbp
。