一种基于车载软件平台进程内模块间的消息广播通信方法

文档序号:6535621阅读:158来源:国知局
一种基于车载软件平台进程内模块间的消息广播通信方法
【专利摘要】本发明公开了一种基于车载软件平台进程内模块间的消息广播通信方法,包括:抽象定义消息发送器类及消息接收器类;通过继承方式实例化消息发送器对象和消息接收器对象;在所述消息发送器类内定义消息接收器对象列表,并在所述消息接收器类内定义消息发送器对象列表;在所述消息发送器类内添加用于获取所述消息接收器对象指针的第一接口,在所述消息接收器类内添加用于获取所述消息发送器对象指针的第二接口;在所述消息发送器类内定义单播或广播消息接口,在所述消息接收器类内定义消息接收接口。采用本发明,可实现一对多或多对一的广播通信,实现进程内不同模块之间进行低耦合的通信,引入消息定义方式,解决不同模块之间消息的定义重叠。
【专利说明】一种基于车载软件平台进程内模块间的消息广播通信方法

【技术领域】
[0001] 本发明涉及嵌入式设备进程通信【技术领域】,尤其涉及一种基于车载软件平台进程 内模块间的消息广播通信方法。

【背景技术】
[0002] 窗口消息通信机制:在Windows中发生的一切都可以用消息来表示,消息用于告 诉操作系统发生了什么,所有的Windows应用程序都是消息驱动的。一个消息是由消息的 名称(UINT)和两个参数(WPARAM,LPARAM)组成。消息的参数中包含有重要的信息。例如 对鼠标消息而言,LPARAM中一般包含鼠标的位置信息,而WPARAM参数中包含了发生该消息 时,SHIFT、CTRL等键的状态信息,对于不同的消息类型来说,两个参数也都相应地具有明确 意义。
[0003] 同步和异步:同步是指发送方发出数据后,等接收方发回响应以后才发下一个数 据包的通讯方式。异步是指发送方发出数据后,不等接收方发回响应,接着发送下个数据包 的通讯方式。
[0004] 相应地,窗口消息通信机制是基于队列的通信方式,可采用同步和异步两种通信 方式进行通信,但在时间上会因为0S的繁忙程度引起消息接收的延迟,甚至更严重的情况 会丢失消息,存在一定的弊端和隐患。
[0005] 轮询方式:这里特指程序中通过定时器或者线程的方式,不断地重复某个操作或 者某段代码,这样的方式会对CPU资源造成很大的消耗。
[0006] 目前,常使用的进程内通信机制可通过对一个CMyQueue类的队列对象进行入列 和出列T_Msg消息结构实现,即在代码的某处向该队列插入一个消息,而在另外一处不断 通过轮询检测的方式获取该队列内的消息来达到不同代码区域之间的通信。
[0007] 但是,该通信机制存在以下缺陷: (1)只能实现一对一的通信方式。对于某一个功能的CMyQueue队列对象来说,发送方 和接收方都是既定的,如果有多个功能或模块需要使用该机制时必须定义多个这样的队列 对象,因而在代码里会存在多个这样的一对一的通信方式,不同通信方式之间如果有联系 的话(即存在一对多的通信方式),只能通过消息接收方接收到消息后再与另外的相关方进 行单独联系,从而实现消息事件沟通,这是相当繁琐的过程。
[0008] (2)消息接收方必须通过轮询的方式获取该队列内的消息。要实现该通信机制必 须在定义CMyQueue队列对象的发送方处暴露该对象,从而让接收方知道该对象并且不断 通过轮询方式对该队列对象进行出列操作以获取消息进行处理。这样的方式首先会消耗过 多的CPU资源,再者会造成不同模块之间的耦合度较大,代码的冗余度较强,并且会增加代 码的复杂度,进而引起一些意料之外的问题。


【发明内容】

[0009] 本发明所要解决的技术问题在于,提供一种基于车载软件平台进程内模块间的消 息广播通信方法,可实现车载软件平台进程内模块之间的一对多或者多对一的广播通信方 式。
[0010] 本发明所要解决的技术问题还在于,提供一种基于车载软件平台进程内模块间的 消息广播通信方法,可引入特定的消息定义方式,有效地解决不同模块之间消息的定义会 数值重叠。
[0011] 为了解决上述技术问题,本发明提供了一种基于车载软件平台进程内模块间的消 息广播通信方法,包括:抽象定义消息发送器类及消息接收器类;通过继承方式实例化所 述消息发送器类的消息发送器对象和所述消息接收器类的消息接收器对象;在所述消息发 送器类内定义消息接收器对象列表,通过所述消息接收器对象列表管理所有与所述消息发 送器类相关的消息接收器对象,并在所述消息接收器类内定义消息发送器对象列表,通过 所述消息发送器对象列表管理所有与所述消息接收器类相关的消息发送器对象;在所述消 息发送器类内添加用于获取所述消息接收器对象指针的第一接口,在所述消息接收器类内 添加用于获取所述消息发送器对象指针的第二接口,当外部调用第一接口时,把所述第一 接口获取的消息接收器对象指针保存到所述消息接收器列表内,并在内部通过所述消息接 收器列表内的消息接收器对象指针自动调用第二接口,把所述第二接口获取的消息发送器 对象指针保存到所述消息发送器对象的列表;在所述消息发送器类内定义单播或广播消 息接口,在所述消息接收器类内定义消息接收接口,所述广播消息接口通过调用所述消息 接收接口,把所述消息发送器对象的状态以接口函数的参数形式传递至所述消息接收器对 象。
[0012] 作为上述方案的改进,所述通过继承方式实例化消息发送器类的消息发送器对象 和消息接收器类的消息接收器对象的方法包括:将普通类通过继承所述消息发送器类的方 式定义为消息发送器对象;将需要关联并接收所述普通类状态的其他普通类通过继承所述 消息接收器类的方式定义为消息接收器对象。
[0013] 作为上述方案的改进,所述接口函数包括三个参数,所述第一个参数为传递的消 息,所述第二个参数及第三个参数为数据传递指针。
[0014] 作为上述方案的改进,所述消息为单播消息或广播消息。
[0015] 作为上述方案的改进,所述消息包括第一子参数及第二子参数,所述第一子参数 为模块名称,所述第二子参数为同一个模块内的不同消息序号。
[0016] 作为上述方案的改进,可将不同模块同时定义为同一消息发送器对象所对应的消 息接收器对象。
[0017] 实施本发明,具有如下有益效果: 运用基于车载软件平台进程内模块间的消息广播通信方法可以将车载软件平台进程 内模块间的一对一的通信方式改进为一对多或者多对一的广播通信方式,从而减少事件相 关方之间不必要过多紧密的联系,实现进程内不同模块之间进行低耦合的通信,使程序架 构清晰明了,有效提高程序的质量和健壮性。
[0018] 另外,引入特定的消息定义方式,可以有效地解决不同模块之间消息的定义会数 值重叠,从而造成消息处理上的混乱。

【专利附图】

【附图说明】
[0019] 图1是本发明一种基于车载软件平台进程内模块间的消息广播通信方法的第一 实施例流程图。

【具体实施方式】
[0020] 为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一 步地详细描述。
[0021] 图1是本发明一种基于车载软件平台进程内模块间的消息广播通信方法的第一 实施例流程图,包括: S101,抽象定义消息发送器类及消息接收器类。
[0022] S102,通过继承方式实例化所述消息发送器类的消息发送器对象和所述消息接收 器类的消息接收器对象。
[0023] 更佳地,所述通过继承方式实例化消息发送器类的消息发送器对象和消息接收器 类的消息接收器对象的方法包括: a、将普通类通过继承所述消息发送器类的方式定义为消息发送器对象。
[0024] b、将需要关联并接收所述普通类状态的其他普通类通过继承所述消息接收器类 的方式定义为消息接收器对象。
[0025] 需要说明的是,一个普通类既可以定义为消息发送器对象,也可以定义为消息接 收器对象,这样可以灵活地配置消息通信机制,而且无需增加过多的代码。
[0026] 更佳地,可将不同模块同时定义为同一消息发送器对象所对应的消息接收器对 象。即可使多个消息接收器对象同时接收同一个消息并进行处理,也可使一个消息接收器 对象同时接收多个消息,继而降低不同模块之间的耦合度。
[0027] 例如,抽象定义消息发送器类为CMsgStation,抽象定义消息接收器类为 CMsgReceiver类。如果普通类A想要向普通类B发送一个消息,可以把普通类A通过 继承CMsgStation类的方式将其定义为一个消息发送器对象A,再把普通类B通过继承 CMsgReceiver类的方式将其定义为一个消息接收器对象B。
[0028] 又如,抽象定义消息发送器类为CMsgStation,抽象定义消息接收器类为 CMsgReceiver类。如果普通类A想要向普通类B及普通类C发送一个消息,可以把普通类 A通过继承CMsgStation类的方式将其定义为一个消息发送器对象A,再把普通类B及普通 类C分别通过继承CMsgReceiver类的方式将其定义为消息接收器对象B及消息接收器对 象C。
[0029] 再如,抽象定义消息发送器类为CMsgStation,抽象定义消息接收器类为 CMsgReceiver类。如果普通类A及普通类B想要向普通类C发送消息,可以把普通类A及 普通类B分别通过继承CMsgStation类的方式将其定义为一个消息发送器对象A及消息发 送器对象B,再把普通类C通过继承CMsgReceiver类的方式将其定义为消息接收器对象C。
[0030] S103,在所述消息发送器类内定义消息接收器对象列表,并在所述消息接收器类 内定义消息发送器对象列表。
[0031] 在所述消息发送器类内定义消息接收器对象列表,通过所述消息接收器对象列表 管理所有与所述消息发送器类相关的消息接收器对象。
[0032] 需要说明的是,所述消息接收器对象列表内存储有一个或多个消息接收器对象指 针,通过所述消息接收器对象列表可有效管理所有与所述消息发送器类相关的所述消息接 收器对象,建立一对多的消息通信链路,从而实现广播消息通信的机制。
[0033] 在所述消息接收器类内定义消息发送器对象列表,通过所述消息发送器对象列表 管理所有与所述消息接收器类相关的消息发送器对象。
[0034] 需要说明的是,所述消息发送器对象列表内存储有一个或多个消息发送器对象指 针,通过所述消息发送器对象列表可有效管理所有与所述消息接收器类相关的所述消息发 送器对象,建立多对一的消息通信链路,从而实现广播消息通信的机制。
[0035] S104,在所述消息发送器类内添加用于获取所述消息接收器对象指针的第一接 口,在所述消息接收器类内添加用于获取所述消息发送器对象指针的第二接口,当外部调 用第一接口时,把所述第一接口获取的消息接收器对象指针保存到所述消息接收器列表 内,并在内部通过所述消息接收器列表内的消息接收器对象指针自动调用第二接口,把所 述第二接口获取的消息发送器对象指针保存到所述消息发送器对象的列表。
[0036] 需要说明的是,在所述消息接收器类内定义消息接收器对象指针,在所述消息发 送器类内添加用于获取所述消息接收器对象指针的第一接口。同时,在所述消息发送器类 内定义消息发送器对象指针,在所述消息接收器类内添加用于获取所述消息发送器对象指 针的第二接口。可有效地使消息发送器对象与消息接收器对象能够映射起来。
[0037] 例如,在消息发送器类CMsgStation内部添加一个用于获取消息接收器对象指针 的第一接口 AddMsgReceiver。在消息接收器类CMsgReceiver内添加用于获取消息发送器 对象指针的第二接口 AddMsgStation。当外部调用第一接口 AddMsgReceiver时,把第一接 口 AddMsgReceiver获取的消息接收器对象指针保存到消息接收器列表内,以传递给消息 发送器对象。并在内部通过消息接收器列表内的消息接收器对象指针自动调用第二接口 AddMsgStation,把所述第二接口 AddMsgStation获取的消息发送器对象指针传递给消息 接收器类CMsgReceiver内部并保存到消息发送器对象的列表内,即可把消息发送器对象 与消息接收器对象关联起来了。
[0038] S105,在所述消息发送器类内定义广播消息接口,在所述消息接收器类内定义消 息接收接口,所述广播消息接口通过调用所述消息接收接口,把所述消息发送器对象的状 态以接口函数的参数形式传递至所述消息接收器对象。
[0039] 需要说明的是,根据所述列表建立消息发送器对象与消息接收器对象之间的映 射。同时,广播消息接口通过调用所述消息接收接口,把所述消息发送器对象的状态以接口 函数的参数形式传递至所述消息接收器对象,即可实现消息发送器对象告知消息接收器对 象自身状态改变。
[0040] 优选地,所述车载软件平台进程内模块间的消息广播通信方法可用于WinCE平 台、Android平台等,实现车载软件平台进程内模块间一对多或者多对一的广播通信。
[0041] 更佳地,所述接口函数包括三个参数,所述第一个参数为传递的消息,所述第二个 参数及第三个参数为数据传递指针。
[0042] 需要说明的是,利用所述第二个参数及第三个参数可根据实际情况传递任意类型 数据的指针。当无数据传递时,所述第二个参数及第三个参数的默认值为"NULL" ;当要传 递数据时,可将保存相应类型数据的数据传递指针通过该成员函数进行传递,继而获取相 应的数据。
[0043] 更佳地,所述消息可为单播消息,也可以为广播消息。
[0044] 其中,所述单播消息用于一对一的传递方式,所述广播消息用于多对多的传递方 式。
[0045] 更佳地,所述消息包括第一子参数及第二子参数,所述第一子参数为模块名称,所 述第二子参数为同一个模块内的不同消息序号。
[0046] 需要说明的是,通过第一子参数及第二子参数的方式,可以有效地解决不同模块 之间消息的定义会数值重叠,从而造成消息处理上的混乱。
[0047] S卩,不同的模块内的消息可以定义为:'XXX' + X的模式,其中,第一个参数"XXX" 为模块名称,例如,"CAN"、"iPod"、"Radio"、"CE69"、"CE6K"等等 ;第二个参数"X"表示同 一个模块内的不同消息序号。
[0048] 例如: APP代码: //升级 const MessageT Msg-Upgrade-Process = 'CE6K' + 1; const MessageT Msg-Upgrade_Tip = 'CE6K' + 2; // MCU const MessageT Msg-MCU-ChangeView = 'CE6K' + 3; const MessageT Msg-MCU-KeyPress = 'CE6K' + 4; const MessageT Msg-MCU-Reset = 'CE6K' + 5; // Radio const MessageT Msg-Radio = 'CE6K' + 6; CAN模块代码: const MessageT Msg-CAN-Upgrade = 'CAN' + 1; const MessageT Msg-CAN-Radar = 'CAN' + 2; const MessageT Msg-CAN-HVAC = 'CAN' + 3。
[0049] 下面结合具体的实施例对本发明作进一步地详细描述。
[0050] 1、确定消息发送器对象与消息接收器对象 假设两个类CSend和CReceive,CSend类通过继承MsgStation类并定义一个对 象(pSend)作为消息发送器,CReceive类通过继承CMsgReceiver类并定义一个对象 (pReceive)作为消息接收器。
[0051] class Csend: public CMsgStation { }; Csend *pSend = new Csend; //实例化消息发送器对象 class CReceive: public CMsgReceiver { }; CReceive *pReceive = new CReceive; // 实例化消息接收器对象 2、 关联消息发送器与消息接收器 CMsgStation类内部有一个成员接口为AddMsgReceiver,CSend类继承了该成员接口, 并通过这个接口方法把pReceive传递给CSend类,这样消息发送器和消息接收器就关联起 来了。
[0052] pSend->AddMsgReceiver( pReceive ); 3、 消息发送与接收 Csend继承CMsgStation类的成员函数Broadcast,对象pSend通过Broadcast的第一 个参数发送各种消息。下面采用同步方式发送一个msg_Notify消息。
[0053] const MessageT msg-Notify send, + 1; INT32 nParam = 1; typedef struct -StParam { INT32 nTxCmd; bool bState; DWORD dwTime; }StParam; StParam stparam; stparam. bTxCmd = 1; stparam. bState = true; stparam. dwTime = 60; pSend->Broadcast (msg-Notify, MessageTxMode_Sync, &nParam, &stparam); 在CMsgReceiver类内部有一个虚函数接口为ReceiveMessage,CReceive类重载这个 函数以重写这个函数的内容,对象pReceive通过ReceiveMessage函数的第一个参数传递 过来的消息,即可分别处理消息发射器发送过来的不同消息。
[0054] B00L CMsgReceiver::ReceiveMessage( MessageT Msg, void* ioParam, void* ioParam2 ) { switch ( Msg ) { case msg-Notify: { INT32 nReciveNum = *( static-cast〈INT32*>( ioParam )); StParam* stReceive = static_cast〈StParam*>( ioParam2 ); return TRUE; } break; case msg-StationDestroyed: { StParam* stReceive2 = static_cast〈StParam*>( ioParam2 ); return TRUE; } break; } return FALSE; } 由上可知,运用基于车载软件平台进程内模块间的消息广播通信方法可以将车载软件 平台进程内模块间的一对一的通信方式改进为一对多或者多对一的广播通信方式,从而减 少事件相关方之间不必要过多紧密的联系,实现进程内不同模块之间进行低耦合的通信, 使程序架构清晰明了,有效提高程序的质量和健壮性。另外,引入特定的消息定义方式(即 消息包括第一子参数及第二子参数),可以有效地解决不同模块之间消息的定义会数值重 叠,从而造成消息处理上的混乱。
[0055] 以上所述是本发明的优选实施方式,应当指出,对于本【技术领域】的普通技术人员 来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为 本发明的保护范围。
【权利要求】
1. 一种基于车载软件平台进程内模块间的消息广播通信方法,其特征在于,包括: 抽象定义消息发送器类及消息接收器类; 通过继承方式实例化所述消息发送器类的消息发送器对象和所述消息接收器类的消 息接收器对象; 在所述消息发送器类内定义消息接收器对象列表,通过所述消息接收器对象列表管理 所有与所述消息发送器类相关的消息接收器对象,并在所述消息接收器类内定义消息发送 器对象列表,通过所述消息发送器对象列表管理所有与所述消息接收器类相关的消息发送 器对象; 在所述消息发送器类内添加用于获取所述消息接收器对象指针的第一接口,在所述 消息接收器类内添加用于获取所述消息发送器对象指针的第二接口,当外部调用第一接口 时,把所述第一接口获取的消息接收器对象指针保存到所述消息接收器列表内,并在内部 通过所述消息接收器列表内的消息接收器对象指针自动调用第二接口,把所述第二接口获 取的消息发送器对象指针保存到所述消息发送器对象的列表; 在所述消息发送器类内定义单播或广播消息接口,在所述消息接收器类内定义消息接 收接口,所述广播消息接口通过调用所述消息接收接口,把所述消息发送器对象的状态以 接口函数的参数形式传递至所述消息接收器对象。
2. 如权利要求1所述的基于车载软件平台进程内模块间的消息广播通信方法,其特征 在于,所述通过继承方式实例化消息发送器类的消息发送器对象和消息接收器类的消息接 收器对象的方法包括: 将普通类通过继承所述消息发送器类的方式定义为消息发送器对象; 将需要关联并接收所述普通类状态的其他普通类通过继承所述消息接收器类的方式 定义为消息接收器对象。
3. 如权利要求1所述的基于车载软件平台进程内模块间的消息广播通信方法,其特征 在于,所述接口函数包括三个参数,所述第一个参数为传递的消息,所述第二个参数及第三 个参数为数据传递指针。
4. 如权利要求3所述的基于车载软件平台进程内模块间的消息广播通信方法,其特征 在于,所述消息为单播消息或广播消息。
5. 如权利要求3所述的基于车载软件平台进程内模块间的消息广播通信方法,其特征 在于,所述消息包括第一子参数及第二子参数,所述第一子参数为模块名称,所述第二子参 数为同一个模块内的不同消息序号。
6. 如权利要求1飞任一项所述的基于车载软件平台进程内模块间的消息广播通信方 法,其特征在于,可将不同模块同时定义为同一消息发送器对象所对应的消息接收器对象。
【文档编号】G06F9/54GK104063285SQ201410014753
【公开日】2014年9月24日 申请日期:2014年1月13日 优先权日:2014年1月13日
【发明者】莫斌 申请人:惠州华阳通用电子有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1