75MQTT控制WiFi模块.docx
《75MQTT控制WiFi模块.docx》由会员分享,可在线阅读,更多相关《75MQTT控制WiFi模块.docx(15页珍藏版)》请在冰点文库上搜索。
75MQTT控制WiFi模块
章节目录
第一章XXAI智能识别技术
第二章人脸识别技术
第三章Arduino基础学习
第四章Arduino进阶学习
第五章IOT物联网
第六章WIFI与Arduino的结合
第七章阿里云IOT服务
第八章XX天工物联网
第九章APPInventor制作手机APP
第十章自己做的七七八八
第十一章制作APPInventor自定义插件
第十二章手机实现局域网连接
第十三章项目应用——小学生XX天工
第十四章项目应用——ESP32-cam摄像头模块
第十五章项目应用——ESP32-cam摄像头模块二
第十六章项目应用——WIFI模块手动配网
第十七章项目应用——红纳里斯的跨阵M1
第十八章项目应用——OLED液晶屏插件
7-5-MQTT控制WiFi模块
我们今天准备用MQTT-fx客户端程序发送一个开关灯的指令,来点亮或熄灭WiFi模块上面的LED灯。
一. 创建产品、设备
创建一个自定义的产品LED_Server。
点击LED_Server的“详情”,自定义一个TOPIC话题,
名字为“led_topic”,权限为“发布和订阅”
点击LED_Server右上角的发布按钮。
在设备中,选择批量添加设备,添加两个设备。
下面的一个用于MQTT-fx客户端连接,上面的一个用于WiFi模块连接。
二. WiFi模块客户端的程序
这次我们设置了一个开关灯的指令,由MQTT客户端发送指令,有WiFi模块接收指令,并根据指令内容点亮或熄灭模块上面的一个LED灯。
我们约定的指令一共有两条:
开灯是 {dn:
"led",s:
1}
关灯是 {dn:
"led",s:
0}
我们让WiFi模块接到来自服务器的消息时,先解读出消息中包含的这两个信息。
如果发现是“led”,则根据后面的s的值来执行开灯或关灯的操作。
程序的源代码:
ArduinoIDE直接烧写
//连接阿里云
//接收{dn:
"led",s:
1}{dn:
"led",s:
0}开关灯
#include
#include
#include
#include"aliyun_mqtt.h"
//GPIO13,D7ontheNodeMCUv3
#defineSENSOR_PIN13
#defineWIFI_SSID "ChinaNet-xxVP" //替换自己的WIFI
#defineWIFI_PASSWD "123456789" //替换自己的WIFI
#definePRODUCT_KEY "a1MVINA9nSN"//替换自己的PRODUCT_KEY
#defineDEVICE_NAME "OxPnar61jUWm0Q3hMHZ0"//替换自己的DEVICE_NAME
#defineDEVICE_SECRET "gMW7fExaxndDjE0JkaCC4QuT5OU58tpo"//替换自己的DEVICE_SECRET
#defineCLIENT_NAME "led"
#defineDEV_VERSION "S-TH-WIFI-v1.0-20190220" //固件版本信息
#defineALINK_led_topic "/"PRODUCT_KEY"/"DEVICE_NAME"/user/led_topic" //自定义话题
#defineALINK_BODY_FORMAT "{\"id\":
\"123\",\"version\":
\"1.0\",\"method\":
\"%s\",\"params\":
%s}"
#defineALINK_TOPIC_PROP_POST "/sys/"PRODUCT_KEY"/"DEVICE_NAME"/thing/event/property/post"
#defineALINK_TOPIC_PROP_POSTRSP "/sys/"PRODUCT_KEY"/"DEVICE_NAME"/thing/event/property/post_reply"
#defineALINK_TOPIC_PROP_SET "/sys/"PRODUCT_KEY"/"DEVICE_NAME"/thing/service/property/set"
#defineALINK_METHOD_PROP_POST "thing.event.property.post"
#defineALINK_TOPIC_DEV_INFO "/ota/device/inform/"PRODUCT_KEY"/"DEVICE_NAME""
#defineALINK_VERSION_FROMA "{\"id\":
123,\"params\":
{\"version\":
\"%s\"}}"
unsignedlonglastMs=0;
WiFiClient espClient;
PubSubClientmqttClient(espClient);
unsignedintWAIT_MS=2000;
voidinit_wifi(constchar*ssid,constchar*password)
{
WiFi.mode(WIFI_STA);
WiFi.begin(ssid,password);
while(WiFi.status()!
=WL_CONNECTED)
{
Serial.println("WiFidoesnotconnect,tryagain...");
delay(500);
}
Serial.println("Wifiisconnected.");
Serial.println("IPaddress:
");
Serial.println(WiFi.localIP());
}
voidmqtt_callback(char*topic,byte*payload,unsignedintlength)
{
Serial.print("Messagearrived[");
Serial.print(topic);
Serial.print("]");
payload[length]='\0';
Serial.println((char*)payload);
parseMqttResponse((char*)payload);
}
//解析mqtt数据
voidparseMqttResponse(char*payload){
Serial.println("startparseOneNetMqttResponse");
StaticJsonBuffer<100>jsonBuffer;
JsonObject&root=jsonBuffer.parseObject(payload);
if(!
root.success()){
Serial.println("parseObject()failed");
return;
}
StringdeviceName=root["dn"];
intstatus=root["s"];
if(strcmp(CLIENT_NAME,deviceName.c_str())==0){
if(status==1)
digitalWrite(LED_BUILTIN,LOW);
else
digitalWrite(LED_BUILTIN,HIGH);
}
}
voidmqtt_version_post()
{
charparam[512];
charjsonBuf[1024];
//sprintf(param,"{\"MotionAlarmState\":
%d}",digitalRead(13));
sprintf(param,"{\"id\":
123,\"params\":
{\"version\":
\"%s\"}}",DEV_VERSION);
//sprintf(jsonBuf,ALINK_BODY_FORMAT,ALINK_METHOD_PROP_POST,param);
Serial.println(param);
mqttClient.publish(ALINK_TOPIC_DEV_INFO,param);
}
voidmqtt_check_connect()
{
while(!
mqttClient.connected())//mqtt
{
while(connect_aliyun_mqtt(mqttClient,PRODUCT_KEY,DEVICE_NAME,DEVICE_SECRET))
{
Serial.println("MQTTconnectsucceed!
");
delay(2000);
//订阅自定义话题
mqttClient.subscribe(ALINK_led_topic);
Serial.println("subscribedone");
mqtt_version_post();
}
}
}
voidmqtt_interval_post()
{
charparam[512];
charjsonBuf[1024];
//sprintf(param,"{\"MotionAlarmState\":
%d}",digitalRead(13));
sprintf(param,"{\"CurrentHumidity\":
%d,\"CurrentTemperature\":
12,\"GeoLocation\":
{\"CoordinateSystem\":
2,\"Latitude\":
2,\"Longitude\":
123,\"Altitude\":
1}}",digitalRead(13));
sprintf(jsonBuf,ALINK_BODY_FORMAT,ALINK_METHOD_PROP_POST,param);
Serial.println(jsonBuf);
mqttClient.publish(ALINK_TOPIC_PROP_POST,jsonBuf);
}
voidsetup()
{
delay(1000);
pinMode(LED_BUILTIN,OUTPUT);
Serial.begin(115200);
Serial.println("DemoStart");
init_wifi(WIFI_SSID,WIFI_PASSWD);
mqttClient.setCallback(mqtt_callback);
}
//theloopfunctionrunsoverandoveragainforever
voidloop()
{
if(millis()-lastMs>=8000)
{
lastMs=millis();
mqtt_check_connect();
}
mqttClient.loop();
}
测试程序
我们用ArduinoIDE烧写开发板,然后打开串口监视器。
我们用浏览器登录阿里云服务器,然后选择上面的那个用于WiFi模块连接的设备,点击后面的“详情”,然后在自定义TOPIC中,点击“led_topic”后面的发布消息,然后发送一个{dn:
"led”,s:
1}的消息,可以看到WiFi模块上面的灯亮了,串口监视器也显示收到了消息。
到这里,我们可以看出WiFi模块的程序是成功的,能自动从阿里云服务器接收话题的消息,并根据指令开灯或关灯。
三. MQTT-fx客户端连接
我们在电脑中设置MQTT-fx的连接,把他连接到前面新建设备中下面的那个连接。
如果设置没有错的话,我们在客户端中点击连接按钮,后面的灯会变绿,说明已经连接到了服务器了。
在浏览器中,我们也能在设备列表中看到设备通过了验证,并以在线。
这时候,我们在电脑的MQTT客户端订阅“led_topic”话题,并往这个话题发送一个{dn:
"led”,s:
1}的消息。
奇怪的是,开发板上的灯并没有被点亮。
我们用浏览器,在设备列表下面的用于MQTT连接的设备后面查看详情,然后在“日志服务”中,能看到MQTT发过来的消息,已经成功地发到了服务器了。
可为什么WiFi开发板的灯不亮呢?
原来,在阿里云的服务中,每一个设备的话题只能自己发、自己收。
不同的设备之间的消息,需要经过“云流转”才能互相传递。
四. 设置云产品流转
点击左边的“云产品流转”,创建规则"led_client"。
在编写SQL中,字段中输入“dn,s”这两个字段名,在Topic中选择客户端连接的设备,“user/led_topic”这个话题。
这句话表示需要流转的消息是来自哪里的消息。
在添加操作中,“发送到一个Topic”,选择WiFi模块连接的设备,“user/led_topic”。
这句话的意思是,把流转的消息发给谁。
总的一句话,流转规则就是要规定好,需要流转的消息来自哪里,去向何方。
设置好后,别忘了点击“启动”。
五. 再次测试程序
这时候,我们打开MQTT-fx客户端,往led_topic话题再发送一个{dn:
"led”,s:
1}的消息时,开发板上面的LED灯亮了,串口监视器也收到了消息。
我们打开WiFi模块连接的设备,在日志服务中,也可以看到有下行的消息了。