Как использовать handle_info() от работника в канале Phoenix?

Я создал работающий worker, который получает сообщения от Arduino в обработчике :elixir_serial, но теперь я хочу использовать его в канале для трансляции полученных данных. Могу ли я внедрить сокет в :elixir_serial 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 нужен?


person luzny    schedule 24.10.2015    source источник


Ответы (1)


При получении данных транслируйте их в тему канала:

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, потому что он может исчезнуть в любое время и повторно подключиться к новому процессу. Вместо этого используйте тему, на которую подписан сокет, и вы будете передавать данные всем, кто захочет об этом узнать.

person Chris McCord    schedule 24.10.2015