ESPNow是一種輕量級的無線通信協(xié)議,適用于ESP32芯片,它可以實(shí)現(xiàn)低功耗、高效率的設(shè)備間通訊,不需要路由器,也不需要wifi,同時,在使用ESPNow的時候不影響wifi 和藍(lán)牙。
在文章中,我們將學(xué)習(xí)如何在Micropython環(huán)境下使用ESP32的ESPNow功能進(jìn)行數(shù)據(jù)傳輸。ESPNOW支持一對一,一對多,多對多的各種通訊方式,在這里不做更多的說明。
準(zhǔn)備工作
在開始之前,確保你已經(jīng)做好了以下準(zhǔn)備工作:
1.安裝Micropython固件到ESP32模塊上(1.20.0 以后的版本)。
2.確保你有兩個或更多的ESP32模塊,它們將用于數(shù)據(jù)通訊(我用的兩塊ESP32-S3進(jìn)行的測試,實(shí)際ESP8266也是支持的,但是某些函數(shù)略有差異)。
獲取ESP32的MAC地址
ESPNOW發(fā)送數(shù)據(jù)需要知道目標(biāo)ESP32的MAC地址。有兩種簡單的方法獲取MAC地址,一種是在燒錄完成后可以看到,另一個是通過程序來獲得
在上圖中燒錄完成后可以看到AP和STA狀態(tài)下的MAC地址
下面是通過代碼獲取MAC地址的方法:
獲取到MAC地址后,一切都簡單了,當(dāng)然,還有一種不獲取MAC地址的方法就是廣播0xFF*6的方式,廢話不多說,直接上代碼
發(fā)送端
import network
import espnow
import time
sta = network.WLAN(network.STA_IF) # Enable station mode for ESP
sta.active(True)
sta.disconnect() # Disconnect from last connected WiFi SSID
e = espnow.ESPNow() # Enable ESP-NOW
e.active(True)
peer1 = b'x34x85x18x90x86x38' # MAC address of peer1's wifi interface
e.add_peer(peer1) # add peer1 (receiver1)
#如果有多個接收都就在這下面接著增加peer2...
print("Starting...") # Send to all peers
def main():
while True:
e.send(peer1, "這是Slave發(fā)送過來的數(shù)據(jù)", True) # send commands to pear 1
time.sleep(2)
if __name__ == "__main__":
main()
代碼很簡單,直接官方代碼小改,注意使用時改MAC地址即可。
#### 接收端的代碼
import network
import espnow
# A WLAN interface must be active to send()/recv()
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.disconnect() # Disconnect from last connected WiFi SSID
e = espnow.ESPNow() # Enable ESP-NOW
e.active(True)
peer = b'x34x85x18x46x3dx28' # MAC address of peer's wifi interface
#這個MAC地址是發(fā)送端的
e.add_peer(peer) # Sender's MAC registration
def espnow_rx():
while True:
host, msg = e.recv()
if msg: # wait for message
print(msg)
if __name__ == "__main__":
espnow_rx()
代碼簡單,不多贅述,注冊完設(shè)備后就收發(fā)信息即可。
通過以上步驟,你就可以在Micropython環(huán)境下使用ESPNow進(jìn)行簡單而高效的數(shù)據(jù)通訊了。記得根據(jù)你的實(shí)際需求調(diào)整代碼和配置信息。
幾個說明
在Micropython控制硬件主要就分幾步走,首先導(dǎo)入相關(guān)的庫,然后構(gòu)建對象,接下來定義相關(guān)的函數(shù),最后調(diào)用定義好的函數(shù)。
1.在這里,導(dǎo)入espnow之后,先實(shí)例化一個對象并激活。
2.在使用espnow收發(fā)數(shù)據(jù)之前必須先啟用Network.STA_IF或者Network.AP_IF,如果不需要wifi轉(zhuǎn)發(fā)那就不需要連接或者配置
3.ESPNow.send(mac,msg)注意消息發(fā)送消息長度不大于250bytes,如是長度大于250bytes時切包再合包。
4.ESPNow.recv([timeout_ms])接收數(shù)據(jù)
5.ESPNow.any()檢查數(shù)據(jù)是否可用
6.其它函數(shù)簡說:
ESPNow.set_pmk(pmk) 設(shè)置用于加密本地主密鑰的主密鑰 (PMK) 用于加密消息的密鑰 (LMK)。如果未設(shè)置,則默認(rèn) PMK 為 由底層樂鑫 ESP-NOW 軟件堆棧使用
ESPNow.add_peer(mac[, lmk][, channel][, ifidx][, encrypt])
ESPNow.add_peer(mac, param=value, …)
添加/注冊提供的 mac 地址作為對等方。其他參數(shù)可以 也被指定為位置或關(guān)鍵字參數(shù)(任何設(shè)置為 的參數(shù)都將設(shè)置為其默認(rèn)值)
ESPNow.del_peer(mac) 取消注冊與提供的 mac 地址關(guān)聯(lián)的對等方
ESPNow.get_peer(mac) (ESP32 only) 已注冊的對等體上轉(zhuǎn)換信息
ESPNow.get_peers() (ESP32 only) 返回所有已注冊對等方的“對等信息”參數(shù)(作為元組 元組)。
ESPNow.peer_count() (ESP32 only) 查看已注冊對等方的數(shù)量
ESPNow.mod_peer(mac, lmk, [channel], [ifidx], [encrypt]) (ESP32 only) ESPNow.mod_peer(mac, ‘param’=value, …) (ESP32 only)
修改與提供的 mac 地址關(guān)聯(lián)的對等方的參數(shù)。參數(shù)可以作為位置或關(guān)鍵字參數(shù)提供 (請參閱)。任何未設(shè)置(或設(shè)置為 )的參數(shù)都將保留該參數(shù)的現(xiàn)有值。
ESPNow.irq(callback) (ESP32 only)
設(shè)置回調(diào)函數(shù),在消息有消息后盡快調(diào)用 從另一個 ESPNow 設(shè)備接收。將調(diào)用回調(diào)函數(shù) 以實(shí)例對象作為參數(shù)。
為了更可靠的運(yùn)行, 建議在以下情況下讀出盡可能多的可用消息 調(diào)用回調(diào)并將讀取超時設(shè)置為零,例如:
def recv_cb(e):
while True: # Read out all messages waiting in the buffer
mac, msg = e.irecv(0) # Don't wait if no messages left
if mac is None:
return
print(mac, msg)
e.irq(recv_cb)
廣播消息的方法:
bcast = b'xff' * 6
e.add_peer(bcast)
e.send(bcast, "Hello World!")
-
無線通信
+關(guān)注
關(guān)注
58文章
4608瀏覽量
143955 -
路由器
+關(guān)注
關(guān)注
22文章
3746瀏覽量
114548 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
87瀏覽量
11626 -
ESP32
+關(guān)注
關(guān)注
18文章
980瀏覽量
17566 -
Micropython
+關(guān)注
關(guān)注
0文章
68瀏覽量
4805
發(fā)布評論請先 登錄
相關(guān)推薦
評論