我有一个 gen_server 与几个硬件传感器通话。此设置工作正常。现在我想通过数据的实时可视化来扩展这个系统。我想通过 websockets 将这些数据传递给 web 客户端。
由于我可能有几个“听众”,例如几个人在不同的网络浏览器上可视化这些数据,我正在考虑类似于观察者模式的东西。每次 Web 客户端请求订阅传感器时,都应将其添加到该传感器的利益相关者列表中。一旦新的传感器数据到达,就应该立即将其推送给客户端。
我正在使用 yaws 来快速获取 websocket 功能。我的问题与偏航似乎工作的方式有关。在服务器端,我只在连接时通过A#arg.clisock
值(例如#Port<0.2825>
)“看到”客户端。在下面的代码中,我注册ws_server
以在新数据从客户端输入时接收回调。在这一点之后,偏航似乎只允许我响应进入服务器端的消息。
out(A) ->
CallbackMod = ws_server,
Opts = [{origin, "http://" ++ (A#arg.headers)#headers.host}],
{websocket, CallbackMod, Opts}.
这是回调模块的样子:
% handle_message(Incoming)
% Incoming :: {text,Msg} | {binary,Msg} | {close, Status, Reason}
handle_message({Type,Data}) ->
gen_server:cast(?SERVER,{websocket,Data}),
noreply.
似乎,我无法对消息做出反应,subscribe <sensor>
并且(在连接时间之后)动态地将这个利益相关者添加到观察者列表中。
如何使用 yaws 服务器完成向客户端异步推送数据以及在会话期间添加和删除我想收听的传感器。handle_message/2
基本上最简单的方法是如果 yaws 可以用第一个参数回调From
。否则我需要添加一个 ref 以在双方都保留一个 ref 并每次将其发送到服务器,看起来我需要保留该信息。