From dd134a632c92171a06b81b7d96956f147d229b86 Mon Sep 17 00:00:00 2001 From: Artemiy Solopov Date: Sun, 14 Dec 2025 23:32:23 +0200 Subject: [PATCH] Application and basic MQTT subscriber --- config/config.exs | 0 config/runtime.exs | 8 ++++++++ lib/neon_vertigo_service.ex | 18 ++++++++++-------- lib/neon_vertigo_service/mqtt.ex | 25 +++++++++++++++++++++++++ mix.exs | 6 +++++- mix.lock | 17 +++++++++++++++++ 6 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 config/config.exs create mode 100644 config/runtime.exs create mode 100644 lib/neon_vertigo_service/mqtt.ex create mode 100644 mix.lock diff --git a/config/config.exs b/config/config.exs new file mode 100644 index 0000000..e69de29 diff --git a/config/runtime.exs b/config/runtime.exs new file mode 100644 index 0000000..8eeb09e --- /dev/null +++ b/config/runtime.exs @@ -0,0 +1,8 @@ +import Config + +config :neon_vertigo_service, :mqtt_params, [ + host: System.get_env("MQTT_HOST", "localhost"), + port: System.get_env("MQTT_PORT", "1883") |> String.to_integer, + username: System.get_env("MQTT_USERNAME"), + password: System.get_env("MQTT_PASSWORD"), +] diff --git a/lib/neon_vertigo_service.ex b/lib/neon_vertigo_service.ex index 593a01d..66d402c 100644 --- a/lib/neon_vertigo_service.ex +++ b/lib/neon_vertigo_service.ex @@ -3,16 +3,18 @@ defmodule NeonVertigoService do Documentation for `NeonVertigoService`. """ - @doc """ - Hello world. + use Application - ## Examples + @impl true + def start(_start_type, _start_args) do + children = [ + # %{id: :emqtt, start: {:emqtt, :start_link, [[{:owner, self()}, {:username, "artemis"}, {:password, "artemis"}]]}}, + {NeonVertigoService.Mqtt, [{}]} + ] - iex> NeonVertigoService.hello() - :world + {: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}]}) - """ - def hello do - :world end end diff --git a/lib/neon_vertigo_service/mqtt.ex b/lib/neon_vertigo_service/mqtt.ex new file mode 100644 index 0000000..8ad19f6 --- /dev/null +++ b/lib/neon_vertigo_service/mqtt.ex @@ -0,0 +1,25 @@ +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/mix.exs b/mix.exs index 5f15389..dccb0fe 100644 --- a/mix.exs +++ b/mix.exs @@ -14,13 +14,17 @@ defmodule NeonVertigoService.MixProject do # Run "mix help compile.app" to learn about applications. def application do [ - extra_applications: [:logger] + extra_applications: [:logger], + mod: {NeonVertigoService, []} ] end # Run "mix help deps" to learn about dependencies. defp deps do [ + {:emqtt, "~> 1.14"}, + {:ecto, "~> 3.10"}, + {:ecto_sqlite3, "~> 0.17"}, # {:dep_from_hexpm, "~> 0.3.0"}, # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"} ] diff --git a/mix.lock b/mix.lock new file mode 100644 index 0000000..3229e0b --- /dev/null +++ b/mix.lock @@ -0,0 +1,17 @@ +%{ + "cc_precompiler": {:hex, :cc_precompiler, "0.1.11", "8c844d0b9fb98a3edea067f94f616b3f6b29b959b6b3bf25fee94ffe34364768", [:mix], [{:elixir_make, "~> 0.7", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "3427232caf0835f94680e5bcf082408a70b48ad68a5f5c0b02a3bea9f3a075b9"}, + "cowlib": {:hex, :cowlib, "2.13.0", "db8f7505d8332d98ef50a3ef34b34c1afddec7506e4ee4dd4a3a266285d282ca", [:make, :rebar3], [], "hexpm", "e1e1284dc3fc030a64b1ad0d8382ae7e99da46c3246b815318a4b848873800a4"}, + "db_connection": {:hex, :db_connection, "2.8.1", "9abdc1e68c34c6163f6fb96a96532272d13ad7ca45262156ae8b7ec6d9dc4bec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61a3d489b239d76f326e03b98794fb8e45168396c925ef25feb405ed09da8fd"}, + "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"}, + "ecto": {:hex, :ecto, "3.13.5", "9d4a69700183f33bf97208294768e561f5c7f1ecf417e0fa1006e4a91713a834", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "df9efebf70cf94142739ba357499661ef5dbb559ef902b68ea1f3c1fabce36de"}, + "ecto_sql": {:hex, :ecto_sql, "3.13.3", "81f7067dd1951081888529002dbc71f54e5e891b69c60195040ea44697e1104a", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.13.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5751caea36c8f5dd0d1de6f37eceffea19d10bd53f20e5bbe31c45f2efc8944a"}, + "ecto_sqlite3": {:hex, :ecto_sqlite3, "0.22.0", "edab2d0f701b7dd05dcf7e2d97769c106aff62b5cfddc000d1dd6f46b9cbd8c3", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "~> 3.13.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.13.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:exqlite, "~> 0.22", [hex: :exqlite, repo: "hexpm", optional: false]}], "hexpm", "5af9e031bffcc5da0b7bca90c271a7b1e7c04a93fecf7f6cd35bc1b1921a64bd"}, + "elixir_make": {:hex, :elixir_make, "0.9.0", "6484b3cd8c0cee58f09f05ecaf1a140a8c97670671a6a0e7ab4dc326c3109726", [:mix], [], "hexpm", "db23d4fd8b757462ad02f8aa73431a426fe6671c80b200d9710caf3d1dd0ffdb"}, + "emqtt": {:hex, :emqtt, "1.14.7", "7ace5a62337fe92c8596bc2872cbcb3430959ff90718c2004bdd691bce61614e", [:rebar3], [{:cowlib, "2.13.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:getopt, "1.0.3", [hex: :getopt, repo: "hexpm", optional: false]}, {:gun, "2.1.0", [hex: :gun, repo: "hexpm", optional: false]}, {:quicer, "0.2.15", [hex: :quicer, repo: "hexpm", optional: false]}], "hexpm", "9eb060ce4abe5092064114819dc72955bc657e020d494660ecc593772c4125db"}, + "exqlite": {:hex, :exqlite, "0.33.1", "0465fdb997be174edeba6a27496fa27dfe8bc79ef1324a723daa8f0e8579da24", [:make, :mix], [{:cc_precompiler, "~> 0.1", [hex: :cc_precompiler, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.8", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "b3db0c9ae6e5ee7cf84dd0a1b6dc7566b80912eb7746d45370f5666ed66700f9"}, + "getopt": {:hex, :getopt, "1.0.3", "4f3320c1f6f26b2bec0f6c6446b943eb927a1e6428ea279a1c6c534906ee79f1", [:rebar3], [], "hexpm", "7e01de90ac540f21494ff72792b1e3162d399966ebbfc674b4ce52cb8f49324f"}, + "gun": {:hex, :gun, "2.1.0", "b4e4cbbf3026d21981c447e9e7ca856766046eff693720ba43114d7f5de36e87", [:make, :rebar3], [{:cowlib, "2.13.0", [hex: :cowlib, repo: "hexpm", optional: false]}], "hexpm", "52fc7fc246bfc3b00e01aea1c2854c70a366348574ab50c57dfe796d24a0101d"}, + "quicer": {:hex, :quicer, "0.2.15", "775fcfa09c9ce5a4a00d23c1c8b1e81cd361ebc847e43bb766efac4373cdb1b8", [:rebar3], [{:snabbkaffe, "1.0.10", [hex: :snabbkaffe, repo: "hexpm", optional: false]}], "hexpm", "52236d9384a541341706bcae438e81b209fa21d2045d3df317f8ba5beda6a8e5"}, + "snabbkaffe": {:hex, :snabbkaffe, "1.0.10", "9be2f54f61fc6862391b666b2b5b76c3fa53598e2989a17cef1b48cf347a8a63", [:rebar3], [], "hexpm", "70a98df36ae756908d55b5770891d443d63c903833e3e87d544036e13d4fac26"}, + "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, +}