前面创建了一个YQS服务,属于GAP Server,也称为从机。本文创建一个GAP Client,即主机,来连接和发现YQS设备。
阅读本文之前,请先阅读前文。
(1)工程框架
打开nus_c工程<SDK Dir>\14.2.0\examples\ble_central\ble_app_nus_c。
编译下载到开发板中,确保工程能够正常运行。
通过RTT Viewer可以看到相关打印日志。
(2)添加yqs_c
复制以下两个文件:
- <SDK Dir>\14.2.0\components\ble\ble_services\ble_nus\ble_nus_c.c
- <SDK Dir>\14.2.0\components\ble\ble_services\ble_nus\ble_nus_c.h
粘贴到ble_app_nus_c目录下,放在main.c的同级目录。
将该目录的相对路径(../../../
)添加到工程的User Include Directory中,如下:
将文件重命名为:
- ble_yqs_c.c
- ble_yqs_c.h
并将两个文件拖放到nRF_BLE_Services中,如下图:
(3)移植YQS
打开ble_yqs_c.c,做全局替换,注意区分大小写:
- NUS –> YQS
- nus –> yqs
对ble_yqs_c.h做同样操作。
将YQS_BASE_UUID中的0x9E改成0x9D,如下:
{{0x9D, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E}}
打开sdk_config.h,在BLE_TPS_ENABLED下方增加一个项目,如下:
// <q> BLE_TPS_ENABLED - ble_tps - TX Power Service
#ifndef BLE_TPS_ENABLED
#define BLE_TPS_ENABLED 0
#endif
// <q> BLE_YQS_C_ENABLED - ble_yqs_c - Youqun Client
#ifndef BLE_YQS_C_ENABLED
#define BLE_YQS_C_ENABLED 1
#endif
在BLE_TPS_BLE_OBSERVER_PRIO下方添加一个项目如下:
// <o> BLE_TPS_BLE_OBSERVER_PRIO
// <i> Priority with which BLE events are dispatched to the TX Power Service.
#ifndef BLE_TPS_BLE_OBSERVER_PRIO
#define BLE_TPS_BLE_OBSERVER_PRIO 2
#endif
// <o> BLE_YQS_C_BLE_OBSERVER_PRIO
// <i> Priority with which BLE events are dispatched to the Youqun Client.
#ifndef BLE_YQS_C_BLE_OBSERVER_PRIO
#define BLE_YQS_C_BLE_OBSERVER_PRIO 2
#endif
同时修改禁用BLE_NUS_C_ENABLE,如下:
// <q> BLE_NUS_C_ENABLED - ble_nus_c - Nordic UART Central Service
#ifndef BLE_NUS_C_ENABLED
#define BLE_NUS_C_ENABLED 0
#endif
找到NRF_SDH_BLE_VS_UUID_COUNT,确保其值为1,如下:
// <o> NRF_SDH_BLE_VS_UUID_COUNT - The number of vendor-specific UUIDs.
#ifndef NRF_SDH_BLE_VS_UUID_COUNT
#define NRF_SDH_BLE_VS_UUID_COUNT 1
#endif
(4)调用YQS
这个工程实际上是一个可以运行的nus主机工程,我们只要将所有的nus替换成yqs即可。
做全局替换,区分大小写:
- NUS –> YQS
- nus –> yqs
此时编译通过,应该可以正常运行。在RTT Viewer中可以看到相应的输出。
但是如果在另一个开发板中跑YQS从机工程,会发现它们无法建立连接及通信。
(5)设备连接
yqs主机发现设备广播数据后,如果检测到了YQS UUID,则连接设备,否则继续扫描。
但是我们的YQS基于ble_app_template实现的,广播包中包含的UUID是0x180A,而不是YQS UUID。这个问题与GATT 服务运行机制无关,这里我们简单的修改一下,越过这个问题。
找到m_yqs_uuid,并做如下修改:
/**@brief YQS uuid. */
static ble_uuid_t const m_yqs_uuid =
{
.uuid = 0x180A/*BLE_UUID_YQS_SERVICE*/,
.type = BLE_UUID_TYPE_BLE/*YQS_SERVICE_UUID_TYPE*/
};
这时候再编译运行,即可发现和连接YQS从机设备。
通过RTT Viewer可以看到相关信息。
(完)