123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #!/usr/bin/env python3
- import paho.mqtt.client as paho
- import random
- import sys
- import time
- # This is a client that carries out randomised behaviour. It is intended for
- # use with the local config file. This file has multiple listeners configured:
- # * 1883 - unencrypted MQTT over TCP with no authentication
- # * 1884 - unencrypted MQTT over TCP with password authentication
- # * 1885 - unencrypted MQTT over TCP with plugin authentication
- # * 1886 - unencrypted MQTT over TCP with password and plugin authentication
- #
- # * 8883 - encrypted MQTT over TCP with no authentication
- # * 8884 - encrypted MQTT over TCP with password authentication
- # * 8885 - encrypted MQTT over TCP with plugin authentication
- # * 8886 - encrypted MQTT over TCP with password and plugin authentication
- #
- # * 8000 - unencrypted MQTT over WebSockets with no authentication
- # * 8001 - unencrypted MQTT over WebSockets with password authentication
- # * 8002 - unencrypted MQTT over WebSockets with plugin authentication
- # * 8003 - unencrypted MQTT over WebSockets with password and plugin authentication
- #
- # * 4430 - encrypted MQTT over WebSockets with no authentication
- # * 4431 - encrypted MQTT over WebSockets with password authentication
- # * 4432 - encrypted MQTT over WebSockets with plugin authentication
- # * 4433 - encrypted MQTT over WebSockets with password and plugin authentication
- #
- # The client randomly picks:
- # * A port out of the list
- # * Whether to use encryption
- # * Whether to use WebSockets
- # * Clean start or not
- # * Session expiry interval or not
- # * QoS to use when subscribing - topics "outgoing/[client id]/message" and "response/#"
- # * Lifetime of connection
- # On a per publish message basis it chooses:
- # * QoS of message
- # * Topic of message "outgoing/[0-max client]/message"
- # * Retain
- # * Interval until next outgoing message
- ports = [
- {"port":1883, "tls":False, "transport":"tcp", "auth":False},
- {"port":1884, "tls":False, "transport":"tcp", "auth":True},
- {"port":1885, "tls":False, "transport":"tcp", "auth":True},
- {"port":1886, "tls":False, "transport":"tcp", "auth":True},
- {"port":8883, "tls":True, "transport":"tcp", "auth":False},
- {"port":8884, "tls":True, "transport":"tcp", "auth":True},
- {"port":8885, "tls":True, "transport":"tcp", "auth":True},
- {"port":8886, "tls":True, "transport":"tcp", "auth":True},
- {"port":8000, "tls":False, "transport":"websockets", "auth":False},
- {"port":8001, "tls":False, "transport":"websockets", "auth":True},
- {"port":8002, "tls":False, "transport":"websockets", "auth":True},
- {"port":8003, "tls":False, "transport":"websockets", "auth":True},
- {"port":4430, "tls":True, "transport":"websockets", "auth":False},
- {"port":4431, "tls":True, "transport":"websockets", "auth":True},
- {"port":4432, "tls":True, "transport":"websockets", "auth":True},
- {"port":4433, "tls":True, "transport":"websockets", "auth":True},
- ]
- booleans = [True, False]
- qos_values = [0, 1, 2]
- def on_connect(client, userdata, flags, rc):
- global running
- if rc == 0:
- client.subscribe("response/#", subscribe_qos)
- client.subscribe("outgoing/%s/message" % (client_id), subscribe_qos)
- else:
- running = False
- def on_message(client, userdata, msg):
- pass
- def on_publish(client, userdata, mid):
- pass
- def on_disconnect(client, userdata, rc):
- running = False
- def do_publish(client):
- retain = random.choice(booleans)
- qos = random.choice(qos_values)
- topic = "outgoing/%d/message" % (random.uniform(1, 1000))
- payload = "message"
- client.publish(topic, payload, qos, retain)
- next_publish_time = time.time() + random.uniform(0.1, 2.0)
- def main():
- global running
- global lifetime
- mqttc = paho.Client(client_id, clean_session=clean_start, protocol=protocol, transport=transport)
- mqttc.on_message = on_message
- mqttc.on_publish = on_publish
- mqttc.on_connect = on_connect
- mqttc.on_disconnect = on_disconnect
- if auth and random.choice(booleans):
- if random.choice(booleans):
- mqttc.username_pw_set("test", "password")
- else:
- mqttc.username_pw_set("bad", "bad")
- if use_tls:
- mqttc.tls_set(ca_certs="../ssl/all-ca.crt")
- mqttc.connect("localhost", port)
- mqttc.loop_start()
- while running:
- time.sleep(0.1)
- now = time.time()
- if now > next_publish_time:
- do_publish(mqttc)
- if now > lifetime:
- if random.choice(booleans):
- mqttc.disconnect()
- lifetime += 5.0
- else:
- running = False
- p = random.choice(ports)
- port = p["port"]
- use_tls = p["tls"]
- transport = p["transport"]
- auth = p["auth"]
- client_id = "cid"+sys.argv[1]
- clean_start = random.choice(booleans)
- subscribe_qos = random.choice(qos_values)
- protocol = paho.MQTTv311
- next_publish_time = time.time() + random.uniform(0.1, 2.0)
- lifetime = time.time() + random.uniform(5.0, 10.0)
- running = True
- main()
|