我们称最上面的机器为“Server”,中间的机器为“Controller”,最下面的机器为“Device”。设备是外围设备(例如 USB 或串行设备)还是计算机都没有关系。
第一个任务是让控制器查询设备。做到这一点的最佳方法实际上取决于设备。如果您考虑 USB 音频/视频设备之类的设备,则需要对其进行调整,然后它们会发送连续的数据流。诸如温度或湿度传感器之类的东西被告知要进行测量,然后它们会用数据做出响应。
通常您将所需的函数写入一个小型库,并使用命令行工具验证它是否有效。在某些情况下,库可能不是必需的,例如,如果控制器中的内核已经支持设备,并且信息很容易获得。(例如,考虑硬盘驱动器中的温度传感器:如果设备是硬盘,那么控制器可以简单地使用命令hddtemp /dev/sda
来获取/dev/sda
(第一个 SATA/ATA/SCSI 硬盘)的温度。我希望最终用户能够选择她感兴趣的硬盘,因此选择必须从服务器流向控制器。)
接下来,您编写一个将在 Controller 上运行的服务。该服务将包含已经编写和测试的库函数,因此可以轻松访问设备。(这样你就知道控制器-设备通信是有效的,并且不需要担心它。一次一件事。)
该服务有许多不同的设计,从普通的 TCP/IP 或 UDP/IP 套接字到远程过程调用 (RPC),再到 HTTP 等高级协议。近年来,使用 HTTP 的最后一种方法变得越来越普遍,响应是 XML、纯文本或二进制媒体(通常是图像)。这个想法是让服务基本上只是另一个可以直接访问设备的 Web 服务器。安全性更简单,因为它不需要是世界可访问的:它可以很好地只响应来自服务器的请求。我使用基本的 shell 脚本 (Bash)、PHP(PHP-CGI 和命令行 PHP、PHP-CLI)和 C 等语言编写了此类服务。最好的选择取决于细节,真的。我个人更喜欢简单的基于文本的 TCP/IP 套接字或 HTTP。
在服务器上,您可以编写一个 PHP 页面,该页面连接到 Controller,请求它想要请求的任何内容(通常取决于用户数据,当然首先要检查完整性和安全性)。PHP 具有简单的内置功能,可用于执行 HTTP 请求和使用原始 TCP/IP 进行连接,因此它非常适合此功能。如果启用了 HTTP 协议包装器,那么它只是$handle = fopen("http://192.168.x.x/myservice?param1=" . urlencode($param1) . "¶m2=" . urlencode($param2), "r+b");
. 要获得套接字连接,请改用该fsockopen()
函数。(有关详细信息,请参阅fopen()
http wrappers和www.php.netfsockopen()
上的PHP 函数参考。)
在实践中,PHP 页面代码首先创建到控制器的连接。然后它发送一个请求,其中包含从最终用户收到的相关净化命令/参数。然后它等待控制器响应结果(通过简单地读取响应),然后关闭连接。响应应该包含所有需要的数据,因此 PHP 页面可以自由地为最终用户构建页面。
这些都不是真的很难,但还有很多事情要做。我发现控制器-设备通信需要最多的工作;完成之后,其余的一直很简单。
如果您可以提供更多详细信息,控制器-设备连接是什么,设备提供什么样的数据(文本?数字?图像?大量二进制数据?),以及什么样的参数/命令(只是“一个结果,请?”、“向上移动”、“你在哪里?”等基本命令)您是否希望您需要发送到控制器/设备,我可能会更具体。
此外,您是否仅限于 PHP,或者您是否愿意使用 C 编写 Controller 服务?我自己发现这是一个非常好的组合。
编辑添加:
简而言之,这三点可以回答如下:
fopen("http://ip.add.re.ss:port/", "r+b");
如果使用 HTTP 协议并且 PHP 配置为允许 http 包装器(它们通常是),则使用,或者使用fsockopen()
. 有关详细信息,请参阅上面链接的 PHP 文档。
对于 IP 连接的设备,控制器基本上是一个继电器或转换器。通常这意味着在 Controller 上运行的守护程序,管理来自服务器(或服务器)的传入请求,以及来自设备(或设备)的响应。当有不同数量的设备和/或需要多个接口时,这种情况更为常见。在实践中,控制器就像上面描述的那样运行一个守护进程,除了协议可能是标准的或足够简单的,因此不需要编写库。
在服务器上运行的 PHP 必须包含对控制器的请求详细信息(正是所需的)。控制器必须将它们传递给设备。如果控制器为服务器上连接的 PHP 提供一个 http URL,它可以解析查询参数,并将它们转换为设备可以理解的格式。实践中的一个特殊问题是处理并发访问。从 Controller 到 Device 通常只有一个连接,但多个 PHP 可能同时连接到 Controller。因此,涉及到一些簿记。在某些情况下,设备向控制器提供连续的数据流(或定期更新的数据),而控制器只是对其进行监视。当服务器上运行的 PHP 从 Controller 查询某些内容时,控制器只是查找最新数据(根本不联系设备,只是正常接收数据),并用它来响应。在这里,通常在从控制器到服务器的响应中包含时间戳,或者更好的是,数据的年龄。
你真的应该为你的问题添加一些细节。(我怀疑否决票是由于缺乏细节。)您不需要告诉我们设备的确切品牌和型号,只需告诉我们它是接收器(电视?收音机?气象站?)还是传感器集群或门锁,如果您知道有关通信协议的任何详细信息(哪些)?到目前为止,我们只知道它使用 IP。这根本没有帮助,现在几乎所有东西都使用IP。这也是我的回答如此含糊的原因;我想更准确一点,但你没有提供足够的信息让我这样做。