2015-10-24 9 views
5

Ho creato working worker, che riceve i messaggi da Arduino in: elixir_serial handler, ma ora voglio usarlo in Channel per trasmettere i dati ricevuti, posso iniettare socket a: elixir_serial handle_info()?Come usare handle_info() da worker nel canale Phoenix?

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 

Avete suggerimenti su come migliorare il codice del lavoratore, ad es. Gen_Server è necessario?

risposta

8

Quando si ricevono dati, trasmessi al tema del canale:

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 

non si vuole far passare l'attuale socket perché potrebbe scomparire in qualsiasi momento e ricollegare con un nuovo processo. Usa l'argomento a cui è iscritto il socket e trasmetti i dati a chiunque voglia saperlo.

+0

Grazie mille! Funziona! – luzny

Problemi correlati