MicroPython是為了在嵌入式系統(tǒng)中運行Python 3編程語言而設(shè)計的輕量級版本解釋器。與常規(guī)Python相比,MicroPython解釋器體積小(僅100KB左右),通過編譯成二進制Executable文件運行,執(zhí)行效率較高。它使用了輕量級的垃圾回收機制并移除了大部分Python標(biāo)準(zhǔn)庫,以適應(yīng)資源限制的微控制器。
MicroPython主要特點包括:
1、語法和功能與標(biāo)準(zhǔn)Python兼容,易學(xué)易用。支持Python大多數(shù)核心語法。
2、對硬件直接訪問和控制,像Arduino一樣控制GPIO、I2C、SPI等。
3、強大的模塊系統(tǒng),提供文件系統(tǒng)、網(wǎng)絡(luò)、圖形界面等功能。
4、支持交叉編譯生成高效的原生代碼,速度比解釋器快10-100倍。
5、代碼量少,內(nèi)存占用小,適合運行在MCU和內(nèi)存小的開發(fā)板上。
6、開源許可,免費使用。Shell交互環(huán)境為開發(fā)測試提供便利。
7、內(nèi)置I/O驅(qū)動支持大量微控制器平臺,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活躍的社區(qū)。
MicroPython的應(yīng)用場景包括:
1、為嵌入式產(chǎn)品快速構(gòu)建原型和用戶交互。
2、制作一些小型的可 programmable 硬件項目。
3、作為教育工具,幫助初學(xué)者學(xué)習(xí)Python和物聯(lián)網(wǎng)編程。
4、構(gòu)建智能設(shè)備固件,實現(xiàn)高級控制和云連接。
5、各種微控制器應(yīng)用如物聯(lián)網(wǎng)、嵌入式智能、機器人等。
使用MicroPython需要注意:
1、內(nèi)存和Flash空間有限。
2、解釋執(zhí)行效率不如C語言。
3、部分庫函數(shù)與標(biāo)準(zhǔn)版有差異。
4、針對平臺優(yōu)化語法,訂正與標(biāo)準(zhǔn)Python的差異。
5、合理使用內(nèi)存資源,避免頻繁分配大內(nèi)存塊。
6、利用原生代碼提升速度關(guān)鍵部位的性能。
7、適當(dāng)使用抽象來封裝底層硬件操作。
總體來說,MicroPython讓Python進入了微控制器領(lǐng)域,是一項重要的創(chuàng)新,既降低了編程門檻,又提供了良好的硬件控制能力。非常適合各類物聯(lián)網(wǎng)和智能硬件的開發(fā)。
MicroPython的內(nèi)置模塊urequests是一個用于進行HTTP請求的模塊,它實現(xiàn)了CPython模塊的一個子集,但也有一些特殊的特點和限制。本文將從以下幾個方面介紹urequests模塊的主要特點、應(yīng)用場景,以及需注意事項,并給出幾個實際運用程序案例。
主要特點
1、urequests模塊提供了一個Request類,用于封裝HTTP請求的方法、URL、頭部、數(shù)據(jù)等信息,以及一個Response類,用于封裝HTTP響應(yīng)的狀態(tài)碼、頭部、內(nèi)容等信息。
2、urequests模塊提供了一個get函數(shù),用于發(fā)送GET請求,以及一個post函數(shù),用于發(fā)送POST請求。這兩個函數(shù)都接受一個URL參數(shù),以及可選的headers參數(shù)和data參數(shù)。headers參數(shù)是一個字典,用于指定請求頭部的字段和值。data參數(shù)是一個字節(jié)串或字符串,用于指定請求體的內(nèi)容。這兩個函數(shù)都返回一個Response對象,或者在出錯時引發(fā)異常。
3、urequests模塊還提供了一個put函數(shù),用于發(fā)送PUT請求,以及一個delete函數(shù),用于發(fā)送DELETE請求。這兩個函數(shù)的參數(shù)和返回值與get和post函數(shù)相同。
4、urequests模塊支持自動處理重定向(redirect)和壓縮(gzip)的響應(yīng),但不支持分塊(chunked)傳輸編碼的響應(yīng)。
urequests模塊使用socket模塊來實現(xiàn)底層的網(wǎng)絡(luò)通信,因此依賴于網(wǎng)絡(luò)接口的配置和連接狀態(tài)。
應(yīng)用場景
1、urequests模塊可以用于訪問Web服務(wù)器或API接口,獲取或發(fā)送數(shù)據(jù),例如獲取天氣信息、新聞資訊、股票行情等。
urequests模塊可以用于實現(xiàn)Web客戶端或爬蟲程序,解析或處理HTML、XML、JSON等格式的數(shù)據(jù),例如抓取網(wǎng)頁內(nèi)容、下載圖片或文件等。
2、urequests模塊可以用于與其他設(shè)備或平臺進行數(shù)據(jù)交互,實現(xiàn)遠程控制或監(jiān)控功能,例如控制智能家居設(shè)備、上傳傳感器數(shù)據(jù)等。
需注意事項
1、urequests模塊的功能和性能可能因不同的端口而異,因此在開發(fā)可移植的MicroPython應(yīng)用程序時,應(yīng)該盡量避免依賴特定的請求或響應(yīng)細節(jié)。
2、urequests模塊在發(fā)送和接收數(shù)據(jù)時可能會消耗較多的內(nèi)存和時間,因此在處理大量或復(fù)雜的數(shù)據(jù)時,應(yīng)該注意優(yōu)化代碼和資源管理。
3、urequests模塊在發(fā)送和接收數(shù)據(jù)時可能會遇到無效或不合法的URL、頭部、數(shù)據(jù)等參數(shù),或者網(wǎng)絡(luò)錯誤、超時、服務(wù)器錯誤等異常情況。這些情況會引發(fā)OSError或ValueError異常,并給出錯誤信息。應(yīng)該使用try-except語句來捕獲并處理這些異常。
實際運用程序案例
案例一:使用urequests模塊從Web服務(wù)器獲取天氣信息
import network
import ujson
import urequests
# 連接到WiFi網(wǎng)絡(luò)
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('SSID', 'PASSWORD')
while not sta_if.isconnected():
pass
# 從Web服務(wù)器獲取天氣信息
url = 'http://api.openweathermap.org/data/2.5/weather?q=Beijing&appid=YOUR_API_KEY'
response = urequests.get(url)
data = response.text
response.close()
# 使用ujson模塊解析天氣信息
weather = ujson.loads(data)
print('城市:', weather['name'])
print('溫度:', weather['main']['temp'] - 273.15, '℃')
print('濕度:', weather['main']['humidity'], '%')
print('天氣:', weather['weather'][0]['description'])
案例二:使用urequests模塊向Web服務(wù)器發(fā)送傳感器數(shù)據(jù)
import machine
import network
import urequests
# 創(chuàng)建一個ADC對象,連接到引腳34(ESP32板上的內(nèi)置溫度傳感器)
adc = machine.ADC(machine.Pin(34))
# 連接到WiFi網(wǎng)絡(luò)
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('SSID', 'PASSWORD')
while not sta_if.isconnected():
pass
# 向Web服務(wù)器發(fā)送傳感器數(shù)據(jù)
url = 'http://example.com/api/sensor'
headers = {'Content-Type': 'application/json'}
while True:
# 讀取ADC值并轉(zhuǎn)換為溫度值
value = adc.read()
temp = (value - 500) / 10
print('溫度:', temp, '℃')
# 將溫度值作為JSON數(shù)據(jù)發(fā)送到Web服務(wù)器
data = '{"temp": ' + str(temp) + '}'
response = urequests.post(url, headers=headers, data=data)
print('響應(yīng):', response.status_code, response.text)
response.close()
案例三:使用urequests模塊下載圖片并顯示在OLED屏幕上
import network
import framebuf
import ssd1306
import urequests
# 創(chuàng)建一個I2C對象,連接到引腳21(SDA)和22(SCL)
i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21))
# 創(chuàng)建一個SSD1306對象,連接到OLED屏幕,分辨率為128x64
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# 連接到WiFi網(wǎng)絡(luò)
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('SSID', 'PASSWORD')
while not sta_if.isconnected():
pass
# 下載圖片并顯示在OLED屏幕上
url = 'http://example.com/image.bmp'
response = urequests.get(url)
data = response.content
response.close()
# 將圖片數(shù)據(jù)轉(zhuǎn)換為幀緩沖對象,格式為1位黑白,大小為128x64
fb = framebuf.FrameBuffer(data, 128, 64, framebuf.MONO_HLSB)
# 將幀緩沖對象繪制到OLED屏幕上,并顯示出來
oled.blit(fb, 0, 0)
oled.show()
案例四:發(fā)送HTTP GET請求:
import urequests
# 發(fā)送GET請求
response = urequests.get("https://api.example.com/data")
# 獲取響應(yīng)內(nèi)容
content = response.text
# 打印響應(yīng)內(nèi)容
print("Response:", content)
在這個示例中,我們使用urequests模塊的get()函數(shù)發(fā)送HTTP GET請求。我們提供目標(biāo)URL作為參數(shù),并將返回的響應(yīng)對象存儲在response變量中。然后,我們使用text屬性獲取響應(yīng)內(nèi)容,并打印出來。
案例五:發(fā)送HTTP POST請求:
import urequests
# POST請求數(shù)據(jù)
data = {
"name": "John",
"age": 30
}
# 發(fā)送POST請求
response = urequests.post("https://api.example.com/data", json=data)
# 獲取響應(yīng)內(nèi)容
content = response.text
# 打印響應(yīng)內(nèi)容
print("Response:", content)
在這個示例中,我們使用urequests模塊的post()函數(shù)發(fā)送HTTP POST請求。我們提供目標(biāo)URL和要發(fā)送的數(shù)據(jù)作為參數(shù),并將返回的響應(yīng)對象存儲在response變量中。在這里,我們將一個包含姓名和年齡的字典作為JSON數(shù)據(jù)發(fā)送。然后,我們使用text屬性獲取響應(yīng)內(nèi)容,并打印出來。
案例六:發(fā)送帶有請求頭的HTTP請求:
import urequests
# 請求頭
headers = {
"User-Agent": "MicroPython",
"Content-Type": "application/json"
}
# 發(fā)送帶有請求頭的請求
response = urequests.get("https://api.example.com/data", headers=headers)
# 獲取響應(yīng)內(nèi)容
content = response.text
# 打印響應(yīng)內(nèi)容
print("Response:", content)
在這個示例中,我們使用urequests模塊發(fā)送HTTP請求,并附帶自定義的請求頭。我們將請求頭作為一個字典傳遞給請求函數(shù)的headers參數(shù)。在這里,我們設(shè)置了User-Agent和Content-Type請求頭字段。然后,我們使用text屬性獲取響應(yīng)內(nèi)容,并打印出來。這些實際運用程序案例展示了使用MicroPython內(nèi)置模塊urequests的功能。通過使用urequests模塊,可以發(fā)送HTTP請求,包括GET和POST請求,并可以附帶請求頭和數(shù)據(jù)。這對于與Web API進行數(shù)據(jù)交互、訪問遠程資源等場景非常有用。
案例七:發(fā)送 GET 請求
import urequests
# 發(fā)送 GET 請求
response = urequests.get("https://api.example.com/data")
# 打印響應(yīng)內(nèi)容
print("響應(yīng)內(nèi)容:", response.text)
# 關(guān)閉響應(yīng)
response.close()
在這個例子中,我們使用 urequests.get() 函數(shù)發(fā)送一個 GET 請求到指定的 URL。獲取到的響應(yīng)存儲在 response 變量中。我們可以使用 response.text 屬性來獲取響應(yīng)內(nèi)容,并將其打印出來。最后,我們使用 response.close() 方法關(guān)閉響應(yīng)。
案例八:發(fā)送 POST 請求
import urequests
# 發(fā)送 POST 請求
payload = {"name": "Alice", "age": 25}
response = urequests.post("https://api.example.com/data", json=payload)
# 打印響應(yīng)內(nèi)容
print("響應(yīng)內(nèi)容:", response.text)
# 關(guān)閉響應(yīng)
response.close()
在這個例子中,我們使用 urequests.post() 函數(shù)發(fā)送一個 POST 請求到指定的 URL,并傳遞一個 JSON 數(shù)據(jù)作為請求的內(nèi)容。我們使用 json 參數(shù)來指定要發(fā)送的 JSON 數(shù)據(jù)。獲取到的響應(yīng)存儲在 response 變量中。我們可以使用 response.text 屬性來獲取響應(yīng)內(nèi)容,并將其打印出來。最后,我們使用 response.close() 方法關(guān)閉響應(yīng)。
案例九: 處理異常
import urequests
try:
# 發(fā)送請求
response = urequests.get("https://api.example.com/data")
# 檢查響應(yīng)狀態(tài)碼
if response.status_code == 200:
# 打印響應(yīng)內(nèi)容
print("響應(yīng)內(nèi)容:", response.text)
else:
print("請求失敗:", response.status_code)
# 關(guān)閉響應(yīng)
response.close()
except Exception as e:
print("發(fā)生異常:", e)
在這個例子中,我們使用 urequests.get() 函數(shù)發(fā)送一個 GET 請求,并使用 try…except 塊來捕獲可能發(fā)生的異常。在 try 塊中,我們發(fā)送請求并獲取響應(yīng)。然后,我們檢查響應(yīng)的狀態(tài)碼。如果狀態(tài)碼為 200,則表示請求成功,我們打印響應(yīng)內(nèi)容。否則,我們打印錯誤消息。最后,我們使用 response.close() 方法關(guān)閉響應(yīng)。如果發(fā)生異常,我們使用 except 塊來捕獲異常,并打印相關(guān)的錯誤信息。這些示例展示了使用 urequests 庫進行 HTTP 請求的實際應(yīng)用。請記住,在使用 urequests 之前,你需要將其安裝到 MicroPython 設(shè)備上。文章來源:http://www.zghlxwxcb.cn/news/detail-798738.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-798738.html
到了這里,關(guān)于【雕爺學(xué)編程】MicroPython手冊之內(nèi)置模塊 urequests:發(fā)送 HTTP 請求和處理響應(yīng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!