IOS / Linux应用程序中的通信架构选择?

时间:2012-03-07 17:41:54

标签: ios web-services middleware

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

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

Figure 1 : my synchronization problem

实际上Linux应用程序嵌入了异步TCP服务器,而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的自定义服务。

  4. The RPC Solution

    讨论这些方法:

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

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

    所以我的问题是:

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

    干杯,

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

我还假设您的模型是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解析器将返回包含非序列化数据的NSObject的NSArray或NSDictionary层次结构。

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

我没有看过iOS上的CORBA - 您必须将C ++库与您的代码联系起来并更改传输以使用CFStreams。再次使用大量的垫片,但是在idl文件中定义协议的优势。您还可以与服务器建立单一连接,而不是为每个请求建立和断开TCP连接。

我的$ .02

答案 2 :(得分:0)

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

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

你可能想避免让linux应用程序调用iOS应用程序,因为这会使iOS应用程序变得很复杂,而且电池会很难用。

答案 3 :(得分:0)

你似乎已经选择了一些现有的技术,并且似乎试图让它们适合这个问题。

  

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

为什么?

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

我倾向于REST的方法,因为:

  • 我做了很多网页开发,所以这就是我的技能所在
  • 它具有最小的依赖性
  • 两端都有很好的支持代码实现协议栈
  • 替换连接的任何一端以测试实现
  • 是微不足道的
  • 监控通信(如果它们没有加密)以测试实现是微不足道的
  • 添加加密/身份验证不会更改数据交换

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