进阶篇-基于掌控板和EMQ X Cloud平台实现响应式web对接物联网MQTT应用

前言:

本文是上篇文章基于掌控板和SIoT平台实现响应式web对接物联网MQTT应用的进阶版本,上篇文章的MQTT服务受限于局域网,无法通过外网来完成Web端远程控制设备,本项目将MQTT服务器搭建在EMQ X Cloud平台,将不在受限于局域网,只要把搭建好的网站放到自己的服务器上,不管何时何地都能在Web端来远程控制设备。

一、EMQ X Cloud平台的配置和响应式Web端代码编写

本项目的亮点可以制作个性化的响应式控制页面。控制页面是使用Bootstrap进行界面布局,再使用jQuery监测按钮时间,然后再通过client.publish()函数,把相关的指令发送到EMQ X Cloud平台上,设备端订阅了相应Topic,接到到相应指令后做出响应。

Bootstrap文档地址:https://v3.bootcss.com/
在这里插入图片描述
控制页面部分代码如下:

<body>
    <div class="container text-center">
        <h1>开关控制</h1>
    </div>
    <br>
    <div class="container text-center">
        <button type="button" id="ledRedOn" class="btn btn-success btn-lg" onclick="open_greenswitch()">绿灯开</button>
        <button type="button" id="ledRedOff" class="btn btn-info btn-lg" onclick="close_greenswitch()">绿灯关</button>
    </div>
    <br>
    <div class="container text-center">
        <button type="button" id="ledGreenOn" class="btn btn-success btn-lg" onclick="open_redswitch()">红灯开</button>
        <button type="button" id="ledGreenOff" class="btn btn-info btn-lg" onclick="close_redswitch()">红灯关</button>
    </div>
    <br>
    <div class="container text-center">
        <button type="button" id="ledBlueOn" class="btn btn-success btn-lg" onclick="open_blueswitch()">蓝灯开</button>
        <button type="button" id="ledBlueOff" class="btn btn-info btn-lg" onclick="close_blueswitch()">蓝灯关</button>
    </div>
    <br>
    <div class="container text-center">
        <button type="button" id="ledBlueOn" class="btn btn-success btn-lg" onclick="open_allswitch()">全开</button>
        <button type="button" id="ledBlueOff" class="btn btn-info btn-lg" onclick="close_allswitch()">全关</button>
    </div> 
    <!-- 数据接收开始 -->
    <div class="receiveData left text-center">
        <h3>消息接收&nbsp;&nbsp;&nbsp;<button class="receiveClear">清除</button></h3>
        <textarea class="receiveArea" name="" id="" cols="85" rows="30"></textarea>
    </div>
    <!-- 数据接收结束 -->
</body>

连接EMQ X Cloud平台MQTT代码如下:

    let receiveClear = document.getElementsByClassName('receiveClear')[0];
    let receiveArea = document.getElementsByClassName('receiveArea')[0];

    var topic_chat = '2018A14133/chat';
    var topic_switch = '2018A14133/switch';  //定义两个topic(聊天topict和开关topic)

    //连接选项,mqtt用户名和密码,这里面应该还可以加上其他参数,具体看官方文档: https://www.npmjs.com/package/mqtt#connect 和https://github.com/mqttjs/mqtt-packet#connect
    const options = {
        connectTimeout: 4000, // 超时时间
        username: '602iot',
        password: '602iot',
        clientId: 'mqttjs_' + (Math.random() * 1000000).toString()
    }

    //浏览器采用websocket协议,路径固定为/mqtt 【此处请定义mqtt客户端client、声明重连和连接失败报错】
    const client = mqtt.connect('ws://red263b0.cn.emqx.cloud:8083/mqtt', options)//EMQ X Cloud平台MQTT的连接地址
    client.on('reconnect', (error) => {
        console.log('正在重连:', error)
    })

    client.on('error', (error) => {
        console.log('连接失败:', error)
    })

    //建立连接 【此处请建立mqtt连接,并订阅上方定义的两个topic,友情提示:帖子示例中onSubscribeSuccess要加上引号】
    client.on('connect', (e) => {
        console.log('成功连接服务器!')
        client.publish(topic_chat, '成功连接服务器!');
    })

部分定义指令发送函数代码如下:

    // 定义开启绿灯函数  function open_greenswitch()
    function open_greenswitch() {
        client.publish(topic_switch, 'Green led on');
    }

    // 定义关闭绿灯函数  function close_greenswitch()
    function close_greenswitch() {
        client.publish(topic_switch, 'Green led off');
    }

网页效果如下图:
在这里插入图片描述

手机网页效果如下图:
在这里插入图片描述
Web端完整代码点此下载

二、设备端代码编写

硬件设备采用了ESP32为主控板,连接网络和EMQ X Cloud平台MQTT服务,接收指令并做出响应。

本文的控制设备用来一个RGBLED,RGBLED三个引脚分别定义了一种颜色,在实际应用中,控制设备可以换成任意设备。

硬件连线:

# ESP32------------RGBLED
# GND---------------GND
# P19----------------G
# P21----------------R
# P18----------------B

WIFI和EMQ X Cloud平台参数定义代码如下:

// WiFi
const char *ssid = "602iot"; //  WiFi name
const char *password = "18wulian";  // WiFi password
// MQTT Broker
const char *mqtt_broker = "red263b0.cn.emqx.cloud";//EMQ X Cloud平台连接地址
const char *topic = "2018A14133/switch";//EMQ X Cloud的Topic
const char *mqtt_username = "602iot";
const char *mqtt_password = "602iot";
const int mqtt_port = 12498;

接收指令和指令响应代码如下:

void callback(char *topic, byte *payload, unsigned int length) {
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
  Serial.print("Message:");

  String Payload = "";
  for (int i = 0; i < length; i++) {
    Payload += (char)payload[i];
    Serial.print((char) payload[i]);
  }
  Serial.println();
//通过判断Web发过来的字符串来进行设备的开关
  if (Payload == "Green led on") {
    digitalWrite(Green_LED, HIGH);
  }
  else if (Payload == "Green led off") {
    digitalWrite(Green_LED, LOW);
  }
  else if (Payload == "Red led on") {
    digitalWrite(Red_LED, HIGH);
  }
  else if (Payload == "Red led off") {
    digitalWrite(Red_LED, LOW);
  }
  else if (Payload == "Blue led on") {
    digitalWrite(Blue_LED, HIGH);
  }
  else if (Payload == "Blue led off") {
    digitalWrite(Blue_LED, LOW);
  }
  else if (Payload == "All on") {
    digitalWrite(Green_LED, HIGH);
    digitalWrite(Red_LED, HIGH);
    digitalWrite(Blue_LED, HIGH);
  }
  else if (Payload == "All off") {
    digitalWrite(Green_LED, LOW);
    digitalWrite(Red_LED, LOW);
    digitalWrite(Blue_LED, LOW);
  }

设备端完整代码点此下载

三、实现效果

在网页上点击相应的按钮,可以实现控制相应灯的开关,实现了Web端远程控制设备。把网页放到自己的服务器上就可以通过外网来访问了,我已经把网页布置到了我的服务器上,通过IP地址即可访问。http://139.198.114.197/
在这里插入图片描述

演示视频🔗


版权声明:本文为weixin_42775304原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_42775304/article/details/116169453