溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

發(fā)布時間:2021-12-07 09:34:00 來源:億速云 閱讀:453 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“基于ESP8266的MicroPython怎么連接MQTT服務(wù)器”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“基于ESP8266的MicroPython怎么連接MQTT服務(wù)器”吧!

ESP8266

ESP8266 是一款由上海樂鑫信息科技開發(fā)的可以作為微控制器使用的成本極低且具有完整TCP/IP協(xié)議棧的Wi-Fi IoT控制芯片。由Ai-Thinker生產(chǎn)的ESP-01芯片于2014年8月首次引起了西方的創(chuàng)客們的注意,這個小模塊允許微控制器通過海斯命令集使用TCP / IP協(xié)議棧連接到Wi-Fi網(wǎng)絡(luò)。然而,在最初的芯片上幾乎沒有使用英文的文檔及可接受的命令。由于模塊上外部組件非常少的原因,導(dǎo)致了其價(jià)格十分便宜,并吸引了許多創(chuàng)客來研究和使用該模塊、開發(fā)配套該芯片使用的軟件以及對其使用中文的使用指南進(jìn)行多語言翻譯。原廠有ESP8266-01,-07,-12E,和-13四款主打,價(jià)格在$2.3-$3.8之間。3.3V的電壓可以直接用LiPo電池供電,比5V功耗要省。我最喜歡的是ESP8266-12E款,GPIO口多,可作為獨(dú)立的計(jì)算原價(jià)。ESP8285即是內(nèi)置了1MiB閃存的ESP8266,其允許單芯片設(shè)備能夠直接連接到Wi-Fi進(jìn)行使用。其后續(xù)產(chǎn)品是2016年所發(fā)布的ESP32。本人是在淘寶購買的NodeMCU Lua 的ESP8266開發(fā)板。

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

MicroPython

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

MicroPython,是Python 3編程語言的一個完整軟件實(shí)現(xiàn),用C語言編寫,被優(yōu)化于運(yùn)行在微控制器 Microcontrollers之上。MicroPython是運(yùn)行在微控制器硬件之上的完全的Python編譯器和運(yùn)行時系統(tǒng)。提供給用戶一個交互式提示符(REPL)來立即執(zhí)行所支持的命令。除了包括選定的核心Python庫,MicroPython還包括了給予編程者訪問低層硬件的模塊。MicroPython是澳大利亞程序員和物理學(xué)家Damien George,在2013年一次成功的Kickstarter眾籌活動之后最初建立的[5]。盡管最初的Kickstart眾籌活動將MicroPython與pyboard微控制器一起發(fā)行,MicroPython支持大量的基于ARM的體系結(jié)構(gòu)[6]。MicroPython已經(jīng)運(yùn)行于Arduino、ESP8266、ESP32、和物聯(lián)網(wǎng)(WiPy、pyboard、pyboard D-series、 STM32F4 Discovery、 NUCLEO-F401RE、 NUCLEO-F767ZI)硬件。在2016年,Python軟件基金會建立了MicroPython的BBC Micro Bit版本,作為其BBC Micro Bit合作伙伴貢獻(xiàn)的一部分。這個項(xiàng)目的源代碼托管于GitHub。

Micropython的由來:
這得益于Damien George這位偉大的計(jì)算機(jī)工程師,Damien George每天都會使用Python工作,他有一天冒出一個大膽的想法:能否用Python來控制單片機(jī),從而實(shí)現(xiàn)對機(jī)器人的操作呢?Python語言本身就是一款簡單上手的腳本語言,一些非計(jì)算機(jī)專業(yè)的愛好者都選Python語言作為入門語言,但是美中不足(中國跟美國為什么不參加世界杯),它不能實(shí)現(xiàn)對一些底層的操作,在硬件領(lǐng)域毫不起眼。所以,Damien George利用6個月時間打造了MicroPython,這就是MicroPyhton的由來。

MQTT

MQTT消息隊(duì)列遙測傳輸(Message Queuing Telemetry Transport) 一種基于發(fā)布/訂閱(publish/subscribe)模式的"輕量級"通訊協(xié)議。 該協(xié)議構(gòu)建于TCP/IP協(xié)議上,由IBM在1999年發(fā)布,目前已成為 IoT 通信的標(biāo)準(zhǔn)。MQTT最大優(yōu)點(diǎn)在于,可以以極少的代碼和有限的帶寬,為連接遠(yuǎn)程設(shè)備提供實(shí)時可靠的消息服務(wù)。作為一種低開銷、低帶寬占用的即時通訊協(xié)議,使其在物聯(lián)網(wǎng)、小型設(shè)備、移動應(yīng)用等方面有較廣泛的應(yīng)用。IBM公司的安迪·斯坦福-克拉克及Arcom公司的阿蘭·尼普于1999年撰寫了該協(xié)議的第一個版本。該協(xié)議的可用性取決于該協(xié)議的使用環(huán)境。IBM公司在2013年就向結(jié)構(gòu)化資訊標(biāo)準(zhǔn)促進(jìn)組織提交了 MQTT 3.1 版規(guī)范,并附有相關(guān)章程,以確保只能對規(guī)范進(jìn)行少量更改。 MQTT是一個基于客戶端-服務(wù)器的消息發(fā)布/訂閱傳輸協(xié)議。MQTT協(xié)議是輕量、簡單、開放和易于實(shí)現(xiàn)的,這些特點(diǎn)使它適用范圍非常廣泛。在很多情況下,包括受限的環(huán)境中,如:機(jī)器與機(jī)器(M2M)通信和物聯(lián)網(wǎng)(IoT)。其在,通過衛(wèi)星鏈路通信傳感器、偶爾撥號的醫(yī)療設(shè)備、智能家居、及一些小型化設(shè)備中已廣泛使用。

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

開發(fā)環(huán)境

  • Windows 10 x64

  • NodeMCU開發(fā)板

  • Python 3.7.4

  • uPyLoader

  • teraterm-4.96

  • MicroPython 1.8.7

  • esp8266 firmware

下載和配置環(huán)境

本人使用的是搭載Windows 10 X64 laptop.所有工具都是基于Windows 10操作系統(tǒng)。首先我們需要準(zhǔn)備下面幾個工具(python-3.7.4 esptool 和 uPyLoader)方便我們下載和調(diào)試NOdeMCU開發(fā)板。

首先到python官網(wǎng)下載 python-3.7.4-amd64.exe,并按照如下選項(xiàng)安裝。

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

然后到Github上下載uPyLoader。由于沒有打包成可執(zhí)行文件,所以需要使用Python啟動。uPyLoader基于Python 3,并且需要這兩個包:PyQt5和pyserial,pyserial版本要大于等于3.1.1。通過cmd shell 命令對NodeMCU firmware進(jìn)行下載,我們需要esptool。

進(jìn)入windows cmd

python -m pip install --upgrade pip
pip install PyQt5
pip install esptool
pip install pyserial>=3.1.1

使用esptool.py你能下面的命令擦除flash。

esptool.py --port COM3 erase_flash
 
#########################################
esptool.py v2.7
Serial port COM3
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 2c:3a:e8:43:c1:c6
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 6.5s
Hard resetting via RTS pin...
##########################################

使用下面的命令燒寫firmware。你可以 到www.micropython.org官網(wǎng)下載NodeMCU最新的firmware。我在寫這個文檔是最新是esp8266-20190529-v1.11.bin。

esptool.py --port COM3 --baud 460800 write_flash --flash_size=detect 0 esp8266-20190529-v1.11.bin
 
#################################################################################################
esptool.py v2.7
Serial port COM64
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 2c:3a:e8:43:c1:c6
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0040
Compressed 617880 bytes to 402086...
Wrote 617880 bytes (402086 compressed) at 0x00000000 in 9.6 seconds (effective 512.9 kbit/s)...
Hash of data verified.
 
Leaving...
Hard resetting via RTS pin...
 
#################################################################################################

進(jìn)入到uPyLoader-master目錄,在命令行輸入python .\main.py啟動uPyLoader。

注意如果之前用串口連接了8266,要關(guān)閉之前的連接。這樣uPyLoader才能找到對應(yīng)的串口。

點(diǎn)擊最右邊的「Connect」即可連接。接下來,菜單欄->「File」->「Init transfer files」。初始化傳輸文件,初始化成功后在MCU端會新增__upload.py和__download.py兩個文件。另外,在菜單欄->「View」下面可以打開終端(Terminal)和編輯器(Code Editor),方便調(diào)試和代碼編寫。

因?yàn)閡PyLoader似乎無法跳轉(zhuǎn)到工作目錄以外的目錄,所以可以在該目錄下創(chuàng)建一個project文件夾,然后把自己的工程代碼(main.py等)放進(jìn)去,方便管理。

需要傳輸文件過去的話,只需要雙擊對應(yīng)的py文件,然后點(diǎn)擊「MCU name」后面的「Transfer」,等待彈窗結(jié)束后,文件就下載過去了。

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

uPyLoader 容易crash。建議還是使用MicroPython File Uploader.exe 會比較穩(wěn)定點(diǎn)。大家可以百度或者google搜索這個工具。大家給去下載 TPYBoard v202資料 資料包里有相應(yīng)的測試代碼和MicroPython File Uploader 工具。

打開MicroPython File Uploader 工具,Open連上開發(fā)板。選擇要傳送的程序文件。點(diǎn)擊Send即可。注意把“Autorun“勾選去掉。如果不去掉,每次發(fā)送完文件后會自動復(fù)位。

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

接下來可以通過在工具命令行框里敲命令查詢文件列表

import os
os.listdir()

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

之外你還能使用調(diào)試串口工具teraterm-4.96 。直接發(fā)命令調(diào)試

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

MQTT服務(wù)器搭建

這里我使用了云服務(wù)器。阿里云百度云騰訊云都可以。我這里使用的是花了99元/年的騰訊云服務(wù)器。點(diǎn)擊鏈接 騰訊云服務(wù)器 選擇好配置購買就可以了。

我的主機(jī)配置是

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

系統(tǒng)是centos 7.6 64位的。

yum -y install unzip
mkdir -p /root/mqtt-server && cd /root/mqtt-server
wget https://www.emqx.io/downloads/broker/v2.3.11/emqttd-centos7-v2.3.11.zip
unzip emqttd-centos7-v2.3.11.zip

配置系統(tǒng)環(huán)境變量

> vim /etc/profile
 
# emqtt
export EMQPATH=/root/mqtt-server/emqttd
export PATH=$EMQPATH/bin:$PATH
 
> source /etc/profile

檢查emq是否正常

> emqttd console
## 如下輸出代表正常
starting emqttd on node 'emq@127.0.0.1'
emqttd ctl is starting...[ok]
emqttd hook is starting...[ok]
emqttd router is starting...[ok]
emqttd pubsub is starting...[ok]
emqttd stats is starting...[ok]
emqttd metrics is starting...[ok]
emqttd pooler is starting...[ok]
emqttd trace is starting...[ok]
emqttd client manager is starting...[ok]
emqttd session manager is starting...[ok]
emqttd session supervisor is starting...[ok]
emqttd wsclient supervisor is starting...[ok]
emqttd broker is starting...[ok]
emqttd alarm is starting...[ok]
emqttd mod supervisor is starting...[ok]
emqttd bridge supervisor is starting...[ok]
emqttd access control is starting...[ok]
emqttd system monitor is starting...[ok]
emqttd 2.3.11 is running now
Eshell V9.0  (abort with ^G)
(emq@127.0.0.1)1> Load emq_mod_presence module successfully.
dashboard:http listen on 0.0.0.0:18083 with 4 acceptors.
mqtt:tcp listen on 127.0.0.1:11883 with 4 acceptors.
mqtt:tcp listen on 0.0.0.0:1883 with 64 acceptors.
mqtt:ws listen on 0.0.0.0:8083 with 4 acceptors.
mqtt:ssl listen on 0.0.0.0:8883 with 16 acceptors.
mqtt:wss listen on 0.0.0.0:8084 with 4 acceptors.
mqtt:api listen on 0.0.0.0:8080 with 4 acceptors.

啟動EMQ服務(wù)

> emqttd start
emqttd 2.3.11 is started successfully!
 
> emqttd_ctl status
Node 'emq@127.0.0.1' is started
emqttd 2.3.11 is running

當(dāng)我們啟動了EMQ之后就可以使用客戶端進(jìn)鏈接了,端口如下

  • 1883 MQTT 協(xié)議端口

  • 8883 MQTT/SSL 端口

  • 8083 MQTT/WebSocket 端口

  • 8080 HTTP API 端口

  • 18083 Dashboard 管理控制臺端口

通過IP訪問18083端口可以通過Dashboard在線觀察EMQ的運(yùn)行狀態(tài)等參數(shù)

默認(rèn)用戶: admin,密碼:public (可在平臺中配置用戶)

MicroPython的MQTT

MicroPython是支持MQTT客戶端的,在Github的micropython-lib中,找到umqtt.simple文件夾,里面就有使用MQTT接口的例程。在ESP8266的MicroPython官方API文檔中,并沒有給出這個接口的介紹,所以需要到搜索下相關(guān)資料。

進(jìn)入umqtt.simple目錄,把umqtt文件夾中的simple.py文件下載到ESP8266。

增加代碼如下:

mqtt.py

from simple import MQTTClient
from machine import Pin
import machine,time, math
import micropython
#選擇G4引腳
led_blue = machine.PWM(machine.Pin(2), freq=1000)  # 設(shè)置 GPIO2 為輸出
led_blue.duty(1024)
# MQTT服務(wù)器地址域名為:49.235.173.142,不變
SERVER = "49.235.173.142"
#設(shè)備ID
CLIENT_ID = "umqtt_client"
#隨便起個名字
TOPIC = b"ledctl"
TOPIC2 = b"pwmled"
TOPIC3 = b"ledstatus"
username="123123"
password="321321"
pwm_old = 0
pwmval = 0
c=None
 
def delay(t):
    for i in range(t):
    k=0;
 
def sub_cb(topic, msg):
    global pwm_old,pwmval
    if topic == b"ledctl":
        print((topic, msg))
        if msg == b"on":
                pwmval = 0
 
        elif msg == b"off":
                led_blue.duty(1024)
                pwmval = 1024;
 
    if topic == b"pwmled":
        pwmval = int(((100-int(msg))/100)*1024)
        print((topic, pwmval))
 
 
def main(server=SERVER):
    #端口號為:6002
    c = MQTTClient(CLIENT_ID, server)
    c.set_callback(sub_cb)
    c.connect()
    c.subscribe(TOPIC)
    c.subscribe(TOPIC2)   
    print("Connected to %s, subscribed to %s topic" % (server, TOPIC))
    try:
        while 1:
            c.wait_msg()
            global pwm_old,pwmval
 
            if pwmval == 1024 :
                c.publish(TOPIC3,'ledoff')
            elif pwmval < 1024 :
                c.publish(TOPIC3,'ledon');
 
            if pwmval > pwm_old :
                for i in range(pwm_old,pwmval,1):
                    led_blue.duty(i)
                    delay(30)
            elif pwmval < pwm_old :
                for i in range(pwm_old,pwmval,-1):
                    led_blue.duty(i)
                    delay(30)
            pwm_old = pwmval
 
    finally:
            c.disconnect()
main.py

from machine import Timer,Pin,I2C,SPI
import machine,mqtt
import dht,ssd1306,math,time
 
def f(t):
    d=dht.DHT11(machine.Pin(0))
    d.measure()
    a=d.temperature()
    b=d.humidity()
    display.fill(0)
    display.text('TPYBoard V202',1,1)
    display.text('Hi, TurnipSmart',1,16)   
    temp = 'Temp '+str(a)+'C'
    display.text(temp,1,31)
    humi = 'humidity '+ str(b)+'%'
    display.text(humi,1,46)
    display.show()   
 
spi = SPI(baudrate=10000000, polarity=1, phase=0, sck=Pin(14,Pin.OUT), mosi=Pin(13,Pin.OUT), miso=Pin(12))
display = ssd1306.SSD1306_SPI(128, 64, spi, Pin(5),Pin(4), Pin(16))
 
tim = Timer(-1)  #新建一個虛擬定時器
tim.init(period=2000, mode=Timer.PERIODIC, callback=f)
 
try:
  display.poweron()
  display.init_display()
 
  display.text('TPYBoard V202',1,1)
  display.text('Hi, TurnipSmart',1,16)
  temp = 'Temp '+str(18)+'C'
  display.text(temp,1,31)
  humi = 'humidity '+str(70)+'%'
  display.text(humi,1,46)
  mqtt.main()
 
except Exception as ex:
  print('Unexpected error: {0}'.format(ex))
  display.poweroff()
boot.py

def do_connect():
        import network
        sta_if = network.WLAN(network.STA_IF)
        ap_if = network.WLAN(network.AP_IF)
        if ap_if.active():
                ap_if.active(False)
        if not sta_if.isconnected():
                print('connecting to network...')
        sta_if.active(True)
        sta_if.connect('mqtt-server', '123456') #wifi的SSID和密碼
        while not sta_if.isconnected():
                pass
        print('network config:', sta_if.ifconfig())
do_connect()

Android的MQTT應(yīng)用

網(wǎng)上已經(jīng)有APP(IoT MQTT Panel)基于MQTT協(xié)議,實(shí)現(xiàn)對NodeMCU的控制。

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

提示沒有連接,點(diǎn)那個紅色按鈕創(chuàng)建一個連接:
基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

前兩項(xiàng)都是隨便填的,值得注意的的是那個Broker Web/IP Address,這個最好自己架個服務(wù)器,可以是上面搭建騰訊云服務(wù)器,也可以是本地搭建的服務(wù)器,當(dāng)然這里做個例子,填完后點(diǎn)那個CREATE:

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

分別添加了Switch,Slider和LED Indicator面板。

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器基于ESP8266的MicroPython怎么連接MQTT服務(wù)器基于ESP8266的MicroPython怎么連接MQTT服務(wù)器基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

這理解釋下:Topic可以理解為一個通道,比如開關(guān),按下后會往ledctl這個通道里發(fā)ledon這個信息,再按一下會往ledctl通道里發(fā)ledoff這個信息,最終界面如下:

基于ESP8266的MicroPython怎么連接MQTT服務(wù)器基于ESP8266的MicroPython怎么連接MQTT服務(wù)器

感謝各位的閱讀,以上就是“基于ESP8266的MicroPython怎么連接MQTT服務(wù)器”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對基于ESP8266的MicroPython怎么連接MQTT服務(wù)器這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI