1
|
|
|
import paho.mqtt.client as mqtt |
2
|
|
|
import argparse |
3
|
|
|
import subprocess |
4
|
|
|
import base64 |
5
|
|
|
import sys |
6
|
|
|
|
7
|
|
|
def parse_args(argv): |
8
|
|
|
parser = argparse.ArgumentParser(description='Subscribe to an MQTT broker with a command line program') |
9
|
|
|
parser.add_argument('command', type=str) |
10
|
|
|
parser.add_argument('-H', '--host', type=str, default='localhost') |
11
|
|
|
parser.add_argument('-P', '--port', type=int, default=1883) |
12
|
|
|
parser.add_argument('-u', '--username', type=str, default=None) |
13
|
|
|
parser.add_argument('-p', '--password', type=str, default=None) |
14
|
|
|
parser.add_argument('-s', '--subscription', type=str, default='#') |
15
|
|
|
parser.add_argument('-i', '--client-id', type=str, default='') |
16
|
|
|
parser.add_argument('--no-clean-session', dest='clean_session', action='store_false') |
17
|
|
|
parser.set_defaults(clean_session=True) |
18
|
|
|
|
19
|
|
|
return parser.parse_args(argv) |
20
|
|
|
|
21
|
|
|
def on_connect(client, userdata, flags, rc): |
22
|
|
|
client.subscribe(userdata.subscription) |
23
|
|
|
|
24
|
|
|
def on_message(client, userdata, msg): |
25
|
|
|
p = subprocess.Popen([userdata.command, '-t', msg.topic, '-p', base64.b64encode(msg.payload)]) |
26
|
|
|
p.wait() |
27
|
|
|
|
28
|
|
|
def main(): |
29
|
|
|
args = parse_args(sys.argv[1:]) |
30
|
|
|
|
31
|
|
|
client = mqtt.Client(client_id=args.client_id, clean_session=args.clean_session, userdata=args) |
32
|
|
|
|
33
|
|
|
client.on_connect = on_connect |
34
|
|
|
client.on_message = on_message |
35
|
|
|
|
36
|
|
|
client.connect(args.host, args.port, 60) |
37
|
|
|
|
38
|
|
|
client.loop_forever() |
39
|
|
|
|