vsomeip支持静态服务发现吗?

1.源码分析

 1.1配置文件

查看vsomeip是否支持静态服务发现,首先查看配置文件。在其配置文件中,有个services项。即服务的每个单独配置,其中包括了服务所使用的ip地址(或者目标服务所在的ECU的IP地址),TCP端口号,UDP端口,广播地址以及端口、协议、事件组等,配置项。

从配置项角度来说,是支持静态服务发现的。但是这里有个问题,这里并没有预留接收端IP地址的位置。即发送端并不知道接收端的信息。

1.2 发送端

根据以上的配置信息,服务的发送端其实是不知道接收端的信息,因此发送的时候,并不能直接发送信息给接收端。以下是vsomeip 片间发送event消息的部分源码。

vsomeip 首先根据service_id, instance_id以及event_id,查找本地的event新,根据event的配置信息,获取其TCP和UDP的服务端的Endpoint,即通信终端。根据event所在的event_group,查找已订阅的单播目标。注意,这里查找的目标是已订阅的,也就说,即使是走静态服务发现,也需要走订阅流程,而event_group只有在service discovery中才会有。因此猜测vsomeip大概率不支持静态服务发现。

之后,事件组会判断是否通过组播方式(在someip协议中,当一个eventgroup订阅的数量超过一定的阈值,则可以通过组播的方式发送event消息,以降低网络的开销,提高通信效率)。但是在该接口中也会根据订阅者的数量判断是否走组播发送。

因此从发送端的代码可以看出,vsomeip发送片间消息的一个前提是存在片间的订阅,而通过配置文件,发送端其实是不知道接收端的ip地址和端口号的。

1.3 订阅端

在发送端的源码分析中知道,订阅端如果想接收到数据,则订阅端需要向发送端发起订阅,这样发送端才能够发送信息到订阅端。而订阅端发送订阅消息是通过vsomeip的subscribe接口,即如下图:

订阅端发起订阅时,vsomeip首先查找本地是否存在已知的客户端,即查看本机中是否有对应的event 发送端,如果不是,则进入else代码。而在静态服务发现中,discovery模块是没有启动的,因此就直接跳入VSOMEIP的错误打印"SOME/IP eventgroups require SD to be enabled!",

而并没有发送任何的订阅操作,因此也就不会收到任何的event消息。这个与实验结果一致。

2.结论

根据以上的源码分析,以及做的测试,vsomeip目前的版本并不支持跨机的静态服务发现(测试使用的vsomeip版本是3.1.20,最新版本是3.4.20,即使是最新版本,订阅端的订阅操作的源码与3.1.20一致)

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值