func main() { clients, errors, err := internetgateway1.NewWANPPPConnection1Clients() if err != nil { log.Fatal(err) } fmt.Printf("Got %d errors finding servers and %d successfully discovered.\n", len(errors), len(clients)) for i, e := range errors { fmt.Printf("Error finding server #%d: %v\n", i+1, e) } for _, c := range clients { dev := &c.ServiceClient.RootDevice.Device srv := c.ServiceClient.Service fmt.Println(dev.FriendlyName, " :: ", srv.String()) scpd, err := srv.RequestSCDP() if err != nil { fmt.Printf(" Error requesting service SCPD: %v\n", err) } else { fmt.Println(" Available actions:") for _, action := range scpd.Actions { fmt.Printf(" * %s\n", action.Name) for _, arg := range action.Arguments { var varDesc string if stateVar := scpd.GetStateVariable(arg.RelatedStateVariable); stateVar != nil { varDesc = fmt.Sprintf(" (%s)", stateVar.DataType.Name) } fmt.Printf(" * [%s] %s%s\n", arg.Direction, arg.Name, varDesc) } } } if scpd == nil || scpd.GetAction("GetExternalIPAddress") != nil { ip, err := c.GetExternalIPAddress() fmt.Println("GetExternalIPAddress: ", ip, err) } if scpd == nil || scpd.GetAction("GetStatusInfo") != nil { status, lastErr, uptime, err := c.GetStatusInfo() fmt.Println("GetStatusInfo: ", status, lastErr, uptime, err) } if scpd == nil || scpd.GetAction("GetIdleDisconnectTime") != nil { idleTime, err := c.GetIdleDisconnectTime() fmt.Println("GetIdleDisconnectTime: ", idleTime, err) } if scpd == nil || scpd.GetAction("AddPortMapping") != nil { err := c.AddPortMapping("", 5000, "TCP", 5001, "192.168.1.2", true, "Test port mapping", 0) fmt.Println("AddPortMapping: ", err) } if scpd == nil || scpd.GetAction("DeletePortMapping") != nil { err := c.DeletePortMapping("", 5000, "TCP") fmt.Println("DeletePortMapping: ", err) } } }
// Use discovered WANPPPConnection1 services to find external IP addresses. func Example_WANPPPConnection1_GetExternalIPAddress() { clients, errors, err := internetgateway1.NewWANPPPConnection1Clients() extIPClients := make([]GetExternalIPAddresser, len(clients)) for i, client := range clients { extIPClients[i] = client } DisplayExternalIPResults(extIPClients, errors, err) // Output: }
// Discover scans the local network for routers and returns the first // UPnP-enabled router it encounters. It will try up to 3 times to find a // router, sleeping a random duration between each attempt. This is to // mitigate a race condition with many callers attempting to discover // simultaneously. // // TODO: if more than one client is found, only return those on the same // subnet as the user? func Discover() (*IGD, error) { maxTries := 3 sleepMs, _ := crypto.RandIntn(5000) for try := 0; try < maxTries; try++ { time.Sleep(time.Millisecond * time.Duration(sleepMs)) pppclients, _, _ := internetgateway1.NewWANPPPConnection1Clients() if len(pppclients) > 0 { return &IGD{pppclients[0]}, nil } ipclients, _, _ := internetgateway1.NewWANIPConnection1Clients() if len(ipclients) > 0 { return &IGD{ipclients[0]}, nil } sleepMs *= 2 } return nil, errors.New("no UPnP-enabled gateway found") }