当前位置: 首页 > 工具软件 > usocket > 使用案例 >

物联网AI MicroPython学习之语法 usocket 套接字

慕宪
2023-12-01

usocket 介绍

usocket 模块提供对BSD套接字接口的访问。

接口说明

usocket - 创建套接字

  • 函数原型:usocket.socket(af = AF_INET, type = SOCK_STREAM, proto = IPPROTO_TCP)
  • 函数功能: 根据给定的地址族、套接字类型以及协议类型参数,创建一个新的套接字。 注意,在大多数情况下不需要指定_proto_,也不建议这样做,因为某些MicroPython端口可能会省略 IPPROTO_*参数。
  • 常量说明
常量定义常量说明
usocket.AF_INETIPV4
usocket.AF_INET6IPV6
usocket.SOCK_STREAMTCP的流式套接字
usocket.SOCK_DGRAM对应UDP的数据包套接字
usocket.SOCK_RAW原始套接字
usocket.IPPROTO_TCPTCP
usocket.IPPROTO_UDPUDP
usocket.SOL_SOCKET套接字选项级别
usocket.SO_REUSEADDR允许绑定地址快速重用
  • 示例:
# 基于TCP的流式套接字 
socket = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) 
# 基于UDP的数据报套接字 
socket = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM)

getaddrinfo - 用主机域名(host)和端口(port)生成用于创建套接字的5元组序列

  • 函数原型:usocket.getaddrinfo(host, port)
  • 参数说明:
参数类型必选参数?说明
hoststirng主机域名
portint主机端口号
  • 返回值

用于创建套接字的5元组,元组结构: (family, type, proto, canonname, sockaddr)

listen - 监听

  • 函数原型:usocket.listen(backlog)
  • 参数说明:
参数类型必选参数?说明
backlogint接受套接字的最大个数,取值范围:>= 0
  • 返回值
    允许服务端新连接接入。

accept - 接受连接请求

  • 函数原型:usocket.accept()
  • 返回值
    返包含新的套接字和客户端地址的元祖,元祖形式为:(conn, address)
  • conn :新的套接字对象,可以用来发送和接收数据
  • address :连接到服务器的客户端地址

connect - 连接到指定地址的服务器

  • 函数原型:usocket.connect(address)
  • 参数说明:
参数类型必选参数?说明
address元组/列表包含地址和端口号
  • 返回值
    连接到指定地址address的服务器。

read - 从套接字中读取size字节数据

  • 函数原型:usocket.read([size])
  • 函数功能:
    从套接字中读取size字节数据,返回一个字节对象。如果没有指定size,则会从套接字读取所有可读数据,直到读取到数据结束,这种情况下和 usocket.readall() 功能相同。
  • 参数说明:
参数类型必选参数?说明
sizeint目标接收字符数量
  • 返回值
    返回读取到的内容,字节类型。

readinto - 将接收到的数据读取到缓冲区中

  • 函数原型:usocket.readinto(buf [, nbytes])
  • 函数功能:
    将字节读取到缓冲区buf中。如果指定了nbytes,则最多读取nbytes数量的字节;如果没有指定nbytes,则最多读取len(buf)字节。
  • 参数说明:
参数类型必选参数?说明
bufbytearray接收数据缓冲区
nbytesint最长要收取数据的字节数
  • 返回值
    实际读取到的字节数

readline - 从接收到的数据中读取一行数据

  • 函数原型:usocket.readline()
  • 返回值
    返回接收到的数据,遇到换行符结束。

write - 将数据写入发送缓冲区中

  • 函数原型:usocket.write(buf)
  • 参数说明:
参数类型必选参数?说明
bufbytearray要放到发送缓冲区的数据
  • 返回值
    实际写入缓冲区的字节数。

send - 发送数据

  • 函数原型:usocket.send(bytes)
  • 参数说明:
参数类型必选参数?说明
bytesbytes要发送的数据内容
  • 返回值
    实际发送的字节数。

sendall - 一次性发送所有数据

  • 函数原型:usocket.sendall(bytes)
  • 函数功能:
    将所有数据都发送到套接字。与send()方法不同的是,此方法将尝试通过依次逐块发送数据来发送所有数据。
  • 参数说明:
参数类型必选参数?说明
bytesbytes要发送的数据内容
  • 返回值
    实际发送的字节数。

注意:该方法再非阻塞套接字上的行为是不确定的,MicroPython建议使用 write() 方法。write 方法具有相同的“禁止短写”策略来阻塞套接字,并且将返回通过非阻塞套接字发送的数据大小。

sendto - 将数据发送到套接字

  • 函数原型:usocket.sendto(bytes, address)
  • 参数说明:
参数类型必选参数?说明
bytesbytes要发送的数据
address元组或列表发送的目标地址,包含地址和端口号
  • 返回值
    实际发送的字节数。

recv - 从套接字接收数据

  • 函数原型:usocket.recv(bufsize)
  • 参数说明:
参数类型必选参数?说明
bufsizeint要接收的数据的最大长度
  • 返回值
    接收到的数据,字节类型的对象,

close - 关闭套接字并释放所有资源

  • 函数原型:usocket.close()
  • 函数功能:
    将套接字标记为关闭并释放所有资源。

recvfrom - 从套接字接收数据

  • 函数原型:usocket.recvfrom(bufsize)
  • 参数说明:
参数类型必选参数?说明
bufsizeint要接收的数据的最大长度
  • 返回值
    返回一个元组,包含字节对象和地址。返回值形式为:(bytes, address)
    • bytes :接收数据的字节对象
    • address :发送数据的套接字的地址

setsockopt - 设置套接字选项

  • 函数原型:usocket.setsockopt(level, optname, value)
  • 参数说明:
参数类型必选参数?说明
levelint套接字选项级别
optnamestringsocket选项名称
valueint/bytes型对象要接收的数据的最大长度
  • 返回值
    设置套接字选项的值。
  • 示例:
socket.setsockopt(usocket.SOL_SOCKET, usocket.SO_REUSEADDR, 1)

setblocking - 设置套接字的阻塞模式

  • 函数原型:usocket.setblocking(flag)
  • 参数说明:
参数类型必选参数?说明
flagBoolTrue代表设置为阻塞模式;False代表设置为非阻塞模式

该方法和调用 settimeout() 的部分用法灯效:

  • socket.setblocking(True) 相当于 socket.settimeout(None)
  • socket.setblocking(False) 相当于 socket.settimeout(0)

settimeout - 设置套接字的发送和接收超时时间

  • 函数原型:usocket.settimeout(value)
  • 参数说明:
参数类型必选参数?说明
valuefloat单位:秒。非负值;0代表非阻塞模式

makefile - 返回与套接字关联的文件对象

  • 函数原型:usocket.makefile(mode=‘rb’)
  • 返回值:
    与套接字关联的文件对象,返回值类型与指定的参数有关。仅支持二进制模式 (‘rb’, ‘wb’, and ‘rwb’)。

注意:关闭makefile返回的文件对象等同于调用了usocket的close()方法。
socket通信示例

import utime 
import network  
# 导入network库 
import usocket  
# 导入usocket库 
wifiSsid = "路由器名称" 
wifiPassword = "路由器密码" 
if __name__ == '__main__':     
    wlan = network.WLAN(network.STA_IF)    #创建WLAN对象     
	wlan.active(True)                      #激活界面     
	wlan.scan()                            #扫描接入点     
	wifi_connected = wlan.isconnected()     
	if not wifi_connected:         
        wlan.connect(wifiSsid, wifiPassword)     
        while True:         
            wifi_connected = wlan.isconnected()         
            if wifi_connected:             
                break         
            else:             
                utime.sleep(0.5)             
                print("wifi_connected:", wifi_connected)     
        ifconfig = wlan.ifconfig()     
        print(ifconfig)     
		# 创建一个套接字     
		sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)     
		# 解析域名     
		sockaddr = usocket.getaddrinfo('www.getman.com', 80)[0][-1]     
		# 建立连接     
		sock.connect(sockaddr)     
		# 向服务端发送消息     
		ret=sock.send('GET /News HTTP/1.1\r\nHost: www.getman.com/echo\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n')     
		#接收服务端消息     
		data=sock.recv(256)     
		print('recv %s bytes:' % len(data))     
		print(data.decode())     
		# 关闭连接     
		sock.close()
  • 输出:
HTTP/1.1 400 Bad Request 
Date: Mon, 22 Nov 2021 13:52:59 GMT 
Server: Apache/2.4.51 
Content-Length: 297 
Connection: close 
Content-Type: text/html; charset=iso-8859-1
 类似资料: