目的
前文中讲了如何启用网络功能,这篇文章中接着讲一讲基本的网络通讯用法。
使用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_INET
和AF_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协议相关知识。
总结
上文介绍了基本的网络应用,一般来说有这些就可以进行很多事情的,很多更高级的网络相关的应用也是基于此开发的。