1. 前言
??在這個(gè)智能硬件和物聯(lián)網(wǎng)時(shí)代,MicroPython和樹莓派PICO正以其獨(dú)特的優(yōu)勢引領(lǐng)著嵌入式開發(fā)的新潮流。MicroPython作為一種精簡優(yōu)化的Python 3語言,為微控制器和嵌入式設(shè)備提供了高效開發(fā)和簡易調(diào)試的
??當(dāng)我們結(jié)合WIZnet W5100S/W5500網(wǎng)絡(luò)模塊,MicroPython和樹莓派PICO的開發(fā)潛力被進(jìn)一步放大。這兩款模塊都內(nèi)置了TCP/IP協(xié)議棧,使得在嵌入式設(shè)備上實(shí)現(xiàn)網(wǎng)絡(luò)連接變得更加容易。無論是進(jìn)行數(shù)據(jù)傳輸、遠(yuǎn)程控制,還是構(gòu)建物聯(lián)網(wǎng)應(yīng)用,它們都提供了強(qiáng)大的支持。
??本章我們將以WIZnet W5100S為例,以MicroPython的開發(fā)方式,連接至OneNET的HTTP服務(wù)器上,并定時(shí)通過POST上傳DHT11溫濕度傳感器采集的溫濕度信息,再通過GET獲取溫濕度信息。
2. 平臺(tái)操作流程
2.1 創(chuàng)建設(shè)備
??首先進(jìn)入開發(fā)者中心,在多協(xié)議接入的HTTP界面下創(chuàng)建好產(chǎn)品以及設(shè)備,然后添加apikey。
注意:如果您登錄之后并沒有多協(xié)議接入這個(gè)選項(xiàng),則需先進(jìn)行實(shí)名認(rèn)證。
2.2 創(chuàng)建數(shù)據(jù)流模板
在數(shù)據(jù)流模板界面創(chuàng)建溫度和濕度的數(shù)據(jù)流模板。
3. WIZnet以太網(wǎng)芯片
WIZnet 主流硬件協(xié)議棧以太網(wǎng)芯片參數(shù)對(duì)比
Model | Embedded Core | Host I/F | TX/RX Buffer | HW Socket | Network Performance |
---|---|---|---|---|---|
W5100S | TCP/IPv4, MAC & PHY | 8bit BUS, SPI | 16KB | 4 | Max 25Mbps |
W6100 | TCP/IPv4/IPv6, MAC & PHY | 8bit BUS, Fast SPI | 32KB | 8 | Max 25Mbps |
W5500 | TCP/IPv4, MAC & PHY | Fast SPI | 32KB | 8 | Max 15Mbps |
- W5100S/W6100 支持 8bit數(shù)據(jù)總線接口,網(wǎng)絡(luò)傳輸速度會(huì)優(yōu)于W5500。
- W6100 支持IPV6,與W5100S 硬件兼容,若已使用W5100S的用戶需要支持IPv6,可以Pin to Pin兼容。
- W5500 擁有比 W5100S更多的 Socket數(shù)量以及發(fā)送與接收緩存
相較于軟件協(xié)議棧,WIZnet的硬件協(xié)議棧以太網(wǎng)芯片有以下優(yōu)點(diǎn):
- 硬件TCP/IP協(xié)議棧:WIZnet的硬件協(xié)議棧芯片提供了一種硬件實(shí)現(xiàn)的TCP/IP協(xié)議棧,這種硬件實(shí)現(xiàn)的協(xié)議棧比軟件實(shí)現(xiàn)的協(xié)議棧具有更好的性能和穩(wěn)定性。
- 不需要額外的嵌入式系統(tǒng)軟件棧和內(nèi)存資源:由于所有的以太網(wǎng)傳輸和接收操作都由獨(dú)立的以太網(wǎng)控制器處理,因此不需要額外的嵌入式系統(tǒng)軟件棧和內(nèi)存資源。
- 抵抗網(wǎng)絡(luò)環(huán)境變化和DDoS攻擊:與易受網(wǎng)絡(luò)環(huán)境變化和DDoS攻擊影響的軟件TCP/IP協(xié)議棧相比,硬件協(xié)議棧芯片能夠提供更穩(wěn)定的以太網(wǎng)性能。
- 適用于低規(guī)格的嵌入式系統(tǒng):即使在低規(guī)格的嵌入式系統(tǒng)中,使用WIZnet的硬件協(xié)議棧芯片也可以比使用軟件TCP/IP協(xié)議棧的高規(guī)格系統(tǒng)顯示出更高效的互聯(lián)網(wǎng)應(yīng)用操作性能。
4. 示例講解以及使用
4.1 程序流程圖
4.2 測試準(zhǔn)備
軟件:
- Thonny
- OneNET平臺(tái)
硬件:
- W5100S IO模塊 + RP2040 樹莓派Pico開發(fā)板 或者 WIZnet W5100S-EVB-Pico開發(fā)板
- DHT11溫濕度傳感器
- Micro USB 接口的數(shù)據(jù)線
- 網(wǎng)線
4.3 連接方式
- 通過數(shù)據(jù)線連接PC的USB口
- 當(dāng)使用W5100S/W5500 IO模塊連接RP2040時(shí)
- RP2040 GPIO 16 <----> W5100S/W5500 MISO
- RP2040 GPIO 17 <----> W5100S/W5500 CS
- RP2040 GPIO 18 <----> W5100S/W5500 SCK
- RP2040 GPIO 19 <----> W5100S/W5500 MOSI
- RP2040 GPIO 20 <----> W5100S/W5500 RST
- DHT11連接RP2040
- RP2040 GPIO 2 <----> DHT11 data
- RP2040 3V3 <----> DHT11 VCC
- RP2040 GND <----> DHT11 GND
- 通過網(wǎng)線直接連接PC網(wǎng)口(或:PC和設(shè)備都通過網(wǎng)線連接交換機(jī)或路由器LAN口)
4.4 相關(guān)代碼
??我們直接打開http_client.onenet.py文件。
第一步:可以看到在w5x00_init()函數(shù)中,進(jìn)行了SPI的初始化。以及將spi相關(guān)引腳和復(fù)位引腳注冊(cè)到庫中,后續(xù)則是激活網(wǎng)絡(luò),并使用DHCP配置網(wǎng)絡(luò)地址信息,當(dāng)DHCP失敗時(shí),則配置靜態(tài)網(wǎng)絡(luò)地址信息。當(dāng)未配置成功時(shí),會(huì)打印出網(wǎng)絡(luò)地址相關(guān)寄存器的信息,可以幫助我們更好的排查問題。
第二步:打開定時(shí)器,例程設(shè)定是5秒觸發(fā)一次。
第三步:觸發(fā)定時(shí)器之后,會(huì)進(jìn)入到request()函數(shù),在這個(gè)函數(shù)中,首先會(huì)進(jìn)行校準(zhǔn)傳感器,然后先通過POST的方式把溫濕度信息上傳到平臺(tái)上,再通過GET的方式獲取剛剛上傳的溫濕度信息,再通過串口打印出來。
需注意:要將程序中的apiaddress替換成您的HTTP api地址,將apikey替換成您的HTTP APIKey
from usocket import socket
from machine import Pin,SPI,Timer
import dht
import urequests
import network
import time
#Timer-related definitions
message_interval = 5
timer_1s_count = 0
tim = Timer()
#HTTP of OneNET
apiaddress = "http://api.heclouds.com/devices/1168040732"
apikey = "fh=hneBwiD6m4o4X==1u=Q6HXp8="
#DHT11 definitions
pin = Pin(2,Pin.OUT)
sensor = dht.DHT11(pin)
"""
W5x00 chip initialization.
param: None
returns: None
"""
def w5x00_init():
spi=SPI(0,2_000_000, mosi=Pin(19),miso=Pin(16),sck=Pin(18))
nic = network.WIZNET5K(spi,Pin(17),Pin(20)) #spi,cs,reset pin
nic.active(True)
try:
#DHCP
print("\r\nConfiguring DHCP")
nic.ifconfig('dhcp')
except:
#None DHCP
print("\r\nDHCP fails, use static configuration")
nic.ifconfig(('192.168.1.20','255.255.255.0','192.168.1.1','8.8.8.8'))#Set static network address information
#Print network address information
print("IP :",nic.ifconfig()[0])
print("Subnet Mask:",nic.ifconfig()[1])
print("Gateway :",nic.ifconfig()[2])
print("DNS :",nic.ifconfig()[3],"\r\n")
#If there is no network connection, the register address information is printed
while not nic.isconnected():
time.sleep(1)
print(nic.regs())
"""
POST submission data and GET request data.
param: None
returns: None
"""
def request():
sensor.measure()
r= urequests.request('POST',apiaddress+'/datapoints',headers={"api-key":apikey},json={'datastreams':[{'id':'CurrentTemperature','datapoints':[{'value':sensor.temperature()}]},{'id':'CurrentHumidity','datapoints':[{'value':sensor.humidity()}]}]})
if not r:
print('spreadsheet: no response received')
print("\r\npost response:",r.json())
r = None
r = urequests.request('GET',apiaddress+'/datapoints',headers={"api-key":apikey})
if r.status_code == 200:
print("get request succ\r\n",r.text)
else:
print("get request error")
"""
1-second timer callback function.
param1: class timer
returns: None
"""
def tick(timer):
global timer_1s_count
timer_1s_count += 1
if timer_1s_count >= message_interval:
timer_1s_count = 0
request()
def main():
print("WIZnet chip HTTP Client of OneNET example")
w5x00_init()
tim.init(freq=1, callback=tick)
while True:
time.sleep(1)
if __name__ == "__main__":
main()
其中還需要用到urequests.py庫,代碼如下:
import usocket
class Response:
def __init__(self, f):
self.raw = f
self.encoding = "utf-8"
self._cached = None
def close(self):
if self.raw:
self.raw.close()
self.raw = None
self._cached = None
@property
def content(self):
if self._cached is None:
try:
self._cached = self.raw.recv(4096)
finally:
self.raw.close()
self.raw = None
return self._cached
@property
def text(self):
return str(self.content, self.encoding)
def json(self):
import ujson
return ujson.loads(self.content)
def request(method, url, data=None, json=None, headers={}, stream=None):
try:
proto, dummy, host, path = url.split("/", 3)
except ValueError:
proto, dummy, host = url.split("/", 2)
path = ""
if proto == "http:":
port = 80
elif proto == "https:":
import ussl
port = 443
else:
raise ValueError("Unsupported protocol: " + proto)
if ":" in host:
host, port = host.split(":", 1)
port = int(port)
ai = usocket.getaddrinfo(host, port, 0, usocket.SOCK_STREAM)
ai = ai[0]
s = usocket.socket(ai[0], ai[1], ai[2])
try:
s.connect(ai[-1])
if proto == "https:":
s = ussl.wrap_socket(s, server_hostname=host)
s.write(b"%s /%s HTTP/1.0\r\n" % (method, path))
if not "Host" in headers:
s.write(b"Host: %s\r\n" % host)
# Iterate over keys to avoid tuple alloc
for k in headers:
s.write(k)
s.write(b": ")
s.write(headers[k])
s.write(b"\r\n")
if json is not None:
assert data is None
import ujson
data = ujson.dumps(json)
s.write(b"Content-Type: application/json\r\n")
if data:
s.write(b"Content-Length: %d\r\n" % len(data))
s.write(b"\r\n")
if data:
s.write(data)
l = s.readline()
#print(l)
l = l.split(None, 2)
status = int(l[1])
reason = ""
if len(l) > 2:
reason = l[2].rstrip()
while True:
l = s.readline()
if not l or l == b"\r\n":
break
#print(l)
if l.startswith(b"Transfer-Encoding:"):
if b"chunked" in l:
raise ValueError("Unsupported " + l)
elif l.startswith(b"Location:") and not 200 <= status <= 299:
raise NotImplementedError("Redirects not yet supported")
except OSError:
s.close()
raise
resp = Response(s)
resp.status_code = status
resp.reason = reason
return resp
def head(url, **kw):
return request("HEAD", url, **kw)
def get(url, **kw):
return request("GET", url, **kw)
def post(url, **kw):
return request("POST", url, **kw)
def put(url, **kw):
return request("PUT", url, **kw)
def patch(url, **kw):
return request("PATCH", url, **kw)
def delete(url, **kw):
return request("DELETE", url, **kw)
4.5 燒錄驗(yàn)證
要測試以太網(wǎng)示例,必須將開發(fā)環(huán)境配置為使用Raspberry Pi Pico。
- 所需的開發(fā)環(huán)境
- Thonny
- 如果你必須編譯MicroPython,則必須使用Linux或Unix環(huán)境。
第一步:將程序復(fù)制到Thonny中,然后選擇環(huán)境為Raspberry Pi Pico
第二步:將urequests.py這個(gè)庫文件保存到樹莓派Pico開發(fā)板中
第二步:運(yùn)行http_client_onenet.py程序,可以在OneNET平臺(tái)上看到上報(bào)的傳感器信息。
注意:因?yàn)镸icroPython的print函數(shù)是啟用了stdout緩沖的,所以有時(shí)候并不會(huì)第一時(shí)間打印出內(nèi)容。
5. 注意事項(xiàng)
- 如果采用的是WIZnet的W5500來實(shí)現(xiàn)本章的示例,則只需燒錄W5500的固件并運(yùn)行示例程序即可。
6. 相關(guān)鏈接
WIZnet官網(wǎng)
本章例程鏈接文章來源:http://www.zghlxwxcb.cn/news/detail-774425.html
想了解更多,評(píng)論留言哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-774425.html
到了這里,關(guān)于九、W5100S/W5500+RP2040之MicroPython開發(fā)<HTTP&OneNET示例>的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!