智能车分布式进程虚拟交换机通信方法_2

文档序号:9276886阅读:来源:国知局
0042]3.取消订阅消息:int UnSubMsg(string msgLabel);
[0043]【功能】取消订阅消息
[0044]【参数】
[0045]msgLabel :消息标题
[0046]【返回值】
[0047]0 :取消订阅成功;
[0048]1 :取消订阅失败;
[0049]4?发布消息:int PubMsg(string msgLabel, object msgContent);
[0050]【功能】发布消息
[0051]【参数】
[0052]msgLabel :消息标题
[0053]msgContent :消息内容
[0054]【返回值】
[0055]0 :发布成功;
[0056]1 :发布失败;
[0057] 所述虚拟交换机使用C#实现动态链接库供进程调用,依照进程要求,其使用流程 如下:
[0058] 1).进程注册:进程向中间件注册,告知上线;
[0059] 2).消息订阅:进程告知中间件自身所需订阅的消息类别;
[0060] 3).消息发布:进程向中间件发布最新消息,中间件将消息封装成帧后通过UDP组 播协议发送到局域网。当收到消息时,中间件查询消息订阅表,并以回调函数的形式通知目 标进程收到消息;
[0061] 4).取消订阅:进程告知中间件不再需要某种消息;
[0062] 5).进程注销:进程告知中间件自身下线,中间件不再向该进程分发任何消息。
[0063] 所述虚拟总线可分为两种类型,可靠型总线和不可靠型总线;总线数量最多1024 条,每条总线上连接的进程数量没有限制。
[0064] 所述消息标题采用64bytes,所述时间戳采用8bytes,所述消息内容 < 60000bytes〇
[0065] 所述进程之间直接传递"对象"类型,无需进程额外对消息内容进行编码与解码。
[0066] 有益效果:与现有技术相比,本发明使用的虚拟交换机,采用总线型拓扑结构,模 块可以"热插拔"到系统中,随用随添加,随停随移除,不存在服务器与客户端的概念。模块 自成通信节点,一旦某模块发生故障对其它模块不产生影响,提高了系统的可靠性。消息采 用"订阅/发布"模式,模块间直接传递"对象",不用考虑数据的封装与解析,提高了开发效 率。模块之间不存在直接的点对点通信,实现了各模块在时间与空间上的解親,增加了模块 的独立性,以及系统的灵活性和可扩展性。
【附图说明】
[0067] 图1是本发明的虚拟交换机拓扑结构图;
[0068] 图2是本发明的虚拟交换机消息延迟时间测试原理图;
[0069] 图3是是本发明的压力测试程序测试原理图。
【具体实施方式】
[0070] 下面结合较佳实施例详细说明本发明的【具体实施方式】。
[0071] 实施例
[0072] 详见附图1,一种智能车分布式进程虚拟交换机通信方法,采用总线型拓扑结构, 基于UDP组播协议,通过订阅/发布消息模式,实现了智能车软件模块间的数据通信,具体 步骤如下:
[0073] -、建立软件模块通信分组:
[0074]智能车软件系统由若干软件模块组成,每个软件模块对应一个进程,软件模块以 进程的形式存在于智能车系统中;按照智能车各软件模块之间的通信关系,将软件模块划 分成若干通信分组,为每组分配一条虚拟总线编号;
[0075] 二、建立虚拟交换机:
[0076] 虚拟交换机用于局域网内单个或多个计算机上不同进程之间的数据通信,所述虚 拟交换机是基于微软.net平台、应用于局域网、异步收发和直接传递"对象"的总线型分布 式消息中间件,以.net环境下托管动态链接库的形式被进程调用,并不存在额外的总线程 序。
[0077] 三、建立虚拟总线:
[0078] 虚拟总线基于UDP组播协议实现,一条虚拟总线相当于一个网络套接字,套接字 的网络地址为私网组播地址,连接到同一条虚拟总线上的各软件模块通过虚拟交换机同时 加入该组播组并监听套接字上的消息,每条总线连接若干进程,所述进程属于局域网内任 何一台计算机,同一总线上的不同进程之间通过订阅消息和发布消息两种模式进行数据通 信;按照智能车各软件模块之间的通信关系,将软件模块划分成若干通信分组,为每组分配 一条虚拟总线编号;
[0079] 四、建立消息:
[0080] 虚拟交换机中的一帧消息由三部分组成:
[0081] 消息标题+时间戳+消息内容
[0082] 其中,时间戳由虚拟交换机生成,消息标题及消息内容由软件模块生成;
[0083] 五、建立订阅消息/取消订阅消息:
[0084] 所述订阅消息是进程将消息标题加入到自身内存中的消息订阅列表中,同时将回 调函数地址关联到所述消息标题,
[0085] 所述取消订阅消息时,进程将消息标题从消息订阅列表中移除,
[0086] 虚拟交换机为每个进程保存了一张消息订阅表,存储在该进程的地址空间中,每 个进程维护一个消息订阅列表;
[0087] 六、发布消息:
[0088] 当软件模块发布消息时,虚拟交换机首先将消息内容通过序列化的方式转换成字 节数组,然后与时间戳及消息标题一起形成消息帧,再通过虚拟总线将消息帧发送给所有 连接到该总线的软件模块;
[0089] 采用总线型拓扑结构,所述虚拟交换机通过一条或多条虚拟总线与软件模块连 接,实现软件模块订阅所需消息和发布产生的消息,通信结束后,虚拟总线随着软件模块的 退出而退出。
[0090] 所述虚拟交换机通过虚拟总线编号计算出组播端口,计算方法为:组播端口 = (总线编号+6000)%1024,侦听该端口号的UDP组播,当虚拟总线有新消息到来时,该进程 空间的虚拟交换程序首先提取该消息标题,然后查找自身消息订阅列表,如果存在该标题, 则在线程池中启动一个新线程执行对应的回调函数,如果不存在则不进行处理;
[0091] 所述发布消息是该进程空间的虚拟交换机首先将消息内容序列化成字节数组,然 后加上时间戳及消息标题形成消息帧,通过虚拟总线编号计算出组播端口号,计算方法为: 组播端口 =(总线编号+6000)%1024,最后通过UDP组播协议将消息广播到以太网。
[0092] 所述虚拟交换机包含可靠传输模式和非可靠传输模式两种运行方式,底层实现分 别对应微软消息队列与UDP多播,不同的虚拟总线,对应不同的多播地址;在同一条虚拟总 线上,能够将数据载荷进一步划分为64位字节的消息头和后面的真正载荷,使得软件模块 能够有选择性的订阅总线上的各类消息。
[0093] 所述虚拟交换机使用方法:虚拟交换机共提供4个接口供软件模块调用:
[0094] 5.连接虚拟总线:VirtualSwitchBus (int busNum);
[0095]【功能】连接虚拟总线
[0096]【参数】
[0097] busNum :总线编号,0 ~1023 ;
[0098] 【返回值】无
[0099] 6?订阅消息:int SubMsg(string msgLabel, MsgRecvFunc msgRecvFunc);
[0100]【功能】订阅消息
[0101] 【参数】
[0102] msgLabel :消息标题
[0103] msgRecvFunc :回调函数
[0104] 回调函数声明如下:void FuncName (object msgContent, ref DateTime msgSentTime)
当前第2页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1