本帖最后由 云天 于 2022-9-22 20:35 编辑
【项目背景】
行空板自带了Wi-Fi: 2.4G,自带Linux操作系统和python环境,我准备利用TCP传输层的协议,完成一个无线键盘,并利用它来玩一个小游戏。
【知识准备】
1.TCP协议 是传输层的协议,解决的问题,是端口与端口的通信问题。 TCP 每次建立通信,都需要三次握手,确定双方状态完毕,在发送数据。如果发送的数据出现了异常,TCP 也内置了一些处理的机制,确保了数据能准确到达目的地。 2.行空板 是一款拥有自主知识产权的国产教学用开源硬件,采用微型计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。同时,其自带Linux操作系统和python环境,还预装了常用的python库,让广大师生只需两步就能开始python教学。 【准备工作】
1.硬件清单 行空板、micro:bit扩展板、按钮、电池座、PVC板 2.行空板连接WIFI 使用USB线连接行空板与电脑。打开电脑的浏览器,输入板子的ip10.1.2.3,就可以打开界面。 进入网络设置页面会自动扫描板子周围的WiFi,在名称下拉框选择需要连接的WiFi,在密码输入框输入密码,点击连接即可让板子连接WiFi。 【键盘制作】 五个按钮在PVC板上排列好,四个做为“上下左右”,另一个做为“空格”。 在盖上挖出各按钮的位置孔。 安装四周档板 封装成键盘盒 【编写程序】 1、测试TCP通信 服务端代码:
-
- import socket # 导入 socket 模块
-
- s = socket.socket() # 创建 socket 对象
- host = '192.168.31.51' # 设置本地主机地址
- print('服务器地址:', host)
- port = 12345 # 设置端口
- s.bind((host, port)) # 绑定端口
-
- s.listen(5) # 等待客户端连接
- c,addr = s.accept() # 建立客户端连接
- while True:
-
- #print('连接地址:', addr)
- content=c.recv(2)
- print(content)
- c.close
复制代码
客户端程序:-
- import socket # 导入 socket 模块
-
- s = socket.socket() # 创建 socket 对象
- host = '192.168.31.51' # 设置要连接的服务器地址
- port = 12345 # 设置端口号
- s.connect((host, port))
- s.send(b'L')
复制代码
2、客户端按键,并增加行空板屏幕显示-
- import socket # 导入 socket 模块
- from pinpong.extension.unihiker import *
- from pinpong.board import Board,Pin
- import time
- from unihiker import GUI
-
- u_gui=GUI()
- 屏幕=u_gui.draw_text(text="行空板",x=45,y=120,font_size=40, color="#0000FF")
- Board().begin()
- p_p8_in=Pin(Pin.P8, Pin.IN)
- p_p9_in=Pin(Pin.P9, Pin.IN)
- p_p12_in=Pin(Pin.P12, Pin.IN)
- p_p13_in=Pin(Pin.P13, Pin.IN)
- p_p14_in=Pin(Pin.P14, Pin.IN)
- s = socket.socket() # 创建 socket 对象
- host = '192.168.31.51' # 设置要连接的服务器地址
- port = 12345 # 设置端口号
- s.connect((host, port))
- bs1 = 0
- bs2 = 0
- bs3 = 0
- bs4 = 0
- bs5 = 0
- while True:
-
- if(p_p8_in.read_digital()==True):
- if(bs1 == 0):
- s.send(b'L')
- bs1 = 1
- 屏幕.config(text="向左")
- else:
- if(bs1 == 1):
- s.send(b'L1')
- bs1 = 0
- 屏幕.config(text="")
- if(p_p9_in.read_digital()==True):
- if(bs2 == 0):
- s.send(b'D')
- bs2 = 1
- 屏幕.config(text="向下")
- else:
- if(bs2 == 1):
- s.send(b'D1')
- bs2 = 0
- 屏幕.config(text="")
- if(p_p12_in.read_digital()==True):
- if(bs3 == 0):
- s.send(b'R')
- bs3 = 1
- 屏幕.config(text="向右")
- else:
- if(bs3 == 1):
- s.send(b'R1')
- bs3 = 0
- 屏幕.config(text="")
- if(p_p13_in.read_digital()==True):
- if(bs4 == 0):
- s.send(b'U')
- bs4 = 1
- 屏幕.config(text="向上")
- else:
- if(bs4 == 1):
- s.send(b'U1')
- bs4 = 0
- 屏幕.config(text="")
- if(p_p14_in.read_digital()==True):
- if(bs5 == 0):
- s.send(b'S')
- bs5 = 1
- 屏幕.config(text="跳起")
- else:
- if(bs5 == 1):
- s.send(b'S1')
- bs5 = 0
- 屏幕.config(text="")
- s.close()
复制代码
3.服务器接收按键指令,并模拟键盘按键
-
- import socket # 导入 socket 模块
- import pyautogui
-
-
- s = socket.socket() # 创建 socket 对象
- host = '192.168.31.51' # 设置本地主机地址
- print('服务器地址:', host)
- port = 12345 # 设置端口
- s.bind((host, port)) # 绑定端口
-
- s.listen(5) # 等待客户端连接
- c,addr = s.accept() # 建立客户端连接
- while True:
-
- #print('连接地址:', addr)
- content=c.recv(2)
- if content==b'L':
- pyautogui.keyDown(key="left")
- elif content==b'L1':
- pyautogui.keyUp(key="left")
- if content==b'R':
- pyautogui.keyDown(key="right")
- elif content==b'R1':
- pyautogui.keyUp(key="right")
- if content==b'U':
- pyautogui.keyDown(key="up")
- elif content==b'U1':
- pyautogui.keyUp(key="up")
- if content==b'D':
- pyautogui.keyDown(key="down")
- elif content==b'D1':
- pyautogui.keyUp(key="down")
- if content==b'S':
- pyautogui.keyDown(key="space")
- elif content==b'S1':
- pyautogui.keyUp(key="space")
- c.close()
复制代码
【演示操作】利用行空板无线键盘玩开摩托车小游戏。
【演示视频】
|