现在希望实现的两个功能是,在web上通过点击按钮切换灯泡的开关,与,灯泡的单片机硬件每隔几秒会发送当前电流量这一数据到服务器,数据在web上显示出来。具体实现方法有点思路但并不是很清晰,希望大神指点一二。
设计与思路在下:
首先硬件会通过tcp协议连接到服务器上。
1.打开web后,web先建立与gatewayWorker连接的websocket,点击按钮会发送{'type':'onOrOff','op':'on'}类似这样的一个json数据,便会触发Events文件里的onMessage,使用Gateway::sendToAll()发送到所有硬件上。这种方法可以吗?
2.当硬件发送数据到服务器后,触发Events文件里的onMessage,目前的设想是将数据放入数据库,web通过轮询数据库再显示出来。还有另一个想法与疑问是,触发onMessage时能不能通过gatewayWorker直接推送到web上呢?在建立websocket的时候,为web分配一个uid,硬件数据到了服务器后,Gateway::sendToUID()到web。可以这样实现吗?
希望大神能对我的思路指点指点,谢谢。
按钮如下:
[attach]946[/attach]
因为web也需要接收到推送,时是不是用GatewayClient不合适?
我这样的设计是不是需要开一个内部推送的端口?具体协议怎么设置呢?
显然是可以的
与web通信肯定要建立 websocket 服务端,所以主要步骤可以这么做
建立一个websocket服务端
tcp服务端(也就是gatewayWorker)通过 AsyncTcpConnection 将消息推送到websocket服务端
websocket服务端接受到推送数据之后推送到与之连接的web端
核心就是 gatewayWorker 与 websocket 服务端的通信,要使用 AsyncTcpConnection 建立两者的连接。
感谢回答!因为硬件是隔数秒就推送到gatewayWorker上一串数据,请问我是要每收到一次数据就建立一次AsyncTcpConnection,进行send吗?
这样做当然是可以的,只要你确实是想用 web 上的一个开关控制_所有_灯泡。
你的思路是对的。具体的实现方法,楼上说的就可以。不过有一点,你一定要用 GatewayWorker 吗?如果仅从你给出的应用场景来看似乎是没有必要的,那么其实还可以再简单一些,如下:
在一个进程中开两个 Worker,一个是 websocket,供 web 连接进来,一个是 tcp(其实应该是 text 或者 frame 协议),供单片机连接进来。
感谢回答!因为gatewayWorker写好了sendToUid与sendToAll这样的函数,所以感觉用起来方便些...