【点灯鼠教程】[Maixpy]+[vofa+]实现K210串口图传【POST提交图片】【使用requests】

写在前面:本篇是图传部分的最后一章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

搬运请注明原文地址

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值