星闪开发之Server-Client 指令交互控制红灯亮灭的全流程解析(SLE_LED详解)

之前有粉丝想要计蒙写一篇关于sle_led样例的详细解析文章,于是有了这篇文章,如果拿到代码库中的项目跑不通请直接跳转至第四部分。
客户端中共两个文件。分别是SLE_LED_Client.h,SLE_LED_Client.c
这段代码是一个 LED 控制模块的头文件框架,采用了标准的头文件保护机制来防止重复包含。
头文件保护宏的作用:头文件保护宏(也称为 Include Guard)是 C/C++ 中防止头文件被重复包含的标准技术。当多个源文件包含同一个头文件时,可能会导致函数或变量的重复定义错误。使用保护宏可以确保头文件内容只被编译一次。
实现了一个基于 SLE协议的 LED 客户端控制系统,主要功能是通过 SLE 协议与远程设备通信并控制本地 LED 灯。整个系统采用模块化设计,包含设备扫描、连接管理、服务发现和 LED 控制等核心模块。
代码特点:
安全机制:使用memcpy_s等安全函数防止缓冲区溢出
资源管理:动态分配内存(osal_vmalloc)并及时释放(osal_vfree)
硬件抽象:通过pinctrl.h和gpio.h封装底层硬件操作
协议栈集成:深度集成 SLE 协议栈,处理扫描、连接、服务发现全流程
调试支持:通过PRINT宏输出详细日志,便于问题定位
依赖多个底层库,涵盖安全操作、协议栈、硬件控制和系统接口,自定义头文件SLE_LED_Client.h用于声明 LED 控制相关接口。
宏定义配置了通信参数(MTU、扫描间隔等),全局变量存储协议回调函数和连接状态,便于跨函数访问。
通过 GPIO 接口直接控制硬件引脚,实现 LED 开关。
支持三种颜色 LED(红、黄、绿),分别对应 GPIO_07、GPIO_10、GPIO_11。
接收到远程通知后,不仅控制本地 LED,还会将状态回传给服务器。
扫描阶段:按预设参数(间隔、窗口)搜索设备,匹配到预设地址g_sle_expected_addr后停止。
连接阶段:建立连接后自动发起配对,并保存连接 ID 用于后续通信。
通过 SSAP 协议发现远程服务,获取服务句柄和 UUID
注册通知回调example_sle_notification_cbk,当收到远程命令时触发 LED 控制
核心工作流程:
SLE协议栈的 LED 服务器头文件框架,主要定义了服务相关的 UUID 和基础结构,使用标准的头文件保护宏防止重复包含。
服务 UUID (0xABCD):标识 LED 服务器提供的整体服务,客户端通过此 UUID 发现服务器
通知报告 UUID (0x1122):用于服务器主动推送通知(如 LED 状态变化)
属性 UUID (0x3344):用于客户端读写 LED 控制属性(如开关状态)
定义了 SLE 协议中 LED 服务器的广播功能,包含数据结构、信道配置和初始化接口。
实现了一个基于 SLE协议的 LED 服务器应用,主要用于控制不同类型 LED 的开关状态。该应用支持设备发现、连接建立、服务发布以及 LED 状态的远程控制,适用于物联网设备中的 LED 管理场景。
关键数据结构
example_control_led_type_t定义LED控制操作(开关主板LED、灯板RGB灯等)核心模块划分
sle_common.h、sle_ssap_server.h等头文件与SLE协议栈交互example_sle_server_send_notify_by_handle发送通知到客户端last_led_operation跟踪上一次操作状态enable_sle():初始化SLE协议栈example_sle_server_add():创建服务和属性example_sle_server_adv_init():启动设备发现广播SLE_UUID_SERVER_SERVICE)和属性(SLE_UUID_SERVER_PROPERTY)SSAP_PERMISSION_READ | SSAP_PERMISSION_WRITE)PRINT函数输出LED状态到调试日志ssaps_ntf_ind_t结构封装通知数据ssaps_notify_indicate函数发送通知到客户端g_conn_id存储当前连接ID实现了SLE的广播功能,主要用于设备发现和连接建立。通过配置广播参数、设置广播数据和扫描响应数据,使服务器能够在网络中被其他设备发现,并支持连接请求。代码包含地址设置、名称配置、广播参数初始化及回调函数注册等完整流程。
struct sle_adv_common_value定义广播数据项,包含长度、类型和值"SLE_LED_SERVER"SLE_ANNOUNCE_LEVEL_NORMAL(普通发现等级)SLE_ADV_TX_POWER=10,影响信号覆盖范围sle_set_local_addr和sle_set_local_name设置基础信息SLE_ANNOUNCE_MODE_CONNECTABLE_SCANABLE表示支持连接和扫描sle_start_announce启动广播,使用默认句柄1将SLE_LED_Server\src\SLE_LED_Server.c文件中的example_sle_server_property_add方法内部
修改为:
修改后的方法如下:
差异主要体现在内存管理方式、描述符字段配置上。
个人分析,仅供参考。如有疑问请留言或者联系计蒙。下一篇文章计划–写一个关于OLED的星闪互联案例。
原文作者:计蒙不吃鱼;如有侵权,请联系管理员删除。