NRF5函数sd_ble_gap_appearance_set
时间: 2023-09-19 17:06:54 浏览: 53
函数说明:设置设备外观
函数原型:
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芯片获取主机设备名称的代码如何实现
在nrf52832芯片中,可以通过蓝牙协议来获取连接主机的设备名称。具体实现步骤如下:
1. 首先需要在蓝牙协议栈中开启获取设备名称的功能。可以在初始化蓝牙协议栈时,设置相应的参数。例如:
```
ble_gap_conn_params_t gap_conn_params = {
.min_conn_interval = MIN_CONN_INTERVAL,
.max_conn_interval = MAX_CONN_INTERVAL,
.slave_latency = SLAVE_LATENCY,
.conn_sup_timeout = CONN_SUP_TIMEOUT
};
ble_gap_conn_sec_mode_t sec_mode;
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
err_code = sd_ble_gap_device_name_set(&sec_mode,
(const uint8_t *)DEVICE_NAME,
strlen(DEVICE_NAME));
APP_ERROR_CHECK(err_code);
err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_GENERIC_TAG);
APP_ERROR_CHECK(err_code);
err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
APP_ERROR_CHECK(err_code);
err_code = sd_ble_gap_adv_data_set(adv_data, sizeof(adv_data), NULL, 0);
APP_ERROR_CHECK(err_code);
err_code = sd_ble_gap_conn_param_update(conn_handle, &gap_conn_params);
APP_ERROR_CHECK(err_code);
```
在上述代码中,通过调用sd_ble_gap_device_name_set函数设置设备名称为DEVICE_NAME。
2. 在连接事件回调函数中,可以获取连接主机的设备名称。例如:
```
static void on_ble_evt(ble_evt_t * p_ble_evt)
{
switch (p_ble_evt->header.evt_id)
{
case BLE_GAP_EVT_CONNECTED:
printf("Connected to device %s\r\n", (char*)p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr);
break;
case BLE_GAP_EVT_DISCONNECTED:
printf("Disconnected\r\n");
break;
default:
// No implementation needed.
break;
}
}
```
在上述代码中,通过访问p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr来获取连接主机的设备名称。
需要注意的是,获取设备名称的方式可能会因蓝牙协议版本不同而有所不同。以上代码仅供参考。