树莓派 Linux Python虚拟环境与测试接收网络层数据包
又把树莓派从垃圾堆里找回来辣!
这里是一个备忘录。测试一下PC与树莓派之间的tcp/udp通信,PC向树莓派发送信息,树莓派用scapy这个库捕获数据包。配置过程的一些小问题。
关于Scapy这个库
Scapy 是一个强大的 Python 库,用于网络数据包的操作、发送、捕获和分析。它能够处理多种网络协议,并允许用户构建、发送和解析网络数据包。Scapy 常用于网络安全、网络测试、协议开发等领域。
主要功能
-
数据包构建:支持多种协议(如 TCP、UDP、ICMP、ARP 等),用户可以轻松创建自定义数据包。
-
数据包发送:能够发送单个或多个数据包,支持多种发送方式。
-
数据包捕获:可以捕获网络流量并进行分析。
-
协议解析:自动解析捕获的数据包,提取协议字段。
-
交互式操作:支持交互式 shell,方便实时调试和测试。
树莓派上的配置
python虚拟环境
这里先不搞anaconda什么的玩意,就直接用python3-venv弄虚拟环境。
安装python3-venv包:sudo apt install python3-venv
# 创建一个新的虚拟环境
python3 -m venv myenv
# 激活虚拟环境
source myenv/bin/activate
# 现在可以在虚拟环境中安装requirements.txt里的依赖库了
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
#退出虚拟环境
deactivate
接下来有一个小小的问题
假如我有代码main.py,但是又需要用root权限运行,直接sudo python main.py
的话又会显示没有安装依赖库
这是因为sudo运行的python解释器是默认环境的,并不是虚拟环境下的python,那么刚才pip的那一大堆东西都用不上。
可以输入
which python
查看当前python解释器是哪一个输入
sudo which python
发现还是默认环境的python
只能直接 su
切换到root账户了
如果树莓派没有预先设置root用户的密码,需要输
sudo passwd root
设置一下密码。
然后重新在root用户下激活虚拟环境。
PC向树莓派发送信息
以TCP协议为例:
import socket
# 目标树莓派的IP地址和端口号
SERVER_IP = '树莓派的IP地址'
SERVER_PORT = 25565
MESSAGE = "Hello, Raspberry Pi!"
# 创建TCP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# 连接到树莓派的25565端口
client_socket.connect((SERVER_IP, SERVER_PORT))
print(f"Connected to {SERVER_IP}:{SERVER_PORT}")
# 发送数据
client_socket.sendall(MESSAGE.encode())
print(f"Sent: {MESSAGE}")
except Exception as e:
print(f"Connection failed: {e}")
finally:
# 关闭连接
client_socket.close()
以UDP协议为例:
import socket
SERVER_IP = '树莓派的IP地址'
SERVER_PORT = 25565
MESSAGE = "Hello, Raspberry Pi!"
# 创建UDP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
# 发送数据
client_socket.sendto(MESSAGE.encode(), (SERVER_IP, SERVER_PORT))
print(f"Sent: {MESSAGE}")
except Exception as e:
print(f"Sending failed: {e}")
finally:
# 关闭连接
client_socket.close()
树莓派捕获信息:
from scapy.all import sniff
# 定义捕获回调函数
def packet_callback(packet):
# 打印捕获到的每个数据包的摘要信息
print(packet.summary())
# 或者更详细地打印整个数据包
# print(packet.show())
# 使用sniff函数捕获25565端口上的TCP流量
sniff(filter="tcp port 25565", prn=packet_callback, store=0)#如果是捕获udp,修改tcp为udp即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?