ssdp
This commit is contained in:
parent
14cd4345d7
commit
df86e3cf66
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
|
@ -10,5 +10,5 @@
|
||||||
"go.testFlags": [
|
"go.testFlags": [
|
||||||
"-v",
|
"-v",
|
||||||
],
|
],
|
||||||
"go.testTimeout": "300s"
|
"go.testTimeout": "100s"
|
||||||
}
|
}
|
|
@ -1,51 +0,0 @@
|
||||||
package ipv4
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
omd "git.loafle.net/overflow/model/discovery"
|
|
||||||
omm "git.loafle.net/overflow/model/meta"
|
|
||||||
omu "git.loafle.net/overflow/model/util"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestHostScan(t *testing.T) {
|
|
||||||
|
|
||||||
z := &omd.Zone{
|
|
||||||
Network: "192.168.1.0/24",
|
|
||||||
Iface: "\\Device\\NPF_{1924FA2B-6927-4BA5-AF43-876C3F8853CE}",
|
|
||||||
Mac: "30:9C:23:15:A3:09",
|
|
||||||
Address: "192.168.1.201",
|
|
||||||
DiscoveredDate: omu.NowPtr(),
|
|
||||||
}
|
|
||||||
|
|
||||||
dp := &omd.DiscoverPort{
|
|
||||||
FirstScanRange: 1,
|
|
||||||
LastScanRange: 20000,
|
|
||||||
ExcludePorts: []int{
|
|
||||||
631,
|
|
||||||
},
|
|
||||||
IncludeTCP: true,
|
|
||||||
IncludeUDP: true,
|
|
||||||
DiscoverService: nil,
|
|
||||||
}
|
|
||||||
|
|
||||||
dh := &omd.DiscoverHost{
|
|
||||||
MetaIPType: omm.ToMetaIPType(omm.MetaIPTypeEnumV4),
|
|
||||||
FirstScanRange: "192.168.1.1",
|
|
||||||
LastScanRange: "192.168.1.255",
|
|
||||||
DiscoverPort: dp,
|
|
||||||
}
|
|
||||||
|
|
||||||
resCh := make(chan interface{})
|
|
||||||
errCh := make(chan error)
|
|
||||||
stopCh := make(chan struct{})
|
|
||||||
ScanHost(z, dh, resCh, errCh, stopCh)
|
|
||||||
|
|
||||||
for res := range resCh {
|
|
||||||
t.Log(res)
|
|
||||||
}
|
|
||||||
|
|
||||||
for err := range errCh {
|
|
||||||
t.Log(err)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -17,7 +17,6 @@ func TestFindIfaces(t *testing.T) {
|
||||||
for _, d := range devices {
|
for _, d := range devices {
|
||||||
t.Log("\nName: ", d.Name)
|
t.Log("\nName: ", d.Name)
|
||||||
t.Log("Description: ", d.Description)
|
t.Log("Description: ", d.Description)
|
||||||
t.Log("Devices addresses: ", d.Description)
|
|
||||||
|
|
||||||
for _, address := range d.Addresses {
|
for _, address := range d.Addresses {
|
||||||
t.Log("- IP address: ", address.IP)
|
t.Log("- IP address: ", address.IP)
|
||||||
|
|
72
ssdp/ssdp.go
Normal file
72
ssdp/ssdp.go
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
package ssdp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/koron/go-ssdp" // MIT license
|
||||||
|
)
|
||||||
|
|
||||||
|
type SpecVersion struct {
|
||||||
|
Major int `xml:"major"`
|
||||||
|
Minor int `xml:"minor"`
|
||||||
|
}
|
||||||
|
type Icon struct {
|
||||||
|
MIMEType string `xml:"mimetype"`
|
||||||
|
Width int `xml:"width"`
|
||||||
|
Height int `xml:"height"`
|
||||||
|
Depth int `xml:"depth"`
|
||||||
|
URL string `xml:"url"`
|
||||||
|
}
|
||||||
|
type Device struct {
|
||||||
|
SpecVersion SpecVersion `xml:"specVersion"`
|
||||||
|
URLBase string `xml:"URLBase"`
|
||||||
|
DeviceType string `xml:"device>deviceType"`
|
||||||
|
FriendlyName string `xml:"device>friendlyName"`
|
||||||
|
Manufacturer string `xml:"device>manufacturer"`
|
||||||
|
ManufacturerURL string `xml:"device>manufacturerURL"`
|
||||||
|
ModelDescription string `xml:"device>modelDescription"`
|
||||||
|
ModelName string `xml:"device>modelName"`
|
||||||
|
ModelNumber string `xml:"device>modelNumber"`
|
||||||
|
ModelURL string `xml:"device>modelURL"`
|
||||||
|
SerialNumber string `xml:"device>serialNumber"`
|
||||||
|
UDN string `xml:"device>UDN"`
|
||||||
|
UPC string `xml:"device>UPC"`
|
||||||
|
PresentationURL string `xml:"device>presentationURL"`
|
||||||
|
Icons []Icon `xml:"device>iconList>icon"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func SearchRootDevices() ([]Device, error) {
|
||||||
|
|
||||||
|
list, err := ssdp.Search(ssdp.RootDevice, 1, "")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
devices := make([]Device, 0, len(list))
|
||||||
|
for _, srv := range list {
|
||||||
|
device, err := parseResponse(srv.Location)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
devices = append(devices, *device)
|
||||||
|
}
|
||||||
|
|
||||||
|
return devices, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseResponse(url string) (*Device, error) {
|
||||||
|
response, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer response.Body.Close()
|
||||||
|
decoder := xml.NewDecoder(response.Body)
|
||||||
|
|
||||||
|
device := &Device{}
|
||||||
|
if err := decoder.Decode(device); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return device, nil
|
||||||
|
}
|
15
ssdp/ssdp_test.go
Normal file
15
ssdp/ssdp_test.go
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
package ssdp
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestSSDP(t *testing.T) {
|
||||||
|
devices, err := SearchRootDevices()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
for _, device := range devices {
|
||||||
|
t.Log(device)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://192.168.1.254:44517/etc/linuxigd/gatedesc.xml
|
Loading…
Reference in New Issue
Block a user