基于ESP8266上云实验

ESP8266篇

由于AT固件的配置过于麻烦,所以使用了MQTT固件进行配置。

ESP8266 - MQTT固件

由于购买回来的ESP8266-01S默认的是AT固件,现在需要用到MQTT指令,所以需要将其刷到AT固件

MQTT 固件 : https://docs.ai-thinker.com/_media/1471_esp8266-at_mqtt-1m.zip

刷固件软件 :https://docs.ai-thinker.com/_media/flash_download_tool_v3.8.5_1.zip

将以上两个文件均下载,保存。

打开刷固件软件 - 选择ESP8266 -> DOWNLOADTOLL -> 将固件包导入

其余配置如图所示,配置完可以点击START

遇到的问题
  1. RST和INT0需用杜邦线接地,然后把RST悬空。点击START后,会显示等待上电同步,需插拔一下3.3V电源线,然后就能跑起来

  1. 设置SPI SPEED 为 20Mhz 和 SPI MODE 为 DIO、 波特率为115200

  1. 没有勾选固件,也是能跑,但跑了个寂寞

  1. 刷完固件,需重新启动一下,然后通过串口查询当前的固件版本 AT+GMR

ESP8266 - MQTT配置指令

指令

配置 STA 模式

AT+CWMODE=1

连接路由器

AT+CWJAP="wifi_Name","wifi_Password"

配置MQTT属性

AT+MQTTUSERCFG=0,1,"clientID","username","password",0,0,""

连接制定的 MQTT broker

AT+MQTTCONN=0,"47.111.117.220",1883,0

查询 MQTT 连接状态

AT+MQTTCONN?

订阅 topic 数据

AT+MQTTSUB=0,"topicName",1

发布 topic 数据

AT+MQTTPUB=0,"topicName","payload",1,0

指令解析

MQTT AT Commands — ESP-AT 用户指南 文档 (espressif.com)

AT+CWMODE : 查询/设置WI-FI模式

功能

命令

响应

查询 ESP 设备的 Wi-Fi 模式

AT+CWMODE?

+CWMODE: mode OK

设置 ESP 设备的 Wi-Fi 模式

AT+CWMODE= mode [, auto_connect ]

OK

  • mode :模式

  • 0: 无 Wi-Fi 模式,并且关闭 Wi-Fi RF

  • 1: Station 模式

  • 2: SoftAP 模式

  • 3: SoftAP+Station 模式

  • auto_connect :切换 ESP 设备的 Wi-Fi 模式时(例如,从 SoftAP 或无 Wi-Fi 模式切换为 Station 模式或 SoftAP+Station 模式),是否启用自动连接 AP 的功能,默认值:1。参数缺省时,使用默认值,也就是能自动连接。

  • 0: 禁用自动连接 AP 的功能

  • 1: 启用自动连接 AP 的功能,若之前已经将自动连接 AP 的配置保存到 flash 中,则 ESP 设备将自动连接 AP

AT+CWJAP : 连接AP

功能

命令

响应

查询与 ESP Station 连接的 AP 信息

AT+CWJAP?

+CWJAP: ssid , bssid , channel , rssi , pci_en , reconn_interval , listen_interval , scan_mode , pmf OK

设置 ESP Station 需连接的 AP

AT+CWJAP=[ ssid ],[ pwd ][,][, pci_en ][,][, listen_interval ][,][, jap_timeout ][,]

WIFI CONNECTED - WIFI GOT IP -OK [WIFI GOT IPv6 LL] - [WIFI GOT IPv6 GL]

+CWJAP: error code ERROR

参数

ssid :目标 AP 的 SSID

如果 SSID 和密码中有 ,、"、\ 等特殊字符,需转义

pwd :密码最长 64 字节 ASCII

  • ssid :目标 AP 的 SSID

  • 如果 SSID 和密码中有 ,、"、\\ 等特殊字符,需转义

  • pwd :密码最长 64 字节 ASCII

  • listen_interval :监听 AP beacon 的间隔,单位为 AP beacon 间隔,默认值:3,范围:[1,100]

  • listen_interval :监听 AP beacon 的间隔,单位为 AP beacon 间隔,默认值:3,范围:[1,100]

  • error code :错误码,仅供参考

  • 1: 连接超时

  • 2: 密码错误

  • 3: 无法找到目标 AP

  • 4: 连接失败

  • 其它值: 发生未知错误

AT+MQTTUSERCFG:设置 MQTT 用户属性

功能

命令

响应

设置 MQTT 用户属性

AT+MQTTUSERCFG= LinkID , scheme , "client_id" , "username" , "password" , cert_key_ID , CA_ID , "path"

OK

参数

LinkID :当前仅支持 link ID 0。

scheme :由于 ESP8266 内存限制,不支持 MQTT over TLS,即 scheme 只能取 1 或 6。

1: MQTT over TCP;

2: MQTT over TLS(不校验证书);

3: MQTT over TLS(校验 server 证书);

4: MQTT over TLS(提供 client 证书);

5: MQTT over TLS(校验 server 证书并且提供 client 证书);

6: MQTT over WebSocket(基于 TCP);

7: MQTT over WebSocket Secure(基于 TLS,不校验证书);

8: MQTT over WebSocket Secure(基于 TLS,校验 server 证书);

9: MQTT over WebSocket Secure(基于 TLS,提供 client 证书);

10: MQTT over WebSocket Secure(基于 TLS,校验 server 证书并且提供 client 证书)。

client_id :MQTT 客户端 ID,最大长度:256 字节。

username :用户名,用于登陆 MQTT broker,最大长度:64 字节。

password :密码,用于登陆 MQTT broker,最大长度:64 字节。

cert_key_ID :证书 ID,目前 ESP-AT 仅支持一套 cert 证书,参数为 0。

CA_ID :CA ID,目前 ESP-AT 仅支持一套 CA 证书,参数为 0。

path :资源路径,最大长度:32 字节。

AT+MQTTCONN:连接 MQTT Broker

功能

命令

响应

查询 ESP 设备已连接的 MQTT broker

AT+MQTTCONN?

+MQTTCONN: LinkID , state , scheme "host" , port , "path" , reconnect OK

连接 MQTT Broker

AT+MQTTCONN= LinkID , "host" , port , reconnect

OK

参数¶

LinkID :当前仅支持 link ID 0。

host :MQTT broker 域名,最大长度:128 字节。

port :MQTT broker 端口,最大端口:65535。

path :资源路径,最大长度:32 字节。

reconnect :

0: MQTT 不自动重连;

1: MQTT 自动重连,会消耗较多的内存资源。

state :MQTT 状态:

0: MQTT 未初始化;

1: 已设置 AT+MQTTUSERCFG;

2: 已设置 AT+MQTTCONNCFG;

3: 连接已断开;

4: 已建立连接;

5: 已连接,但未订阅 topic;

6: 已连接,已订阅过 topic。

scheme :

1: MQTT over TCP;

2: MQTT over TLS(不校验证书);

3: MQTT over TLS(校验 server 证书);

4: MQTT over TLS(提供 client 证书);

5: MQTT over TLS(校验 server 证书并且提供 client 证书);

6: MQTT over WebSocket(基于 TCP);

7: MQTT over WebSocket Secure(基于 TLS,不校验证书);

8: MQTT over WebSocket Secure(基于 TLS,校验 server 证书);

9: MQTT over WebSocket Secure(基于 TLS,提供 client 证书);

10: MQTT over WebSocket Secure(基于 TLS,校验 server 证书并且提供 client 证书)。

AT+MQTTSUB:订阅 MQTT Topic

功能

命令

响应

查询已订阅的 topic

AT+MQTTSUB?

+MQTTSUB: LinkID , state , "topic1" , qos +MQTTSUB: LinkID , state , "topic2" , qos +MQTTSUB: LinkID , state , "topic3" , qos ... OK

订阅指定 MQTT topic 的指定 QoS,支持订阅多个 topic

AT+MQTTSUB= LinkID , "topic" , qos

OK

当 AT 接收到已订阅的 topic 的 MQTT 消息时

+MQTTSUBRECV: LinkID , "topic" , data_length ,data

若已订阅过该 topic,则返回

ALREADY SUBSCRIBE

参数

LinkID :当前仅支持 link ID 0。

state :MQTT 状态:

0: MQTT 未初始化;

1: 已设置 AT+MQTTUSERCFG;

2: 已设置 AT+MQTTCONNCFG;

3: 连接已断开;

4: 已建立连接;

5: 已连接,但未订阅 topic;

6: 已连接,已订阅过 MQTT topic。

topic :订阅的 topic。

qos :订阅的 QoS。

AT+MQTTPUB:发布 MQTT 消息(字符串)

功能

命令

响应

通过 topic 发布 MQTT 字符串 消息

AT+MQTTPUB= LinkID , "topic" , "data" , qos , retain

OK

参数

LinkID :当前仅支持 link ID 0。

topic :MQTT topic,最大长度:128 字节。

data :MQTT 字符串消息。

qos :发布消息的 QoS,参数可选 0、1、或 2,默认值:0。

retain :发布 retain。

说明

每条 AT 命令的总长度不能超过 256 字节。

本命令不能发送数据 \0,若需要发送该数据,请使用 AT+MQTTPUBRAW 命令。

MQTT服务器篇

该篇是基于云服务器而编写,需要自己搭建。

系统 : CentOS 7 (Linux)

需进入终端,依次输入以下命令

步骤

命令

1

配置 EMQX Yum 源

curl -s https://assets.emqx.com/scripts/install-emqx-rpm.sh | sudo bash

2

安装 EMQX

sudo yum install emqx -y

3

启动 EMQX

sudo systemctl start emqx

终端

然后需要开放端口 18083

我是阿里云的服务器,则需要在实例那找到安全组,然后去开放 0.0.0.0/0 端口范围18083/18083

然后 u 服务器的IP地址 + 18083 /u 就可以进入

EMQX Dashboard管理后台

默认账号 : admin 默认密码 : public

至此,服务器配置已基本配置完成

MQTT测试工具 MQTTX
Directory listing for MQTTX: / | EMQ (emqx.com)

可以通过测试工具去测试是否成功

遇到的问题
  1. 端口未开放,需要根据之前的步骤开启对应的端口

  1. 每个端口都有对应的方法,需要查阅EMQX的监听器,不然连接不成功,特别是SSL

MQTT 微信小程序篇

小程序基于mqtt.js进行开发( 基本步骤 略~~ )

mqtt.js : https://cdn.bootcdn.net/ajax/libs/mqtt/4.1.0/mqtt.min.js

WebSocket connection to ‘ws://xxxxx‘ failed问题解决办法

将其放在utils 文件下

首先

微信公众平台添加socket地址

微信开发者工具
js文件

引用

var mqtt= require('../../utils/mqtt.js');
var client = 0 ;
var app = getApp();

渲染页面 - 自加载

  /
    生命周期函数--监听页面加载
   /
  onLoad(options) {
      this.connectmqtt();
  },

MQTT连接

// MQTT 连接
  connectmqtt:function(){
    var that = this
    if ( app.MQTT_CONNECT_FLAG == 1 )  return;
     const options={
      connectTimeout:4000,
      clientId: 'wx_' + parseInt(Math.random()  100 + 800, 10),
      username:'',//测试可以为空
      password:'',//测试可以为空
    }
    try {
      client=mqtt.connect('wxs://你的soket地址/mqtt',options)
      client.on('connect',(e)= {
        //console.log('服务器连接成功')
        client.subscribe(this.data.Subscribe_Name,{qos:0},function(err){
          if(!err){
            console.log('订阅成功')
            wx.showToast({
              title: '连接成功',
              icon :"success"
            })
            that.setData
            ({
                Connect_Flag:1,
                Subscribe_Flag :1
            })
            app.MQTT_CONNECT_FLAG = 1;
            app.MQTT_Subscribe_FLAG = 1;
          }
        })
      })
      //信息监听
      client.on('message',function(topic,massage){
        console.log('收到'+massage.toString())
        
        that.setData({
          Resecive_Msg :JSON.parse(massage).msg
        })
      })
      client.on('reconnect',(error)= {
        console.log('正在重连',error)
        wx.showToast({
          title: '正在重连',
          icon :"error"
        })
      })
      client.on('error',(error)= {
        //console.log('连接失败',error)
        wx.showToast({
          title: '连接失败',
          icon :"error"
        })
      })
    } catch (error) {
    }
  },

取消连接

Not_connectmqtt()
  {
    if ( app.MQTT_CONNECT_FLAG == 0 )  return;
    var that = this ;
    that.setData
    ({
        Connect_Flag:0
    })
    app.MQTT_CONNECT_FLAG = 0;
   client.end()
    wx.showToast({
      title: '断开连接成功'
    })
  },

订阅主题

Book_Sub()
  {
    if (this.data.Subscribe_Flag) return;
    client.subscribe(this.data.Subscribe_Name)
    wx.showToast({
      title: '主题订阅成功'
    })
    
    this.setData
    ({
        Subscribe_Flag:1
    })
    app.MQTT_Subscribe_FLAG = 1;
  },

取消订阅

  UnBook_Sub()
  {
    if (!this.data.Subscribe_Flag) return;
    this.setData
    ({
        Subscribe_Flag:0
    })
    app.MQTT_Subscribe_FLAG = 0;
    client.unsubscribe

    wx.showToast({
  
      title: '取消订阅成功'
  
    })
  }

页面初始数据

  data: {
      Connect_Flag : app.MQTT_CONNECT_FLAG,
      Subscribe_Name:"Temperture",
      Subscribe_Flag:app.MQTT_Subscribe_FLAG,
      Resecive_Msg :'',
  },
wxml文件
 !--pages/WuLian/WuLian.wxml-- 
 view style="margin-top: 50px;"  /view 

 !-- 未连接 -- 
 button wx:if="{{!Connect_Flag}}" class="msg" bindtap="connectmqtt"  连接  /button 

 !-- 连接 -- 
 button wx:if="{{Connect_Flag}}" class="msg" bindtap="Not_connectmqtt"  取消连接  /button 

 !-- 订阅主题 -- 
 input style=" margin:20rpx ; border: 1px solid rgb(199, 199, 199); border-radius: 8rpx; height: 50rpx; padding: 10rpx;" type="text" placeholder="默认主题 {{Subscribe_Name}}"
      bindinput="Subscribe_Name"/ 
 !-- 连接 -- 
 button wx:if="{{!Subscribe_Flag }}" class="msg" bindtap="Book_Sub"  订阅主题  /button 
 button wx:if="{{Subscribe_Flag }}" class="msg" bindtap="UnBook_Sub"  取消订阅  /button 

 text style="display: block; border: 1px solid rgb(194, 194, 194); margin: 10rpx; padding: 10rpx; height: 50px; width: 90%; border-radius: 5px;"   接送到的信息 : {{Resecive_Msg}} /text 
遇到的问题
  1. 由于微信小程序 均需要SSL证书,所以连接MQTT必须要用SSL

  1. 由于安卓端不能使用网址+端口方式访问,So 需要用宝塔反向代理,映射到对应端口

  1. 同个订阅名字才可以bb

配置文件

    proxy_pass http://127.0.0.1:8085;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    
    add_header X-Cache $upstream_cache_status;

至此,ESP8266上云基本完成。

Follow me

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值