gpt4 book ai didi

c++ - 具有通用通信媒体层的中间件

转载 作者:太空宇宙 更新时间:2023-11-04 12:25:44 27 4
gpt4 key购买 nike

问候大家,

我正在尝试为具有通用通信媒体层的嵌入式设备实现中间件(驱动程序)。不确定执行此操作的最佳方法是什么,因此我正在寻求经验丰富的stackoverflow用户的建议:)。基本上,我们在全国范围内都有与服务器通信的设备(或在现场使用的pda /笔记本电脑)。通常的通信形式是通过TCP / IP进行的,但也可以使用usb,RF dongle,IR等。该计划是使对象与这些设备中的每一个相对应,在一侧处理专有协议(protocol),并从另一侧处理请求/响应。内部系统。

问题是如何在媒体和处理对象之间创建通用的东西。我曾使用boost.asio和TCP调度程序一起玩,但是尝试创建一些通用的东西似乎是一场噩梦:)。有人试图做这样的事情吗?最好的方法是什么?

示例:设备连接到我们的Linux服务器。 (在服务器上)创建了一个新的中间件实例,该实例将其自身通告给正在运行的服务之一(细节并不重要)。该服务负责确保设备时间同步。因此,它询问中间件设备的时间是多少,驱动程序将其转换为设备语言(协议(protocol)),然后发送消息,设备响应,驱动程序再次将其转换为服务。对于这样一个简单的请求,这似乎有点过头了,但是想象一下,驱动程序必须转换更复杂的请求,并且设备的多个版本使用不同的协议(protocol)等,但是将使用相同的时间同步服务。目的是通过中间件抽象设备,以便能够使用相同的服务与它们进行通信。

另一个例子:我们发现与设备的远程通信中断。因此,我们派人使用PDA,他使用USB电缆连接到设备。启动具有与时间同步服务相同功能的应用程序。再次创建中间件实例(在PDA上),这次仅使用USB /串行媒体而不是如上例中的TCP / IP来转换应用程序和设备之间的通信。
我希望现在更有意义:)

干杯,
汤姆

最佳答案

The thing is how create something generic in between the media and the handling objects. I had a play around with the TCP dispatcher using boost.asio but trying to create something generic seems like a nightmare :). Anybody tried to do something like that? What is the best way how to do it?



我没有使用Boost,但是我通常处理此类问题的方法是创建一个与服务器交互的Device基类,然后为每种设备类型将其子类化,并使子类处理设备奇数。这样,Device类就成为协议(protocol)的定义。同样,Device类需要是可移植的,但子类则不需要。

如果您需要更出色的方法,则可以使用Factory模式创建实际的子类对象。

就实际通信而言,我将查看每个设备是否只能运行一个进程。如果每个进程必须有多个设备,那么在Linux上,我将使用 select()及其 friend 来管理各种设备实例之间的I / O。我不知道如何在Windows上执行此操作;它的 select仅适用于套接字,不适用于串行端口或其他类似文件的事物。

我想到的其他有用的东西包括dbus和MPI(消息传递接口(interface))库,尽管它们并不是解决问题的完整解决方案(dbus不进行计算机间通信,即IIRC)。

这有帮助吗?

编辑:需要格式化的答复汤姆的答复...

Does your device class contain the communication specific parts? Because that's the thing I wanted to avoid.



子类包含特定于通信的部分。这就是在这里使用子类的重点。通用的东西放在基类中,而具体的东西放在子类中。

I was thinking about something like this: Say there is a dispatcher specific for media used which creates Connection object for each connection (media specific), Device obj. would be created as well but just a generic one and the Connection would pass the incoming data to Device and the Device would pass the responses back to Connection.



我认为这可能有点复杂,并且您期望通用设备处理特定的连接,但是很难快速维护。

我推荐的是一个Device子类,专门用于处理这种类型的Connection,该类从调度程序获取Connection并拥有它,直到连接关闭。然后,您的经理可以与通用设备进行对话,并且Connection可能会干扰具体的设备。

例如:假设您有一个温度传感器USB Thingamajig。您有一些调度程序捕获“USB物已插入”信号。看到USB东西插入时:
  • Dispatcher创建一个USBTemperatureThingConnection
  • Dispatcher创建一个USBTemperatureDevice,它是Device的子类,将USBTemperatureThingConnection赋予USBTemperatureDevice作为构造函数参数。
  • USBTemperatureDevice::USBTemperatureDevice(USBTemperatureThingConnection* conn)会在本地设置所需的任何内容以完成连接的设置,然后向设备管理器发送一条消息,指出它已进行了设置。

  • 一段时间后,设备管理器要在所有设备上设置时间。因此,它遍历其设备列表,并在每个设备上调用通用(甚至是抽象的) Device::SetTime(const struct timespec_t&)方法。

    当到达您的温度设备时,它会调用 USBTemperatureDevice::SetTime(const struct timespec_t&),因为 USBTemperatureDevice会覆盖 Device中的一个(后者是抽象的,即 virtual void SetTime(const struct timespec_t&) = 0;或无操作的内容,即 virtual void SetTime(const struct timespec_t&) {},因此对于可以执行此操作的设备,您不必覆盖它) t设定时间)。 USBTemperatureDevice::SetTime(const struct timespec_t&)使用 USBTemperatureThingConnection来完成USB温度传感器特定的所需工作,以获取时间设置。

    一段时间后,设备可能会发回“时间设置结果”消息,说明其是否起作用。那是在 USBTemperatureThingConnection上,它会唤醒您的线程,您需要对其进行处理。因此,您的 USBTemperatureDevice::DealWithMessageFromSensor()方法(仅存在于 USBTemperatureDevice中)将深入研究消息内容并确定时间设置是否有效。然后,它获取该结果,将其转换为 enum Device::ResultCode中定义的值,并调用 Device::TimeSetComplete(ResultCode result),该结果记录该结果,设置一个标志( bool Device::timeComplete)表示结果在其中,然后按 SemaphoreCondition唤醒设备管理器并获取它检查所有 Device的情况,以防它被阻止等待所有设备完成设置时间后再继续。

    我不知道该模式叫什么。如果按下,如果我感到脾气暴躁,我会说“子类化”或“面向对象设计”。 “中间件”是 Device类,DeviceManager及其所有基础。然后,应用程序仅与设备管理器对话,或至多与特定设备的通用 Device接口(interface)对话。

    Btw. Factory pattern was planned, each object would run in separate thread :)



    很高兴听到。

    关于c++ - 具有通用通信媒体层的中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2650085/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com