
RIOT 上的 Wakaama LwM2M 客户端实战指南从 Leshan 测试服务器搭建到 Bootstrap 引导配置【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本指南以 RIOT 仓库中的 examples/networking/misc/lwm2m 示例为核心完整讲解如何在 RIOT 节点上运行一个基于 Eclipse Wakaama 的 LwM2M 客户端包括搭建本地 Leshan 测试服务器、配置并运行 Bootstrap 引导流程、通过 Kconfig/环境变量注入服务器地址与凭据以及使用 shell 命令控制灯控对象与查看内存。读完本文你将能够在 native 模拟器或真实板卡上把一个注册了 Security、Server、Device、Light Control 等对象的 LwM2M 客户端成功接入 CoAP/CoAPS 服务器并学会定位与调试连接问题。示例概览节点上运行了哪些 LwM2M 对象该示例应用在节点上启动一个 LwM2M 客户端并创建以下对象实例依据 lwm2m_cli.c 中的初始化代码对象作用对应源码Security object保存服务器 URI、安全模式PSK/RPK、身份与密钥pkg/wakaama/contrib/objects/security.cServer object描述所注册的 LwM2M 服务器Short ID、生命周期等pkg/wakaama/contrib/objectsDevice object上报设备信息名称、电量、固件版本等pkg/wakaama/include/objects/device.hLight control object可远程控制的灯对象开关、亮度、颜色pkg/wakaama/contrib/objects/light_control.cOn/Off switch object可远程切换的开关对象pkg/wakaama/contrib/objects/on_off_switch.c从 lwm2m_cli.c 可以看到对象的注册顺序先调用lwm2m_client_init()完成客户端上下文初始化随后依次创建 Security、Server、Device、Light control、On/Off switch 五个对象并填充到对象列表obj_list[]中。灯控对象实例默认使用LED_COLOR FFFFFF白色与LED_APP_TYPE LED 0其状态变化回调_light_cb会打印灯的开关、颜色与亮度并可在板卡定义了LED0_ON/LED0_OFF时真实驱动板载 LED。该示例基于 Eclipse Wakaama 官方 example client 改造而来。Wakaama 是 Eclipse 基金会维护的 LwM2M 协议栈实现RIOT 以USEPKG wakaama的方式将其集成进构建系统。搭建 LwM2M 测试服务器Eclipse Leshan要测试客户端首先需要一个可供注册的 LwM2M 服务器。Eclipse Leshan 的 demo 服务器是本地运行的最佳选择。下载服务器 jar 包wget https://hudson.eclipse.org/leshan/job/leshan/lastSuccessfulBuild/artifact/leshan-server-demo.jar直接运行java -jar ./leshan-server-demo.jar启动后会输出监听地址INFO LeshanServer - LWM2M server started at coap://0.0.0.0/0.0.0.0:5683 coaps://0.0.0.0/0.0.0.0:5684 INFO LeshanServerDemo - Web server started at http://0.0.0.0:8080/.可见默认监听端口为CoAP5683、CoAPSDTLS 加密的 CoAP5684、Web 管理界面8080。若节点通过边界路由器Border Router接入可能需要指定服务器绑定地址使用-lh选项。例如java -jar ./leshan-server-demo.jar -lh fd00:dead:beef::1打开 Web 管理界面默认http://0.0.0.0:8080/在 Security 区块点击Add Security Information选择安全模式Pre-Shared Key然后填入客户端 Endpoint 名称以及身份Identity与密钥Key。这些凭据必须与 RIOT 侧配置的CONFIG_LWM2M_PSK_ID/CONFIG_LWM2M_PSK_KEY保持一致默认值见下文凭据与安全配置一节。使用 Bootstrap Server 测试引导流程LwM2M 提供引导Bootstrap机制客户端先从 Bootstrap 服务器获取注册信息再据此注册到一个或多个 LwM2M 服务器适合需要批量部署、动态下发服务器地址的场景。客户端侧开启 Bootstrap 支持默认情况下示例中创建的 Security 对象实例假定使用的是标准 LwM2M 服务器。若配置对应的是 LwM2M Bootstrap Server需要将lwm2m_obj_security_args_t.is_bootstrap置为truelwm2m_cli.c 中默认false。同时必须在 wakaama 包的配置中开启 Bootstrap 支持两种方式任选其一通过make menuconfig在Packages Configure Wakaama LwM2M下勾选LWM2M_BOOTSTRAP对应 pkg/wakaama/Kconfig 中的config LWM2M_BOOTSTRAP或直接在 CFLAGS 中加入-DCONFIG_LWM2M_BOOTSTRAP1。Bootstrap 支持开启后pkg/wakaama/Makefile.include 会据此拉取相应模块。客户端会连接 pkg/wakaama/include/lwm2m_client_config.h 中定义的CONFIG_LWM2M_BSSERVER_PORT端口默认5685该端口被 pkg/wakaama/contrib/lwm2m_client_connection.c 用于解析 Bootstrap 服务器地址。运行 Leshan Bootstrap ServerBootstrap 服务器使用的端口必须与普通 LwM2M 服务器不同普通服务器默认 CoAP 5683、CoAPS 5684、Web 8080并且要与客户端侧CONFIG_LWM2M_BSSERVER_PORT中设置的端口一致。下载 Bootstrap 服务器 jar 包wget https://hudson.eclipse.org/leshan/job/leshan/lastSuccessfulBuild/artifact/leshan-bsserver-demo.jar通过命令行参数指定各端口后运行# set CoAP, CoAPs and webserver ports for bootstrap server BS_COAPPORT5685 BS_COAPSPORT5686 BS_WEBPORT8888 # run the server java -jar ./leshan-bsserver-demo.jar --coap-port ${BS_COAPPORT} \ --coaps-port ${BS_COAPSPORT} --web-port ${BS_WEBPORT}在 Bootstrap 服务器 Web 界面配置节点与目标服务器点击Add new client bootstrap configuration按钮填写设备名称它必须与节点侧CONFIG_LWM2M_DEVICE_NAME保持一致该宏定义于 pkg/wakaama/include/objects/device.h默认值为testRIOTDevice并被 pkg/wakaama/contrib/lwm2m_client.c 用作注册名在LWM2M Server标签页输入 LwM2M 服务器监听的地址可选择No security或Pre-Shared Key模式。完成上述配置后客户端启动时会先连 Bootstrap 服务器获取目标服务器信息再完成注册。配置、编译与运行客户端服务器地址与 Bootstrap 标志的配置途径服务器地址在应用初始化 Security 对象时被写入见 lwm2m_cli.c 中的server_uri CONFIG_LWM2M_SERVER_URI。它可以通过两种方式设置make menuconfig在Application configuration菜单中修改LWM2M_SERVER_URI对应 examples/networking/misc/lwm2m/Kconfig提示 The host part of the URI MUST be a valid IPv6 address环境变量LWM2M_SERVER_URI由 Makefile 读取默认值为coaps://[fd00:dead:beef::1]:5684。服务器地址必须能从节点访问既可以在 native 上通过 tap 接口直连也可以让节点作为 mote 挂到 border_router 示例 组成的 6LoWPAN 网络上。如果使用 Bootstrap 服务器还需要通过menuconfig或设置环境变量LWM2M_SERVER_BOOTSTRAP1来启用该信息会被用于 Security 对象实例的创建。应用级 Kconfig 配置项examples/networking/misc/lwm2m/Kconfig 定义了如下应用级配置配置项类型默认值说明LWM2M_SERVER_URIstringcoaps://[fd00:dead:beef::1]:5684注册/引导用的服务器 URI主机部分必须是合法 IPv6 地址LWM2M_SERVER_SHORT_IDint1范围 1–65534服务器 Short ID用于 Server/Security 对象LWM2M_CRED_PSKbool选中PSK预共享密钥凭据类型自动选中DTLS_PSKLWM2M_PSK_IDstringClient_IdentityPSK 身份LWM2M_PSK_KEYstringThisIsRIOT!PSK 密钥LWM2M_CRED_RPKbool—RPK原始公钥凭据类型自动选中DTLS_ECCWakaama 包的全局配置位于Packages Configure Wakaama LwM2M菜单包含 pkg/wakaama/Kconfig 中的端口、生命周期、CoAP 块大小等选项例如LWM2M_STANDARD_PORT默认5683与LWM2M_DTLS_PORT默认5684远端服务器 CoAP/CoAPS 端口LWM2M_DEVICE_TTL默认300设备在服务器上的生命周期秒LWM2M_COAP_DEFAULT_BLOCK_SIZE默认10块传输大小取 2 的指数2^416 到 2^101024 字节LWM2M_TLSF_BUFFER默认5120TLSF 内存分配器缓冲区大小字节LWM2M_WITH_LOGS是否开启 Wakaama 内部调试日志。访问配置界面只需运行make menuconfig依赖模块与构建命令示例 Makefile 展示了完整依赖链netdev_default与auto_init_gnrc_netif拉取并自动初始化链路层存在 IEEE802.15.4 设备时会自动包含 6LoWPANgnrc_ipv6_router_default提供 IPv6 路由此外还启用了 shell、wakaama包、灯控/开关对象模块以及 DTLS 支持USEPKG wakaama USEMODULE wakaama_objects_light_control USEMODULE wakaama_objects_on_off_switch USEMODULE wakaama_client_dtls USEPKG tinydtls USEMODULE prng_sha1prng其中tinydtls提供 sock DTLS 实现prng_sha1prng为其提供密码学安全 PRNG。若未通过 Kconfig 配置Makefile 会通过 CFLAGS 注入CONFIG_LWM2M_SERVER_URI、CONFIG_LWM2M_SERVER_SHORT_ID、CONFIG_DTLS_PEER_MAX2、CONFIG_MAX_BUF1024。CONFIG_DTLS_PEER_MAX2与 DTLS 握手缓冲区相关选项CONFIG_DTLS_HANDSHAKE_BUFSIZE_EXP9可在 app.config 中查看。编译、烧录并打开终端BOARDboard make clean all flash term默认BOARD ? native见 Makefile即无需硬件即可在 native 模拟器上先跑通全流程。凭据与安全模式PSK 与 RPK 的源码级说明安全凭据集中在 credentials.hPSK 身份与密钥由CONFIG_LWM2M_PSK_ID/CONFIG_LWM2M_PSK_KEY定义默认Client_Identity/ThisIsRIOT!编译期可用 CFLAGS 覆盖RPK 客户端公私钥与服务器公钥以openssl ec导出的 DER 字节数组形式内嵌文件中的注释给出了复现命令openssl ec -in keys.der -inform DER -pubout -outform DER | xxd -i等。在 lwm2m_cli.c 中Security 对象实例的创建逻辑会根据 Kconfig 选择动态切换默认构造时使用LWM2M_SECURITY_MODE_RAW_PUBLIC_KEYRPK若启用CONFIG_LWM2M_CRED_PSK则切换为LWM2M_SECURITY_MODE_PRE_SHARED_KEY填入 PSK 身份与密钥若启用CONFIG_LWM2M_CRED_RPK则继续使用 RPK 模式并填入客户端与服务器公钥两者都未启用时打印Error: you must select a credential type并中止。其余安全相关参数还包括client_hold_off_time 5注册前等待秒数与bootstrap_account_timeout 0。实际使用中PSK 凭据需要与 Leshan 服务器 Security 页面填写的 Identity/Key 完全一致RPK 则要求服务器侧导入与server_rpk_pub对应的公钥。Shell 命令详解应用在 lwm2m_cli.c 注册了lwm2m顶层 shell 命令main.c则启动 shell 主循环见 main.c。可用子命令如下命令说明lwm2m start配置模块并注册到服务器。底层调用lwm2m_client_run()成功返回后置connected 1lwm2m light on\|off dimmer [color]设置灯控对象状态on/off指定开关dimmer为亮度0–100 的整数color为可选的十六进制颜色串lwm2m switch on\|off切换 On/Off Switch 对象状态源码中实现属补充命令lwm2m mem仅当在 Makefile 中启用了DEVELHELP时可用打印 LwM2M 模块的内存使用情况调用lwm2m_tlsf_status()lwm2m light与lwm2m switch在执行前都会检查connected标志未注册成功时提示LwM2M client not connected。灯控命令内部按顺序调用lwm2m_object_light_control_update_color()、update_status()、update_dimmer()最后一次更新会触发_light_cb回调从而在终端打印灯的实时状态并若板卡支持点亮板载 LED。参数数量不合法时命令会打印 usage 提示。调试手段与内存调优开启两级调试日志客户端适配层调试将 pkg/wakaama/contrib/lwm2m_client.c 和 pkg/wakaama/contrib/lwm2m_client_connection.c 中的ENABLE_DEBUG置为 1可查看 RIOT 侧适配层的收发与状态流转日志Wakaama 内部日志通过menuconfig勾选LWM2M_WITH_LOGS或直接在 CFLAGS 追加CFLAGS -DCONFIG_LWM2M_WITH_LOGS。开启后 pkg/wakaama/Makefile.include 会为 Wakaama 启用其内建打印帮助跟踪协议栈内部的 CoAP/DTLS 行为。TLSF 内存池调整客户端内存分配使用 TLSF 包提供的私有堆。pkg/wakaama/contrib/lwm2m_platform.c 将堆实现为uint32_t数组其大小由CONFIG_LWM2M_TLSF_BUFFER决定默认 5120 字节见 pkg/wakaama/include/lwm2m_platform.h。若内存吃紧可在make menuconfig的 Wakaama 菜单中调整该值。启用DEVELHELP后可用lwm2m mem实时观察堆占用辅助确定合理容量。仓库路径速查示例应用 examples/networking/misc/lwm2m含 README.md、Makefile、Kconfig、lwm2m_cli.c、credentials.h、app.configWakaama 包 pkg/wakaamaKconfig、include/lwm2m_client_config.h、contrib/lwm2m_client.c、contrib/lwm2m_client_connection.c、contrib/objects边界路由器参考示例 examples/networking/gnrc/border_router【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考