nordic的SDK中,手机通过GATT连接nordic后,nordic还能发出广播包吗?
时间: 2023-06-25 21:02:35 浏览: 159
是的,Nordic的SDK中,即使手机通过GATT连接了Nordic设备,设备仍然可以发出广播包。事实上,广播包是一种非连接的方式,可以用于设备之间的发现和通信。而GATT连接则是一种连接方式,用于设备之间的数据传输和控制。因此,这两种方式是相互独立的,Nordic设备可以同时使用这两种方式与其他设备通信。
相关问题
nordic NRF_MESH_GATT_BLE_OBSERVER_PRIO不能更改
这是一个IT类问题,可以回答。
nRF Mesh是一个基于Nordic Semiconductor的蓝牙芯片开发的Mesh网络解决方案,其中包括一个GATT/BLE Observer模块,用于监听和接收BLE广播包。在nRF Mesh中,NRF_MESH_GATT_BLE_OBSERVER_PRIO是一个用于指定GATT/BLE Observer模块优先级的常量,它的值不能被更改。
请给出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服务。
阅读全文