Skip to content
Simple Service Discovery Protocol (SSDP) Client. Also supports Radio Thermostat and the Marvell SSDP flavor
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


Discover devices on your network that use the Simple Service Discovery Protocol

Also supports Radio Thermostat which uses Marvell's SSDP implementation. Details are available in the Radio Thermostat API Documentation


1. git clone
2. mix do deps.get, deps.compile
3. iex -S mix
4. SSDP.Client.start


On startup SSDP.Client will broadcast a discovery packet over the local network. Compliant devices will respond with a basic header which is parsed and used to gather a more detailed description of the device from an XML file hosted by the device. SSDP.Client will notify the event bus, available at SSDP.Client.Events, of any devices it finds. Every minute it sends out another discovery broadcast to find any new devices on the network. The event bus will broadcast all devices, not just the new ones it finds. It is up to the developer to handle de-duping the devices broadcast over the event bus. However there is a function SSDP.Client.devices that will return a list of all the unique devices on the network.

The events broadcast over the event bus are in the form {:device, device} where the device is a Map that consists of the following fields.

    device: %{
        device_type: 'urn:Belkin:device:insight:1',
        friendly_name: 'WeMo Insight',
        icon_list: [
                depth: '100',
                height: '100',
                mime_type: 'jpg',
                url: 'icon.jpg',
                width: '100'
        manufacturer: 'Belkin International Inc.',
        manufacturer_url: '',
        model_description: 'Belkin Insight 1.0',
        model_name: 'Insight',
        model_number: '1.0',
        model_url: '',
        presentation_url: '/pluginpres.html',
        serial_number: nil,
        service_list: [
                control_url: '/upnp/control/WiFiSetup1',
                event_sub_url: '/upnp/event/WiFiSetup1',
                scpd_url: '/setupservice.xml',
                service_id: 'urn:Belkin:serviceId:WiFiSetup1',
                service_type: 'urn:Belkin:service:WiFiSetup:1'
        udn: 'uuid:Insight-1_0-221350K12000B5',
        upc: nil
    uri: %URI{
        authority: "",
        fragment: nil,
        host: "",
        path: nil,
        port: 80,
        query: nil,
        scheme: "http",
        userinfo: nil
    url: nil,
    version: %{
        major: '1',
        minor: '0'

For an example implementation of an event handler see SSDP.Handler. To add a handler to the event bus call SSDP.Client.add_handler(handler)

defmodule SSDP.Handler do
    use GenEvent
    require Logger

    def init do
        {:ok, []}

    def handle_event({:device, device} = obj, parent) do
        #do some fun logic here.
        send(parent, obj)
        {:ok, parent}
You can’t perform that action at this time.