如何使用凤凰频道worker的handle_info()?
How to use handle_info() from worker in Phoenix Channel?
我创建了working worker,它在: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 有必要吗?
当您收到数据时,将其广播到频道的主题:
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
,因为它可能随时消失并在新进程下重新连接。使用套接字订阅的主题,您将向任何想了解它的人广播数据。
我创建了working worker,它在: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 有必要吗?
当您收到数据时,将其广播到频道的主题:
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
,因为它可能随时消失并在新进程下重新连接。使用套接字订阅的主题,您将向任何想了解它的人广播数据。