NRF5函数sd_ble_gap_appearance_set
时间: 2023-09-19 19:06:54 浏览: 101
函数说明:设置设备外观
函数原型:
uint32_t sd_ble_gap_appearance_set(uint16_t appearance)
参数说明:
appearance:设备外观编码,详见官方文档
返回值:
返回NRF_ERROR_INVALID_PARAM表示参数无效,否则返回NRF_SUCCESS
函数作用:
用于设置设备的外观编码,可以用于标识设备类型、功能等信息,方便其他设备识别。
注意事项:
1. 外观编码必须在官方文档中规定的范围内。
2. 设置外观编码应在连接之前完成。
3. 该函数只能在SoftDevice中调用。
相关问题
请给出Nordic nRF5 SDK中创建新的BLE服务的详细示例
好的,下面是使用Nordic nRF5 SDK创建新的BLE服务的详细示例:
1. 首先,在nRF5 SDK中打开“examples\ble_peripheral\ble_app_template”示例。
2. 在“ble_app”文件夹中,打开“ble_srv_common.h”文件。此文件包含了一些常用的BLE服务定义,你可以通过阅读该文件来了解BLE服务的实现方式。
3. 在“ble_app”文件夹中,打开“ble_srv_common.c”文件。此文件包含了一些常用的BLE服务实现代码,你可以通过阅读该文件来了解BLE服务的实现方式。
4. 在“ble_app”文件夹中,创建一个新的文件夹,命名为“my_service”。
5. 在“my_service”文件夹中,创建一个新的文件,命名为“my_service.h”。在该文件中,你需要定义你的自定义BLE服务的UUID,以及相关的特性和属性等信息。例如:
```
#ifndef MY_SERVICE_H
#define MY_SERVICE_H
#include "ble.h"
#include "ble_srv_common.h"
#define BLE_UUID_MY_SERVICE 0x1234 // 自定义服务的UUID
// 自定义服务的特性UUID
#define BLE_UUID_MY_SERVICE_CHARACTERISTIC 0x5678
// 自定义服务的特性值结构体
typedef struct
{
uint8_t value;
} ble_my_service_characteristic_t;
// 自定义服务的事件结构体
typedef struct
{
ble_my_service_characteristic_t char_value;
} ble_my_service_evt_t;
// 自定义服务的事件句柄类型
typedef void (*ble_my_service_evt_handler_t) (ble_my_service_evt_t * p_evt);
// 自定义服务的初始化函数
uint32_t ble_my_service_init(void);
// 自定义服务的事件注册函数
void ble_my_service_evt_handler_register(ble_my_service_evt_handler_t evt_handler);
#endif // MY_SERVICE_H
```
6. 在“my_service”文件夹中,创建一个新的文件,命名为“my_service.c”。在该文件中,你需要实现你的自定义BLE服务的初始化、事件处理等功能。例如:
```
#include "my_service.h"
static uint16_t m_service_handle; // 自定义服务的句柄
static ble_gatts_char_handles_t m_char_handles; // 自定义服务的特性句柄
static ble_my_service_evt_handler_t m_evt_handler; // 自定义服务的事件处理函数
// 自定义服务的事件回调函数
static void my_service_evt_handler(ble_evt_t const * p_ble_evt)
{
switch (p_ble_evt->header.evt_id)
{
case BLE_GAP_EVT_CONNECTED:
break;
case BLE_GAP_EVT_DISCONNECTED:
break;
case BLE_GATTS_EVT_WRITE:
if (p_ble_evt->evt.gatts_evt.params.write.handle == m_char_handles.value_handle)
{
ble_my_service_evt_t evt;
evt.char_value.value = p_ble_evt->evt.gatts_evt.params.write.data[0];
m_evt_handler(&evt);
}
break;
default:
break;
}
}
// 自定义服务的事件注册函数
void ble_my_service_evt_handler_register(ble_my_service_evt_handler_t evt_handler)
{
m_evt_handler = evt_handler;
}
// 自定义服务的初始化函数
uint32_t ble_my_service_init(void)
{
uint32_t err_code;
ble_uuid_t ble_uuid;
ble_uuid128_t base_uuid = {BLE_UUID_MY_SERVICE_BASE};
// 生成自定义服务的UUID
err_code = sd_ble_uuid_vs_add(&base_uuid, &ble_uuid.type);
VERIFY_SUCCESS(err_code);
ble_uuid.uuid = BLE_UUID_MY_SERVICE;
// 添加自定义服务
err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &m_service_handle);
VERIFY_SUCCESS(err_code);
// 添加自定义服务的特性
ble_gatts_char_md_t char_md;
memset(&char_md, 0, sizeof(char_md));
char_md.char_props.read = 1;
char_md.char_props.write = 1;
ble_gatts_attr_md_t attr_md;
memset(&attr_md, 0, sizeof(attr_md));
attr_md.read_perm = BLE_GAP_CONN_SEC_MODE_OPEN;
attr_md.write_perm = BLE_GAP_CONN_SEC_MODE_OPEN;
attr_md.vloc = BLE_GATTS_VLOC_STACK;
ble_uuid_t char_uuid;
char_uuid.uuid = BLE_UUID_MY_SERVICE_CHARACTERISTIC;
char_uuid.type = ble_uuid.type;
ble_gatts_attr_t attr;
memset(&attr, 0, sizeof(attr));
attr.p_uuid = &char_uuid;
attr.p_attr_md = &attr_md;
attr.init_len = sizeof(ble_my_service_characteristic_t);
attr.max_len = sizeof(ble_my_service_characteristic_t);
attr.p_value = NULL;
err_code = sd_ble_gatts_characteristic_add(m_service_handle, &char_md, &attr, &m_char_handles);
VERIFY_SUCCESS(err_code);
// 注册事件回调函数
err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_GENERIC_TAG);
VERIFY_SUCCESS(err_code);
err_code = sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *) DEVICE_NAME, strlen(DEVICE_NAME));
VERIFY_SUCCESS(err_code);
err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, m_adv_handle, TX_POWER);
VERIFY_SUCCESS(err_code);
err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_SCAN_INIT, 0, TX_POWER);
VERIFY_SUCCESS(err_code);
err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_CONN, 0, TX_POWER);
VERIFY_SUCCESS(err_code);
err_code = sd_ble_gap_ppcp_set(&ppcp);
VERIFY_SUCCESS(err_code);
return NRF_SUCCESS;
}
```
7. 在“main.c”文件中,包含“my_service.h”头文件,并在初始化函数中调用“ble_my_service_init()”函数来初始化你的自定义BLE服务。例如:
```
#include "my_service.h"
int main(void)
{
uint32_t err_code;
// 初始化BLE协议栈
ble_stack_init();
// 初始化GAP参数
gap_params_init();
// 初始化GATT参数
gatt_init();
// 初始化自定义服务
err_code = ble_my_service_init();
APP_ERROR_CHECK(err_code);
// 启动广播
advertising_start();
// 进入主循环
for (;;)
{
idle_state_handle();
}
}
```
到此为止,我们已经完成了一个简单的自定义BLE服务的创建实例。你可以根据自己的需要修改“my_service.h”和“my_service.c”文件,来实现更加复杂的自定义BLE服务。
在nRF52832平台上如何设计和实现BLE广播功能?同时,请提供如何解析扫描到的广播数据的方法。
在nRF52832平台上设计和实现BLE广播功能,以及解析扫描到的广播数据,需要深入了解BLE的GAP和GATT协议层。《青风详解nRF52832蓝牙工程入门与nRF51822协议层剖析》是深入学习这些知识的好帮手。
参考资源链接:[青风详解nRF52832蓝牙工程入门与nRF51822协议层剖析](https://wenku.csdn.net/doc/bf0807rpqr?spm=1055.2569.3001.10343)
实现BLE广播功能,首先需要初始化nRF52832设备的广播参数,包括广播间隔、广播数据包的内容、广播类型等。在nRF5 SDK中,这通常涉及到ble_gap_conn_params_t结构体的设置,以及ble_gap_adv_params_t结构体的配置,这些都可以在SDK的示例代码中找到。
广播数据包通常包含设备名称、设备功能、以及特定的自定义数据。广播数据可以使用ble_advdata_t结构体进行配置。示例代码片段可能如下所示:
```c
ble_advdata_t advdata = {
.name_type = BLE_ADVDATA_FULL,
.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE,
.appearance = APPpearance,
.uuids_complete = &uuids_complete,
};
```
在广播过程中,nRF52832设备将自动发送广播数据包。对于扫描端设备,需要配置ble_gap_scan_params_t结构体设置扫描参数,然后启动扫描。扫描到的广播数据可以通过nRF SDK中的回调函数ble_GAPSCAN报告,示例代码如下:
```c
static void scan_start(void) {
uint32_t err_code;
err_code = sd_ble_gap_scan_start(&m_scan_param);
APP_ERROR_CHECK(err_code);
}
static void scan_filter_set(void) {
uint32_t err_code;
err_code = sd_ble_gap_scan_filter_set(BLE_GAP_SCAN_FILTER_NONE);
APP_ERROR_CHECK(err_code);
}
```
解析扫描到的广播数据通常需要根据广播数据包的结构来解码特定字段。使用nRF SDK提供的API可以帮助解析广播数据包中的字段,例如设备名称和UUID等。在解析过程中,需要关注ble_gap_evt_adv_report_t结构体,这是包含扫描到的广播数据的主要结构体。
通过以上步骤,可以在nRF52832平台上实现BLE广播功能,并处理扫描到的广播数据。进一步的学习和实践可以参考《青风详解nRF52832蓝牙工程入门与nRF51822协议层剖析》中的相关章节,这本教材能够为你提供从基础原理到具体实现的全面指导。
参考资源链接:[青风详解nRF52832蓝牙工程入门与nRF51822协议层剖析](https://wenku.csdn.net/doc/bf0807rpqr?spm=1055.2569.3001.10343)
阅读全文