跳到主要内容

C2 自带 WiFi MQTT 通信

注意:仅 C2 内部自带Wifi功能,C1内部自带的是蓝牙功能所以不适合本教程。

一、本例程实现功能(以OneNet云接入为例)

接入OneNet云,向云端mqtt publish发送模拟的温度和湿度,并订阅subscribe云端下发的cmd指令控制开发板上的Led灯亮灭。

本例程为参考程序,虽然是基于中移物联的OneNet云作为接入云,但接其他云(阿里云,百度云,腾讯云等等)也可以完全参考本例程的代码,只要它们支持MQTT协议即可。关于OneNet的接入,官网中已有详细教程,本篇章就不再赘述。

三、接线图

无需任何接线图,ShineBlink C2开发板上的C2芯片自带Wifi功能。

C2MinI

四、材料清单

名称推荐购买链接(或者您可以自己制作)模块/芯片硬件资料下载
路由器Ap
声明:这里推荐的购买链接仅供参考,您完全可以去其他商家或渠道购买,只要功能相似即可。

五、完整代码

LIB_SystemLogEnable()
--配置USB以虚拟串口模式工作,这样调用print()函数就会在电脑串口终端打印输出
LIB_UsbConfig("CDC")
ap_ssid = "123" --你的wifi路由器账号
ap_passwd = "456" --你的wifi路由器密码
--MQTT服务器地址(适用于ONE NET平台)
server_addr = "183.230.40.96" --OneNet服务器ip地址,也可以写成"mqtts.heclouds.com"(推荐)
server_port = 1883
--MQTT 连接参数(适用于ONE NET平台)
mqtt_con_clientID = "TestDevice001"
mqtt_con_username = "353255"
mqtt_con_password = "version=2018-10-31&res=products%2F353255%2Fdevices%2FTestDevice001&et=1893427200&method=md5&sign=%2F5RJwGwytPWvVDB04K7rnw%3D%3D"
--MQTT topic相关参数(适用于ONE NET平台)
mqtt_sub_topic = "$sys/353255/TestDevice001/cmd/request/+"--订阅用
mqtt_pub_topic = "$sys/353255/TestDevice001/dp/post/json" --发布用
--配置D9为普通输出,控制LED2
LIB_GpioOutputConfig("D9","STANDARD")
--使能系统10毫秒定时器开始工作
LIB_10msTimerConfig("ENABLE")
--初始化C2芯片内部的WIFI以MQTT Client方式工作,并配置其详细工作参数,具体参数介绍可参考API文档
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")
--变量初始化
cnt_10ms = 0
pub_id = 0
temprature = 0.00
humidity = 0.00
--定义10ms中断回调函数
function LIB_10msTimerCallback()
cnt_10ms = cnt_10ms + 1
temprature = temprature + 0.01 --模拟温度动态升高
humidity = humidity + 0.02 --模拟湿度动态升高
end
--开始大循环
while(GC(1) == true)
do
--查询是否收到云端下发的cmd指令
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
--每5秒发送温湿度度数据给server
if cnt_10ms >= 500 then
cnt_10ms = 0
pub_id = pub_id + 1
json_str = string.format("{\"id\":%d, \"dp\":{\"temperatrue\":[{\"v\": %.2f,}], \"humidity\":[{\"v\":%.2f,}]}}", pub_id, temprature, humidity)
--注意json_str的总长度不要超过250字节
LIB_MqttC2SendPub("QOS0", mqtt_pub_topic, json_str) --publish
end
end
如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

代码运行结果

(1)云端下发如下Json 字符串的时候开发板的Led灯回切换亮灭状态,如下图:

 {"LED":2} --云端下发内容

sub

(2)开发板每隔5秒向云端上传温湿度数据,如下图:

pub