diff --git a/data_gateway-SAMPLE.cfg b/data_gateway-SAMPLE.cfg index 96f6e1f..3b3994a 100644 --- a/data_gateway-SAMPLE.cfg +++ b/data_gateway-SAMPLE.cfg @@ -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: diff --git a/data_gateway.py b/data_gateway.py index 6969d87..f6f9b6d 100644 --- a/data_gateway.py +++ b/data_gateway.py @@ -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() diff --git a/data_gateway_config.py b/data_gateway_config.py index 9f693f7..edb1591 100644 --- a/data_gateway_config.py +++ b/data_gateway_config.py @@ -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'), diff --git a/web/app.py b/web/app.py index bef8c46..ed9c540 100644 --- a/web/app.py +++ b/web/app.py @@ -4654,7 +4654,7 @@ Name: ''' + p.name + '''  -  Port: ''' + 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 = '''

Added data gateway options.

Redirecting in 3 seconds.

diff --git a/web/templates/data_gateway_help.html b/web/templates/data_gateway_help.html index 65447c1..c525720 100644 --- a/web/templates/data_gateway_help.html +++ b/web/templates/data_gateway_help.html @@ -82,7 +82,7 @@ .[SHORTCUT] [DMR ID] [MESSAGE] Send an SMS to another user on a different network. -#DMRNET 1234567 Are you there? +.DMRNET 1234567 Are you there?