我遇到了软件架构问题。 我必须设计一个IOS应用程序,它将与Linux应用程序通信以获取传感器的状态,并发布执行器命令。这两个应用程序在本地网络中运行,在IOS设备和Linux计算机之间具有Ad-Hoc WiFi连接。
所以我必须在两个应用程序之间同步两个值(如图1所示)。在Linux / Linux系统中,由于任何发布者/怀疑者中间件,我解决了这个问题。 但是如何在IOS / Linux世界中解决这个问题?
实际上Linux应用程序嵌入了异步TCP服务器,而IOS应用程序是异步TCP客户端。两个应用程序都通过TCP套接字进行通信。我认为这种方法是一种低级方法,我想将通信层迁移到更高级别的基于服务的通信框架。
经过一些书目研究后,我发现了三种解决问题的方法:
我可以创建一个RESTful Web服务,它可以模拟传感器状态,并且能够向执行器发送命令。 IOS存在一个RESTful Web服务客户端的实现,即“RESTKit”,我想我可以在服务器端使用Apache / Axis2。
由于libmaia,我可以在我的Linux计算机上创建一个RPC服务提供程序。在IOS方面,我可以使用xmlrpc(https://github.com/eczarny/xmlrpc)。我的两个程序将通过下图中描述的服务进行通信。
我没有详细介绍这些方法,但我想我可以在IOS端使用Bonjour,在linux端使用AVAHI。然后在两侧创建类似于RPC的自定义服务。
讨论这些方法:
REST方式似乎不是好方法,因为:“ REST接口旨在高效地进行大粒度超媒体数据传输”(来自Fielding论文的第5章) )。我的数据是非常精细的谷物数据,因为我的命令只是一个浮点数,而我的传感器状态也是如此。
我认为ZeroConf方式和RPC方式之间没有太大区别。 ZeroConf提供“仅”服务发现机制,我不需要这种机制,因为我的应用程序是一个严格的应用程序。双方都知道服务存在。
所以我的问题是:
干杯,
答案 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。