跳到主要内容

WiFi+MQTT接入Aliyun云平台

一、本例程实现功能介绍

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

二、云平台操作流程

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

https://iot.aliyun.com/

STEP 2: 创建产品

2.1 选择官网产品栏目->物联网IOT->物联网平台->进入公共实例

2.2 进入公共实例->产品->创建产品

​ 2.2.1 输入产品名称(我这里输入:MQTT_TEST)

​ 2.2.2 所属品类,按自身情况选择(我这里输入路灯照明)

​ 2.2.3 节点类型为直连设备

​ 2.2.4 连网方式为WIFI。

​ 2.2.5 数据格式为ICA标准数据格式(默认)

2.3 添加设备

2.3.1 选择设备栏,选则添加设备;

​ 2.3.2 选择刚才创建的产品(MQTT_TEST)

​ 2.3.3 输入设备名称(这里我输入TEST1)

​ 2.3.4 输入备注名称(这里我输入测试1)

​ 2.3.5 完成设备的添加

2.4 查看相应参数

​ 2.4.1 创建好相应的产品以及设备后,选择查看设备

2.4.2 选择查看MQTT 连接参数(即可获取clientld、username、passwd、mqttHostUrl、port)

​ 2.4.3 上面的参数非常重要获取到之后,还需要与官网进行订阅和发布

2.5 订阅以及发布

​ 2.5.1 选择产品栏,进入创建的产品(MQTT_TEST),选择查看。

​ 2.5.2 选择Topic类列表(记住是在产品栏里查看相应Topic列表而不是在设备里查看)

2.5.3 选择自定义Topic,复制相应的发布Topic,以及相应的订阅Topic(我这里用物模型通行中的发布Topic方便展示数据)

​ 2.5.4 用自定义的发布以及订阅Topic可不进行下列步骤! 因为我选择了物模型数据发送,而且发送的数据为温湿度,而官网没有相应的温湿度物模型,所以相应产品中的功能定义。

​ 2.5.5 选择编辑草稿->添加自定义功能

​ 2.5.6 功能名称(温度)标识符(temperature)数据类型(float)其中标识符非常重要,数据发送上来的格式需要是相对应的标识符。湿度也类似一样 功能名称(湿度)标识符(Humidity)数据类型(float)

​ 2.5.7 发布上线

--打印系统日志函
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" --你自己的路由器密码
--服务器地址和端口号查看产品MQTT参数
--aliyun中MQTT连接参数中的mqttHostUrl以及port
server_addr = "iot-06z00cmvlu9lw3p.mqtt.iothub.aliyuncs.com" --aliyun服务器ip地址
server_port = 1883
--MQTT 连接参数(适用于aliyun平台)
--MQTT参数中的username
mqtt_con_username = "TEST1&hkk5JgK9dJM"
--MQTT参数中的clientID
mqtt_con_clientID = "hkk5JgK9dJM.TEST1|securemode=2,signmethod=hmacsha256,timestamp=1661153431727|"
--MQTT参数中的password
mqtt_con_password = "e6e3f4eed260f4872542abc4139f0d462f18163ddc0ff70f5c73d9807453ad44"
--MQTT topic相关参数(适用于aliyun平台)
--在产品中的订阅与发布中的自定义topic或物模型topic
--订阅选择自定义TOPIC,相应的设备名记得更改
--发布我这里用物模型topic,相应的设备名记得更改
mqtt_sub_topic = "/hkk5JgK9dJM/TEST1/user/get"--订阅用
mqtt_pub_topic = "/sys/hkk5JgK9dJM/TEST1/thing/event/property/post" --发布用

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,\"params\":{\"temperature\":%.1f,\"Humidity\":%.1f}}",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: 在设备栏中找到设备并查看

选择相应的物模型数据,即可看到我们创建好的温度及湿度显示数据,可点击实时刷新查看

DataView

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

Ⅰ 鼠标点击进入在对应的设备的“Topic列表”中的“发布消息”

Publish

Ⅱ 然后在弹出的界面中的命令内容中输入“{"LED":2}

Publish2

Ⅲ 最后点击确认,待设备成功收到命令并返回正确的应答后,我们就可以看到C2 DevKit开发板上的LED2灯珠由亮变灭或者由灭变亮了。