#lang scribble/manual @(require (for-label racket/base (file "../main.rkt") (file "../media-renderer.rkt") (file "../media-server.rkt") (file "../services/av-transport.rkt") (file "../services/rendering-control.rkt") (file "../services/connection-manager.rkt") (file "../services/content-directory.rkt"))) @title{Introduction} The @racketmodname[racket-upnp] collection implements a small UPnP control point. It discovers devices with SSDP, downloads their device descriptions, and represents devices and services as ordinary Racket values. Unknown vendor-specific device and service types are retained instead of discarded. The public interface is divided into layers: @itemlist[ @item{The @racketmodname[racket-upnp] module provides discovery, device information, generic service inspection, and generic SOAP calls.} @item{Modules in the @tt{racket-upnp/services} subcollection provide typed interfaces for standard UPnP services.} @item{The @racketmodname[racket-upnp/media-renderer] and @racketmodname[racket-upnp/media-server] modules provide convenient device-oriented interfaces.} ] A normal application can use the device-oriented modules without dealing with SSDP, SOAP, service control URLs, or DIDL-Lite XML directly. The generic layer remains available for inspection and vendor-specific extensions.