【问题标题】:How to use handle_info() from worker in Phoenix Channel?如何使用凤凰频道工作人员的 handle_info()?
【发布时间】:2016-01-23 20:12:25
【问题描述】:

我创建了工作工作者,它在 :elixir_serial 处理程序中从 Arduino 获取消息,但现在我想在 Channel 中使用它来广播接收到的数据,我可以将套接字注入到 :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 是必要的吗?

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案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,因为它可能随时消失并在新进程下重新连接。改用套接字订阅的主题,您会将数据广播给任何想了解它的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-07
      • 2017-08-07
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多