+85
-1
README.md
+85
-1
README.md
···
1
-
## UPNP Client
1
+
<h1>UPnP Client</h1>
2
+
<p>
3
+
<a href="LICENSE" target="_blank">
4
+
<img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-blue.svg" />
5
+
</a>
6
+
<a href="https://crates.io/crates/upnp-client-rs" target="_blank">
7
+
<img src="https://img.shields.io/crates/v/upnp-client-rs.svg" />
8
+
</a>
9
+
10
+
<a href="https://crates.io/crates/upnp-client-rs" target="_blank">
11
+
<img src="https://img.shields.io/crates/dr/upnp-client-rs" />
12
+
</a>
13
+
14
+
<a href="https://docs.rs/upnp-client-rs" target="_blank">
15
+
<img src="https://docs.rs/upnp-client-rs/badge.svg" />
16
+
</a>
17
+
</p>
2
18
3
19
This is a UPNP client library for Rust.
4
20
···
10
26
[dependencies]
11
27
upnp-client = "0.1"
12
28
```
29
+
30
+
### Example
31
+
32
+
This example will print out all the devices found on the network.
33
+
34
+
```rust
35
+
use colored_json::prelude::*;
36
+
use futures_util::StreamExt;
37
+
38
+
use crate::discovery::discover_pnp_locations;
39
+
40
+
mod discovery;
41
+
mod types;
42
+
43
+
#[tokio::main]
44
+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
45
+
let devices = discover_pnp_locations();
46
+
tokio::pin!(devices);
47
+
48
+
while let Some(device) = devices.next().await {
49
+
let json = serde_json::to_string_pretty(&device)?;
50
+
println!("{}", json.to_colored_json_auto()?);
51
+
}
52
+
53
+
Ok(())
54
+
}
55
+
```
56
+
57
+
Output:
58
+
59
+
```json
60
+
{
61
+
"device_type": "urn:schemas-upnp-org:device:MediaRenderer:1",
62
+
"friendly_name": "Kodi (MacBook-Pro-de-Tsiry-4.local)",
63
+
"location": "http://192.168.8.101:1825/",
64
+
"manufacturer": "XBMC Foundation",
65
+
"manufacturer_url": "http://kodi.tv/",
66
+
"model_description": "Kodi - Media Renderer",
67
+
"model_name": "Kodi",
68
+
"model_number": "18.4 Git:20190831-3ade758ceb",
69
+
"services": [
70
+
{
71
+
"control_url": "/AVTransport/d599320b-2d3b-e0d7-3224-dc1c4b074dae/control.xml",
72
+
"event_sub_url": "/AVTransport/d599320b-2d3b-e0d7-3224-dc1c4b074dae/event.xml",
73
+
"scpd_url": "/AVTransport/d599320b-2d3b-e0d7-3224-dc1c4b074dae/scpd.xml",
74
+
"service_id": "urn:upnp-org:serviceId:AVTransport",
75
+
"service_type": "urn:schemas-upnp-org:service:AVTransport:1"
76
+
},
77
+
{
78
+
"control_url": "/ConnectionManager/d599320b-2d3b-e0d7-3224-dc1c4b074dae/control.xml",
79
+
"event_sub_url": "/ConnectionManager/d599320b-2d3b-e0d7-3224-dc1c4b074dae/event.xml",
80
+
"scpd_url": "/ConnectionManager/d599320b-2d3b-e0d7-3224-dc1c4b074dae/scpd.xml",
81
+
"service_id": "urn:upnp-org:serviceId:ConnectionManager",
82
+
"service_type": "urn:schemas-upnp-org:service:ConnectionManager:1"
83
+
},
84
+
{
85
+
"control_url": "/RenderingControl/d599320b-2d3b-e0d7-3224-dc1c4b074dae/control.xml",
86
+
"event_sub_url": "/RenderingControl/d599320b-2d3b-e0d7-3224-dc1c4b074dae/event.xml",
87
+
"scpd_url": "/RenderingControl/d599320b-2d3b-e0d7-3224-dc1c4b074dae/scpd.xml",
88
+
"service_id": "urn:upnp-org:serviceId:RenderingControl",
89
+
"service_type": "urn:schemas-upnp-org:service:RenderingControl:1"
90
+
}
91
+
]
92
+
}
93
+
```
94
+
95
+
### License
96
+
MIT