【基础】LwM2M 通讯协议

LwM2M 协议基础

LwM2M 简介

LwM2M 的全称为 Lightweight Machine-To-Machine,是一种适用于物联网设备的轻量级的通讯协议,由 OMA(Open Mobile Alliance)公司提出并定义。LwM2M 协议适用于资源有限的终端设备。

LwM2M 协议的突出特点如下:

  • 协议基于 REST 框架实现;

  • 协议中消息的传输采用 CoAP 协议实现;

  • 协议定义了紧凑、高效且兼具扩展性的数据模型;

LwM2M 基本架构

LwM2M 协议的基本框架如下图所示:
在这里插入图片描述

协议的架构当中包含两个实体,分别为 LwM2M Server 以及 LwM2M Client:

  • LwM2M Server 为服务器,部署在 LwM2M 服务供应商处或者网络服务供应商处;

  • LwM2M Client 为客户端,部署在各个实际设备上;

除此之外,还可以加入 LwM2M Bootstrap Server(引导服务器)或者 SmartCard(智能卡)以实现对客户端的初始引导(告知客户端服务器的相关信息)。

LwM2M 协议在各个实体之间规定了 4 个接口来实现响应的功能:

  • Bootstrap(引导接口):引导接口的目的是向 LwM2M 客户端提供注册到 LwM2M 服务器的必要信息,如服务器的访问信息、客户端支持的资源信息等。这些信息可以由设备厂商预先存储在设备中,也可以通过引导服务器或者智能卡写入设备;

  • Client Registration(客户端注册接口):注册接口的目的是将 LwM2M 客户端与 LwM2M 进行互联,将 LwM2M 客户端的相关信息存储在 LwM2M 服务器上。只有完成了客户端的注册,LwM2M 才能实现与服务端之间的通信;

  • Device Management and Service Enablement(设备管理与服务实现接口):设备管理与服务实现接口的主控方为 LwM2M 服务器,其可以向客户端发送指定,由客户端对指令进行响应并将响应消息发送给服务器;

  • Information Reporting(信息上报接口):信息上报接口允许 LwM2M 服务器向客户端订阅资源信息,客户端接收到订阅消息后,按照约定的模式向服务器报告自身资源的变化情况,即观察者模式;

LwM2M 资源定义

LwM2M 协议的服务对象为资源有限的终端设备,因此选择支持 REST 架构的 CoAP 来实现消息的传递。(CoAP 协议的相关内容可以参看:【基础】CoAP 通讯协议-CSDN博客)。

为进一步节省数据传输的开销,协议的数据结构也必须足够简单。LwM2M 协议定义了以资源为基本单位的模型,所有的数据都存储在资源当中。数据的体系架构为“对象-实例-资源”三级架构,对应到 Java 中可以理解为“类-实例化对象-对象属性”。

LwM2M 协议预定义了 8 种对象(Object)来满足基本的需求,如下表所示:

Object 对象Object ID
Security(安全对象)0
Server(服务器对象)1
Access Control(访问控制对象)2
Device(设备对象)3
Connectivity Monitoring(连通性监控对象)4
Firmware(固件对象)5
Location(位置对象)6
Connectivity Statistic(连通性统计对象)7

考虑到扩展性,协议也允许用户根据实际需要自定义更多对象,对象的定义与资源代号可以参考 Lwm2m-registry

在这样的数据模型中,资源、实例以及对象都是用数字对应的ID来表示的,以实现最大程度的压缩,因此任何资源都可以用最多 3 级的简洁方式表示,例如/1/0/1表示服务器对象(Server Object)第1个实例中的服务器短 ID 资源。 在注册阶段,LwM2M 客户端把携带了资源信息的对象实例传递给 LwM2M 服务器,以通知服务器自身设备所具备的能力。

LwM2M 协议实现

开源协议实现

LwM2M协议的主要开源实现有以下几个:

  • OMA LwM2M DevKit:提供可视化界面与 LwM2M 服务器交互;
  • Eclipse Leshan:基于 Java,提供了 LwM2M 服务器与 LwM2M 客户端的实现;
  • Eclipse Wakaama:基于 C,提供了LwM2M 服务器与 LwM2M 客户端的实现;
  • AVSystem Anjay:基于 C,提供了 LwM2M 客户端的实现;

Java LwM2M Client

LwM2M 客户端的代码基于 Eclipse Leshan 库编写(Github 地址)。

下述代码创建了 LwM2M Client 并连接到 Leshan 提供的公共服务器。

public class MyClientDemo {

    private static final int OBJECT_ID_TEMPERATURE_SENSOR = 3303;

    public static void main(String[] args) {
//        String url = "coap://localhost:5685";
        String url = "coap://leshan.eclipseprojects.io:5683";
        String endpoint = "lwM2M-test-client";
        LeshanClientBuilder builder = new LeshanClientBuilder(endpoint);

        List<ObjectModel> models = ObjectLoader.loadAllDefault();
        String[] modelsPath = new String[] {"3303.xml"};
        try {
            models.addAll(ObjectLoader.loadDdfResources("/models", modelsPath));
        } catch (IOException | InvalidModelException | InvalidDDFFileException e) {
            e.printStackTrace();
        }

        ObjectsInitializer initializer = new ObjectsInitializer(new StaticModel(models));
        initializer.setInstancesForObject(LwM2mId.SECURITY, Security.noSec(url, 123));
        initializer.setInstancesForObject(LwM2mId.SERVER, new Server(123, 300, EnumSet.of(BindingMode.U), false, BindingMode.U));
        initializer.setInstancesForObject(LwM2mId.DEVICE, new Device("LwM2M-Client", "model Y", "88.163", EnumSet.of(BindingMode.U)));
        initializer.setInstancesForObject(LwM2mId.LOCATION, new MyLocation());
        initializer.setInstancesForObject(OBJECT_ID_TEMPERATURE_SENSOR, new RandomTemperatureSensor());

        builder.setObjects(initializer.createAll());
        builder.setEndpointsProviders(new JavaCoapClientEndpointsProvider());

        LeshanClient client = builder.build();
        client.start();
    }

}

启动程序后,访问https://leshan.eclipseprojects.io/#/clients即可看到自己编写的客户端,点击相应的客户端名称即可查看客户端的数据,如下所示:
在这里插入图片描述

  • 28
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值