cli.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. """Production entry point using paho-mqtt and pyserial."""
  2. import argparse
  3. import logging
  4. import signal
  5. import threading
  6. from .bridge import Bridge
  7. from .config import Config
  8. def main() -> None:
  9. parser = argparse.ArgumentParser(description="Motian MQTT / MAVLink telemetry and serial bridge")
  10. parser.add_argument("--config", required=True, help="path to JSON configuration")
  11. parser.add_argument("--debug", action="store_true")
  12. args = parser.parse_args()
  13. logging.basicConfig(level=logging.DEBUG if args.debug else logging.INFO,
  14. format="%(asctime)s %(levelname)s %(name)s: %(message)s")
  15. import paho.mqtt.client as mqtt
  16. import serial
  17. config = Config.from_file(args.config)
  18. client = mqtt.Client(callback_api_version=mqtt.CallbackAPIVersion.VERSION2,
  19. client_id=config.client_id, protocol=mqtt.MQTTv311)
  20. if config.mqtt_username is not None:
  21. client.username_pw_set(config.mqtt_username, config.mqtt_password())
  22. if config.mqtt_tls:
  23. client.tls_set(ca_certs=config.mqtt_ca_file,
  24. certfile=config.mqtt_cert_file, keyfile=config.mqtt_key_file)
  25. client.reconnect_delay_set(min_delay=1, max_delay=30)
  26. client.max_queued_messages_set(1)
  27. bridge = Bridge(config, client, serial.serial_for_url)
  28. done = threading.Event()
  29. def shutdown(signum: int, frame: object) -> None:
  30. done.set()
  31. signal.signal(signal.SIGINT, shutdown)
  32. signal.signal(signal.SIGTERM, shutdown)
  33. bridge.start()
  34. try:
  35. done.wait()
  36. finally:
  37. bridge.stop()
  38. if __name__ == "__main__":
  39. main()