ITPub博客

首页 > 数据库 > 数据库开发技术 > 星闪开发之Server-Client 指令交互控制红灯亮灭案例解析(SLE_LED详解)

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

数据库开发技术 作者:逻辑编码者 时间:2025-06-05 08:50:07 0 删除 编辑

系列文章目录

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


在这里插入图片描述


前言

之前有粉丝想要计蒙写一篇关于sle_led样例的详细解析文章,于是有了这篇文章,如果拿到代码库中的项目跑不通请直接跳转至第四部分。


一、项目地址

基于海思WS63项目库中的sle_led项目

二、客户端

客户端中共两个文件。分别是SLE_LED_Client.h,SLE_LED_Client.c

1.SLE_LED_Client\inc\SLE_LED_Client.h

这段代码是一个 LED 控制模块的头文件框架,采用了标准的头文件保护机制来防止重复包含。

头文件保护宏的作用:头文件保护宏(也称为 Include Guard)是 C/C++ 中防止头文件被重复包含的标准技术。当多个源文件包含同一个头文件时,可能会导致函数或变量的重复定义错误。使用保护宏可以确保头文件内容只被编译一次。

2.SLE_LED_Client\src\SLE_LED_Client.c

实现了一个基于 SLE协议的 LED 客户端控制系统,主要功能是通过 SLE 协议与远程设备通信并控制本地 LED 灯。整个系统采用模块化设计,包含设备扫描、连接管理、服务发现和 LED 控制等核心模块。

代码特点:
安全机制:使用memcpy_s等安全函数防止缓冲区溢出
资源管理:动态分配内存(osal_vmalloc)并及时释放(osal_vfree)
硬件抽象:通过pinctrl.h和gpio.h封装底层硬件操作
协议栈集成:深度集成 SLE 协议栈,处理扫描、连接、服务发现全流程
调试支持:通过PRINT宏输出详细日志,便于问题定位

头文件与依赖管理

依赖多个底层库,涵盖安全操作、协议栈、硬件控制和系统接口,自定义头文件SLE_LED_Client.h用于声明 LED 控制相关接口。

宏定义与全局变量

宏定义配置了通信参数(MTU、扫描间隔等),全局变量存储协议回调函数和连接状态,便于跨函数访问。


LED 控制功能

通过 GPIO 接口直接控制硬件引脚,实现 LED 开关。
支持三种颜色 LED(红、黄、绿),分别对应 GPIO_07、GPIO_10、GPIO_11。
接收到远程通知后,不仅控制本地 LED,还会将状态回传给服务器。

回调函数(扫描使能,开始,停止,结果)

设备扫描与连接流程

扫描阶段:按预设参数(间隔、窗口)搜索设备,匹配到预设地址g_sle_expected_addr后停止。
连接阶段:建立连接后自动发起配对,并保存连接 ID 用于后续通信。

服务发现与通信协议

通过 SSAP 协议发现远程服务,获取服务句柄和 UUID
注册通知回调example_sle_notification_cbk,当收到远程命令时触发 LED 控制

任务启动与系统集成

客户端总结

核心工作流程:

  1. 系统启动:创建 SLE LED 客户端任务,等待协议栈初始化
  2. 注册回调:设置扫描、连接、SSAP 协议的各类回调函数
  3. 设备扫描:按预设参数搜索设备,匹配到目标地址后停止
  4. 建立连接:与目标设备配对,获取连接 ID
  5. 服务发现:通过 SSAP协议发现远程服务,获取操作句柄
  6. 命令交互:接收远程通知(如 “RLED_ON”),控制本地 LED 并回传状态

三、服务端

1.SLE_LED_Server\inc\SLE_LED_Server.h

SLE协议栈的 LED 服务器头文件框架,主要定义了服务相关的 UUID 和基础结构,使用标准的头文件保护宏防止重复包含。

服务 UUID (0xABCD):标识 LED 服务器提供的整体服务,客户端通过此 UUID 发现服务器
通知报告 UUID (0x1122):用于服务器主动推送通知(如 LED 状态变化)
属性 UUID (0x3344):用于客户端读写 LED 控制属性(如开关状态)

2.SLE_LED_Server\inc\SLE_LED_Server_adv.h

定义了 SLE 协议中 LED 服务器的广播功能,包含数据结构、信道配置和初始化接口。

广播数据结构设计

广播信道配置

广播数据类型枚举

广播初始化接口

3.SLE_LED_Server\src\SLE_LED_Server.c

实现了一个基于 SLE协议的 LED 服务器应用,主要用于控制不同类型 LED 的开关状态。该应用支持设备发现、连接建立、服务发布以及 LED 状态的远程控制,适用于物联网设备中的 LED 管理场景。
关键数据结构

  • 枚举类型:example_control_led_type_t定义LED控制操作(开关主板LED、灯板RGB灯等)
  • 全局变量:存储服务句柄、连接ID、属性句柄等关键信息
  • UUID定义:使用16位UUID标识服务和属性

核心模块划分

  1. SLE协议栈接口:通过sle_common.h、sle_ssap_server.h等头文件与SLE协议栈交互
  2. 任务管理:使用CMSIS-RTOS v2进行多任务管理,创建LED控制任务和服务器主任务
  3. LED控制逻辑:定义多种LED操作类型,并实现周期性控制逻辑
  4. 服务与属性管理:创建SLE服务和属性,处理读写请求
  5. 连接管理:处理设备连接状态变化和配对完成事件

LED控制任务

  • 周期性控制:每500ms切换一次LED状态,按红→黄→绿的顺序循环控制
  • 命令发送:通过example_sle_server_send_notify_by_handle发送通知到客户端
  • 状态管理:使用枚举变量last_led_operation跟踪上一次操作状态

服务器初始化流程

  • 初始化顺序:延时等待→使能SLE→注册回调→创建服务→启动广播
  • 关键函数:
    • enable_sle():初始化SLE协议栈
    • example_sle_server_add():创建服务和属性
    • example_sle_server_adv_init():启动设备发现广播

服务与属性创建

  • UUID设置:使用16位UUID标识服务(SLE_UUID_SERVER_SERVICE)和属性(SLE_UUID_SERVER_PROPERTY)
  • 属性权限:设置为可读可写(SSAP_PERMISSION_READ | SSAP_PERMISSION_WRITE)
  • 描述符添加:为属性添加描述符,定义通知操作权限

客户端交互处理

  • 写请求处理:接收客户端发送的LED控制命令
  • 命令解析:通过字符串匹配识别"LED_ON"、"LED_OFF"等命令
  • 状态反馈:通过PRINT函数输出LED状态到调试日志

通知发送机制

  • 通知结构:使用ssaps_ntf_ind_t结构封装通知数据
  • 内存管理:动态分配内存存储通知数据,发送后释放
  • 协议接口:通过ssaps_notify_indicate函数发送通知到客户端

连接状态管理

  • 状态回调:监听连接状态变化和配对完成事件
  • 任务启动:配对成功后启动LED控制任务
  • 连接ID管理:使用全局变量g_conn_id存储当前连接ID

4.SLE_LED_Server\src\SLE_LED_Server_adv.c

实现了SLE的广播功能,主要用于设备发现和连接建立。通过配置广播参数、设置广播数据和扫描响应数据,使服务器能够在网络中被其他设备发现,并支持连接请求。代码包含地址设置、名称配置、广播参数初始化及回调函数注册等完整流程。

广播数据配置

  • 数据结构:使用struct sle_adv_common_value定义广播数据项,包含长度、类型和值
  • 名称设置:遵循广播数据格式(长度+类型+内容),名称为"SLE_LED_SERVER"
  • 发现等级:设置为SLE_ANNOUNCE_LEVEL_NORMAL(普通发现等级)
  • 接入模式:值为0(具体含义由协议定义)

扫描响应数据配置

  • 扫描响应作用:当设备被扫描时,返回包含功率和名称的响应数据
  • 功率等级:设置为SLE_ADV_TX_POWER=10,影响信号覆盖范围
  • 数据复用:扫描响应中的名称设置复用广播数据的名称配置函数

设备地址与名称设置

  • 地址格式:6字节固定地址,可能为厂商自定义格式
  • 名称规范:使用小写字母和下划线,符合设备命名惯例
  • 协议接口:通过sle_set_local_addr和sle_set_local_name设置基础信息

广播参数初始化

  • 广播模式:SLE_ANNOUNCE_MODE_CONNECTABLE_SCANABLE表示支持连接和扫描
  • 间隔配置:广播间隔固定为25ms,连接间隔固定为12.5ms
  • 超时机制:连接监控超时5000ms,超过则断开连接
  • 信道映射:使用默认信道,适应标准网络环境

回调函数与广播控制

  • 回调机制:监听广播启用、禁用、终止和SLE启用事件
  • 初始化流程:注册回调→设置参数→配置数据→地址名称→启动广播
  • 广播控制:通过sle_start_announce启动广播,使用默认句柄1

四、从代码库拿的代码跑不通(解决)

将SLE_LED_Server\src\SLE_LED_Server.c文件中的example_sle_server_property_add方法内部

修改为:

修改后的方法如下:

差异主要体现在内存管理方式、描述符字段配置上。

总结

个人分析,仅供参考。如有疑问请留言或者联系计蒙。下一篇文章计划–写一个关于OLED的星闪互联案例。

原文作者:计蒙不吃鱼;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-06-01

  • 博文量
    13
  • 访问量
    961