After cloning the repo, before running the app you need to install required packages. I recommend using virtual environment (venv) for this:
-
First create the virtual environment:
python3 -m venv <your-venv-name>
-
Then you need to activate the environment:
source <your-venv-name>/bin/activate
-
using cmd
<your-venv-name>/Scripts/activate.bat
-
using powershell
<your-venv-name>/Scripts/Activate.ps1
-
-
Once environment is activated, install required packages
pip install -r requirements.txt
-
Run the app using
python3 main.py
-
To quit the app use the exit button in gui (or Ctrl+C in CLI mode)
-
To quit virtual environment, type
deactivate
You can run the app with several arguments described below:
command | shortened | arguments | example | description |
---|---|---|---|---|
--set-broker |
-sb |
host (string), port (int) | python main.py -sb localhost 1883 | sets current broker |
--add-topic |
-at |
topic name (string), data format (string), interval [seconds] (float) | python main.py -at "my/topic" "<%randi%>" 10 | adds topic to list |
--no-gui |
-nogui |
- | python main.py -nogui | launches app without gui |
--verbose |
-v |
- | python main.py -v | prints logs to console in addition to logs.txt file |
Data format is a string containg formula for a message. Additionally, data format functions can accept arguments. Here is table with each function and argument described
function | accepted arguments | default | example data format | description |
---|---|---|---|---|
randi |
min (int), max (int) |
min = -2^31, max = 2^31-1 | <%randi min=-10 max=10%> | Sends random int from [min ; max ] range |
randu |
min (int), max (int) |
min = 0, max = 2^32 - 1 | <%randu min=10 max=20%> | Sends random uint from [min ; max ] range |
randf |
min (float), max (float) |
min = 0, max = 1 | <%randf min=-1 max=16.9%> | Sends random float from [min ; max ) range |
rands |
collection (list of strings), length (int) |
length = 10 | <%rands collection=["a","ab",'abc']%> | Sends random string from given collection or generates random string with given length . If both arguments are passed, it will prioritize collection. |
file |
src (string), separator (string) |
separator = "None" | <%file src="test.txt" separator="\n"%> | Sends data from given file one, split by given separator (or all of it at once if separator is not specified) |
time |
- | - | <%time%> | Sends current time (datetime.now().time()) |
datetime |
- | - | <%datetime%> | Sends current date time in ISO format (datetime.now().isoformat()) |
inc |
start (int | float), inc (int | float), reset (int | float) |
start = 0, inc = 1, reset = None | <%inc start=0 inc=2 reset=10%> | Every time the message is sent, the value is incremented by inc . When the value is more than reset it returns back to start . |
Keep in mind that you dont always have to pass in all the arguments. If you skip any (for example max in randi
, it will use the default value).
Argument value cannot contain space characters unless it's a string or a list (starts with '
, "
or [
). For example:
<%rands collection=["x", "y"]%>
- OK (collection value uses[
...]
)<%rands collection= ["x", "y"]%>
- ERROR (space before opening square bracket)<%file src="hello world.txt"%>
- OK (src value uses"
..."
)<%randi max= 10%>
- ERROR (space after parameter value)
Assume we want to revieve messages with following format
{
"data": {
"x": <some int>,
"y": <some float>,
}
}
Our Data format would then be
{ "data": { "x": "<%randi%>", "y": "<%randf%>" } }
You can always create config.json
file yourself if you think writing it with the command line tool is too tedious - simply follow the format below (uuid is treated as str
not uuid type, so you can use whatever unique string you want).
{
"broker": {
"host": "localhost",
"port": 1883
},
"topics": {
"5b8cf095-c3c6-4730-8618-80811f4506ab": {
"topic": "topic1"
"data_format": "<%randi%>",
"interval": 1,
"manual": false
},
"my-app-unique-id": {
"topic": "test/topic2",
"data_format": "{ \"x\": \"<%randu%>\" }",
"interval": 1.5,
"manual": false
}
}
}
result - app publishes random int value on 'topic1' every second and random uint value on 'test/topic2'
Keep in mind that the look of the app is dependent on user's system - QT uses native components.