本次测评k230的网络模块,通过Socket编程实现CanMV K230与电脑服务器助手建立连接,相互收发数据。
我们先来看看网络层级模型图,这是构成网络通信的基础:
TCP 是一种传输层协议,它比 UDP
更复杂,具备数据确认、重传和滑动窗口等机制,保证了可靠传输。而 HTTP 是运行在应用层的协议,浏览网页时通常通过 HTTP 与服务器通信,默认使用端口 80。
比如我们访问淘宝,浏览器实际上是通过 IP 地址和端口向服务器发出 HTTP 请求。淘宝服务器处理请求后返回网页内容,连接随即关闭。这样设计是为了节省服务器资源,因为同时保持大量连接是很消耗资源的。
当多个用户或应用程序同时通信时,操作系统通过 Socket 接口
来区分不同的 TCP 连接或进程。Socket 相当于应用层和传输层之间的桥梁,虽然最常用于 TCP/IP,但它本身并不依赖特定协议,是一种通用的通信编程接口。
简单来说,Socket抽象层介于传输层和应用层之间,跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议(通常是TCP或UDP),本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
所以,socket的出现只是可以更方便的使用TCP/IP协议栈而已,简单理解就是其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。以下是通讯流程:
从上图可以看到,建了Socket通信需要一个服务器端和一个客户端,以本实验为例,CanMV K230作为客户端,电脑使用网络调试助手作为服务器端,双方使用TCP协议传输。对于客户端,则需要知道电脑端的IP和端口即可建立连接。
本实验的代码流程如下:
一、Socket 对象构造
s = usocket.socket(af=AF_INET,
type=SOCK_STREAM, proto=IPPROTO_TCP)
af:地址族
type:套接字类型
proto:协议
二、常用方法
获取地址信息
addr =
socket.getaddrinfo('www.01studio.cc', 80)[0][-1]
addr = socket.getaddrinfo('127.0.0.1',
80)[0][-1]
获取可用于连接或绑定的地址格式。
客户端方法
s.connect(addr) # 连接服务器
s.send(b'hello') # 发送字节数据
data = s.recv(1024) # 接收数据(最多 1024 字节)
服务器方法
s.bind(addr) # 绑定地址
s.listen(5) # 监听连接(最多 5 个等待连接)
conn, addr = s.accept() # 接受一个连接
通用操作
s.close() # 关闭连接
下面演示示例代码
#导入相关模块
import network,socket,time
from machine import Pin,Timer
#WIFI连接函数
def WIFI_Connect():
WIFI_LED=Pin(52, Pin.OUT) #初始化WIFI指示灯
wlan = network.WLAN(network.STA_IF) #STA模式
wlan.active(True) #激活接口
if not wlan.isconnected():
for i in range(3): #重复连接3次
#输入WIFI账号密码(仅支持2.4G信号), 连接超过5秒为超时
wlan.connect('01Studio', '88888888')
if wlan.isconnected(): #连接成功
break
if wlan.isconnected(): #连接成功
print('connect success')
#LED蓝灯点亮
WIFI_LED.value(1)
#等待获取IP地址
while wlan.ifconfig()[0] == '0.0.0.0':
pass
#串口打印信息
print('network information:', wlan.ifconfig())
return True
else: #连接失败
#LED闪烁3次提示
for i in range(3):
WIFI_LED.value(1)
time.sleep_ms(300)
WIFI_LED.value(0)
time.sleep_ms(300)
wlan.active(False)
return False
#判断WIFI是否连接成功
if WIFI_Connect(): #连接成功
#创建socket连接TCP类似,连接成功后发送“Hello 01Studio!”给服务器。
s=socket.socket()
addr=socket.getaddrinfo('192.168.100.200',10000)[0][-1] #服务器IP和端口
print(addr)
s.connect(addr)
s.settimeout(0)#接收不阻塞
s.send('Hello k230')
while True:
text=s.recv(128) #单次最多接收128字节
if text == b'':
pass
else: #打印接收到的信息为字节,可以通过decode('utf-8')转成字符串
print(text)
s.send('I got:'+text.decode('utf-8'))
time.sleep_ms(50)
打开网络调试工具
这个时候电脑连接上k230板子,烧录python代码到板子上运行
这个时候我们的pc端(tcp
server)就和k230连接上了并开始相互收发数据
本次实验通过在 K230 上实现基于
Socket 的 TCP 客户端通信,成功与电脑服务器建立连接并实现数据收发。掌握了 Socket 编程的基本流程,加深了对 TCP/IP 协议和网络通信机制的理解,为后续网络应用开发打下了基础。
更多回帖