Added Auto-Discovery through UDP Broadcasts
This commit is contained in:
parent
6451deea33
commit
6570ac93c0
2 changed files with 135 additions and 18 deletions
55
libipcamera/Discovery.go
Normal file
55
libipcamera/Discovery.go
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
package libipcamera
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Ports to try discovery on
|
||||
var targetPorts = []int{22600, 21600}
|
||||
|
||||
// AutodiscoverCamera will try to find a camera using UDP Broadcasts
|
||||
func AutodiscoverCamera(verbose bool) (net.IP, error) {
|
||||
conn, err := net.ListenPacket("udp", ":22601")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
for _, port := range targetPorts {
|
||||
go sendDiscoveryBroadcasts(conn, port, 5, verbose)
|
||||
}
|
||||
|
||||
buffer := make([]byte, 80)
|
||||
_, remoteAddr, err := conn.ReadFrom(buffer)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
udpAddr := remoteAddr.(*net.UDPAddr)
|
||||
return udpAddr.IP, nil
|
||||
}
|
||||
|
||||
func sendDiscoveryBroadcasts(localConn net.PacketConn, port, count int, verbose bool) {
|
||||
broadcastAddress, err := net.ResolveUDPAddr("udp", fmt.Sprintf("255.255.255.255:%d", port))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
broadcastPacket := CreateCommandPacket(0x0114)
|
||||
|
||||
if verbose {
|
||||
log.Printf("Trying Autodiscovery using UDP Port %d\n", port)
|
||||
}
|
||||
for i := 0; i < count; i++ {
|
||||
_, err = localConn.WriteTo(broadcastPacket, broadcastAddress)
|
||||
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
time.Sleep(time.Millisecond * 500)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue