# lib/da_product_app/mqtt/handler.ex defmodule DaProductApp.MQTT.Handler do use Tortoise.Handler require Logger @impl true def init(opts) do client_id = Keyword.get(opts, :client_id, "unknown_client") {:ok, %{online_devices: %{}, client_id: client_id}} end @impl true def connection(:up, state) do device_id = parse_device_id(state.client_id) Logger.info("Device #{device_id} connected") DaProductApp.DeviceRegistry.track_online(device_id) {:ok, put_in(state, [:online_devices, device_id], true)} end @impl true def connection(:down, state) do device_id = parse_device_id(state.client_id) Logger.info("Device #{device_id} disconnected") DaProductApp.DeviceRegistry.track_offline(device_id) {:ok, put_in(state, [:online_devices, device_id], false)} end @impl true def handle_message(["", "ack", "qr-device", device_id], payload, state) do Logger.info("Received ACK from #{device_id}") Logger.info("Received payload from #{payload}") DaProductAppWeb.Endpoint.broadcast("qr:ack:#{device_id}", "ack_received", %{}) {:ok, state} end defp parse_device_id("qr_" <> rest), do: rest defp parse_device_id(client_id), do: client_id end