使用MicroPython开发ESP32(05):基础网络应用(socket & http requests)

目的

前文中讲了如何启用网络功能,这篇文章中接着讲一讲基本的网络通讯用法。

使用socket进行TCP/UDP通讯

MicroPython使用socket进行TCP/UDP通讯主要用到了usocket模块。

使用演示

UDP发送
在这里插入图片描述
UDP发送非常简单,声明socket对象、创建对方地址,然后就可以发消息了。

UDP接收
在这里插入图片描述
UDP接收只要声明了socket对象,然后绑定本地地址和端口号就可以等待别人发数据过来了。

TCP发送
在这里插入图片描述
TCP发送和UDP发送一样,主要区别在于声明socket对象时填入的参数不同。

TCP接收
在这里插入图片描述
TCP接收稍微复杂点,绑定完本地地址端口号后还需要开启监听。在有客户接入时还需要接收连接请求后才能收数据。

函数说明

  • usocket.getaddrinfo(host, port, af=0, type=0, proto=0, flags=0, /)
    输入域名与端口号或IP地址与端口号,返回usocket可用的地址格式,如下示例:
    sockaddr = usocket.getaddrinfo(‘www.micropython.org’, 80)[0][-1]
    sockaddr = usocket.getaddrinfo(‘127.0.0.1’, 80)[0][-1]

  • usocket.socket(af=AF_INET, type=SOCK_STREAM, proto=IPPROTO_TCP, /)
    socket对象构造函数
    af可选 AF_INETAF_INET6 分别表示ipv4和ipv6;
    type为socket类型,选 SOCK_STREAM 时会以TCP方式通讯,选 SOCK_DGRAM 时会以UDP方式通讯;
    proto选择以TCP还是UDP方式通讯,这里可以不用管,只要前面type选了这里会自动选择;

  • socket.close()
    关闭socket;

  • socket.bind(address)
    绑定socket监听的地址与端口号;

  • socket.listen([backlog])
    (TCP模式) socket作为服务器开启监听;

  • socket.accept()
    (TCP模式) 接受一个客户端连接请求,返回客户端socket对象与客户端地址的元组对象;

  • socket.connect(address)
    连接到远程地址;

  • socket.send(bytes)
    发送数据(必须先连接到某个地址),返回发送字节数;

  • socket.sendto(bytes, address)
    向某个地址发送数据,返回发送字节数;

  • socket.sendall(bytes)
    推荐使用write()方法代替;

  • socket.recv(bufsize)
    读取数据,bufsize为读取最大长度;

  • socket.recvfrom(bufsize)
    读取数据与数据源地址,bufsize为读取最大长度;

  • socket.setsockopt(level, optname, value)
    设定socket参数选项;

  • socket.settimeout(value)
    设置超时(单位秒),如果填写0则为非阻塞模式,如果不填写或者填写非负值则为阻塞模式。超时后会引发 OSError 异常;

  • socket.setblocking(flag)
    sock.setblocking(True) 等同于 sock.settimeout(None);
    sock.setblocking(False) 等同于 sock.settimeout(0);

  • socket.makefile(mode='rb', buffering=0, /)
    返回与套接字关联的文件对象。确切的返回类型取决于给makefile()的参数。支持仅限于二进制模式(’ rb ‘、’ wb ‘和’ rwb ')。

  • socket.read([size])
    读取数据,size为读取最大长度,如果不填写该值则将读取至EOF(结束符)为止;

  • socket.readinto(buf[, nbytes])
    读取数据到buf,nbytes为读取最大长度,如果不填写该值则将读取len(buf)长度,返回总共读取的字节数;

  • socket.readline()
    读取一行;

  • socket.write(buf)
    尝试将所有数据通过socket发送,返回发送字节数;
    在这里插入图片描述
    更多内容可以参考下面链接:
    http://docs.micropython.org/en/latest/library/usocket.html

使用urequests进行HTTP访问

上面的usocket模块可以用在基础的TCP/UDP通讯,也可以用于基于TCP的HTTP协议通讯,但是用起来并不方便。在CPython中有一个requests模块,用于进行HTTP访问,用起来非常方便,在micropython也有相应的模块urequests。urequests这个模块目前micropython官方文档里并没有具体的介绍,不过可以正常使用。

使用演示

在这里插入图片描述
上图中我先接入了一个网络,然后使用urequests访问了百度首页,最后将收到的网页内容打印出来。

函数说明

  • request(method, url, data=None, json=None, headers={}, stream=None)
    发起HTTP请求,并以Response对象返回收到的内容,method为请求的方法,url为请求地址,其它为可选参数。实际使用中可以使用对该函数进一步封装的函数:

    • head(url, **kw) 使用HEAD方法发起请求;
    • get(url, **kw) 使用GET方法发起请求;
    • post(url, **kw) 使用POST方法发起请求;
    • put(url, **kw) 使用PUT方法发起请求;
    • patch(url, **kw) 使用PATCH方法发起请求;
    • delete(url, **kw) 使用DELETE方法发起请求;
  • class Response
    Response是requests请求后返回的内容,其可用方法与属性如下:

    • close(self) 清除对象中的内容;
    • content 返回二进制数据;
    • text返回文本数据;
    • json(self) 将json数据转换成字典返回;

在这里插入图片描述
更多内容可以参考模块源码:
https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py

对于各个HTTP请求的方法以及内容解读等可以自行搜索学习HTTP协议相关知识。

总结

上文介绍了基本的网络应用,一般来说有这些就可以进行很多事情的,很多更高级的网络相关的应用也是基于此开发的。

发布了72 篇原创文章 · 获赞 226 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/Naisu_kun/article/details/104059147