2

いくつかのハードウェアセンサーと通信する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です。それ以外の場合は、参照を追加して両側に参照を保持し、それを毎回サーバーに送信する必要があります。その情報を保持する必要があるのは逆のようです。

4

1 に答える 1

2

クライアントがWebSocket接続を開始すると、Yawsは新しいgen_serverプロセスを開始して、クライアントとサーバー間のすべての通信を処理します。gen_serverは、クライアントから送信されたすべてのメッセージをコールバック関数handle_message/1にディスパッチするため、最初の接続にのみ使用されるわけではありません。

また、gen_serverプロセスは、サーバーからクライアントにデータをプッシュするために使用されます-yaws_api:websocket_send(Pid, {Type, Data})関数を使用します。パラメータは、WebSocketgen_serverのPidpidです。コールバックモジュールは次のように変更できます。

handle_message({Type,Data}) ->
      gen_server:cast(?SERVER,{self(), Data}),
      noreply.

これにより、サーバーは、で使用されるWebSocketgen_serverのpidになりますyaws_api:websocket_send/2。このDataパラメーターにはクライアント要求が含まれており、センサーサブスクリプション要求を確認し、WebSocket pidを適切なセンサーに関連付けるために、サーバーで解析する必要があります。

于 2012-08-20T19:54:06.387 に答える