NBIOT+MQTT接入ONE NET云平台

 

前言:MQTT是一种基于TCP的物联网通信协议,在物联网领域应用非常广泛,基本上所有的云平台都支持设备以MQTT协议接入,所以如果您的设备支持MQTT连接,就可以很容易的对接各云平台(比如ONE NET、阿里云、腾讯云等)。CORE提供的MQTT库函数也十分简单,您只需根据各云平台的规则,在调用MQTT库函数时对传入的参数做相应的调整即可对接各家云平台。

MQTT协议文档下载

 

下面将按如下步骤介绍云平台的接入:

 

 

一、本例程实现功能介绍

CORE向云端(ONE NET)上传温湿度数据,同时也接受云端下发的命令数据来控制CORE电路板上LED2灯的亮灭。

 

二、云平台操作流程

STEP 1: 注册并登录平台账号

在ONE NET云平台官网(https://open.iot.10086.cn)注册并登录开发者账号 注册账号方法: https://open.iot.10086.cn/doc/easy-manual/

 

STEP 2: 创建产品

产品相当于一个集合,该集合下面可以有成千上万的相同功能的设备。

产品创建方法: https://open.iot.10086.cn/doc/mqtt/book/get-start/product&device/createProduct.html

下图是我创建的产品的概况:

chanpin_detail

产品名称为: “mqtt_test”

产品ID:“353255”,该值在后面的代码解析中会提到,是设备和云端建立连接时的必要参数

access_key:该值这里我们用不到,但您以后开发客户端和云平台对接时就必须要了

 

STEP 3: 创建设备

设备相当于一个具体的硬件实物。

设备创建方法: https://open.iot.10086.cn/doc/mqtt/book/get-start/product&device/createDevice.html

注意:设备名称必须唯一,设备名称中可以包含产品的SN码,MAC地址,唯一ID等等来保证唯一性。

下图是我创建的设备的详情:

device_detail

设备名称为: “TestDevice001”,该值在后面的代码解析中会提到,是设备和云端建立连接时的必要参数

设备key为: HNC7fq0yREOYs3uQoWREmZJjbwW8kiT6mxsDoh/dyW4= ,该值在后面的代码解析中会提到,是设备和云端建立连接时的必要参数

 

STEP 4: 完成

至此,我们已完成产品的创建,并在产品中创建了一例设备,在接下来的示例代码中,我们会用到已创建的产品和设备中的一些关键参数。

 

三、硬件接线图、材料清单

m5311_sht30

 

 

名称推荐购买链接(或者您可以自己制作)模块/芯片硬件资料下载
M5311模块购买链接(模块型号:M5311M11全网通版,不带mcu,附带棒状天线,根据您的实际需求来选择相应的物联网卡)下载地址
SHT30/31温湿度传感器模块购买地址下载地址

声明:这里推荐的购买链接仅供参考,您完全可以去其他商家或渠道购买,只要功能相似即可,如果需要更低的成本建议自己开发硬件模块或定制。

product2

product1

 

四、完整代码&代码解析

(1)完整代码

代码功能:CORE每隔5秒向云端(ONE NET)上传温湿度数据,同时也接受云端下发的数据来控制CORE电路板上LED2灯的亮灭。

如果感兴趣,上面代码中出现的LIB开头的库函数可以在API文档中通过Ctrl+F查询。

 

(2)代码关键部分解析

PART 1(云平台地址)

server_addr和server_port是中国移动物联网(ONE NET)MQTT服务的固定IP地址和端口号,请不要改动它。

PART 2(MQTT连接参数)

mqtt_con_clientID、mqtt_con_username、mqtt_con_password 这三个参数是设备和服务端建立mqtt连接时所必须的三个参数,如果你曾接入过多个物联网云平台,你会发现它们的异同往往都在这三个参数上。这里我们介绍ONE NET云平台下关于这三个参数的定义规则:

① mqtt_con_clientID: 设备和服务端建立mqtt连接时,clientID用来标识设备的唯一性,我这里我们使用的是设备名称“TestDevice001”,设备名称应具有唯一性,比如可以用您定义的SN序列号等,这里是我在创建该设备时起的名字"TestDevice001"。

mqtt_clientID

② mqtt_con_username:设备和服务端建立mqtt连接时,username用来认证连接的用户名,该值为产品ID

mqtt_usrname

 

③ mqtt_con_password:设备和服务端建立mqtt连接时,password用来认证连接的密码。该密码的计算途径有两种:一种是通过电脑生成,一种是通过代码生成(python)。关于计算原理,请参考此处。当然您也可以不用花精力去看这些,直接看接下来的例子即可。这里的例子我们仅介绍通过电脑软件的生成方法,软件下载地址

下图为我使用token.exe电脑软件生成password的方法:

token_gen

下面介绍各个参数的来源,products、devices、md5这三个词汇固定不变

  1. 上图中的“353255”即是我们在创建产品时云平台自动赋予的产品ID。
  2. 上图中的“TestDevice001”即是我们在前面创建设备时我们给设备起的具有唯一性的设备名称。
  3. 上图中的“1893427200”表示将要生成的password的有效期,Unix时间戳,有效期截至为2030/1/1 0:0:0。
  4. 上图中的“HNC7fq0yREOYs3uQoWREmZJjbwW8kiT6mxsDoh/dyW4=”即是我们在前面创建设备时云平台自动赋予设备的设备key。
  5. 上图中的“version=2018-10-31&res=products%2F353255%2Fdevices%2FTestDevice001&et=1893427200&method=md5&sign=%2F5RJwGwytPWvVDB04K7rnw%3D%3D” 即是生成结果(设备和服务端建立连接所需要的password)。

 

PART 3(MQTT订阅、发布)

订阅和发布路径:

mqtt_sub_topic是用来给设备订阅服务器的命令消息(比如控制LED等) mqtt_pub_topic是用来给设备向服务器发布消息(比如温湿度)

这两个字符串的中包含的”353255“和“TestDevice001”分别是产品ID和设备名称,其他部分保持固定不变即可

注意:这两个路径的结构由ONE NET云平台定义,其结构不可随意更改,如果感兴趣可以参考此处,设备命令Topic簇数据点Topic簇

 

回复云平台下发的命令:

ONE NET平台中的关于设备如何应答平台下发的cmd命令的格式已做了定义,可以参考设备命令Topic簇

下面举个例子来说明: 如果服务器下发cmd的topic为:$sys/353255/TestDevice001/cmd/request/33ffea0a-e5f1-49d6-a626-ffee1bbd93ef 那么我们应答的topic应该为:$sys/353255/TestDevice001/cmd/response/33ffea0a-e5f1-49d6-a626-ffee1bbd93ef

云平台会自动为每条下发的cmd分配一个cmd id, 例子中的33ffea0a-e5f1-49d6-a626-ffee1bbd93ef即为cmdid。

 

定时向云平台发布本地温湿度数

 

PART 4(其他)

其他部分代码已有详细注释,这里就不赘述了。

 

五、代码实验现象

STEP 1: 硬件准备工作

按照上面的接线方式将CORE和M5311 NB-IOT模块、SHT30温湿度传感器连接就位,然后将上面的完整代码拷贝入Core的TF卡中的main.lua文件,完成Core的代码更新。

 

STEP 2: 在开发者控制台中找到设备

从ONE NET开发者控制台界面中进入对应的产品 ,然后在产品界面中鼠标点击进入“设备列表” 后可以看到我们刚刚创建的一个设备硬件实例“TestDevice001”,如下图:

result0

 

result1

 

STEP 3 查看设备的温湿度数据:

Ⅰ 鼠标点击对应的设备的“数据流”中-->

Ⅱ 然后可以看到设备通过Json文本上传给服务器的两个数据流:"temprature"和“humidity” -->

Ⅲ 然后我们以"temprature"为例,鼠标点击进入,可以看到tempature的温度数据的历史数据和实时数据动态

result2

 

result3

result7

 

STEP 4 从云平台下发cmd指令控制CORE上的LED2灯的亮灭:

Ⅰ 鼠标点击进入在对应的设备的“更多操作”中的“下发命令” -->

Ⅱ 然后在弹出的界面中的命令内容中输入“{"LED":2}”,超时时间5秒,返回结果中选择String格式

Ⅲ 最后点击发送,待设备成功收到命令并返回正确的应答后(应答消息中包含“Got it”),我们就可以看到Core电路板上的LED2灯珠由亮变灭或者由灭变亮了。

result5

result6

result7