使用 EMQX 接入 LwM2M 协议设备

LwM2M 协议介绍

LwM2M 是一种轻量级的物联网设备管理协议,由 OMA(Open Mobile Alliance)组织制定。它基于 CoAP (Constrained Application Protocol)协议,专门针对资源受限的物联网设备设计,例如传感器、智能表计等,它们通常由电池供电,并且 CPU、内存、网络链接资源有限。

协议栈结构

协议栈结构

LwM2M 协议栈有以下几个特点:

  • 应用层除了协议本身定义了一套标准的对象资源模型外,也允许用户进行自定义对象模型。
  • 传输层上一般是常用的 CoAP/UDP,使其在兼顾轻量的前提下,也提供了一定程度的可靠性保证。
  • 传输安全上采用 DTLS 协议,支持 Pre-Shared Key、Raw Public Key、X.509 证书等多种安全模式。
  • 网络层一般以 UDP + IPv4/6 和 SMS 为主,同时也支持将其部署在 NB-IoT、TCP、LoRAWAN 等网络上。

资源模型

资源模型是 LwM2M 协议的核心,它定义了客户端与服务器之间的通信规范。客户端按该定义的数据格式向服务器上报数据,服务器通过资源模型向客户端对应的资源发送读、写、执行等控制命令。

下图展示了客户端(LwM2M Client)、对象(Objects)和资源(Resources)之间的关系,客户端可能有多个类型的资源,每个资源都隶属于某个对象:

资源模型

所有标准的对象和资源都存在一个固定的编号,他们由 OMA LwM2M Registry 进行统一维护。

例如,用于温度传感器类设备的对象 Id 为 3303,它定义了:

  • Resource 5700: Sensor Value (current temperature reading)

    资源 5700:传感器值(当前温度读数)

  • Resource 5701: Sensor Units (units of the temperature reading, e.g., Celsius or Fahrenheit)

    资源 5701:单位(例如,摄氏度或华氏度)

  • Resource 5601: Min Measured Value (minimum recorded temperature)

    资源 5601:最小测量值

  • Resource 5602: Max Measured Value (maximum recorded temperature)

    资源 5602:最大测量值

LwM2M 协议支持在对象和资源上定义允许的操作,例如:

  • Read: 获取资源的当前值
  • Write: 设置新值
  • Execute: 调用定义在资源上的函数
  • Observe/Notify: 订阅该资源值的变化,并实时进行通知

优势和主要应用场景

综上可见,LwM2M 协议的主要优势有:

  • 轻量级:基于 CoAP 和 UDP 协议,网络开销小,适合资源受限设备。
  • 远程管理:定义了多种标准化的资源,支持设备升级、资源状态查询、监控等操作。
  • 灵活的资源模型:LwM2M 的资源模型允许灵活地表示设备能力,可根据具体应用定义自定义资源。
  • 安全性:支持 DTLS 安全传输,确保设备数据的安全性。

主要适用的场景有:

  • 智慧城市:管理路灯、交通传感器和环境监测设备。
  • 交通运输:跟踪和管理车队车辆,优化物流,监控车辆健康状况。
  • 工业物联网:在工厂环境中监控和管理机器、传感器和执行器。
  • 智慧农业:远程管理土壤传感器、气象站和灌溉系统。
  • 智能制造:监控和管理机器、传感器和生产线,以提高效率和实现预测性维护。
  • 医疗保健:管理可穿戴健康监测设备和医疗设备。

使用 EMQX 接入 LwM2M 协议

EMQX 是一款大规模分布式 MQTT 消息服务器,功能丰富,专为物联网和实时通信应用而设计。EMQX 除了完整支持 MQTT 协议之外,还可通过网关有效地管理 STOMP、MQTT-SN、CoAP、LwM2M 等非 MQTT 协议的连接、身份验证和消息传输等,并提供统一的用户界面以简化使用。

EMQX 提供了强大的内置 LwM2M 网关功能,能够高效地接入各类 LwM2M 设备。它支持基于 UDP 或 DTLS 的设备连接方式,确保了设备通信的安全性和稳定性。通过 EMQX Dashboard,用户可以轻松地进行设备管理。此外,LwM2M 网关还具备强大的消息转换能力,能够将 LwM2M 消息与 JSON 格式的 MQTT 消息进行相互转换。这一功能不仅实现了设备上行消息的结构化解析,方便用户对设备数据进行进一步的处理和分析,还支持通过 JSON 格式的消息下行操作,实现对设备的灵活控制。这种双向转换机制,使得 EMQX 在物联网设备管理和数据交互方面表现得更加出色,为复杂的物联网应用场景提供了强大的支持。

启用 LwM2M 网关

EMQX 5 及其以上的版本支持通过 EMQX Dashboard 在网页上进行启动 LwM2M 网关。

首先,使用以下命令启动 EMQX 5.8.4,并将端口 1883、18083、5684 映射到宿主机上:

sudo docker run -d --name emqx584 \-p 18083:18083 \-p 1883:1883 \-p 5783:5783/udp emqx/emqx:5.8.4

然后打开 EMQX Dashboard,通过 “Managment“ → “Gateway“ 进入到网关管理页面,选中 ”LwM2M“ 开始配置:

Management → Gateway

所有页面都保持默认配置即可,配置完成后显示以下提示,即表示成功开启 LwM2M 网关:

Gateways

启用 LwM2M 客户端和消息收发

在本示例中,你可以选择手动编译安装 wakaama 以提供 LwM2M 客户端的支持,或使用已经预编译好的 Docker 镜像进行测试。以 Docker 为例:

  1. 先通过 Docker 启动 MQTTX-CLI,用于观察 LwM2M 上线过程:

    sudo docker run -it --rm --network host emqx/mqttx-cli
    
  2. 订阅 up/# 主题以接收 LwM2M 客户端产生的消息:

    mqttx sub --topic up/#
    
  3. 使用 Docker 启动 wakaama 命令行容器:

    sudo docker run --rm -it --network host heeejianbo/my-wakaama:1.0
    
  4. 在容器中,使用以下命令建立一个 LwM2M 客户端连接:

    lwm2mclient -l 57830 -p 5783 -h 127.0.0.1 -4 -n testlwm2mclient
    
  5. 在 mqttx 客户端观察到以下消息,则表示 LwM2M 客户端成功登录到 EMQX 中:

    topic: up/register, qos: 0
    {"msgType":"register","data":{"objectList":["/1","/1/0","/2/0","/3/0","/4/0","/5/0","/6/0","/7/0","/31024","/31024/10","/31024/11","/31024/12"],"lwm2m":"1.1","lt":300,"ep":"testlwm2mclient","b":"U","alternatePath":"/"}}
    topic: up/resp, qos: 0
    {"msgType":"observe","is_auto_observe":true,"data":{"reqPath":"/3/0","content":[{"path":"/3/0","value":"W3siYm4iOiIvMy8wLyIsIm4iOiIwIiwidnMiOiJPcGVuIE1vYmlsZSBBbGxpYW5jZSJ9LHsibiI6IjEiLCJ2cyI6IkxpZ2h0d2VpZ2h0IE0yTSBDbGllbnQifSx7Im4iOiIyIiwidnMiOiIzNDUwMDAxMjMifSx7Im4iOiIzIiwidnMiOiIxLjAifSx7Im4iOiI2LzAiLCJ2IjoxfSx7Im4iOiI2LzEiLCJ2Ijo1fSx7Im4iOiI3LzAiLCJ2IjozODAwfSx7Im4iOiI3LzEiLCJ2Ijo1MDAwfSx7Im4iOiI4LzAiLCJ2IjoxMjV9LHsibiI6IjgvMSIsInYiOjkwMH0seyJuIjoiOSIsInYiOjEwMH0seyJuIjoiMTAiLCJ2IjoxNX0seyJuIjoiMTEvMCIsInYiOjB9LHsibiI6IjEzIiwidiI6MzEwNDg1ODkwM30seyJuIjoiMTQiLCJ2cyI6IiswMTowMCJ9LHsibiI6IjE1IiwidnMiOiJFdXJvcGUvQmVybGluIn0seyJuIjoiMTYiLCJ2cyI6IlUifV0="}],"codeMsg":"content","code":"2.05"}}
    
  6. 再连接一个 MQTTX-CLI 的客户端,用于与 LwM2M 设备交互:

    sudo docker run -it --rm --network host emqx/mqttx-cli
    
  7. 向步骤 3 中创建的 testlwm2mclient 客户端发送一条读指令,读取其设备的固件版本:

    mqttx pub --topic dn/testlwm2mclient -m '{"msgType": "read", "data": {"path": "/3/0/3"}}'
    
  8. 可以观察到步骤1中创建的订阅端接收到了读指令的数据返回,其固件版本为 1.0

    topic: up/resp, qos: 0
    {"msgType":"read","data":{"reqPath":"/3/0/3","content":[{"value":"1.0","path":"/3/0/3"}],"codeMsg":"content","code":"2.05"}}
    

至此,一个简单的 LwM2M 连接和指令收发的示例便完成了。

管理 LwM2M 客户端

在 EMQX 中可以通过 Dashboard 对这三类设备进行管理。例如针对 MQTT,可以在对应网关的 Clients 页面进行查看:

LwM2M Clients

LwM2M Clients

点击该客户端 ID 时,也可查看其详细的信息:

LwM2M Client Info

LwM2M Client Info

总结

LwM2M 协议在资源受限设备的场景中有着广泛的应用,它不仅提供了丰富的互操作语来实现设备之间的互联互通,还提供了丰富的安全机制以确保设备数据的安全性。

EMQX 的 LwM2M 网关提供了简单的用户层接口,实现 LwM2M 协议的接入和设备管理。用户可以方便地将 LwM2M 设备接入到 EMQX 中,实现与 MQTT 协议的互通,进行更完整的设备数据采集、处理和分析。

版权声明: 本文为 EMQ 原创,转载请注明出处。 原文链接:https://www.emqx.com/zh/blog/integrating-lwm2m-with-mqtt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(五级)

青少年软件编程(Python)等级考试试卷(五级) 一、单选题(共25题,共50分) 1.已知x[3,5,7],那么执行语句x[len(x):][1,2]后,x的值?(A) A. [3,5,7,1,2] B. [1,2,3,5,7] C. [3,5,7] D. [1,2] 2.以下…

React 第二十五节 <Fragment></Fragment> 的用途以及使用注意事项详解

文章如果错误偏差&#xff0c;烦请及时批评指正 一、为什么要使用 <Fragment>&#xff1f; 因为在 React 中&#xff0c;组件必须返回单个根元素。当我们尝试直接返回相邻的 JSX 元素时&#xff1a; function BrokenComponent() {return (<h1>标题</h1><…

服务器绑定 127.0.0.1 和 0.0.0.0 的区别

前言 IP 地址实际上并不是分配给计算机的&#xff0c;而是分配给网卡的&#xff0c;因此当计算机上存在多块网卡时&#xff0c;每一块网卡都会有自己的 IP 地址。 绑定 127.0.0.1 是绑定到 lookback 这个虚拟的本地回环接口&#xff0c;该接口只处理本机上的数据&#xff0c;…

deepseek和chatgpt对比

DeepSeek 和 ChatGPT 都是自然语言处理领域的工具&#xff0c;但它们的设计目标和功能有所不同。 功能定位&#xff1a; ChatGPT 是一个基于 OpenAI GPT-3 或 GPT-4 的聊天机器人&#xff0c;旨在进行人机对话、文本生成、问题解答等&#xff0c;广泛应用于教育、客服、创意写作…

【Java 面试 八股文】Redis篇

Redis 1. 什么是缓存穿透&#xff1f;怎么解决&#xff1f;2. 你能介绍一下布隆过滤器吗&#xff1f;3. 什么是缓存击穿&#xff1f;怎么解决&#xff1f;4. 什么是缓存雪崩&#xff1f;怎么解决&#xff1f;5. redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&…

第二天:工具的使用

每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中&#xff0c;对于爬虫有兴趣的伙伴可以订阅专栏一起学习&#xff0c;完全免费。 键盘为桨&#xff0c;代码作帆。这趟为期30天左右的Python爬虫特训即将启航&#xff0c;每日解锁新海域&#xff1a;从Requests库的…

MySQL8.0 innodb Cluster 高可用集群部署(MySQL、MySQL Shell、MySQL Router安装)

简介 MySQL InnoDB集群&#xff08;Cluster&#xff09;提供了一个集成的&#xff0c;本地的&#xff0c;HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议&#xff0c;保障数据一致性&#xff0c;组复制支持单主模式和多主模式。 InnoDB Cluster组件&#xff1a; …

Unity-Mirror网络框架-从入门到精通之LagCompensation示例

文章目录 前言什么是滞后补偿Lag Compensation示例延迟补偿原理ServerCubeClientCubeCapture2DSnapshot3D补充LagCompensation.cs 独立算法滞后补偿器组件注意:算法最小示例前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mir…

初窥强大,AI识别技术实现图像转文字(OCR技术)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据、人工智能领域创作者。目前从事python全栈、爬虫和人工智能等相关工作&#xff0c;主要擅长领域有&#xff1a;python…

不小心删除服务[null]后,git bash出现错误

不小心删除服务[null]后&#xff0c;git bash出现错误&#xff0c;如何解决&#xff1f; 错误描述&#xff1a;打开 git bash、msys2都会出现错误「bash: /dev/null: No such device or address」 问题定位&#xff1a; 1.使用搜索引擎搜索「bash: /dev/null: No such device o…

zsh: command not found: conda

场景描述 在 Linux 服务器上使用 zsh 时&#xff0c;如果出现 zsh: command not found: conda 错误&#xff0c;说明你的系统未正确配置 conda 命令&#xff0c;或者你尚未安装 Anaconda/Miniconda。 解决方案 确保已安装 Anaconda 或 Miniconda conda 是 Anaconda 或 Minico…

github不翻墙就可以访问

目录 简介资料准备windows平台设置下载运行git设置firefox设置 ubuntu平台设置下载启动服务设置系统代理git设置firefox设置证书 注意事项 简介 由于github访问不稳定,严重影响了国内软件开发,在网上搜索并验证了一些方法.现在整理出来一个可以正常使用的方法, 在windows和Lin…

k8s部署logstash

1. 编写logstash.yaml配置文件 --- apiVersion: v1 kind: Service metadata:name: logstash spec:type: ClusterIPclusterIP: Noneports:- name: logstash-tcpport: 5000targetPort: 5000- name: logstash-beatsport: 5044targetPort: 5044- name: logstash-apiport: 9600targ…

【JVM详解一】类加载过程与内存区域划分

一、简介 1.1 概述 JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关…

25考研电子信息复试面试常见核心问题真题汇总,电子信息考研复试没有项目怎么办?电子信息考研复试到底该如何准备?

你是不是在为电子信息考研复试焦虑&#xff1f;害怕被老师问到刁钻问题、担心专业面答不上来&#xff1f;别慌&#xff01;作为复试面试92分逆袭上岸的学姐&#xff0c;今天手把手教你拆解电子信息类复试通关密码&#xff01;看完这篇&#xff0c;让你面试现场直接开大&#xf…

SOA(面向服务架构)全面解析

1. 引言 什么是SOA&#xff08;面向服务架构&#xff09; SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服务架构&#xff09;是一种将应用程序功能以“服务”的形式进行模块化设计的架构风格。这些服务是独立的功能模块&#xff0c;它们通过定义明确的接口…

【leetcode 32】1047. 删除字符串中的所有相邻重复项

Java中的queue、deque、ArrayDeque的区别 使用 Deque 作为堆栈(ArrayDeque是双端队列&#xff0c;当仅使用栈操作时push/pop&#xff0c;就是栈) class Solution {public String removeDuplicates(String s) {//使用 Deque 作为堆栈(ArrayDeque是双端队列&#xff0c;当仅使用栈…

C# COM 组件在.NET 平台上的编程介绍

.NET学习资料 .NET学习资料 .NET学习资料 一、COM 组件简介 COM&#xff08;Component Object Model&#xff09;即组件对象模型&#xff0c;是一种微软提出的软件组件技术&#xff0c;它允许不同的软件模块在二进制层面进行交互。COM 组件可以用多种编程语言开发&#xff0…

【鸿蒙HarmonyOS Next实战开发】mp4parser库-音视频裁剪、合成、取帧等操作

mp4parser 简介 一个读取、写入操作音视频文件编辑的工具。 下载安装 ohpm install ohos/mp4parserOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考如何安装 OpenHarmony ohpm 包 使用说明 视频合成 import {MP4Parser} from "ohos/mp4parser";import {I…

Maven 中常用的 scope 类型及其解析

在 Maven 中&#xff0c;scope 属性用于指定依赖项的可见性及其在构建生命周期中的用途。不同的 scope 类型能够影响依赖项的编译和运行阶段。以下是 Maven 中常用的 scope 类型及其解析&#xff1a; compile&#xff08;默认值&#xff09;&#xff1a; 这是默认的作用域。如果…