wsc_client.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import sys, time, collections
  2. from PyQt5.QtCore import QObject, pyqtSignal, QSettings
  3. import paho.mqtt.client as mqtt
  4. import logging
  5. import wsc_device
  6. import wsc_device_encoder
  7. from wsc_tools import ParsingTools
  8. #FORMAT = '%(asctime)-15s'
  9. logging.basicConfig( level=logging.DEBUG)
  10. log = logging.getLogger("wsc_client")
  11. class WSC_Client(QObject):
  12. # define Qt signals (I don't understand why this is here)
  13. encoderUpdate = pyqtSignal([dict], name='encoderUpdate')
  14. networkStatus = pyqtSignal([str], name='networkStatus')
  15. networkUpdate = pyqtSignal([str], name='networkUpdate')
  16. settingsError = pyqtSignal([str], name='settingsError')
  17. def __init__(self, settingFile=None, clientID = None, debug=True, mqttdebug=True):
  18. super(WSC_Client, self).__init__()
  19. # Private Class Flags and Variables
  20. self.__clientID = clientID
  21. self.__settingFile = settingFile
  22. self.__debug = debug
  23. self.__mqttDebug = mqttdebug
  24. self.__errorIndex = 0
  25. self.__refreshCb = None
  26. self.__org = 'IdeasX'
  27. self.__app = 'Workstation-Client'
  28. # MQTT Client Object
  29. self._mqttc = mqtt.Client(self.__clientID, clean_session=True, userdata=None, protocol=mqtt.MQTTv311)
  30. # IdeasX Device Managers / Parsers
  31. self.__encoderManager = wsc_device.DeviceManager(wsc_device_encoder.Encoder, self._mqttc, self.encoderUpdate)
  32. self.__parserTools = ParsingTools()
  33. self._mqttc.on_connect = self.wsc_on_connect
  34. self._mqttc.on_disconnect = self.wsc_on_disconnect
  35. if self.__mqttDebug:
  36. self._mqttc.on_log = self.mqtt_on_log
  37. '''
  38. MQTT Callback Functions
  39. '''
  40. def wsc_on_connect(self, mqttc, backend_data, flags, rc):
  41. if rc == 0:
  42. log.info('Connected to %s: %s' % (mqttc._host, mqttc._port))
  43. self.networkStatus.emit("Connected to %s: %s" % (mqttc._host, mqttc._port))
  44. else:
  45. log.info('rc: ' + str(rc))
  46. self.networkStatus.emit('Connection Failure (rc: ' +str(rc))
  47. def wsc_on_disconnect(self, mqttc, backend_data, rc):
  48. if self.__debug:
  49. if rc != 0:
  50. log.warning("Client disconnected and its a mystery why!")
  51. self.networkStatus.emit("Uh No! WSC was disconnected!")
  52. else:
  53. log.info("Client successfully disconnected.")
  54. self.networkStatus.emit("Uh No! WSC was disconnected!")
  55. self.printLine()
  56. def mqtt_on_log(self, mqttc, backend_data, level, string):
  57. log.debug(string)
  58. def StartWorkstationClient(self, ip=None, port=1883, keepAlive=60, gui=False):
  59. self.keepAlive = keepAlive
  60. if ip == None or ip == "":
  61. settings = QSettings(self.__org, self.__app)
  62. settings.beginGroup('Broker')
  63. self.ip = settings.value('NetworkBroker', 'ideasx.duckdns.org')
  64. self.port = settings.value('NetworkPort', 1883)
  65. self.__LocalBroker = settings.value('LocalBroker', '10.42.0.1')
  66. self.__LocalPort = settings.value('LocalPort', 1883)
  67. settings.endGroup()
  68. else:
  69. log.info("Loading hardcoded defaults")
  70. self.ip = ip
  71. self.port = port
  72. try:
  73. self._mqttc.connect(self.ip, int(self.port), self.keepAlive)
  74. self.__encoderManager.setupMQTT()
  75. if gui:
  76. log.info("Starting WSC Backend (GUI Version)")
  77. self._mqttc.loop_start() # start MQTT Client Thread
  78. else:
  79. log.info("Starting WSC Backend (CMD Version)")
  80. self._mqttc.loop_forever() # needs to be blocking in CMD mode
  81. except Exception as e:
  82. # this needs to be updated to look at the exception errors
  83. log.critical("Error connecting to IdeasX")
  84. log.critical(e)
  85. self.networkStatus.emit("Oh-no! Broker settings are incorrect or there is a network failure")
  86. #sys.exit(1)
  87. def restartWSC(self):
  88. self.killWSC()
  89. self.networkUpdate.emit("Restarting WSC...")
  90. self.StartWorkstationClient()
  91. def killWSC(self):
  92. self._mqttc.loop_stop()
  93. log.info("Murdered MQTT thread.")
  94. def printLine(self):
  95. print('-'*70)
  96. if __name__ == "__main__":
  97. Host = "127.0.0.1"
  98. Port = 1883
  99. KeepAlive = 30
  100. msgFlag = False;
  101. deviceID = None;
  102. cmdPayload = None;
  103. cmdArg = None;
  104. cmdTest = True;
  105. wsc = WSC_Client()
  106. if cmdTest:
  107. wsc.StartWorkstationClient(Host, Port, KeepAlive, gui=False)
  108. else:
  109. wsc.StartWorkstationClient(Host, Port, KeepAlive, gui=True)
  110. time.sleep(3)
  111. (result, mid) = wsc._mqttc.subscribe('/encoders/18:fe:34:d2:6f:68/health', qos=0)
  112. print(result, mid)
  113. (result, mid) = wsc._mqttc.subscribe('/encoders/18:fe:34:d2:6f:68/health', qos=0)
  114. print(result, mid)
  115. wsc.activateEncoder('18:fe:34:d2:6f:68')
  116. # print(wsc.subscribedEncoders)
  117. # time.sleep(2)
  118. # wsc.deactivateEncoder('18:fe:34:d2:6f:68')
  119. # print(wsc.subscribedEncoders)
  120. time.sleep(10)
  121. wsc.killWSC()