【python】windows实现与k230使用socket通信并传输文件
k230是一款十分强大的视觉模块,本文尝试实现了k230与windows基于wifi的文件传输,效果还是不错的
socket模块是老牌的tcp通信库,可以参考下面的文章
socket通讯原理及例程(一看就懂)
一、K230(客户端)
k230想要使用socket,得先联网,而且这个网络只能是2.4ghz(以后可能会支持5
g),联网后创建客户端即可接收windows服务端的消息
import network,socket,time
from machine import Pin,Timer
import os
#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('K230_test', '12345678')if wlan.isconnected(): #连接成功breakif 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 Trueelse: #连接失败#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
然后再写个简单的客户端,等服务端写完即可尝试是否能够收到文本
def receive_file(save_path):s = socket.socket()address=socket.getaddrinfo('10.42.0.210',5007) #服务器IP和端口print(address)while True:s.connect(address[0][-1])response = s.recv(1024)print("收到回复:", response)s.close()
if WIFI_Connect():receive_file('/data/output.wav')
二、windows(服务端)
socket是python的内置库,不需要pip
服务端也和客户端一样,先写个简单的,尝试是否能够通信
import socket
import timedef start_server(ip, port):server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind((ip, port))server_socket.listen(1)print(f"服务器正在 {ip}:{port} 上监听...")while True:client_socket, addr = server_socket.accept()print(f"连接地址:{addr}")# data = client_socket.recv(1024)# print(f"收到数据: {data.decode()}")client_socket.send(b"Hello from Server!")client_socket.close()time.sleep(1)# 启动服务器
start_server('10.42.0.210', 5007)
然后记住,先运行服务端代码
再运行客户端代码,切记、切记、切记!!!!!!!
客户端打印信息
服务端打印信息
三、windows发送文件至k230
将刚刚客户端和服务端的代码改写一下,就完成了文件传输了
服务端代码
import socket
import timedef send_file(ip,port,file_path):server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind((ip, port))# 等待客户端连接server_socket.listen(5)print("等待连接...")while True:client_socket, addr = server_socket.accept()with open(file_path, "rb") as f:# 获取文件大小file_size = len(f.read())# 返回文件开头f.seek(0)# 发送文件大小给客户端client_socket.sendall(str(file_size).encode() + b'\n')# 发送文件内容data = f.read(1024)while data:client_socket.sendall(data)data = f.read(1024)print("文件发送完成")client_socket.close()breaksend_file('10.42.0.210',5007,'output.wav')
客户端代码:
import network,socket,time
from machine import Pin,Timer
import os#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('K230_test', '12345678')if wlan.isconnected(): #连接成功breakif 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 Trueelse: #连接失败#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
def receive_file(save_path):s = socket.socket()address=socket.getaddrinfo('10.42.0.210',5007) #服务器IP和端口print(address)while True:s.connect(address[0][-1])#接收文件大小信息file_size_str = ""while True:char = s.recv(1).decode()if char == '\n':breakfile_size_str += charfile_size = int(file_size_str)print(f"文件大小: {file_size} 字节")# 开始接收文件内容bytes_received = 0with open(save_path, 'wb') as f:while bytes_received < file_size:chunk = s.recv(min(1024, file_size - bytes_received))if not chunk:raise RuntimeError("套接字连接中断")f.write(chunk)bytes_received += len(chunk)print(f"已接收: {bytes_received}/{file_size} 字节")print("文件接收完成")s.close()breakif WIFI_Connect():receive_file('/data/output.wav')
客户端打印消息
connect success
network information: ('10.42.0.244', '255.255.255.0', '10.42.0.1', '10.42.0.1')
[(2, 1, 0, '', ('10.42.0.210', 5007))]
文件大小: 123238 字节
已接收: 1024/123238 字节
已接收: 2048/123238 字节
已接收: 3072/123238 字节
已接收: 4096/123238 字节
已接收: 5120/123238 字节
已接收: 6144/123238 字节
已接收: 7168/123238 字节
已接收: 8192/123238 字节
已接收: 9216/123238 字节
已接收: 10240/123238 字节
已接收: 11264/123238 字节
已接收: 12288/123238 字节
已接收: 13312/123238 字节
已接收: 14336/123238 字节
已接收: 15360/123238 字节
已接收: 16384/123238 字节
已接收: 17408/123238 字节
已接收: 18432/123238 字节
已接收: 19456/123238 字节
已接收: 20480/123238 字节
已接收: 21504/123238 字节
已接收: 22528/123238 字节
已接收: 23552/123238 字节
已接收: 24576/123238 字节
已接收: 25600/123238 字节
已接收: 26624/123238 字节
已接收: 27648/123238 字节
已接收: 28672/123238 字节
已接收: 29696/123238 字节
已接收: 30720/123238 字节
已接收: 31744/123238 字节
已接收: 32768/123238 字节
已接收: 33792/123238 字节
已接收: 34816/123238 字节
已接收: 35840/123238 字节
已接收: 36864/123238 字节
已接收: 37888/123238 字节
已接收: 38912/123238 字节
已接收: 39936/123238 字节
已接收: 40960/123238 字节
已接收: 41984/123238 字节
已接收: 43008/123238 字节
已接收: 44032/123238 字节
已接收: 45056/123238 字节
已接收: 46080/123238 字节
已接收: 47104/123238 字节
已接收: 48128/123238 字节
已接收: 49152/123238 字节
已接收: 50176/123238 字节
已接收: 51200/123238 字节
已接收: 52224/123238 字节
已接收: 53248/123238 字节
已接收: 54272/123238 字节
已接收: 55296/123238 字节
已接收: 56320/123238 字节
已接收: 57344/123238 字节
已接收: 58368/123238 字节
已接收: 59392/123238 字节
已接收: 60416/123238 字节
已接收: 61440/123238 字节
已接收: 62464/123238 字节
已接收: 63488/123238 字节
已接收: 64512/123238 字节
已接收: 65536/123238 字节
已接收: 66560/123238 字节
已接收: 67584/123238 字节
已接收: 68608/123238 字节
已接收: 69632/123238 字节
已接收: 70656/123238 字节
已接收: 71680/123238 字节
已接收: 72704/123238 字节
已接收: 73728/123238 字节
已接收: 74752/123238 字节
已接收: 75776/123238 字节
已接收: 76800/123238 字节
已接收: 77824/123238 字节
已接收: 78848/123238 字节
已接收: 79872/123238 字节
已接收: 80896/123238 字节
已接收: 81920/123238 字节
已接收: 82944/123238 字节
已接收: 83968/123238 字节
已接收: 84992/123238 字节
已接收: 86016/123238 字节
已接收: 87040/123238 字节
已接收: 88064/123238 字节
已接收: 89088/123238 字节
已接收: 90112/123238 字节
已接收: 91136/123238 字节
已接收: 92160/123238 字节
已接收: 93184/123238 字节
已接收: 94208/123238 字节
已接收: 95232/123238 字节
已接收: 96256/123238 字节
已接收: 97280/123238 字节
已接收: 98304/123238 字节
已接收: 99328/123238 字节
已接收: 100352/123238 字节
已接收: 101376/123238 字节
已接收: 102400/123238 字节
已接收: 103424/123238 字节
已接收: 104448/123238 字节
已接收: 105472/123238 字节
已接收: 106496/123238 字节
已接收: 107520/123238 字节
已接收: 108544/123238 字节
已接收: 109568/123238 字节
已接收: 110592/123238 字节
已接收: 111616/123238 字节
已接收: 112640/123238 字节
已接收: 113664/123238 字节
已接收: 114688/123238 字节
已接收: 115712/123238 字节
已接收: 116736/123238 字节
已接收: 117760/123238 字节
已接收: 118784/123238 字节
已接收: 119808/123238 字节
已接收: 120832/123238 字节
已接收: 121856/123238 字节
已接收: 122880/123238 字节
已接收: 123238/123238 字节
文件接收完成
并且成功在k230的data目录下找到output.wav文件