Python模拟发送SOME/IP消息(Scapy模块)

1 说明

主要介绍如何使用Python+scapy模块进行SOME/IP以及SOME/IP-SD消息的发送和解析;关于SOME/IP-SD协议的介绍可以查看我的另一篇文章:SOME/IP服务发现协议说明-SD,以及关于SOME/IP协议的介绍可以查看文章:SOME/IP协议说明

2 依赖

  • Python
    • 版本:3.8(本文章使用Python3.8版本编写的示例代码,实际Python3应该都能兼容,但是没有试过所有的版本)
  • scapy
    • 版本:2.5.0(需要注意查看的文档版本与安装的版本是否一致,不同版本之间可能会存在接口或属性变更的情况)
    • 官网:scapy
    • SOME/IP接口:SOME/IP

3 服务端

3.1 导包

from scapy.all import *
from scapy.contrib.automotive.someip import *
from scapy.layers.l2 import Ether
from scapy.layers.inet import IP, UDP, TCP
import time

注意:在scapy的模块 scapy.all 中导入了一个交互式的模块 from scapy.autorun import *,该模块会导致无法打包;如果你需要使用Pyinstaller或其他工具将编写好的脚本打包成EXE之后再执行的话,需要自己处理一下该模块的代码,或者可以直接屏蔽(# from scapy.autorun import *)该导入(如果不需要使用交互式功能的话);

3.2 参数定义

定义协议需要使用的一些参数,如网卡名称、MAC地址、IP地址、端口号等;

# 注意以下参数需要根据自己的实际情况配置,否则可能无法通信成功

NETWORK_ADAPTER = "Intel(R) Wi-Fi 6 AX201 160MHz"  # 定义要使用的网卡

LOCAL_MAC = "01:02:03:04:05:06"  # 定义网卡对应的MAC地址
LOCAL_IP = "127.0.0.1"  # 定义网卡对应的IP地址(注意此处最好设置为固定的IP地址)

BROADCAST_MAC = "a1:a2:a3:a4:00:30"  # 定义广播(多播)消息时要广播的目的MAC地址
BROADCAST_IP = "239.192.255.250"  # 定义广播(多播)消息时的目的IP地址
BROADCAST_PORT = 30490  # 定义发送广播消息时使用的源端口号和目的端口号,SOME/IP-SD协议通常默认使用30490

SESSION_ID_OFFER = 1  # 定义用于发送offer时的session id

3.3 提供服务(Offer Service)

模拟一个ECU的服务端,向外部(其他ECU或客户端或服务)广播发送Offer(提供的服务均使用UDP通信时),用于提供可订阅的服务;

from scapy.all import *
from scapy.contrib.automotive.someip import *
from scapy.layers.l2 import Ether
from scapy.layers.inet import IP, UDP, TCP
import time


# 注意以下参数需要根据自己的实际情况配置,否则可能无法通信成功

NETWORK_ADAPTER = "Intel(R) Wi-Fi 6 AX201 160MHz"  # 定义要使用的网卡

LOCAL_MAC = "01:02:03:04:05:06"  # 定义网卡对应的MAC地址
LOCAL_IP = "127.0.0.1"  # 定义网卡对应的IP地址(注意此处最好设置为固定的IP地址)

BROADCAST_MAC = "a1:a2:a3:a4:00:30"  # 定义广播(多播)消息时要广播的目的MAC地址
BROADCAST_IP = "239.192.255.250"  # 定义广播(多播)消息时的目的IP地址
BROADCAST_PORT = 30490  # 定义发送广播消息时使用的源端口号和目的端口号,SOME/IP-SD协议通常默认使用30490

SESSION_ID_OFFER = 1  # 定义用于发送offer时的session id


# 构建一个SOME/IP头,构建的原则以及参数设置请参考文档开头引用的另外两个文章
def some_ip_header():
	some_ip = SOMEIP()
	some_ip.srv_id = 0xffff
	some_ip.sub_id = 0x1  # 在Scapy的someip模块中,该参数为1表示需要使用类型为Event,参数为0表示需要使用类型为Method
	# some_ip.method_id = 0x8100
	some_ip.event_id = 0x8100
	some_ip.session_id = SESSION_ID_OFFER
	some_ip.msg_type = SOMEIP.TYPE_NOTIFICATION
	some_ip.retcode = SOMEIP.RET_E_OK

	SESSION_ID_OFFER += 1
	if SESSION_ID_OFFER > 0xffff:
		SESSION_ID_OFFER = 1

	return some_ip


# 构建一个SOME/IP-SD头以及Entries列表和Options列表,构建的原则以及参数设置请参考文档开头引用的另外两个文章
def some_ip_sd():
	# 构建Options
	option1 = SDOption_IP4_EndPoint()  # Option有多种类型,请根据协议规定以及业务需求选择自己需要的类型并配置
	option1.addr = LOCAL_IP
	option1.l4_proto = 0x06  # 0x06: TCP, 0x11: UDP
	option1.port = 50001  # 该端口应该是实际业务层定义的服务端的服务端口,请按照实际情况配置

	option2 = SDOption_IP4_EndPoint()  # Option有多种类型,请根据协议规定以及业务需求选择自己需要的类型并配置
	option2.addr =
### GitLab CI/CD 自动化部署的最佳实践 #### 安装与注册 GitLab Runner GitLab CI/CD 的核心组件之一是 GitLab Runner,它负责执行 `.gitlab-ci.yml` 文件中的定义的任务。为了实现自动化部署,首先需要安装并注册 GitLab Runner。 可以通过以下命令完成 GitLab Runner 的安装和启动[^1]: ```bash sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner sudo gitlab-runner start ``` 接着,通过 `register` 命令将 Runner 注册到指定的 GitLab 项目中[^2]。 --- #### 配置 .gitlab-ci.yml 文件 `.gitlab-ci.yml` 是 GitLab CI/CD 的配置文件,用于定义流水线的工作流程。最佳实践中应遵循以下几个原则: 1. **清晰划分阶段**: 将工作流划分为多个阶段 (stages),例如 `build`, `test`, 和 `deploy`。这有助于提高可读性和维护性。 ```yaml stages: - build - test - deploy ``` 2. **使用缓存加速构建过程**: 如果某些依赖项不会频繁更改,可以利用缓存功能减少重复下载的时间。 ```yaml cache: paths: - node_modules/ ``` 3. **环境变量管理**: 敏感信息(如 API 密钥)不应硬编码在配置文件中,而是通过 GitLab 提供的安全变量机制来设置。 4. **动态创建测试矩阵**: 对于多平台或多版本支持的应用程序,建议采用 matrix 构建策略以覆盖更多场景。 ```yaml job_template: script: echo Running tests on $VERSION variables: VERSION: "" run_tests: extends: job_template script: - echo Testing with version ${VERSION} parallel: matrix: - VERSION: ["v1", "v2"] ``` 5. **错误处理与通知**: 添加失败重试逻辑以及发送邮件或其他形式的通知给相关人员以便及时响应问题。 ```yaml notify_on_failure: stage: deploy only: - master when: on_failure script: - curl https://example.com/webhook?status=failure ``` --- #### 实现项目的自动部署 对于实际应用来说,在完成了代码编译、单元测试之后还需要将其发布至生产环境中去。下面是一个简单的例子展示如何把应用程序推送到远程服务器上运行: ```yaml deploy_production: stage: deploy environment: name: production url: http://your-production-url.com only: - main before_script: - apt-get update && apt-get install -y sshpass script: - sshpass -p "$SSH_PASSWORD" scp ./dist/* user@server:/var/www/html/ after_success: - echo Deployment successful. ``` 上述脚本会先更新本地包列表再安装必要的工具;然后借助 SSH 协议上传打包好的文件夹内容到目标主机相应目录下最后打印成功消息结束整个操作序列。 --- #### 总结 综上所述,从安装配置 runner 到编写合理的 yml 脚本来控制不同环节直至最终达成持续集成目的构成了完整的 GitLab CI/CD 流程体系结构设计思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李星星BruceL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值