2015-10-24 3 views
5

मैंने वर्किंग वर्कर्स बनाया है, जो Arduino से संदेश प्राप्त करता है: elixir_serial हैंडलर, लेकिन अब मैं इसे प्राप्त डेटा प्रसारित करने के लिए चैनल में उपयोग करना चाहता हूं, क्या मैं सॉकेट इंजेक्ट कर सकता हूं: elixir_serial handle_info()?फीनिक्स चैनल में कार्यकर्ता से 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

संबंधित मुद्दे