// DiscoverDevices attempts to find targets of the given type. This is // typically the entry-point for this package. searchTarget is typically a URN // in the form "urn:schemas-upnp-org:device:..." or // "urn:schemas-upnp-org:service:...". A single error is returned for errors // while attempting to send the query. An error or RootDevice is returned for // each discovered RootDevice. func DiscoverDevices(searchTarget string) ([]MaybeRootDevice, error) { httpu, err := httpu.NewHTTPUClient() if err != nil { return nil, err } defer httpu.Close() responses, err := ssdp.SSDPRawSearch(httpu, string(searchTarget), 2, 3) if err != nil { return nil, err } results := make([]MaybeRootDevice, len(responses)) for i, response := range responses { maybe := &results[i] loc, err := response.Location() if err != nil { maybe.Err = ContextError{"unexpected bad location from search", err} continue } maybe.Location = loc if root, err := DeviceByURL(loc); err != nil { maybe.Err = err } else { maybe.Root = root } } return results, nil }
// DiscoverDevices attempts to find targets of the given type. This is // typically the entry-point for this package. searchTarget is typically a URN // in the form "urn:schemas-upnp-org:device:..." or // "urn:schemas-upnp-org:service:...". A single error is returned for errors // while attempting to send the query. An error or RootDevice is returned for // each discovered RootDevice. func DiscoverDevices(searchTarget string) ([]MaybeRootDevice, error) { httpu, err := httpu.NewHTTPUClient() if err != nil { return nil, err } defer httpu.Close() responses, err := ssdp.SSDPRawSearch(httpu, string(searchTarget), 2, 3) if err != nil { return nil, err } results := make([]MaybeRootDevice, len(responses)) for i, response := range responses { maybe := &results[i] loc, err := response.Location() if err != nil { maybe.Err = ContextError{"unexpected bad location from search", err} continue } locStr := loc.String() root := new(RootDevice) if err := requestXml(locStr, DeviceXMLNamespace, root); err != nil { maybe.Err = ContextError{fmt.Sprintf("error requesting root device details from %q", locStr), err} continue } var urlBaseStr string if root.URLBaseStr != "" { urlBaseStr = root.URLBaseStr } else { urlBaseStr = locStr } urlBase, err := url.Parse(urlBaseStr) if err != nil { maybe.Err = ContextError{fmt.Sprintf("error parsing location URL %q", locStr), err} continue } root.SetURLBase(urlBase) maybe.Root = root } return results, nil }