【问题标题】:Communication architecture choice in an IOS / Linux application?IOS / Linux 应用程序中的通信架构选择?
【发布时间】:2012-03-25 06:38:17
【问题描述】:

我有一个软件架构问题。 我必须设计一个 IOS 应用程序,它将与 Linux 应用程序通信以获取传感器的状态,并发布执行器命令。这两个应用程序在 IOS 设备和 Linux 计算机之间使用 Ad-Hoc WiFi 连接的本地网络中运行。

所以我必须在两个应用程序之间同步两个值(如图 1 所示)。在 Linux/Linux 系统中,我通过任何发布者/订阅者中间件解决了此类问题。 但是在 IOS / Linux 世界中我该如何解决这个问题

实际上Linux应用程序内嵌了一个异步TCP Server,而IOS应用程序是一个异步TCP客户端。两个应用程序都通过 TCP 套接字进行通信。我认为这种方法是一种低级方法,我想将通信层迁移到更高级别的基于服务的通信框架。

经过一些书目研究后,我发现了三种解决问题的方法:

  1. REST 方式:

    我可以创建一个 RESTful Web 服务,它可以对传感器状态进行建模,并且能够向执行器发送命令。 IOS 有一个 RESTful Web 服务客户端的实现,即“RESTKit”,我想我可以在服务器端使用 Apache/Axis2。

  2. RPC 方式:

    多亏了 libmaia,我可以在我的 Linux 计算机上创建一个 RPC 服务提供程序。在 IOS 端,我可以使用 xmlrpc (https://github.com/eczarny/xmlrpc)。我的两个程序将通过下图描述的服务进行通信。

  3. ZeroConf 方式:

    我没有详细介绍这种方法,但我想我可以在 IOS 端使用 Bonjour,在 linux 端使用 AVAHI。然后像在双方的 RPC 中一样创建自定义服务。

关于这些方法的讨论:

REST 方式似乎不是好方法,因为:“REST 接口旨在高效地进行大粒度超媒体数据传输”(来自 Fielding 论文的第 5 章)。我的数据是非常精细的数据,因为我的命令只是一个浮点数,我的传感器状态也是。

我认为 ZeroConf 方式和 RPC 方式没有太大区别。 ZeroConf“只”提供服务发现机制,我不需要这种机制,因为我的应用程序是一个刚性应用程序。双方都知道存在哪些服务。

所以我的问题是:

  • 基于 XML RPC 的方法是解决我的 iPhone 和计算机之间的变量同步问题的好选择吗?
  • 是否存在其他方法?

【问题讨论】:

  • 我假设在 SensorValueChanged 调用中,linux 应用程序是客户端,iOS 应用程序是服务器。对吗?
  • 我更喜欢服务器运行在linux电脑上。
  • 我的意思是,对于 SensorValueChanged,linux 应用程序调用 iOS 应用程序吗?
  • 回答您的问题 Paul Lalonde:是的。

标签: ios web-services middleware


【解决方案1】:

XML RPC 和您所说的“RESTful Web 服务”都可以完成工作。如果您可以使用 JSON 而不是 XML 作为有效负载格式,那将在 iOS 方面简化一些事情。

Zeroconf(又名 bonjour)可以与任何一种方法结合使用。在您的情况下,它将允许客户端动态定位服务器,作为在客户端中硬编码 URL 或其他地址的替代方法。 Zeroconf 在实际的应用程序级数据传输中没有任何作用。

您可能希望避免让 linux 应用程序调用 iOS 应用程序,因为这会使 iOS 应用程序复杂化很多,而且会很耗电。

【讨论】:

    【解决方案2】:

    我实际上建议您为您的应用程序使用“tcp socket + protobuf”。

    Socket 在将消息推送到您的 ios 应用程序方面非常有效,而 protobuf 可以节省您传递消息而不是字符字节的时间。您的另一个高级提案实际上引入了更多复杂性...

    【讨论】:

    • 如果我理解得很好,Proto buff 是一种序列化机制,因此这可能是灵活性和代码过载之间的正确平衡。 IOS 上是否存在良好的 protobuff 实现?
    • 是的,在这里查看stackoverflow.com/questions/1601656/…
    • 提醒一下,如果您需要不断更改消息类型,最好在 .proto 中使用“可选”
    【解决方案3】:

    您似乎精心挑选了一些现有技术,并试图让它们适应问题。

    我想将通信层迁移到更高级别的基于服务的通信框架

    为什么?

    您应该寻求在可用资源方面满足您要求的方法(您是否应该假设客户端可以保持一致的连接?它需要有多安全?)但是除了功能性、可用性和安全性之外,最大的应该关注的是如何以最少的努力实现这一点。

    我倾向于使用 REST 方法,因为:

    • 我从事大量网络开发工作,这就是我的技能所在
    • 它具有最小的依赖关系
    • 在两端实现协议栈的代码得到了很好的支持
    • 更换连接的任一端来测试实现很简单
    • 监控通信(如果它们未加密)以测试实施很简单
    • 添加加密/身份验证不会改变数据交换

    关于您的引用,对于 SCADA 来说,没有 HTTP 可能不是最明智的 - 但 iOS 也不是。

    【讨论】:

    • 你说得对,我没有解释为什么要将我的通信层迁移到更高级别的抽象。主要原因是将从 Ios 设备传输到 linux 工作站的“消息”不断演变。我不想在通信链接的每一侧都设计一个带有解析器的“语言”,因为我根据经验知道这是潜在错误的来源。我没有安全要求,通信可以认为是一致的。
    【解决方案4】:

    我无法提供答案;只是一些需要考虑的事情,没有特别的顺序。

    我也假设你的模型是iOS设备轮询服务器同步状态。

    最好不要在 iOS 设备上直接使用 Berkeley 套接字。 iOS 过去常常遇到低级套接字在一段时间不活动后无法连接的问题。至少我会使用 NSStream 或 CFStream 对象进行传输,或者,如果可能的话,我会使用 NSURL、NSURLConnection、NSURLRequest。 NSURLConnection 的异步数据加载能力非常适合 iOS 的 gui 更新循环。

    我认为您将不得不实现某种形式的数据定义语言,独立于您的实现方法(RES、XML RPC、CORBA、自己滚动等)

    您通过网络发送和接收的数据可能是 XML 或 JSON。如果您使用 XML,则必须编写自己的 XML 文档处理程序,因为 iOS 实现了 NSXMLParser 类而不是 NSXMLDocument 类。我将 JSON 称为 JSON 解析器将返回包含未序列化数据的 NSObjects 的 NSArray 或 NSDictionary 层次结构。

    我研究了一个使用 CFStreams 进行传输的 GSOAP 实现。每个请求和响应都由特定于请求的类处理以创建特定于请求的对象。每个新请求都需要为返回的数据定义一个新的类。通过 NSOperationQueue 触发请求来保持交互性。这里有很多垫片。这种方法的主要优点是接口是在 wsdl 模式中定义的(所有请求、响应和数据结构都定义在一个地方。

    我没有看过 iOS 上的 CORBA - 你必须将 C++ 库绑定到你的代码并更改传输以使用 CFStreams此外,您将与服务器建立单一连接,而不是为每个请求建立和断开 TCP 连接。

    我的 $.02

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2021-04-13
      • 2011-06-18
      相关资源
      最近更新 更多