func Example_ReuseDiscoveredDevice() { var allMaybeRootDevices []goupnp.MaybeRootDevice for _, urn := range []string{internetgateway1.URN_WANPPPConnection_1, internetgateway1.URN_WANIPConnection_1} { maybeRootDevices, err := goupnp.DiscoverDevices(internetgateway1.URN_WANPPPConnection_1) if err != nil { fmt.Fprintf(os.Stderr, "Could not discover %s devices: %v\n", urn, err) } allMaybeRootDevices = append(allMaybeRootDevices, maybeRootDevices...) } locations := make([]*url.URL, 0, len(allMaybeRootDevices)) fmt.Fprintf(os.Stderr, "Found %d devices:\n", len(allMaybeRootDevices)) for _, maybeRootDevice := range allMaybeRootDevices { if maybeRootDevice.Err != nil { fmt.Fprintln(os.Stderr, " Failed to probe device at ", maybeRootDevice.Location.String()) } else { locations = append(locations, maybeRootDevice.Location) fmt.Fprintln(os.Stderr, " Successfully probed device at ", maybeRootDevice.Location.String()) } } fmt.Fprintf(os.Stderr, "Attempt to re-acquire %d devices:\n", len(locations)) for _, location := range locations { if _, err := goupnp.DeviceByURL(location); err != nil { fmt.Fprintf(os.Stderr, " Failed to reacquire device at %s: %v\n", location.String(), err) } else { fmt.Fprintf(os.Stderr, " Successfully reacquired device at %s\n", location.String()) } } // Output: }
func discover(out chan<- *upnp, target string, matcher func(*goupnp.RootDevice, goupnp.ServiceClient) *upnp) { devs, err := goupnp.DiscoverDevices(target) if err != nil { return } found := false for i := 0; i < len(devs) && !found; i++ { if devs[i].Root == nil { continue } devs[i].Root.Device.VisitServices(func(service *goupnp.Service) { if found { return } // check for a matching IGD service sc := goupnp.ServiceClient{service.NewSOAPClient(), devs[i].Root, service} upnp := matcher(devs[i].Root, sc) if upnp == nil { return } // check whether port mapping is enabled if _, nat, err := upnp.client.GetNATRSIPStatus(); err != nil || !nat { return } out <- upnp found = true }) } if !found { out <- nil } }
func discoverUPNP_IG2() <-chan NAT { res := make(chan NAT, 1) go func() { // find devices devs, err := goupnp.DiscoverDevices(internetgateway2.URN_WANConnectionDevice_2) if err != nil { return } for _, dev := range devs { if dev.Root == nil { continue } dev.Root.Device.VisitServices(func(srv *goupnp.Service) { switch srv.ServiceType { case internetgateway2.URN_WANIPConnection_1: client := &internetgateway2.WANIPConnection1{ServiceClient: goupnp.ServiceClient{ SOAPClient: srv.NewSOAPClient(), RootDevice: dev.Root, Service: srv, }} _, isNat, err := client.GetNATRSIPStatus() if err == nil && isNat { res <- &upnp_NAT{client, make(map[int]int), "UPNP (IG2-IP1)", dev.Root} return } case internetgateway2.URN_WANIPConnection_2: client := &internetgateway2.WANIPConnection2{ServiceClient: goupnp.ServiceClient{ SOAPClient: srv.NewSOAPClient(), RootDevice: dev.Root, Service: srv, }} _, isNat, err := client.GetNATRSIPStatus() if err == nil && isNat { res <- &upnp_NAT{client, make(map[int]int), "UPNP (IG2-IP2)", dev.Root} return } case internetgateway2.URN_WANPPPConnection_1: client := &internetgateway2.WANPPPConnection1{ServiceClient: goupnp.ServiceClient{ SOAPClient: srv.NewSOAPClient(), RootDevice: dev.Root, Service: srv, }} _, isNat, err := client.GetNATRSIPStatus() if err == nil && isNat { res <- &upnp_NAT{client, make(map[int]int), "UPNP (IG2-PPP1)", dev.Root} return } } }) } }() return res }
func (d *Driver) startUPNPDiscovery() { go func() { for { devices, err := goupnp.DiscoverDevices("urn:dial-multiscreen-org:service:dial:1") if err == nil { for _, dev := range devices { info := parseUpnpInfo(dev.Root) ip := strings.TrimSuffix(strings.TrimPrefix(dev.Root.URLBaseStr, "http://"), ":8008") d.add(net.ParseIP(ip), 8009, info) } } time.Sleep(time.Second * 30) } }() }