2015-10-24 5 views
5

私はArduinoのメッセージをelixir_serialハンドラで取得していますが、今では受信したデータをブロードキャストするためにChannelで使用したいのですが、elixir_serial handle_info()にソケットを注入できますか?Phoenix Channelのworkerからhandle_info()を使用するには?

defmodule MyApp.Serialport do 
    require Logger 
    use GenServer 

    def start_link() do 
    GenServer.start_link(__MODULE__, []) 
    end 

    def init([]) do 
    work() 
    {:ok, []} 
    end 

    defp work do 
    {:ok, serial} = Serial.start_link 
    Serial.open(serial, "/dev/tty.arduino") 
    Serial.set_speed(serial, 9600) 
    Serial.connect(serial) 
    Logger.debug "pid #{inspect serial}" 
    end 

    def handle_info({:elixir_serial, serial, data}, state) do 
    Logger.debug "received :data #{inspect data}" 
    {:noreply, state} 
    end 
end 

ワーカーコードを改善する方法についてご意見がありますか? Gen_Serverは必要ですか?

答えて

8

あなたはチャンネルのトピックにそれをデータ放送を受信:

def handle_info({:elixir_serial, serial, data}, state) do 
    Logger.debug "received :data #{inspect data}" 
    MyApp.Endpoint.broadcast("some:topic", "serial_data", %{data: data} 

    {:noreply, state} 
end 

それはいつでも消えて、新しいプロセスの下で再接続する可能性があるため、あなたが実際socketを渡す必要はありません。ソケットがサブスクライブされているトピックを代わりに使用すると、その情報を知りたいすべての人にデータをブロードキャストします。

+0

ありがとうございました!それは働いている! – luzny

関連する問題