跳到主要内容

WiFi+MQTT接入OneNet云平台

一、本例程实现功能介绍

C2 DevKit 开发板向云端(中国移动 OneNet 云平台)上传温湿度数据,同时也接受云端下发的命令数据来控制开发板板上LED灯的亮灭。

二、云平台操作流程

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

https://open.iot.10086.cn

STEP 2: 创建产品

2.1 进入产品服务中的MQTT物联网套件立即使用

2.2 选择添加产品

​ 输入相关产品信息(根据自身情况随意添加),联网方式选择wifi,设备接入协议选择MQTTS,操作系统选择无即可! 随即我们就有了自己的产品,其中产品ID我们会使用!

2.3 添加设备

​ 点击进入相应产品,选择设备列表!然后选择添加设备,输入相应的设备名称,于是我们就有了相应的设备。其中设备名称我们会使用! 在设备详情中,可以找到相应的key,这个key我们也会使用!

2.4 生成password

使用OneNET-token计算工具,填入相应的产品ID,设备名称,key即可生成password!

token

STEP 3: 完成

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

实际原理:1:先创建大的类目(产品),获取产品ID。2:在产品下,创建各个设备,获取设备名称和KEY 3:生成各个设备的password。

--打印系统日志函
LIB_SystemLogEnable()
--配置USB以虚拟串口模式工作,这样调用print()函数就会在电脑串口终端打印输出
LIB_UsbConfig("CDC")
--设置sht3x传感器占用SCL0和SDA0引脚,并启动传感器以每秒出10个数据的频率工作,repeatability="HIGH"时精度最高
LIB_Sht3xConfig("IIC0","10","HIGH")
--设置0.96寸oled模块占用SCL1和SDA1引脚
LIB_0_96_OledConfig("IIC1")
--设置按键"BTN1"(占用D10口)以低电平有效的方式检测按键动作
LIB_ButtonConfig("BTN1","D10","L")
--配置D8为普通输出,控制Core电路板上的LED1
LIB_GpioOutputConfig("D8","STANDARD")
LIB_GpioOutputConfig("D9","STANDARD")
LIB_GpioWrite("D8",1) --LED1灭
LIB_GpioWrite("D9",1) --LED1灭
--使能10毫秒定时器开始工作
LIB_10msTimerConfig("ENABLE")
runtime=0
ap_ssid = "sb32" --你自己的路由器账号
ap_passwd = "sb123456" --你自己的路由器密码
--服务器地址和端口号可以不变
server_addr = "183.230.40.96" --OneNet服务器ip地址,也可以写成"mqtts.heclouds.com"(推荐)
server_port = 1883
--MQTT 连接参数(适用于ONE NET平台)
--538597为产品ID(注意是产品ID不是设备ID)
mqtt_con_username = "538597"
--TestC2为设备名称(注意是设备名称不是产品名称)
mqtt_con_clientID = "TestC2"
--该password由产品ID设备名称及设备KEY通过onenet—token工具生成
mqtt_con_password = "version=2018-10-31&res=products%2F538597%2Fdevices%2FTestC2&et=1893427200&method=md5&sign=uFqbzL2A4dgFD0cnJ4j%2B5Q%3D%3D"
--MQTT topic相关参数(适用于ONE NET平台)
--填入相应的产品ID及设备名称即可
mqtt_sub_topic = "$sys/538597/TestC2/cmd/request/+"--订阅用
mqtt_pub_topic = "$sys/538597/TestC2/dp/post/json" --发布用

LIB_MQTTC2Config(ap_ssid,ap_passwd,server_addr,server_port,0,mqtt_con_clientID,mqtt_con_username,mqtt_con_password,60,mqtt_sub_topic,"QOS0")
pub_id = 0
timer = 0
temp = 0.00
humi = 0.00

--首先定义函数
function LIB_10msTimerCallback()
timer = timer + 10
end

--开始大循环
while(GC(1) == true)
do
--每隔1秒读取温湿度信息
if timer >= 1000 then
timer = 0
sht3x_flag,temprature,humidity = LIB_Sht3xGetResult()
--如果传感器有新的温湿度数据产生
if sht3x_flag == 1 then
temp = temprature
humi = humidity
--在oled的第一行和第二行分别显示温度(摄氏度)和湿度(百分比)
LIB_0_96_OledPuts("1","1",string.format("T:%.1f H:%.1f", temp, humi))
end
pub_id = pub_id + 1
json_str = string.format("{\"id\":%d, \"dp\":{\"temperatrue\":[{\"v\": %.2f,}], \"humidity\":[{\"v\":%.2f,}]}}", pub_id, temp, humi)
--注意json_str的总长度不要超过250字节
LIB_MqttC2SendPub("QOS0", mqtt_pub_topic, json_str) --publish
end
--每隔200ms需要做的任务
recv_flag,topic,data = LIB_MqttC2RecvSub()
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_MqttC2SendPub("QOS0", topic, "Got it!")
--延时2秒是为了保证本次publish不被之后的publish覆盖,所以该延时太少可能导致LIB_MqttSendPub失败
LIB_DelayMs(2000)
end
end

三:代码实验现象

STEP 1: 硬件准备工作

将上面的完整代码拷贝入虚拟TF卡中的main.lua文件,完成Lua代码的更新。

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

从OneNet开发者(https://open.iot.10086.cn/develop/global/product/#/console)界面中进入对应的产品 ,然后在产品界面中鼠标点击进入“设备列表” 后可以看到我们刚刚创建的一个硬件设备

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

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

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

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

DevData

DevData2

DevData3

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

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

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

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

cmd1

cmd

随即可以看到开发板的LED灯亮灭切换!