add option for second MQTT server

This commit is contained in:
KF7EEL 2022-03-09 07:28:37 -08:00
parent 13e539f8ce
commit d6b32ffed7
5 changed files with 82 additions and 15 deletions

View File

@ -141,13 +141,24 @@ IGATE_LONGITUDE = 11930. W
# MQTT Configuration
# MQTT is used to accces external applications and other networks
# This must be unique on the MQTT server
GATEWAY_CALLSIGN: N0CALL
# URL for users to find out more about network
URL: localhost/website
# Simple description to display on External Services page
DESCRIPTION: Change me.
# Connection to HBNet MQTT server for external applications
MQTT_SERVER: mqtt.hbnet.xyz
MQTT_PORT: 1883
MQTT_USERNAME:
MQTT_PASSWORD:
# Connect to custom MQTT server
MQTT_SERVER2:
MQTT_PORT2: 1883
MQTT_USERNAME2:
MQTT_PASSWORD2:

View File

@ -148,8 +148,13 @@ def sms_type(sub, sms):
##mqtt_shortcut_gen = ''.join(random.choices(string.ascii_uppercase, k=4))
def mqtt_main(broker_url = 'localhost', broker_port = 1883):
global mqtt_client
def mqtt_main(mqtt_user, mqtt_pass, mqtt_user2, mqtt_pass2, broker_url = 'localhost', broker_port = 1883, broker_url2 = 'localhost', broker_port2 = 1883):
global mqtt_client, mqtt_client2
if broker_url2 != '':
logger.info('Enabling MQTT Server 22')
mqtt_client2 = mqtt.Client(client_id = mqtt_shortcut_gen + '-' + str(random.randint(1,99)))
elif broker_url2 == '':
mqtt_client2 = ''
## print(broker_port)
# On connect, send announcement
def on_connect(client, userdata, flags, rc):
@ -157,6 +162,22 @@ def mqtt_main(broker_url = 'localhost', broker_port = 1883):
logger.debug('Connected to MQTT server: ' + broker_url)
def on_disconnect(client, userdata, flags, rc):
logger.debug('Disconnected from MQTT server')
def mqtt_connect():
global mqtt_client2
print('connect')
# Pass MQTT server details to instrance
if mqtt_user != '':
logger.info('MQTT User/Pass specified')
mqtt_client.username_pw_set(mqtt_user, mqtt_pass)
if mqtt_user2 != '':
logger.info('MQTT User/Pass specified for server 2')
mqtt_client.username_pw_set(mqtt_user, mqtt_pass)
mqtt_client.connect(broker_url, broker_port, keepalive = 30)
if broker_url2 == '':
mqtt_client2 = ''
logger.info('Second MQTT server not used')
elif broker_url2 != '':
mqtt_client2.connect(broker_url2, broker_port2, keepalive = 30)
# Process received msg here
def on_message(client, userdata, message):
@ -192,35 +213,53 @@ def mqtt_main(broker_url = 'localhost', broker_port = 1883):
logger.error(e)
send_sms(False, int(topic_list[2]), data_id[0], data_id[0], 'unit', dict_payload['network'] + '/' + list(dict_payload.keys())[0] + ': ' + dict_payload[list(dict_payload.keys())[0]])
mqtt_client = mqtt.Client(client_id = mqtt_shortcut_gen + '-' + str(random.randint(1,99)))
if broker_url2 != '':
mqtt_client2.will_set("ANNOUNCE", json.dumps({mqtt_shortcut_gen:"LOST_CONNECTION"}), 0, False)
mqtt_client2.on_message = on_message
mqtt_client2.on_connect = on_connect
mqtt_client2.on_disconnect = on_disconnect
# Last will and testament
mqtt_client.will_set("ANNOUNCE", json.dumps({mqtt_shortcut_gen:"LOST_CONNECTION"}), 0, False)
mqtt_client.on_message = on_message
mqtt_client.on_connect = on_connect
mqtt_client.on_disconnect = on_disconnect
mqtt_client.connect(broker_url, broker_port)
mqtt_connect()
# Subscribe to:
# Incoming messages
mqtt_client.subscribe('MSG/' + mqtt_shortcut_gen + '/#', qos=0)
# Announcements for service/network discovery
mqtt_client.subscribe("ANNOUNCE", qos=0)
if broker_url2 != '':
mqtt_client2.subscribe('MSG/' + mqtt_shortcut_gen + '/#', qos=0)
mqtt_client2.subscribe("ANNOUNCE", qos=0)
mqtt_client2.loop_start()
mqtt_client.loop_start()
def mqtt_send_msg(network_shortcut, rcv_dmr_id, snd_dmr_id, message):
msg_dict = json.dumps({str(snd_dmr_id):message, 'network':mqtt_shortcut_gen}, indent = 4)
mqtt_client.publish(topic='MSG/' + network_shortcut + '/' + str(rcv_dmr_id), payload=msg_dict, qos=0, retain=False)
if mqtt_client2 != '':
mqtt_client2.publish(topic='MSG/' + network_shortcut + '/' + str(rcv_dmr_id), payload=msg_dict, qos=0, retain=False)
logger.info('Sent message to another network via MQTT: ' + network_shortcut)
def mqtt_send_app(network_shortcut, snd_dmr_id, message):
msg_dict = json.dumps({'dmr_id': str(snd_dmr_id), 'message':message, 'network':mqtt_shortcut_gen, 'sms_type':'unit'}, indent = 4)
mqtt_client.publish(topic='APP/' + network_shortcut, payload=msg_dict, qos=0, retain=False)
if mqtt_client2 != '':
mqtt_client2.publish(topic='APP/' + network_shortcut, payload=msg_dict, qos=0, retain=False)
logger.info('Sent message to external application via MQTT: ' + network_shortcut)
def mqtt_announce():
mqtt_client.publish(topic="ANNOUNCE", payload=json.dumps({'shortcut':mqtt_shortcut_gen, 'type': 'network', 'url':CONFIG['DATA_CONFIG']['URL'], 'description':CONFIG['DATA_CONFIG']['DESCRIPTION']}, indent = 4), qos=0, retain=False)
if mqtt_client2 != '':
mqtt_client2.publish(topic="ANNOUNCE", payload=json.dumps({'shortcut':mqtt_shortcut_gen, 'type': 'network', 'url':CONFIG['DATA_CONFIG']['URL'], 'description':CONFIG['DATA_CONFIG']['DESCRIPTION']}, indent = 4), qos=0, retain=False)
def download_aprs_settings(_CONFIG):
@ -579,14 +618,26 @@ def download_config(CONFIG_FILE, cli_file):
if final_options[0] == 'gateway_callsign':
mqtt_server = corrected_config['DATA_CONFIG']['GATEWAY_CALLSIGN'] = final_options[1].upper()
if final_options[0] == 'server':
mqtt_server = corrected_config['DATA_CONFIG']['MQTT_SERVER'] = final_options[1]
if final_options[0] == 'port':
mqtt_port = corrected_config['DATA_CONFIG']['MQTT_PORT'] = final_options[1]
if final_options[0] == 'url':
mqtt_port = corrected_config['DATA_CONFIG']['URL'] = final_options[1]
if final_options[0] == 'description':
mqtt_port = corrected_config['DATA_CONFIG']['DESCRIPTION'] = final_options[1]
if final_options[0] == 'server':
mqtt_server = corrected_config['DATA_CONFIG']['MQTT_SERVER'] = final_options[1]
if final_options[0] == 'port':
mqtt_port = corrected_config['DATA_CONFIG']['MQTT_PORT'] = final_options[1]
if final_options[0] == 'username':
mqtt_port = corrected_config['DATA_CONFIG']['MQTT_USERNAME'] = final_options[1]
if final_options[0] == 'password':
mqtt_port = corrected_config['DATA_CONFIG']['MQTT_PASSWORD'] = final_options[1]
if final_options[0] == 'server2':
mqtt_server = corrected_config['DATA_CONFIG']['MQTT_SERVER2'] = final_options[1]
if final_options[0] == 'port2':
mqtt_port = corrected_config['DATA_CONFIG']['MQTT_PORT2'] = final_options[1]
if final_options[0] == 'username2':
mqtt_port = corrected_config['DATA_CONFIG']['MQTT_USERNAME2'] = final_options[1]
if final_options[0] == 'password2':
mqtt_port = corrected_config['DATA_CONFIG']['MQTT_PASSWORD2'] = final_options[1]
if 'DATA_GATEWAY:' in i:
## print(i)
gateway_options = i[13:].split(':')
@ -2085,7 +2136,7 @@ if __name__ == '__main__':
if CONFIG['DATA_CONFIG']['GATEWAY_CALLSIGN'] == 'n0call'.upper():
logger.info('MQTT disabled. External applications and networks will not be available.')
else:
mqtt_thread = threading.Thread(target=mqtt_main, args=(CONFIG['DATA_CONFIG']['MQTT_SERVER'],int(CONFIG['DATA_CONFIG']['MQTT_PORT']),))
mqtt_thread = threading.Thread(target=mqtt_main, args=(CONFIG['DATA_CONFIG']['MQTT_USERNAME'],CONFIG['DATA_CONFIG']['MQTT_PASSWORD'],CONFIG['DATA_CONFIG']['MQTT_USERNAME2'],CONFIG['DATA_CONFIG']['MQTT_PASSWORD2'],CONFIG['DATA_CONFIG']['MQTT_SERVER'],int(CONFIG['DATA_CONFIG']['MQTT_PORT']),CONFIG['DATA_CONFIG']['MQTT_SERVER2'],int(CONFIG['DATA_CONFIG']['MQTT_PORT2']),))
mqtt_thread.daemon = True
mqtt_thread.start()

View File

@ -203,11 +203,16 @@ def build_config(_config_file):
## 'RULES_PATH': config.get(section, 'RULES_PATH'),
'GATEWAY_CALLSIGN': config.get(section, 'GATEWAY_CALLSIGN'),
## 'URL': config.get(section, 'URL'),
## 'DESCRIPTION': config.get(section, 'DESCRIPTION'),
'URL': config.get(section, 'URL'),
'DESCRIPTION': config.get(section, 'DESCRIPTION'),
'MQTT_USERNAME': config.get(section, 'MQTT_USERNAME'),
'MQTT_PASSWORD': config.get(section, 'MQTT_PASSWORD'),
'MQTT_SERVER': config.get(section, 'MQTT_SERVER'),
'MQTT_PORT': config.get(section, 'MQTT_PORT'),
'MQTT_USERNAME2': config.get(section, 'MQTT_USERNAME2'),
'MQTT_PASSWORD2': config.get(section, 'MQTT_PASSWORD2'),
'MQTT_SERVER2': config.get(section, 'MQTT_SERVER2'),
'MQTT_PORT2': config.get(section, 'MQTT_PORT2'),

View File

@ -4654,7 +4654,7 @@ Name: <strong>''' + p.name + '''</strong>&nbsp; -&nbsp; Port: <strong>''' + str(
## s = ServerList.query.filter_by(name=request.args.get('add_data_options')).first()
print(request.form)
print(request.form.get('user_settings'))
add_data_options(request.args.get('add_data_options'), 'DATA_GATEWAY:data_id=' + request.form.get('data_id') + ':call_type=' + request.form.get('call_type') + ':aprs_login_call=' + request.form.get('aprs_login_call') + ':aprs_login_passcode=' + request.form.get('aprs_login_passcode') + ':aprs_server=' + request.form.get('aprs_server') + ':aprs_port=' + request.form.get('aprs_port') + ':default_ssid=' + request.form.get('default_ssid') + ':default_comment=' + request.form.get('default_comment') + ':aprs_filter=' + request.form.get('aprs_filter') + ':user_settings=' + request.form.get('user_settings') + ':igate_time=' + request.form.get('igate_time') + ':igate_icon=' + request.form.get('igate_icon') + ':igate_comment=' + request.form.get('igate_comment') + ':igate_lat=' + request.form.get('igate_lat') + ':igate_lon=' + request.form.get('igate_lon') + ';MQTT:gateway_callsign=' + request.form.get('gateway_call') + ':server=' + request.form.get('mqtt_server') + ':port=' + request.form.get('mqtt_port') + ':username=' + request.form.get('mqtt_user') + ':password=' + request.form.get('mqtt_password') + ':url=' + request.form.get('url') + ':description=' + request.form.get('description'))
add_data_options(request.args.get('add_data_options'), 'DATA_GATEWAY:data_id=' + request.form.get('data_id') + ':call_type=' + request.form.get('call_type') + ':aprs_login_call=' + request.form.get('aprs_login_call') + ':aprs_login_passcode=' + request.form.get('aprs_login_passcode') + ':aprs_server=' + request.form.get('aprs_server') + ':aprs_port=' + request.form.get('aprs_port') + ':default_ssid=' + request.form.get('default_ssid') + ':default_comment=' + request.form.get('default_comment') + ':aprs_filter=' + request.form.get('aprs_filter') + ':user_settings=' + request.form.get('user_settings') + ':igate_time=' + request.form.get('igate_time') + ':igate_icon=' + request.form.get('igate_icon') + ':igate_comment=' + request.form.get('igate_comment') + ':igate_lat=' + request.form.get('igate_lat') + ':igate_lon=' + request.form.get('igate_lon') + ';MQTT:gateway_callsign=' + request.form.get('gateway_call') + ':url=' + request.form.get('url') + ':description=' + request.form.get('description') + ':server=' + request.form.get('mqtt_server') + ':port=' + request.form.get('mqtt_port') + ':username=' + request.form.get('mqtt_user') + ':password=' + request.form.get('mqtt_password') + ':server2=localhost:port2=1883:username2=:password2=')
content = '''<h3 style="text-align: center;">Added data gateway options.</h3>
<p style="text-align: center;">Redirecting in 3 seconds.</p>

View File

@ -82,7 +82,7 @@
<tr>
<td><strong>.[SHORTCUT] [DMR ID] [MESSAGE]</strong></td>
<td>Send an SMS to another user on a different network.</td>
<td><em><code>#DMRNET 1234567 Are you there?</code></em></td>
<td><em><code>.DMRNET 1234567 Are you there?</code></em></td>
</tr>
</tbody>
</table>