前言:MQTT是一种基于TCP的物联网通信协议,在物联网领域应用非常广泛,基本上所有的云平台都支持设备以MQTT协议接入,所以如果您的设备支持MQTT连接,就可以很容易的对接各云平台(比如ONE NET、阿里云、腾讯云等)。CORE提供的MQTT库函数也十分简单,您只需根据各云平台的规则,在调用MQTT库函数时对传入的参数做相应的调整即可对接各家云平台。
MQTT协议文档下载(提取码:yngb)。
实现了4G模块通过MQTT协议接入OneNet(中移物联网)云平台。开发者可以参考本实例,针对各种云平台(阿里云、腾讯云,百度云等)只需调整代码中的参数即可实现对接。
使用Ubeeto开发板提供的基于ML302 4G 模块的库函数能够很容易的将开发板对接入云平台,涉及的库函数只有如下三个:
LIB_Cat1MqttML302Config() --初始化Mqtt通信 LIB_Cat1MqttML302RecvSub() --接收服务端(broker)下发的信息 LIB_Cat1MqttML302SendPub() --向服务端(broker)发送信息
注意:ML302其他没到的引脚可以不用接。
实际接线图如下:
如果开发者不需要GPS定位功能,可不接GPS天线
名称 | 推荐购买链接(或者您可以自己制作) | 模块/芯片硬件资料下载 |
---|---|---|
ML302模块 | 购买链接(模块型号:ML302-G全网通版,如果不需GPS功能可以不带G,并按照实际需求购买合适的中国移动物联网sim套餐卡,另外根据需求购买4G和GPS天线) | 下载地址(提取码:y8dv) |
声明:这里推荐的购买链接仅供参考,您完全可以去其他商家或渠道购买,只要功能相似即可,如果需要更低的成本建议自己开发硬件模块或定制。
本例程实现了通过MQTT协议向OneNet云平台发送实时温度和湿度数据,接收并解析OneNet云平台下发的json格式指令控制Core电路板上的LED2灯的亮灭。
--MQTT服务器地址(适用于ONE NET平台) server_addr = "mqtts.heclouds.com" --中移物联网MQTT接入服务域名/ip地址 server_port = 1883 --MQTT 连接参数(适用于ONE NET平台) mqtt_con_clientID = "TestDevice002" mqtt_con_username = "353255" mqtt_con_password = "version=2018-10-31&res=products%2F353255%2Fdevices%2FTestDevice002&et=1893427200&method=md5&sign=VNzqoi1o%2BSaqUOogFzUb6Q%3D%3D" --MQTT topic相关参数(适用于ONE NET平台) mqtt_sub_topic = "$sys/353255/TestDevice002/cmd/request/+"--订阅用 mqtt_pub_topic = "$sys/353255/TestDevice002/dp/post/json" --发布用 --设置m5311 NB模块占用TX0、RX0、D5、D6引脚,MQTT模式,KeepAlive周期180秒,不开启GPS功能 LIB_Cat1MqttML302Config("UART0","D5","HIGH","D6","HIGH",server_addr,server_port,mqtt_con_clientID,mqtt_con_username,mqtt_con_password,180,mqtt_sub_topic,"QOS0","NO_GPS") --配置D9为普通输出,控制LED2 LIB_GpioOutputConfig("D9","STANDARD") --使能系统10毫秒定时器开始工作 LIB_10msTimerConfig("ENABLE") --变量初始化 cnt_10ms = 0--作为计时器用 cnt1_10ms = 0--作为计时器用 pub_id = 0 temprature = 0.00--用该变量模拟温度数据 humidity = 0.00--用该变量模拟湿度数据 --定义10ms中断回调函数 function LIB_10msTimerCallback() cnt_10ms = cnt_10ms + 1 cnt1_10ms = cnt1_10ms + 1 temprature = temprature + 0.1--模拟温度动态变化 if temprature >= 60 then temprature = 0 end humidity = humidity + 0.2--模拟湿度动态变化 if humidity >= 100 then humidity = 0 end end --开始大循环 while(GC(1) == true) do --查询是否收到服务器下发的cmd数据(已订阅的"$sys/353255/TestDevice002/cmd/request/+") recv_flag,topic,data = LIB_Cat1MqttML302RecvSub() if recv_flag == 1 then --根据json路径"$.LED"解析服务器下发的json文本,并执行LED亮灭操作 Json_Val = LIB_JsonParse(data, "$.LED") --服务器下发的是"{"LED":0}" if Json_Val == "0" then LIB_GpioWrite("D9",1) --LED2灭 --服务器下发的是"{"LED":1}" elseif Json_Val == "1" then LIB_GpioWrite("D9",0) --LED2亮 --服务器下发的是"{"LED":2}" elseif Json_Val == "2" then LIB_GpioToggle("D9") --LED2亮灭切换 else LIB_GpioWrite("D9",1) --LED2灭 end --根据收到的topic中的cmdid应答服务器, --将收到的topic中"request"替换成"response"后作为应答topic发给服务器 topic = string.gsub(topic,"request","response") --应答服务器的内容可自定义,这里为"Got it!" LIB_Cat1MqttML302SendPub("QOS0", topic, "Got it!") end --每5秒发送温湿度度数据给server if cnt_10ms >= 500 then cnt_10ms = 0 pub_id = pub_id + 1 --以下请不要看花眼了,这也是按照ML302模组的要求来做的(双引号前面要加转义符号),实际发送字符串例子如下: --"{\"id\":44, \"dp\":{\"temperatrue\":[{\"v\": 36.40,}], \"humidity\":[{\"v\":91.40,}]}}" json_str = string.format("{\\\"id\\\":%d, \\\"dp\\\":{\\\"temperatrue\\\":[{\\\"v\\\": %.2f,}], \\\"humidity\\\":[{\\\"v\\\":%.2f,}]}}", pub_id, temprature, humidity) --注意json_str的总长度不要超过150字节 LIB_Cat1MqttML302SendPub("QOS0", mqtt_pub_topic, json_str) --publish end --每12秒打印一次4G模组信息(包含sim卡) --注意:这里只是为了演示如何获取模组信息,实际应用中您可以根据您的需求查询即可,不需要一直查询 if cnt1_10ms >= 1200 then --12000ms cnt1_10ms = 0 State,IMSI,ICCID,CSQ = LIB_Cat1StatusQuery() print(string.format("module State: %s", State)) print(string.format("module IMSI: %s", IMSI)) print(string.format("module ICCID: %s", ICCID)) print(string.format("module CSQ: %d ", CSQ)) end end
如果感兴趣,上面代码中出现的LIB开头的库函数可以在API文档中通过Ctrl+F查询。
之前用过M5311 NB-IOT模块的同学会发现它和ML302 4G模块的库函数非常相似:
初始化MQTT配置 | 接收 | 发送 | |
---|---|---|---|
M5311 NB-IOT模块 | LIB_NbMqttM5311Config | LIB_Cat1MqttML302RecvSub | LIB_Cat1MqttML302SendPub |
ML302 4G模块 | LIB_Cat1MqttML302Config | LIB_NbMqttM5311RecvSub | LIB_NbMqttM5311SendPub |
它们的库函数不仅相似,用法也几乎一摸一样(除了LIB_Cat1MqttML302Config函数多了一个GPS配置),对于接入云平台的方法更是一模一样,所以这里我们直接参考网站上的《NBIOT+MQTT接入OneNet物联网平台》教程就可以接入OneNet了。
同样针对其他云平台(阿里云、腾讯云,百度云等)的用法,调整代码中下面的参数,即可接入
--MQTT服务器地址(适用于ONE NET平台) server_addr = "mqtts.heclouds.com" --中移物联网MQTT接入服务ip地址 server_port = 1883 --MQTT 连接参数(适用于ONE NET平台) mqtt_con_clientID = "TestDevice002" mqtt_con_username = "353255" mqtt_con_password = "version=2018-10-31&res=products%2F353255%2Fdevices%2FTestDevice002&et=1893427200&method=md5&sign=VNzqoi1o%2BSaqUOogFzUb6Q%3D%3D" --MQTT topic相关参数(适用于ONE NET平台) mqtt_sub_topic = "$sys/353255/TestDevice002/cmd/request/+"--订阅用 mqtt_pub_topic = "$sys/353255/TestDevice002/dp/post/json" --发布用
小tips:
从上面可以看出,我们可以很容易实现NB+4G同时工作的双网模式,只需给每个模块配置不同UART和GPIO即可。
简单、快捷、高效、强大的物联网开发板
© 2022. All Rights Reserved. 粤ICP备2021058065号