理想的开源代码 mvbs
https://gitee.com/haloos/vbslite_mvbs
代码仓库简介
- MVBS,全称为 Micro Vehicle Bus Service,是VBSLite工程的核心组件之一
- 面向MCU领域设计的通信中间件,实现资源受限环境下的高效业务互联互通
- 主要采用以数据为中心的发布-订阅(DCSP, Data-Centric Publish Subscribe)通信模型 并通过RTPS协议进行数据传输,提供低时延、高可靠的数据通信,同时支持若干必要的QoS策略
- 提供RPC(Remote Function Call)功能,支持请求-调用通信模型,构建支持多种通信模式的统一通信平台
MVBS特性
- 实现RTPS标准最小子集
- MVBS符合协议规范但仅实现RTPS标准中最小子集
- 精简行为部分实现协议中的stateless与stateful两种参考分别可以为best-effort和reliable两种通信可靠性提供协议支持
- 精简的实体:participant、writer、reader
- 精简的QoS(8种规范QoS+1种自定义QoS)
- 支持自定义子消息
- 实现对E2E报文的支持
- 互操作性
- MVBS协议可以和外部RTPS Entity进行相互操作
- 容错恢复
- 单点故障不影响网络通信
- 重启后可以重新加入通讯网络,继续通信
- 支持Reliability QoS进行可靠传输
- 较低的资源消耗
- 支持动态和静态发现
- 支持RPC通信模式
代码目录
vbslite_mvbs 源代码在 haloosspace/vbs/vbslite/mvbs 目录下,目录结构如下图所示:
mvbs ├── README.md # 这个是MVBS仓库的readme ├── build.mk # 用于构建的makefile文件 ├── CMakeLists.txt # cmake编译脚本 ├── posix_aux # 为linux和windows平台提供扩展支持库 ├── include │ ├── mcdr # 序列化接口 │ ├── mvbs # MVBS头文件集合 │ │ ├── adapter # 适配层头文件 │ │ ├── core # MVBS内部核心的实体定义和操作 │ │ ├── diag # 诊断相关的头文件 │ │ ├── rte # RTE接口文件 │ │ ├── rtps # RTPS协议元素定义文件 │ │ ├── sections # 用于支持内存layout │ │ └── utils # 常用的工具文件 │ └── rpc # RPC头文件 └── src ├── adapter # 适配层实现 │ ├── auto # 基于VCOS 适配层的参考实现 │ └── posix # 基于POSIX提供的适配层实现 ├── core │ ├── diag # 诊断工具的实现 │ ├── discovery # 实体发现协议的实现 │ ├── entities # MVBS内部实体的实现 │ ├── include # 提供给MVBS内部的头文件 │ ├── messages # 报文组装的实现 │ ├── mvbs # MVBS内部接口层的实现 │ ├── netio # 网络接口的封装实现 │ ├── qos # E2E和WLP的实现 │ ├── storages # CacheChange和History的实现 │ ├── transport # Transport的实现 │ └── utils # 常用工具的实现 ├── mcdr # 序列化库的实现 ├── rpc # RPC的实现 └── rte # RTE接口的实现
仓库使用入门
mvbs搭建
https://gitee.com/haloos/manifests 通过repo的方式管理多个仓库
注:window根据上述文档配置,安装msys2, 安装windows平台编译工具,安装python的依赖库
1├── build
2├── docs
3├── examples
4├── Makefile
5├── mvbs
6├── tools
7└── vbs
编译命令
进入顶层目录之后执行如下命令:
1source build/envsetup.sh
2lunch MINGW
3mma -j8
vscode debug
msys64终端安装gdb
pacman -S mingw-w64-x86_64-gdb
安装 C/C++ 扩展
vscode 中配置
launch.json
1{
2 "version": "0.2.0",
3 "configurations": [
4 {
5 "name": "msys",
6 "type": "cppdbg",
7 "request": "launch",
8 "program": "${workspaceFolder}\\vbslitespace\\out\\MINGW\\objs\\udp_test_sub\\udp_test_sub.exe", // 根据你的路径修改,需要调试的程序的路径
9 "args": [],
10 "stopAtEntry": false,
11 "cwd": "${workspaceFolder}",
12 "environment": [],
13 "externalConsole": false,
14 "MIMode": "gdb",
15 "miDebuggerPath": "D:\\App\\msys64\\mingw64\\bin\\gdb.exe", // 根据你的路径修改
16 "setupCommands": [
17 {
18 "description": "Enable pretty-printing for gdb",
19 "text": "-enable-pretty-printing",
20 "ignoreFailures": true
21 },
22 { "text": "set output-radix 16" } // 16进制显示变量
23 ]
24 }
25 ]
26}
源代码
SPDP
ptcp_spdp_writer_send_pdp
- 启动发送广播自己上线
- 周期广播自己在线
- 回复其他participate自己存在
1// 启动广播
2main
3 app_init
4 Rte_Dds_Init
5 ptcp_enable
6 ptcp_discovery_start
7 ptcp_dpde_discovery_start
8 ptcp_spdp_announce_online
9 ptcp_spdp_writer_send_pdp
liveliness_lost
ptcp_proxy_liveliness_lost writer_remove_proxy writer_remove_proxies_with_ptcp
SEDP
1main
2 Rte_Dds_Ptcp_Recv_Handler
3 ptcp_recv_handler
4 udp_trans_recv_handle
5 msg_recv_process
6 msg_recv_process_submsg (收到 ACKNACK 报文)
7 msg_recv_process_submsg_acknack
8 ptcp_dpde_on_acknack
9 sub_writer_on_acknack (填充endpoint信息)
10 udp_trans_sendto
11 udp_trans_send
12 mvbs_udp_socket_sendto
13 mvbs_udp_send
数据接收
1main
2 Rte_Dds_Ptcp_Recv_Handler
3 ptcp_recv_handler
4 udp_trans_recv_handle
5 ptcp_recv_cb
6 ptcp_process_new_message
7 msg_recv_process
8 msg_recv_process_submsg 消息分类
9 msg_recv_process_submsg_data (DATA)
10 ptcp_dpde_on_data
11 ptcp_pdp_reader_on_data
12 ptcp_proxy_parse
13 cdr_deserialize_ptcp_proxy (返回值判断是否new ptcp)
14 ptcp_pdp_reader_data_process (上面返回ok,才会继续)
15 ptcp_spdp_create_ptcp_proxy (Add new ptcp)
数据发送
1Rte_Dds_TxData
2 writer_submit_sample
3 writer_submit_instance_sample
4 writer_new_change
5 writer_send_data
6 writer_send_wcc (没有对ptcp_send_buffer_to返回值处理,上层失败返回也是ok)
数据缓存处理
todo
抓包实例
app1: meta多播端口: 7400 meta单播端口: 7410 数据单播端口: 7411
app2: meta多播端口: 7400 // 同一个domain 所以相同 meta单播端口: 7412 数据单播端口: 7413
APP1: 7411 –> APP2 : 7412,此报文和app1发送的发现组播报文(Frame:43)除了目的ip和端口外其他都是相同的数据
APP2: 7413 –> APP1 : 7410 同样发送单播发现报文
APP1 -> APP2 通过 SEDP 协议发送广播的主题,Qos,deadline, liveliness等信息
APP2 -> APP1 通过 SEDP 协议发送订阅的主题
APP1 -> APP2 发送数据
评论