当前位置: 首页 > article >正文

使用 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

相关文章:

使用 EMQX 接入 LwM2M 协议设备

LwM2M 协议介绍 LwM2M 是一种轻量级的物联网设备管理协议,由 OMA(Open Mobile Alliance)组织制定。它基于 CoAP (Constrained Application Protocol)协议,专门针对资源受限的物联网设备设计,例…...

【Elasticsearch】bool查询

Elasticsearch 的bool查询是构建复杂查询条件的核心工具之一。它允许通过布尔逻辑组合多个查询子句,以实现精确的搜索需求。bool查询支持四种主要的子句类型:must、should、filter和must_not。每种子句类型都有其特定的作用和行为。 1.bool查询的基本结构…...

Redis 常见面试题汇总(持续更新)

文章目录 01、Redis 支持哪些数据类型?02、谈谈对 Redis 的 AOF 机制的 rewrite 模式的理解?03、请列举几个 Redis 常见性能问题和解决方案04、Redis 使用的最大内存是多少?内存数据淘汰策略有哪些?05、请谈谈 Redis 的同步机制。…...

蓝桥杯备赛 Day13.1走出迷宫

链接:走出迷宫 题目描述 小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。 小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。 障碍物不能通…...

全面解析鸿蒙(HarmonyOS)开发:从入门到实战,构建万物互联新时代

文章目录 引言 一、鸿蒙操作系统概述二、鸿蒙开发环境搭建三、鸿蒙核心开发技术1. **ArkUI框架**2. **分布式能力开发**3. **原子化服务与元服务** 四、实战案例:构建分布式音乐播放器五、鸿蒙开发工具与调试技巧六、鸿蒙生态与未来展望结语 引言 随着万物互联时代…...

使用 mkcert 本地部署启动了 TLS/SSL 加密通讯的 MongoDB 副本集和分片集群

MongoDB 是支持客户端与 MongoDB 服务器之间启用 TLS/SSL 进行加密通讯的, 对于 MongoDB 副本集和分片集群内部的通讯, 也可以开启 TLS/SSL 认证. 本文会使用 mkcert 创建 TLS/SSL 证书, 基于创建的证书, 介绍 MongoDB 副本集、分片集群中启动 TLS/SSL 通讯的方法. 我们将会在…...

P3372 【模板】线段树 1【题解2】

本题题解分两篇 此篇为第贰篇,用树状数组做 第壹篇:P3372 【模板】线段树 1【题解1】 本文讲解树状数组解决区间修改区间查询 其它树状数组相关文章: 树状数组讲解单点修改/查询树状数组解决区间修改单点查询 P3372 【模板】线段树 1 题…...

使用 EDOT 监测由 OpenAI 提供支持的 Python、Node.js 和 Java 应用程序

作者:来自 Elastic Adrian Cole Elastic 很自豪地在我们的 Python、Node.js 和 Java EDOT SDK 中引入了 OpenAI 支持。它们为使用 OpenAI 兼容服务的应用程序添加日志、指标和跟踪,而无需任何代码更改。 介绍 去年,我们宣布了 OpenTelemetry…...

kotlin中expect和actual关键字修饰的函数作用

在 Kotlin 多平台编程中,expect 和 actual 关键字用于定义跨平台的抽象和具体实现。这种机制允许开发者声明一个平台无关的接口或函数签名(使用 expect),然后在每个目标平台上提供具体的实现(使用 actual)。…...

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测 代码下载:CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测 一、引言 1.1、研究背景及意义 随着全球能源危机和环境问题的日益严重,可再…...

mysql8.0使用MGR实现高可用与利用MySQL Router构建读写分离MGR集群

MGR是MySQL Group Replication的缩写,即MySQL组复制。 在以往,我们一般是利用MySQL的主从复制或半同步复制来提供高可用解决方案,但这存在以下几个比较严重的问题: 主从复制间容易发生复制延迟,尤其是在5.6以前的版本…...

保研考研机试攻略:python笔记(4)

🐨🐨🐨15各类查找 🐼🐼二分法 在我们写程序之前,我们要定义好边界,主要是考虑区间边界的闭开问题。 🐶1、左闭右闭 # 左闭右闭 def search(li, target): h = len(li) - 1l = 0#因为都是闭区间,h和l都可以取到并且相等while h >= l:mid = l + (h - l) // 2…...

如何保证缓存和数据库一致性

保证缓存和数据库一致性是分布式系统中的一个常见挑战。以下是几种常用的策略和方法,用于解决缓存与数据库之间的数据一致性问题: 1. 基础同步策略 基础同步策略包括以下几种常见的操作顺序: 先更新缓存再更新数据库:这种方法可能导致缓存中的数据成为脏数据,因为如果数…...

关于conda换镜像源,pip换源

目录 1. 查看当前下载源2. 添加镜像源2.1清华大学开源软件镜像站2.2上海交通大学开源镜像站2.3中国科学技术大学 3.删除镜像源4.删除所有镜像源,恢复默认5.什么是conda-forge6.pip换源 1. 查看当前下载源 conda config --show channels 如果发现多个 可以只保留1个…...

分布式服务框架 如何设计一个更合理的协议

1、概述 前面我们聊了如何设计一款分布式服务框架的问题,并且编码实现了一个简单的分布式服务框架 cheese, 目前 cheese 基本具备分布式服务框架的基本功能。后面我们又引入了缓存机制,以及使用Socket替代了最开始的 RestTemplate。并且还学习了网络相关…...

git客户端版本下载

1. 访问官方网站:您可以在git官方网站(https://git-scm.com)上找到git软件最新稳定版下载链接。 2.如果需要下载其它版本,可访https://github.com/git-for-windows/git/releases选择想要的版本下载。...

前端快速生成接口方法

大家好,我是苏麟,今天聊一下OpenApi。 官网 : umijs/openapi - npm 安装命令 npm i --save-dev umijs/openapi 在根目录(项目目录下)创建文件 openapi.config.js import { generateService } from umijs/openapi// 自…...

mysql 学习12 存储引擎,mysql体系结构

mysql 体系结构 存储引擎简介 存储引擎 就是 存储数据,建立索引,更新/查询 数据等技术的实现方式。 存储引擎 是基于表的,而不是基于库的,所以存储引擎也可以称为 表类型 mysql默认的使用InnoDB 做为存储引擎 查看一下我们之前…...

【Java八股文】02-Java集合面试篇

【Java八股文】02-Java集合面试篇 概念数组与集合区别常用集合Java中的线程安全的集合是什么?Collections和Collection的区别 Listjava中list的几种实现把ArrayList变成线程安全的有哪些方法?CopyOnWriteArrayList是如何保证线程安全的? Mapj…...

稀土抑烟剂——为汽车火灾安全增添防线

一、稀土抑烟剂的基本概念 稀土抑烟剂是一类基于稀土元素(如稀土氧化物和稀土金属化合物)开发的高效阻燃材料。它可以显著提高汽车内饰材料的阻燃性能,减少火灾发生时有毒气体和烟雾的产生。稀土抑烟剂不仅能提升火灾时的安全性,…...

Unity进阶教程AOI算法原理详解

最新课程《全栈双客户端(Unity/Cocos) TurnKey方案》更新了AOI专题,今天分享一下AOI算法的实现原理。 AOI的功能和作用 在MMORPG网路游戏当中,单服同时在线一般都会有几千人。当有个玩家执行一个操作,理想情况下要把玩家的操作广播同步给单…...

Python中的HTTP客户端库:httpx与request | python小知识

Python中的HTTP客户端库:httpx与request | python小知识 在Python中,发送HTTP请求和处理响应是网络编程的基础。requests和httpx是两个常用的HTTP库,它们都提供了简洁易用的API来发送HTTP请求。然而,httpx作为新一代的HTTP客户端…...

ASP.NET Core SignalR的分布式部署

假设聊天室程序被部署在两台服务器上,客户端1、2连接到了服务器A上的ChatRoomHub,客户端3、4连接到服务器B上的ChatRoomHub,那么客户端1发送群聊消息时,只有客户端1、2能够收到,客户端3、4收不到;在客户端3…...

【Elasticsearch】match查询

Elasticsearch 的match查询是全文搜索中最常用和最强大的查询类型之一。它允许用户在指定字段中搜索文本、数字、日期或布尔值,并提供了丰富的功能来控制搜索行为和结果。以下是match查询的详细解析,包括其工作原理、参数配置和使用场景。 1.match查询的…...

AndroidStudio中可用的Ai插件

GitHub Copilot 这是我目前主用的,还行 1. 安装 打开 Android Studio:启动您的 Android Studio。 导航到插件设置: 点击菜单栏中的 File(文件) > Settings(设置)。在设置窗口中&#xff0…...

【C】链表算法题7 -- 环形链表||

leetcode链接https://leetcode.cn/problems/linked-list-cycle-ii/description/ 问题描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到…...

STM32系统架构介绍

STM32系统架构 1. CM3/4系统架构2. CM3/4系统架构-----存储器组织结构2.1 寄存器地址映射(特殊的存储器)2.2 寄存器地址计算2.3 寄存器的封装 3. CM3/4系统架构-----时钟系统 STM32 和 ARM 以及 ARM7是什么关系? ARM 是一个做芯片标准的公司&#xff0c…...

Android Studio:EditText常见4种监听方式

1. 文本变化监听(TextWatcher) TextWatcher 主要用于监听 EditText 里的文本变化,它有三个方法: beforeTextChanged(文本变化前)onTextChanged(文本正在变化时)afterTextChanged&a…...

window patch按块分割矩阵

文章目录 1. excel 示意2. pytorch代码3. window mhsa 1. excel 示意 将一个三维矩阵按照window的大小进行拆分成多块2x2窗口矩阵,具体如下图所示 2. pytorch代码 pytorch源码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_p…...

机器学习(李宏毅)——BERT

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 读这篇文章必须先了解self-attention、Transformer,可参阅我其他文章。 二、大纲 BERT简介self-…...