diff --git a/lib/neon_vertigo_service.ex b/lib/neon_vertigo_service.ex index 66d402c..c1c9a3f 100644 --- a/lib/neon_vertigo_service.ex +++ b/lib/neon_vertigo_service.ex @@ -8,13 +8,10 @@ defmodule NeonVertigoService do @impl true def start(_start_type, _start_args) do children = [ - # %{id: :emqtt, start: {:emqtt, :start_link, [[{:owner, self()}, {:username, "artemis"}, {:password, "artemis"}]]}}, - {NeonVertigoService.Mqtt, [{}]} + NeonVertigoService.Mqtt.Supervisor, ] {:ok, _spid} = Supervisor.start_link(children, strategy: :one_for_one) - # {:ok, mqtt_pid} = Supervisor.start_child(spid, %{id: :emqtt, start: {:emqtt, :start_link, [[{:owner, self()}, {:username, "artemis"}, {:password, "artemis"}]]}}) - # {:ok, _} = Supervisor.start_child(spid, {NeonVertigoService.Mqtt, [{mqtt_pid}]}) end end diff --git a/lib/neon_vertigo_service/mqtt.ex b/lib/neon_vertigo_service/mqtt.ex deleted file mode 100644 index 8ad19f6..0000000 --- a/lib/neon_vertigo_service/mqtt.ex +++ /dev/null @@ -1,25 +0,0 @@ -defmodule NeonVertigoService.Mqtt do - use GenServer - - def start_link(_) do - GenServer.start_link(__MODULE__, {}) - end - - def init(_) do - mqtt_config = Application.fetch_env!(:neon_vertigo_service, :mqtt_params) - {:ok, mqtt_pid} = :emqtt.start_link([{:owner, self()} | mqtt_config]) - {:ok, _mqtt_props} = :emqtt.connect(mqtt_pid) - Process.link(mqtt_pid) - - :emqtt.subscribe(mqtt_pid, %{}, [{"$share/neon-vertigo-service/test/+", [{:qos, 1}]}]) - - {:ok, {mqtt_pid}} - end - - # Handling MQTT messages - def handle_info({:publish, msg}, state) do - IO.puts("Received message") - IO.inspect(msg) - {:noreply, state} - end -end diff --git a/lib/neon_vertigo_service/mqtt/server.ex b/lib/neon_vertigo_service/mqtt/server.ex new file mode 100644 index 0000000..ebbc189 --- /dev/null +++ b/lib/neon_vertigo_service/mqtt/server.ex @@ -0,0 +1,35 @@ +defmodule NeonVertigoService.Mqtt.Service do + use GenServer + + def start_link(_) do + GenServer.start_link(__MODULE__, [], name: __MODULE__) + end + + def init(_) do + {:ok, {}, {:continue, :init_mqtt}} + end + + # Callbacks + def handle_continue(:init_mqtt, {}) do + mqtt_config = Application.fetch_env!(:neon_vertigo_service, :mqtt_params) + {:ok, mqtt_pid} = Supervisor.start_child( + NeonVertigoService.Mqtt.Supervisor, + %{ + id: :neon_vertigo_emqtt, + start: {:emqtt, :start_link, [[owner: self(), name: :neon_vertigo_service_emqtt] ++ mqtt_config]} + } + ) + {:ok, _mqtt_props} = :emqtt.connect(mqtt_pid) + + :emqtt.subscribe(mqtt_pid, %{}, [{"$share/neon-vertigo-service/test/+", [{:qos, 1}]}]) + + {:noreply, {mqtt_pid}} + end + + # Handling MQTT messages + def handle_info({:publish, msg}, state) do + IO.puts("Received message") + IO.inspect(msg) + {:noreply, state} + end +end diff --git a/lib/neon_vertigo_service/mqtt/supervisor.ex b/lib/neon_vertigo_service/mqtt/supervisor.ex new file mode 100644 index 0000000..17b1243 --- /dev/null +++ b/lib/neon_vertigo_service/mqtt/supervisor.ex @@ -0,0 +1,18 @@ +defmodule NeonVertigoService.Mqtt.Supervisor do + use Supervisor + + def start_link(init_arg) do + Supervisor.start_link(__MODULE__, init_arg, name: __MODULE__) + end + +# Callbacks + + @impl true + def init(_init_arg) do + children = [ + NeonVertigoService.Mqtt.Service + ] + + Supervisor.init(children, strategy: :one_for_all) + end +end