Powered by AppSignal & Oban Pro

CPE Client Session (optional networked demo)

livebook/05_cpe_client_session.livemd

CPE Client Session (optional networked demo)

> This notebook starts a local HTTP listener (Bandit) and performs a one-shot TR-069 session.

Setup and start ACS + Finch

Mix.install([
  {:caretaker, path: "."}
])

alias Caretaker.CPE.{Client, DeviceState}
require Logger

{:ok, sup} =
  Supervisor.start_link(
    [
      {Bandit, plug: Caretaker.ACS.Server, port: 4051},
      {Finch, name: Caretaker.Finch},
      {Caretaker.ACS.Session, []}
    ],
    strategy: :one_for_one
  )

Run one-shot session (basic)

{:ok, result} =
  Client.run_session(
    "http://localhost:4051/cwmp",
    device_id: %{
      manufacturer: "Acme",
      oui: "A1B2C3",
      product_class: "Router",
      serial_number: "XYZ123"
    },
    max_retries: 2,
    timeout: 3000
  )

Logger.info("Session result=#{inspect(result)}")
result

Run session with stateful device (Phase 1+)

# Create a device state with TR-181 parameters
{:ok, state} = DeviceState.start_link(
  device_id: %{oui: "DEMO01", product_class: "Router", serial_number: "STATE001"},
  params: %{
    "Device.DeviceInfo.Manufacturer" => "Caretaker Demo",
    "Device.DeviceInfo.SoftwareVersion" => "1.0.0",
    "Device.DeviceInfo.UpTime" => "12345",
    "Device.IP.Interface.1.Enable" => "true",
    "Device.IP.Interface.1.IPv4Address.1.IPAddress" => "192.168.1.100"
  }
)

# Run session with device state - GetParameterValues will return real data
{:ok, result} =
  Client.run_session(
    "http://localhost:4051/cwmp",
    device_id: %{
      manufacturer: "Caretaker Demo",
      oui: "DEMO01",
      product_class: "Router",
      serial_number: "STATE001"
    },
    device_state: state,
    max_retries: 2,
    timeout: 3000
  )

Logger.info("Stateful session result=#{inspect(result)}")
result

Teardown (optional)

Process.exit(sup, :normal)
:ok