ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RIOT 中 Cayenne Low Power Payload(LPP)编解码实践:基于 cayenne-lpp 包的测试应用深度解析

RIOT 中 Cayenne Low Power Payload(LPP)编解码实践:基于 cayenne-lpp 包的测试应用深度解析 物联网嵌入式操作系统实时系统【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址https://gitcode.com/GitHub_Trending/riot/RIOT点击查看免费下载Cayenne Low Power PayloadLPP是面向 LPWAN如 LoRaWAN网络的轻量级二进制数据序列化格式它用紧凑的字节布局将传感器读数打包成可直接放入 LoRaWAN 帧的上行负载。本文以 RIOT 官方测试应用 tests/pkg/cayenne-lpp/README.md 为主线结合 tests/pkg/cayenne-lpp/main.c 与 pkg/cayenne-lpp 包定义完整讲解如何在 RIOT 上运行 Cayenne LPP 编解码测试、理解其字节级编码原理并掌握将该测试扩展为真实 LoRaWAN 节点数据发送流程的方法。Cayenne LPP 与 RIOT 中的 cayenne-lpp 包Cayenne LPP 的核心思想是用通道号1 字节 数据类型码1 字节 载荷定长 N 字节的三段式结构把每个传感器读数编码成紧凑二进制。RIOT 通过外部包pkg机制集成了社区实现cayenne-lpp相关说明位于 pkg/cayenne-lpp/doc.txt其中明确指出该包为 Cayenne LPP 格式提供 RIOT 支持适用于通过 LoRaWAN 等 LPWAN 网络发送数据的场景。包本身由 pkg/cayenne-lpp/Makefile 定义PKG_NAMEcayenne-lpp PKG_URLhttps://github.com/aabadie/cayenne-lpp PKG_VERSION0.1.1 PKG_LICENSELGPL-2.1-only include $(RIOTBASE)/pkg/pkg.mk all: $(QQ)$(MAKE) -C $(PKG_SOURCE_DIR) -f $(RIOTBASE)/Makefile.base固定版本0.1.1许可证为LGPL-2.1-only构建时通过pkg/pkg.mk拉取源码并借用 RIOT 的Makefile.base编译头文件搜索路径由 pkg/cayenne-lpp/Makefile.include 提供INCLUDES -I$(PKGDIRBASE)/cayenne-lpp因此应用代码中只需#include cayenne_lpp.h即可使用全部 API。测试应用概览运行方式与预期输出官方 README 给出的使用方法非常简洁——在native板RIOT 的宿主机仿真平台上直接编译并启动终端make all term该命令在 tests/pkg/cayenne-lpp/Makefile 的配合下工作。该 Makefile 内容如下include ../Makefile.pkg_common USEPKG cayenne-lpp include $(RIOTBASE)/Makefile.include关键点是USEPKG cayenne-lpp它声明本测试应用依赖该外部包RIOT 构建系统会据此完成包的拉取、打补丁与编译Makefile.pkg_common位于 tests/pkg/Makefile.pkg_common。程序启动后应输出以下两行内容对应 README 的 Expected result 一节Cayenne LPP test application 03670110056700FF第一行是应用启动横幅第二行则是第一个测试用例编码出的完整 LPP 负载。该十六进制串并非随机数据而是两个温度传感器读数的逐字节编码结果下一节将逐字节拆解其含义。逐用例源码解析从传感器值到 LPP 字节流测试程序 tests/pkg/cayenne-lpp/main.c 共执行 3 个用例每个用例都遵循同一模式调用cayenne_lpp_add_*系列 API 向缓冲区写入数据随后用memcmp与预置期望字节流比对一致则打印SUCCESS否则打印FAILED并返回非零退出码。测试前后通过cayenne_lpp_reset(lpp)清空缓冲区。Test 1双温度传感器cayenne_lpp_add_temperature(lpp, 3, 27.2); cayenne_lpp_add_temperature(lpp, 5, 25.5);期望字节流定义为#define TEST_BUFFER1 { 0x03, 0x67, 0x01, 0x10, 0x05, 0x67, 0x00, 0xff }逐字节解读| 字节 | 值 | 含义 | | ---- | -- | ---- | | 1 |0x03| 通道号 3第一路温度 | | 2 |0x67| 类型码温度传感器 | | 3-4 |0x01 0x10| 有符号 16 位温度值0x0110 272除以 10 得27.2°C| | 5 |0x05| 通道号 5第二路温度 | | 6 |0x67| 类型码温度 | | 7-8 |0x00 0xff|0x00FF 255除以 10 得25.5°C|这正好拼出 README 中的预期输出03670110056700FF。可见温度编码规则为摄氏度 ×10 取整后存入有符号 16 位这也是 Cayenne LPP 温度类型type0x67的固定载荷长度2 字节的由来。Test 2温度 加速度计cayenne_lpp_reset(lpp); cayenne_lpp_add_temperature(lpp, 1, -4.1); cayenne_lpp_add_accelerometer(lpp, 6, 1.234, -1.234, 0);期望字节流native 平台#define TEST_BUFFER2 { 0x01, 0x67, 0xFF, 0xD8, \ 0x06, 0x71, 0x04, 0xD1, 0xFB, 0x2F, 0x00, 0x00 }解码过程01 67 FF D8通道 1 温度。0xFFD8是有符号 16 位值-40即 -4.0°C浮点 -4.1 经定点化后落入 -40/-410xFD8 与 -410xFFD7 相差 1属于定点量化误差这正是源码中对 native32 与其它平台使用两套期望缓冲区的深层原因06 71 04 D1 FB 2F 00 00通道 6 加速度计类型码0x71。三个轴向各占 2 字节0x04D1 1233约 1.234g、0xFB2F -1233约 -1.234g、0x0000 0即g 值 ×1000 存入有符号 16 位。Test 3GPS 定位cayenne_lpp_reset(lpp); cayenne_lpp_add_gps(lpp, 1, 42.3519, -87.9094, 10);期望字节流#define TEST_BUFFER3 { 0x01, 0x88, 0x06, 0x76, \ 0x5E, 0xF2, 0x96, 0x0A, 0x00, 0x03, 0xE8 }解码过程01 88通道 1类型码0x88GPS纬度 3 字节0x06765E 423518除以 1e4 得42.3518°源码入参 42.3519量化误差 0.0001经度 3 字节0xF2960A为有符号 24 位值-879094除以 1e4 得-87.9094°与入参完全一致海拔 3 字节0x0003E8 1000单位为厘米除以 100 得10 米。同时源码中通过CAYENNE_LPP_TEMPERATURE_SIZE、CAYENNE_LPP_ACCELEROMETER_SIZE、CAYENNE_LPP_GPS_SIZE三个常量分别校验各类型固定载荷长度温度 2、加速度 6、GPS 9 字节这些常量由cayenne_lpp.h提供可在后续自研编码时直接复用避免手写魔法数字。自动化回归测试让编码结果可机器校验该测试应用不仅面向人工演示还内置了自动化验证脚本 tests/pkg/cayenne-lpp/tests/01-run.pyNB_TESTS 3 def testfunc(child): for test in range(NB_TESTS): child.expect_exact(Test {}:.format(test 1)) child.expect(Result: [0-9A-Z] SUCCESS)脚本借助 RIOT 的 testrunner 框架逐个等待Test 1:、Test 2:、Test 3:横幅出现并用正则Result: [0-9A-Z] SUCCESS断言每个用例都打印了大写十六进制结果且以SUCCESS结尾。这意味着在 CI持续集成或make test流程中只要任一用例编码错误导致输出变成FAILED测试即告失败。对 LoRaWAN 节点固件而言这种编码前先过单元测试的做法能有效防止设备上线后上报损坏数据。从测试到实战把 LPP 负载接入 LoRaWAN 上行链路结合 pkg/cayenne-lpp/doc.txt 与测试源码可将该测试的应用模式迁移到真实 LoRaWAN 节点引入依赖在应用 Makefile 中加入USEPKG cayenne-lpp参考 tests/pkg/cayenne-lpp/Makefile并在源码中#include cayenne_lpp.h声明缓冲上下文仿照static cayenne_lpp_t lpp;维护编解码状态发送前调用cayenne_lpp_reset()复位按通道叠加数据不同传感器使用不同通道号如温度0x67、加速度0x71、GPS0x88在 1 字节通道号范围内合理规划通道分配注意每类数据的载荷定长缓冲区总容量受cayenne_lpp_t内部数组约束需在应用层估算一次上报的最大字节数发送负载将lpp.buffer与lpp.cursor有效长度交给 LoRaWAN 协议栈如 RIOT 的 Semtech LoRaMAC 包填充进上行帧即可被兼容 Cayenne LPP 的云平台如 myDevices自动解析为图表数据。需要注意的是测试程序在 native 平台运行时Test 2 使用0xFF 0xD8而非其它平台的0xFF 0xD7两者相差 1 个 LSB源于定点化在宿主机浮点环境与交叉编译环境间的舍入差异。若在真实硬件上移植本测试务必像源码那样按平台区分期望字节流或以编码后回解误差在容差内替代精确字节比对。总结通过make all term一条命令RIOT 的 cayenne-lpp 测试应用在 native 上完成了温度、加速度计、GPS 三类传感器的 LPP 编码自检。从 tests/pkg/cayenne-lpp/main.c 的字节级断言到 tests/pkg/cayenne-lpp/tests/01-run.py 的自动化回归再到 pkg/cayenne-lpp 的包封装读者可以以此为模板将通道号 类型码 定长载荷的 LPP 编码实践直接落地到自己的 LoRaWAN 物联网节点固件中。赞分享物联网嵌入式操作系统实时系统【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址https://gitcode.com/GitHub_Trending/riot/RIOT点击查看免费下载相关推荐PyTorch Geometric 数据变换Transforms完全指南Data 与 HeteroData 的预处理与增强实战PyTorch Geometric 数据变换Transforms完全指南Data 与 HeteroData 的预处理与增强实战 导读 torch_geom物联网嵌入式操作系统实时系统RIOT OS 核心 API 运行时长基准测试runtime_coreapis 应用深度解析RIOT OS 核心 API 运行时长基准测试runtime_coreapis 应用深度解析 导读 本文围绕 RIOT OS 测试套件中的 tests/ben物联网嵌入式操作系统实时系统RIOT 中 NimBLE 与 ESP WiFi 共存测试应用深度解析tests/pkg/nimble_esp_wifi_coexistRIOT 中 NimBLE 与 ESP WiFi 共存测试应用深度解析tests/pkg/nimble_esp_wifi_coexist 导读 本文围绕 R物联网嵌入式操作系统实时系统上一篇Chat-Ollama项目知识库嵌入模型配置指南下一篇WebToEpub完整指南三步将网页小说转为EPUB电子书的神器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表