NORDIC Thingy:52 蓝牙 BLE 服务 SoC 程序调用流程分析之三, User interface service

Nordic Thingy 52 BLE Services

* Thingy configuration service 

* Environment service 

* User interface service 

* Motion service 

* Sound service 

* Battery service 

* DFU service


* User interface service 

The UI module handles the onboard LEDs, buttons, and other potential UI components like a quadrature decoder, touchscreen etc. The UI module runs on top of the UI BLE Service (ble_uis), the LED and button drivers, and the UI flash storage with base UUID EF68xxxx-9B35-4933-9B10-52FFA9740042. This module enables RGB LED value setting and button event notifications via BLE. Button notification is enabled by writing 0x0001 to the CCCD of the button characteristic.

UI 模块处理板载的 LED、按键、 触摸屏操作等, UI 模块基于 UI BLE 服务 (ble_uis); LED 和按键的驱动,UI Flash 基于 UUID: EF68xxxx-9B35-4933-9B10-52FFA9740042 存储;UI 模块通过 BLE 使能 RGB LED 值设定和按键事件通知。按键通知使能是通过写入 0x0001 到按键特征的 CCCD。


服务 UUID 定义

文件: ble_uis.h

#define BLE_UIS_UUID_BASE        {{0x42, 0x00, 0x74, 0xA9, 0xFF, 0x52, 0x10, 0x9B, 0x33, 0x49, 0x35, 0x9B, 0x00, 0x00, 0x68, 0xEF}}

#define BLE_UIS_UUID_SERVICE     0x0300     /**< UUID for UI service */
#define BLE_UIS_UUID_LED_CHAR    0x0301     /**< UUID for LED characteristic. */
#define BLE_UIS_UUID_BUTTON_CHAR 0x0302     /**< UUID for button characteristic. */
#define BLE_UIS_UUID_PIN_CHAR    0x0303     /**< UUID for pin characteristic. */

程序功能调用流程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用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服务

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值