Scan all interface

This commit is contained in:
Radhi Fadlillah
2017-05-24 09:12:51 +07:00
parent 329082c9db
commit 17f6fb8306

View File

@@ -15,9 +15,38 @@ var errWrongDiscoveryResponse = errors.New("Response is not related to discovery
// StartDiscovery send a WS-Discovery message and wait for all matching device to respond // StartDiscovery send a WS-Discovery message and wait for all matching device to respond
func StartDiscovery(duration time.Duration) ([]Device, error) { func StartDiscovery(duration time.Duration) ([]Device, error) {
// Get list of interface address
addrs, err := net.InterfaceAddrs()
if err != nil {
return []Device{}, err
}
// Fetch IPv4 address
ipAddrs := []string{}
for _, addr := range addrs {
ipAddr, ok := addr.(*net.IPNet)
if ok && !ipAddr.IP.IsLoopback() && ipAddr.IP.To4() != nil {
ipAddrs = append(ipAddrs, ipAddr.IP.String())
}
}
// Create initial discovery results // Create initial discovery results
discoveryResults := []Device{} discoveryResults := []Device{}
// Discover device on each interface's network
for _, ipAddr := range ipAddrs {
devices, err := discoverDevices(ipAddr, duration)
if err != nil {
return []Device{}, err
}
discoveryResults = append(discoveryResults, devices...)
}
return discoveryResults, nil
}
func discoverDevices(ipAddr string, duration time.Duration) ([]Device, error) {
// Create WS-Discovery request // Create WS-Discovery request
requestID := "uuid:" + uuid.NewV4().String() requestID := "uuid:" + uuid.NewV4().String()
request := ` request := `
@@ -45,35 +74,38 @@ func StartDiscovery(duration time.Duration) ([]Device, error) {
request = regexp.MustCompile(`\s+`).ReplaceAllString(request, " ") request = regexp.MustCompile(`\s+`).ReplaceAllString(request, " ")
// Create UDP address for local and multicast address // Create UDP address for local and multicast address
localAddress, err := net.ResolveUDPAddr("udp4", ":0") localAddress, err := net.ResolveUDPAddr("udp4", ipAddr+":0")
if err != nil { if err != nil {
return discoveryResults, err return []Device{}, err
} }
multicastAddress, err := net.ResolveUDPAddr("udp4", "239.255.255.250:3702") multicastAddress, err := net.ResolveUDPAddr("udp4", "239.255.255.250:3702")
if err != nil { if err != nil {
return discoveryResults, err return []Device{}, err
} }
// Create UDP connection to listen for respond from matching device // Create UDP connection to listen for respond from matching device
conn, err := net.ListenUDP("udp", localAddress) conn, err := net.ListenUDP("udp", localAddress)
if err != nil { if err != nil {
return discoveryResults, err return []Device{}, err
} }
defer conn.Close() defer conn.Close()
// Set connection's timeout // Set connection's timeout
err = conn.SetDeadline(time.Now().Add(duration)) err = conn.SetDeadline(time.Now().Add(duration))
if err != nil { if err != nil {
return discoveryResults, err return []Device{}, err
} }
// Send WS-Discovery request to multicast address // Send WS-Discovery request to multicast address
_, err = conn.WriteToUDP([]byte(request), multicastAddress) _, err = conn.WriteToUDP([]byte(request), multicastAddress)
if err != nil { if err != nil {
return discoveryResults, err return []Device{}, err
} }
// Create initial discovery results
discoveryResults := []Device{}
// Keep reading UDP message until timeout // Keep reading UDP message until timeout
for { for {
// Create buffer and receive UDP response // Create buffer and receive UDP response