理想的开源代码 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特性

  1. 实现RTPS标准最小子集
    • MVBS符合协议规范但仅实现RTPS标准中最小子集
    • 精简行为部分实现协议中的stateless与stateful两种参考分别可以为best-effort和reliable两种通信可靠性提供协议支持
    • 精简的实体:participant、writer、reader
    • 精简的QoS(8种规范QoS+1种自定义QoS)
  2. 支持自定义子消息
    • 实现对E2E报文的支持
  3. 互操作性
    • MVBS协议可以和外部RTPS Entity进行相互操作
  4. 容错恢复
    • 单点故障不影响网络通信
    • 重启后可以重新加入通讯网络,继续通信
    • 支持Reliability QoS进行可靠传输
  5. 较低的资源消耗
  6. 支持动态和静态发现
  7. 支持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接口的实现

仓库使用入门

参考 VBS开发者手册 —— 快速入门

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

  1. 启动发送广播自己上线
  2. 周期广播自己在线
  3. 回复其他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

抓包实例

udp_test_sub_pub.pcapng

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 发送数据