いくつかのハードウェアセンサーと通信するgen_serverがあります。この設定は正常に機能します。次に、データをリアルタイムで視覚化してこのシステムを拡張したいと思います。そして、このデータをWebSocketを介してWebクライアントに配信したいと思います。
複数の「リスナー」がいる可能性があるため、たとえば、さまざまなWebブラウザーでこのデータを視覚化する複数の人々がいるため、オブザーバーパターンに似たものを考えています。Webクライアントがセンサーのサブスクライブを要求するたびに、そのセンサーの利害関係者のリストに追加する必要があります。新しいセンサーデータが到着したらすぐに、遅滞なくクライアントにプッシュする必要があります。
私はyawsを使用してWebSocket機能をすばやく取得しています。私の問題は、フランベジアが機能しているように見える方法に関連しています。サーバー側では、接続時にA#arg.clisock
値(eg #Port<0.2825>
)を介してクライアントを「見る」だけです。以下のコードでws_server
は、クライアントから新しいデータが入力されたときにコールバックを受信するように登録しています。この時点以降、yawsはサーバー側に入るメッセージにのみ応答できるようになります。
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サーバーを使用して、クライアントへのデータの非同期プッシュを実行し、セッション中にリッスンするセンサーを追加および削除するにはどうすればよいですか。基本的に最も簡単な方法は、yawsがhandle_message/2
最初の引数を。としてコールバックできる場合From
です。それ以外の場合は、参照を追加して両側に参照を保持し、それを毎回サーバーに送信する必要があります。その情報を保持する必要があるのは逆のようです。