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
遇到的问题
RST和INT0需用杜邦线接地,然后把RST悬空。点击START后,会显示等待上电同步,需插拔一下3.3V电源线,然后就能跑起来
设置SPI SPEED 为 20Mhz 和 SPI MODE 为 DIO、 波特率为115200
没有勾选固件,也是能跑,但跑了个寂寞
刷完固件,需重新启动一下,然后通过串口查询当前的固件版本 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)
可以通过测试工具去测试是否成功
遇到的问题
端口未开放,需要根据之前的步骤开启对应的端口
每个端口都有对应的方法,需要查阅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
遇到的问题
由于微信小程序 均需要SSL证书,所以连接MQTT必须要用SSL
由于安卓端不能使用网址+端口方式访问,So 需要用宝塔反向代理,映射到对应端口
同个订阅名字才可以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上云基本完成。