Skip to content

Instantly share code, notes, and snippets.

@wmealing
Created January 13, 2015 15:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wmealing/f9f44a02c229407a3e32 to your computer and use it in GitHub Desktop.
Save wmealing/f9f44a02c229407a3e32 to your computer and use it in GitHub Desktop.
defmodule Upnpsd do
@inaddr_mcast {239,255,255,250}
@ttl 4
@port 1900
defp setup_socket() do
options = [{:reuseaddr, true}, {:as, :list}]
Socket.UDP.open!(1900, options)
end
defp create_discovery_payload(service_type) do
"M-SEARCH * HTTP/1.1\r
HOST: 239.255.255.250:1900\r
MAN: \"ssdp:discover\"\r
ST: #{service_type}\r
MX: 3\r\n\r
"
end
def discover(service_type) do
# Use a 3 second timeout, if it takes longer,
# its likely NOT on the lan.
recv_options = [{:timeout,3000}]
# Header style payload for packet
payload = create_discovery_payload service_type
server = setup_socket
:ok = Socket.Datagram.send!(server, payload, {@inaddr_mcast, @port})
{data, _} = Socket.Datagram.recv! server, recv_options
Socket.close server
to_string data
end
end
@chrismccord
Copy link

defmodule Upnpsd do
  @inaddr_mcast {239,255,255,250}
  @ttl 4
  @port 1900
  @timeout 3000


  def discover(service_type) do
    # Header style payload for packet
    service_type
    |> create_discovery_payload 
    |> send_datagram(setup_socket)
    |> to_string
  end

  defp send_datagram(payload, server) do
    :ok = Socket.Datagram.send!(server, payload, {@inaddr_mcast, @port})
    {data, _} = Socket.Datagram.recv!(server, timeout: @timeout)
    Socket.close(server)

    data
  end

  defp setup_socket() do
    Socket.UDP.open!(1900, reuseaddr: true, as: :list)
  end

  defp create_discovery_payload(service_type) do
    """
    M-SEARCH * HTTP/1.1\r
    HOST: 239.255.255.250:1900\r
    MAN: \"ssdp:discover\"\r
    ST: #{service_type}\r
    MX: 3\r\n\r
    """
  end

end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment