Skip to content

Commit e8ec16a

Browse files
committed
add multiple protocols server side
1 parent f03b34b commit e8ec16a

4 files changed

Lines changed: 95 additions & 5 deletions

File tree

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# General
2+
3+
There are multiple ways to start serving your `Thing`:
4+
5+
- One needs to run one `Thing` in multiple protocols
6+
- One needs to run multiple `Thing`s in one protocol
7+
- One needs to run multiple `Thing`s in multiple protocols
8+
9+
## Run Single Thing in Multiple Protocols
10+
11+
There are two possible syntax options:
12+
13+
```python linenums="1"
14+
from hololinked.server import HTTPServer, MQTTServer
15+
16+
http_server = HTTPServer(port=9000)
17+
mqtt_server = MQTTServer(host='mqtt.example.com', port=1883)
18+
zmq_server = ZMQServer(access_points=['IPC', 'tcp://*:9001'])
19+
20+
Oscilloscope(id='oscilloscope').run(servers=[http_server, mqtt_server, zmq_server])
21+
```
22+
23+
OR
24+
25+
```python linenums="1"
26+
from hololinked.server import HTTPServer, MQTTServer
27+
28+
Oscilloscope(id='oscilloscope').run(
29+
access_points=(
30+
('HTTP', 9000),
31+
('MQTT', 'mqtt.example.com'),
32+
('ZMQ', ['IPC', 'tcp://*:9001']),
33+
)
34+
)
35+
```
36+
37+
The first option is obviously preferred.
38+
39+
## Run Multiple Things in One Protocol
40+
41+
```python linenums="1"
42+
from hololinked.server import HTTPServer
43+
44+
server = HTTPServer(port=9000)
45+
server.add_thing(Oscilloscope(id='oscilloscope'))
46+
server.add_thing(DCPowerSupply(id='dc-power-supply'))
47+
48+
server.run()
49+
```
50+
51+
## Run Multiple Things in Multiple Protocols
52+
53+
```python linenums="1"
54+
from hololinked.server import HTTPServer, MQTTServer, run
55+
56+
http_server = HTTPServer(port=9000)
57+
mqtt_server = MQTTServer(host='mqtt.example.com', port=1883)
58+
59+
http_server.add_thing(Oscilloscope(id='oscilloscope'))
60+
mqtt_server.add_thing(DCPowerSupply(id='dc-power-supply'))
61+
62+
run(servers=[http_server, mqtt_server])
63+
```

docs/beginners-guide/articles/protocols/http.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ ssl_context = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS_SERVER)
1313
ssl_context.load_cert_chain(cert_file, keyfile=key_file)
1414
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_3
1515

16-
http_server = HTTPServer(port=8090, ssl_context=ssl_context)
16+
http_server = HTTPServer(port=9000, ssl_context=ssl_context)
1717

1818
Oscilloscope(id='oscilloscope').run(servers=[http_server])
1919
# OR
2020
Oscilloscope(
2121
id='oscilloscope',
2222
).run_with_http_server(
23-
port=8090,
23+
port=9000,
2424
ssl_context=ssl_context,
2525
)
2626
```
@@ -44,7 +44,7 @@ One can register custom routes and methods as follows:
4444
```python linenums="1" title="Custom Routes"
4545
from hololinked.server import HTTPServer
4646

47-
server = HTTPServer(port=8090)
47+
server = HTTPServer(port=9000)
4848

4949
server.add_property('/channels/data/A', Oscilloscope.channel_A)
5050
server.add_event('/channels/data/A/stream', Oscilloscope.channel_A_data_event)
@@ -57,13 +57,13 @@ Oscilloscope(id='oscilloscope').run(servers=[server])
5757
On the web browser, one may want to access the HTTP server from a different domain name, especially during development or in private networks. In such cases, one needs to enable CORS headers:
5858

5959
```python linenums="1" title="Enable CORS"
60-
http_server = HTTPServer(port=8090, config=dict(cors=True))
60+
http_server = HTTPServer(port=9000, config=dict(cors=True))
6161
Oscilloscope(id='oscilloscope').run(servers=[http_server])
6262
# OR
6363
Oscilloscope(
6464
id='oscilloscope',
6565
).run_with_http_server(
66-
port=8090,
66+
port=9000,
6767
config=dict(cors=True),
6868
)
6969
```
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# MQTT
2+
3+
## SSL context
4+
5+
To use MQTT over SSL/TLS, one needs to create an SSL context as follows:
6+
7+
```python linenums="1" title="Use SSL"
8+
import ssl, os
9+
10+
ssl_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
11+
ssl_context.load_verify_locations(cafile="ca.crt")
12+
ssl_context.check_hostname = True
13+
ssl_context.verify_mode = ssl.CERT_REQUIRED
14+
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2
15+
16+
mqtt_server = MQTTServer(
17+
host='mqtt.example.com',
18+
port=8883,
19+
ssl_context=ssl_context,
20+
)
21+
Oscilloscope(id='oscilloscope').run(servers=[mqtt_server])
22+
```
23+
24+
Note that since MQTT has broker-based architecture and all publishers are clients to the broker,
25+
the SSL context here is created with purpose `ssl.Purpose.SERVER_AUTH`.

mkdocs.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ nav:
2525
- Configuring Thing Class: beginners-guide/articles/thing.md
2626
- Serialization: beginners-guide/articles/serialization.md
2727
- Protocols:
28+
- General: beginners-guide/articles/protocols/general.md
2829
- HTTP: beginners-guide/articles/protocols/http.md
30+
- MQTT: beginners-guide/articles/protocols/mqtt.md
2931
- Security: beginners-guide/articles/security.md
3032
- API Reference:
3133
- Namespaces: api-reference/namespaces.md

0 commit comments

Comments
 (0)