如何在Phoenix Channel中使用handle_info()?

luz*_*zny 6 elixir phoenix-framework

我创建了工作者,它从Arduino获取消息:elixir_serial handler,但现在我想在Channel中使用它来广播接收到的数据,我可以将socket注入: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
Run Code Online (Sandbox Code Playgroud)

您对如何改进工人代码有任何建议吗,例如:Gen_Server是必要的吗?

Chr*_*ord 9

收到数据后,将其广播到频道的主题:

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
Run Code Online (Sandbox Code Playgroud)

您不希望传递实际内容,socket因为它可能随时消失并在新进程下重新连接.使用套接字订阅的主题,您将向希望了解它的任何人广播数据.