树莓派 Linux Python虚拟环境与测试接收网络层数据包

又把树莓派从垃圾堆里找回来辣!

这里是一个备忘录。测试一下PC与树莓派之间的tcp/udp通信,PC向树莓派发送信息,树莓派用scapy这个库捕获数据包。配置过程的一些小问题。

关于Scapy这个库

Scapy 是一个强大的 Python 库,用于网络数据包的操作、发送、捕获和分析。它能够处理多种网络协议,并允许用户构建、发送和解析网络数据包。Scapy 常用于网络安全、网络测试、协议开发等领域。

主要功能

  1. 数据包构建:支持多种协议(如 TCP、UDP、ICMP、ARP 等),用户可以轻松创建自定义数据包。

  2. 数据包发送:能够发送单个或多个数据包,支持多种发送方式。

  3. 数据包捕获:可以捕获网络流量并进行分析。

  4. 协议解析:自动解析捕获的数据包,提取协议字段。

  5. 交互式操作:支持交互式 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即可

 

posted @   拾一贰叁  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示