透传模式接入可以看

LWM2M协议简介

  LwM2M(lightweight Machine to Machine),是由OMA(open Mobile Alliance)定义的物联网协议, 主要使用在资源受限(包括存储、 功耗等)的NB终端。

  协议特点:

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_Json


  LWM2M 把设备上的服务抽象为 Object 和 Resource, 并在 XML 文件中定义各种 Object 的属性和功能。

  LWM2M Objects: 每个对象对应客户端的某个特定功能实体。 LWM2M 规范定义了标准Objects, 比如urn:oma:lwm2m:oma:1; (LWM2M Server Object)、 urn:oma:lwm2m:oma:3; (Device Object), 每个object下可以有很多resource。 比如Device Object可以有Manufacturer, Model Number等resource。

  LWM2M Protocol定义了一些逻辑操作, 比如Read、 Write、 Execute等。

  CoAP是IETF定义的Constrained Application Protocol, 用来做LWM2M的传输层, 下层可以是UDP或者SMS, UDP是必须支持的, SMS可选。

  DTLS用来保证客户端和服务器间的安全性。

  支持IMEI认证和SM9认证两种设备认证方式。

AEP平台操作

进入AEP官网,完成注册 https://www.ctwing.cn/

进入“AEP控制台”

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_非透传_02

选择“设备接入”

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_非透传_03

选择“LWM2M”协议

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_BC26_04

创建产品

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_Json_05


  创建成功后,在产品中心中出现一个产品

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_非透传_06


在详情中可以看到很多信息

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_LWM2M_07


拖到最下面把服务器IP和端口号记好,后面模组接入要用

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_非透传_08

添加设备

  往刚才创建的产品中添加新的设备。一个产品中可以有很多个设备。比如一个智能家居产品,可以包含扫地机器人设备、烟感设备等。

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_电信AEP平台_09


  设备名称自定义即可,填写NB模组的IMEI,保持默认开启自动订阅。

  IMEI长度为8-17个字节, 它是设备的唯一标识, 平台不允许重复添加

  选择自动订阅, 平台会针对设备支持的Object自动发起Observe流程, 否则需要手动发起Observe流程。

电信AEP平台接受的数据格式

  经过上面的步骤,在平台上建立起了模组对应IMEI号的设备。接下来就需要模组给平台上的该设备上传或下载数据了。首先看下平台接受的数据格式。

  Object 19 ( LwM2M APPDATA) 可以用于应用层业务数据的封装, 实现包括业务数据上报、 业务指令下发、 终端事件上报等功能。
  目前平台仅支持Data字段, 其他字段暂时不支持, 即:

  • 消息上行通过/19/0/0传送
  • 消息下行通过/19/1/0传送

  对于Data字段, 平台既支持数据透传也支持数据解析( 非透传) 。对于非透传设备, 数据格式支持紧凑二进制和Json两种格式。

一、 非透传设备

  非透传设备上报的业务数据, 平台需要对业务数据进行解析, 因此数据格式必须遵守平台关于Object19的约定, 目前Object19支持紧凑二进制和Json两种数据格式。

1、 紧凑二进制格式

  业务数据上报、 事件上报、 无线参数上报的Data字段编码格式:

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_BC26_10

  • CMDType: 必填字段, 1Byte, 数据上报-0x02; 事件上报-0x07; 无线参数上报-0x03;
  • ServiceID: 必填字段, 2Bytes, 填写平台分配的服务ID
  • Payload_length: 必填字段, 2Bytes, 根据payload长度填写
  • Payload: 类型为Binary, Parameter1、 Parameter2等需要按照对应服务的属性列表的顺序填写, Parameter的类型要与属性类型一致。

  业务指令下发、 指令下发响应的Data字段编码格式:

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_BC26_11

  • CMDType: 必填字段, 1Byte, 下行指令固定为0x06, 指令响应固定为0x86
  • ServiceID: 必填字段, 2Bytes, 填写平台分配的服务ID
  • TaskID: 必填字段, 2Bytes, 由平台分配, 用于关联下发指令和回复响应, 指令和响应中的TaskID必须一致
  • Payload_length: 必填字段, 2Bytes, Payload的长度
  • Payload: 类型为Binary, 按照服务定义的属性( 或参数) 进行编码和解码

示例1、 设备上报两个属性

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_Json_12


服务ID: 1, 属性1: 5个字节的定长字符串“hello”, 属性2: 2个字节的整型, 值为100。 首先需要将属性值转换为十六进制, 字符串“hello”转换

为十六进制为: 0x68656C6C6F(参照ASCII码表转换) , 100的十六进制为0x0064。 编码过程为:

CMDType: 0x02

ServiceID: 0x0001

Payload_length: 0x0007

Payload: 0x68656C6C6F0064

因此19/0/0的Data字段应填: 020001000768656C6C6F0064示例2、 设备上报的属性为变长字符串

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_BC26_13


服务ID: 2, 属性: 变长字符串, 长度为5个字节, 值为: “hello”。 变长字符串在编码时需要携带2个字节的长度, 即属性1编码后的数据是

0x000568656C6C6F。 编码过程为:

CMDType: 0x02

ServiceID: 0x0002

Payload_length: 0x0007

Payload: 0x000568656C6C6F

因此19/0/0的Data字段应填: 0200020007000568656C6C6F示例3、 指令下发和响应

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_Json_14


下发的指令服务ID: 8001(0x1F41), TaskID: 1, 参数为1个字节整形: 1-获取当前时间, 0-时钟同步。编码过程为:

CMDType: 0x06

ServiceID: 0x1F41

TaskID: 0x0001

Payload_length: 0x0001

Payload: 01

19/1/0的Data字段为十六进制: 061F410001000101, 解析出指令内容为“获取当前时间”, 设备需要将系统时间通过响应发给平台。

指令响应的服务ID: 9001(0x2329), TaskID: 1, 参数为12字节的定长字符串“201812251300”, 编码过程为:
CMDType: 0x86
ServiceID: 0x2329
TaskID: 0x0001
Payload_length: 0x000C
Payload: 0x323031383132323531333030
指令响应19/0/0的Data字段应填: 8623290001000C323031383132323531333030

2、 JSON格式

  业务数据上报、 事件上报、 无线参数上报的Data部分应满足以下格式:
{“serviceId”: XXXX, parameter1:value1, parameter2:value2}
  “serviceId”的值为对应服务的服务ID, parameter1、 parameter2对应服务中每个属性, 用属性标识进行替换, value1、 value2对应属性值, 按照定义的属性类型填写。

  业务指令下发、 指令下发响应的Data部分应满足以下格式:
{“serviceId”:XXXX, “taskId”:XXXX, parameter:value}
  “serviceId”的值为对应服务的服务ID, "taskId"由平台分配, 用于关联下发指令和回复的响应。 parameter和value按照服务定义的属性来填写。

示例

定义如下物模型:

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_电信AEP平台_15


libxml2 xmlDocDumpFormatMemory 未能将doc格式化_BC26_16


数据上报Data部分数据为

{“serviceId”: 1, “temperature”:36.5, “humidity”:20.5}

指令下发Data部分数据为
{“serviceId”:8001, “taskId”:2, “temperature”:30.5}

指令下发响应Data部分数据为
{“serviceId”:9001, “taskId”:2, “temperature”:30.5}

二、 透传设备

  平台对19/0/0、 19/1/0的Data字段不进行解析, 支持任意格式的业务数据的透传。

模组侧操作

  从上面可以知道要把数据以非透传的方式上传给平台需要满足平台的数据格式要求,否则会被平台拒收。
  目前非透传方式支持紧凑二进制和Json两种数据格式。本文介绍下Json的数据格式。

1、AT

AT
OK

查看返回OK,模组通信正常

2、AT+CGPADDR=1

AT+CGPADDR=1
+CGPADDR: 1,56.3.104.7

OK

检查NB模组的IP地址。

3、AT+QLWCLOSE

AT+QLWCLOSE
OK

CLOSE OK

关闭上次的连接。只有建立连接了才能关闭,才会回复OK。如果回复error,不用管,说明没有建立连接。

4、AT+QLWDEL

AT+QLWDEL
OK

删除上次的LWM2M的连接。回复error,说明模组内没有保存上次连接的设置,不管即可。

5、AT+QLWSERV=“221.229.214.202”,5683

AT+QLWSERV="221.229.214.202",5683
OK

设置电信AEP的IP地址和端口号,在产品详情中去看

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_非透传_08

6、AT+QLWCONF=“866971030565266”

AT+QLWCONF="866971030565266"

OK

设置接口LWM2M的NB模组的IMEI号

其中IMEI号可以通过指令 AT+CGSN=1 从模组中获取。

7、AT+QLWADDOBJ=19,0,1,“0”

AT+QLWADDOBJ=19,0,1,"0"
OK

添加 LWM2M对象, 19/0/0 上行链路

8、AT+QLWADDOBJ=19,1,1,“0”

AT+QLWADDOBJ=19,1,1,"0"
OK

添加 LWM2M 对象,19/0/1 下行链路

9、AT+QLWOPEN=0

AT+QLWOPEN=0
OK

CONNECT OK

+QLWOBSERVE: 0,19,0,0

开始注册IoT平台,并使用直接推送模式

10、AT+QLWCFG=“dataformat”,0,0

AT+QLWCFG="dataformat",0,0
OK

设置发送和接收的数据为文本字符串格式。

11、AT+QLWDATASEND=19,0,0,50,{“serviceId”:1,“temperature”:36.1,“humidity”:30.5},0x0000

AT+QLWDATASEND=19,0,0,50,{"serviceId":1,"temperature":36.1,"humidity":30.5},0x0000
OK

  使用NON模式上报数据,此模式不需要IoT平台应答。

  业务数据上报、 事件上报、 无线参数上报的Data部分应满足以下格式:{“serviceId”: XXXX, parameter1:value1, parameter2:value2}   serviceId和对应serviceId的parameter1parameter2可以在如下页面看到:

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_LWM2M_18


  服务ID即是serviceId,点击参数列表下面的图标就可以看到此serviceId下的parameter1parameter2,比如:

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_非透传_19


  因此按照Json的格式,就可以得到:{"serviceId":1,"temperature":36.1,"humidity":30.5,"illuminance":10}

  serviceId下的parameter可以用完,也可以只用1个或2个,可以少但是不能多,不然平台认为格式不正确,拒收。

  此时可以在AEP平台上去看接收的数据。

  先查下设备的ID,并复制

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_BC26_20

粘贴到搜索框中,点搜索,即可查询到接收到的数据。

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_Json_21


可以看到电信AEP平台接收到的数据与NB模组发送的数据一致。再通过电信AEP平台下发一条指令,先查下哪些serviceId的服务类型是指令下发的:

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_电信AEP平台_22


这里先来补充说下常见的4种服务类型

  1. 指令下发:利用物联网平台给设备发送命令消息, 实现对传感器的实时控制
  2. 指令下发响应:终端设备收到命令数据后执行命令, 可以生成响应。 物联网平台能通过指令下发响应服务识别该响应
  3. 数据上报:使用者利用物联网平台, 将大量的终端设备连接到网络中, 对终端传感器采集到的数据进行数据格式定义, 并保存至物联网平台
  4. 事件上报:事件上报功能为您提供上报自定义事件, 方便您将业务产生的异常事件采集上报到云端

我们这里就使用serviceId为8004的来下发,控制设备的灌溉流量。

libxml2 xmlDocDumpFormatMemory 未能将doc格式化_非透传_23


libxml2 xmlDocDumpFormatMemory 未能将doc格式化_BC26_24

  因为模组处于PSM状态,不是与基站时刻连接的,因此平台下发数据NB模组不会立马收到,而是等NB模组再次与服务端连接时才会收到。我们使用AT+QLWUPDATE 向电信 IoT 平台发送一次更新请求。

AT+QLWUPDATE
OK

UPDATE OK

+QLWDATARECV: 19,1,0,47,{"total_flow":20.3,"taskId":1,"serviceId":8004}

可以看到NB模组收到了服务端下发的Json格式的数据。

12、AT+QLWCLOSE

AT+QLWCLOSE
OK

CLOSE OK

取消电信AEP的LWM2M注册

13、AT+QLWDEL

AT+QLWDEL
OK

删除LWM2M的连接

完整的AT流程

AT
OK
AT+CGPADDR=1
+CGPADDR: 1,56.70.128.189

OK
AT+QLWCLOSE
ERROR
AT+QLWDEL
ERROR
AT+QLWSERV="221.229.214.202",5683
OK
AT+QLWCONF="866971030565266"
OK
AT+QLWADDOBJ=19,0,1,"0"
OK
AT+QLWADDOBJ=19,1,1,"0"
OK
AT+QLWOPEN=0
OK

CONNECT OK

+QLWOBSERVE: 0,19,0,0
AT+QLWCFG="dataformat",0,0

OK
AT+QLWDATASEND=19,0,0,50,{"serviceId":1,"temperature":36.1,"humidity":30.5},0x0000
OK
AT+QLWUPDATE
OK

UPDATE OK

+QLWDATARECV: 19,1,0,47,{"total_flow":20.3,"taskId":1,"serviceId":8004}
AT+QLWCLOSE
OK

CLOSE OK
AT+QLWDEL
OK