写在前面:本篇是图传部分的最后一章PATH2,同时也是K210实现AIOT篇章的开始。本篇将主重分享k210使用requests模块的一些情况。
POST(requests)
引入requests
requests是micropyhton为了发挥ESP8266/ESP32等IOT单片机联网能力而提供的一个库。通过requests,可以实现HTTP/HTTPS的六种常用指令。
实际上在K210上,官方固件是不含requests模块的(毕竟K210自己没有网卡),相应的提供了一个名为MicroWebCli的库(需自行编译)考虑到代码通用性(micropython能使用官方库实现的代码,尽量不要用第三方代码——这与micropython的兼容性背道而驰),这里使用自行导入的requests库来实现。
使用requests构建post报文
requests提供了六种http方法,而它们都指向了request
函数:
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)
实际上这几种方法是没法上传数据的,因此我们从request
入手:
def request(method, url, data=None, json=None, headers={}, stream=None):
request提供了method,url,data,headers等我们需要的入口,因此我们就从这里下手:
method='POST'
url="http://192.168.137.1/photo/"
data=img.to_bytes()
headers={'FILENAME':'JPG'}
response = urequests.request(method=method,url=url,data=data,headers=headers)
由于Maixpy同样没有ussl模块,https在这里是没法使用的(已经在MicroWebCli模块中实现)
headers注意要用: ,来分割不同的自定义headers。如
headers={'ID':'123','PW':'12345678'}
注意,headers的成员需要大写,否则服务器无法正确识别。
测试
获取图片后,调用requests POST即可提交图片。同样可以使用urequest获取响应情况。
img=img = sensor.snapshot()
img = img.compressed(100)#压缩图片为jpg,质量为10%
data=img.to_bytes()
response = urequests.request(method=method,url=url,data=data,headers=headers)
print(response.status_code)
print(response.reason)
服务器响应:
JPG:
[14/Mar/2021 17:07:15] "POST /photo/ HTTP/1.0" 200 20
K210打印信息:
>>> init i2c2
[MAIXPY]: find ov2640
[MAIXPY]: find ov sensor
200
b'OK'
完整代码
# Untitled - By: Lithromantic - 周二 3月 9 2021
from fpioa_manager import fm
fm.register(10, fm.fpioa.UART1_TX, force=True)
fm.register(9, fm.fpioa.UART1_RX, force=True)
from machine import UART
import sensor, image, time,network
import socket
import urequests
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
ssid="1234"
key="11111111"
uart_A = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=8192)
net=network.ESP8285(uart_A)
net.disconnect()
net.connect(ssid, key)
method='POST'
url="http://192.168.137.1/photo/"
data=None
headers={'FILENAME':'JPG'}
while True:
img=img = sensor.snapshot()
img = img.compressed(100)#压缩图片为jpg,质量为10%
data=img.to_bytes()
response = urequests.request(method=method,url=url,data=data,headers=headers)
print(response.status_code)
print(response.reason)
print(response.text)
request使用交流
实际上在测试request时,我也相继测试了其他方法。但是在使用get时,接收的数据会乱码,可能是我外挂ESP01S网卡的原因。定位问题时,发现在sock .read()就出现了问题(见我另外一个帖子),所以request实际上正常使用。希望有板载网卡的回复下使用情况。
Maixpy实际上有json
接口的,所以实际上可以快速移植ESP32等单片机的Micropython项目的,直接部署物联网项目没有太大问题。
修复后的输出日志:
>>> init i2c2
[MAIXPY]: find ov2640
[MAIXPY]: find ov sensor
set baudrate=1152000...
200
b'OK'
ok,图片储存在:C:\Users\Lithromantic\Desktop\web\photo,图片名为:2021-03-15-10-30-00.JPG
最新的代码:
# Untitled - By: Lithromantic - 周二 3月 9 2021
from fpioa_manager import fm
fm.register(10, fm.fpioa.UART1_TX, force=True)
fm.register(9, fm.fpioa.UART1_RX, force=True)
from machine import UART
import sensor, image, time,network
import socket
import urequests
from setuart import setUART as SU
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.VGA)
sensor.skip_frames(time = 2000)
ssid="1234"
key="11111111"
method='POST'
url="http://192.168.137.1/photo/"
data=None
headers={'FILENAME':'JPG'}
def set_net(baudrate=1152000):
#wifi config
SU.setuart(baudrate,1)
uart = UART(UART.UART1,baudrate, timeout=1000, read_buf_len=10240)
net=network.ESP8285(uart)
net.disconnect()
net.connect(ssid, key)
#set_net(4096000)
while True:
img=img = sensor.snapshot()
img = img.compress(100)#压缩图片为jpg,质量为10%
data=img.to_bytes()
response = urequests.request(method=method,url=url,data=data,headers=headers)
print(response.status_code)
print(response.reason)
print(response.text)
使用说明
请参考外挂网卡一贴,重新设置ESP01S的波特率,实际情况下,115200会造成接收代码乱码。
文章来源于Sipeed点灯鼠,原文链接:https://bbs.sipeed.com/thread/554
搬运请注明原文地址