关于Web推送到硬件与硬件返回数据推送到web的设计的问题

Syname

现在希望实现的两个功能是,在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]

3089 3 1
3个回答

Syname

因为web也需要接收到推送,时是不是用GatewayClient不合适?
我这样的设计是不是需要开一个内部推送的端口?具体协议怎么设置呢?

  • 暂无评论
Jeffrey

触发onMessage时能不能通过gatewayWorker直接推送到web上呢?

显然是可以的

与web通信肯定要建立 websocket 服务端,所以主要步骤可以这么做

建立一个websocket服务端
tcp服务端(也就是gatewayWorker)通过 AsyncTcpConnection 将消息推送到websocket服务端
websocket服务端接受到推送数据之后推送到与之连接的web端

核心就是 gatewayWorker 与 websocket 服务端的通信,要使用 AsyncTcpConnection 建立两者的连接。

  • Syname 2018-03-01

    感谢回答!因为硬件是隔数秒就推送到gatewayWorker上一串数据,请问我是要每收到一次数据就建立一次AsyncTcpConnection,进行send吗?

maq

这样做当然是可以的,只要你确实是想用 web 上的一个开关控制_所有_灯泡。
你的思路是对的。具体的实现方法,楼上说的就可以。不过有一点,你一定要用 GatewayWorker 吗?如果仅从你给出的应用场景来看似乎是没有必要的,那么其实还可以再简单一些,如下:

在一个进程中开两个 Worker,一个是 websocket,供 web 连接进来,一个是 tcp(其实应该是 text 或者 frame 协议),供单片机连接进来。

  • Syname 2018-03-01

    感谢回答!因为gatewayWorker写好了sendToUid与sendToAll这样的函数,所以感觉用起来方便些...

年代过于久远,无法发表回答
🔝