wsc_client.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import sys, time, collections
  2. from PyQt5.QtCore import QObject, pyqtSignal, QSettings, QTimer
  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, EncoderConfig
  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. self.encoderConfig = EncoderConfig()
  36. if self.__mqttDebug:
  37. self._mqttc.on_log = self.mqtt_on_log
  38. '''
  39. MQTT Callback Functions
  40. '''
  41. def wsc_on_connect(self, mqttc, backend_data, flags, rc):
  42. if rc == 0:
  43. log.info('Connected to %s: %s' % (mqttc._host, mqttc._port))
  44. self.networkStatus.emit("Connected to %s: %s" % (mqttc._host, mqttc._port))
  45. else:
  46. log.info('rc: ' + str(rc))
  47. self.networkStatus.emit('Connection Failure (rc: ' +str(rc))
  48. def wsc_on_disconnect(self, mqttc, backend_data, rc):
  49. if self.__debug:
  50. if rc != 0:
  51. log.warning("Client disconnected and its a mystery why!")
  52. self.networkStatus.emit("Uh No! WSC was disconnected!")
  53. else:
  54. log.info("Client successfully disconnected.")
  55. self.networkStatus.emit("Uh No! WSC was disconnected!")
  56. self.printLine()
  57. def mqtt_on_log(self, mqttc, backend_data, level, string):
  58. log.debug(string)
  59. def StartWorkstationClient(self, ip=None, port=1883, keepAlive=60, gui=False):
  60. self.keepAlive = keepAlive
  61. if ip == None or ip == "":
  62. settings = QSettings(self.__org, self.__app)
  63. settings.beginGroup('Broker')
  64. self.ip = settings.value('NetworkBroker', 'ideasx.duckdns.org')
  65. self.port = settings.value('NetworkPort', 1883)
  66. self.__LocalBroker = settings.value('LocalBroker', '10.42.0.1')
  67. self.__LocalPort = settings.value('LocalPort', 1883)
  68. settings.endGroup()
  69. else:
  70. log.info("Loading hardcoded defaults")
  71. self.ip = ip
  72. self.port = port
  73. try:
  74. self._mqttc.reconnect_delay_set(1,120)
  75. self._mqttc.connect(self.ip, int(self.port), self.keepAlive)
  76. self.__encoderManager.setupMQTT()
  77. if gui:
  78. log.info("Starting WSC Backend (GUI Version)")
  79. self._mqttc.loop_start() # start MQTT Client Thread
  80. else:
  81. log.info("Starting WSC Backend (CMD Version)")
  82. self._mqttc.loop_forever() # needs to be blocking in CMD mode
  83. except Exception as e:
  84. # this needs to be updated to look at the exception errors
  85. log.critical("Error connecting to IdeasX")
  86. log.critical(e)
  87. self.networkStatus.emit("Oh-no! Broker settings are incorrect or there is a network failure")
  88. #sys.exit(1)
  89. def connectionTimeout(self):
  90. self.killWSC()
  91. self.networkUpdate.emit("Oh-no! Broker settings are incorrect or there is a network failure")
  92. log.info("connection timeout")
  93. def restartWSC(self):
  94. self.killWSC()
  95. self.networkUpdate.emit("Restarting WSC...")
  96. self.StartWorkstationClient(gui=True)
  97. def killWSC(self):
  98. self._mqttc.loop_stop()
  99. log.info("Murdered MQTT thread.")
  100. def printLine(self):
  101. print('-'*70)
  102. if __name__ == "__main__":
  103. Host = "127.0.0.1"
  104. Port = 1883
  105. KeepAlive = 30
  106. msgFlag = False;
  107. deviceID = None;
  108. cmdPayload = None;
  109. cmdArg = None;
  110. cmdTest = True;
  111. wsc = WSC_Client()
  112. if cmdTest:
  113. wsc.StartWorkstationClient(Host, Port, KeepAlive, gui=False)
  114. else:
  115. wsc.StartWorkstationClient(Host, Port, KeepAlive, gui=True)
  116. time.sleep(3)
  117. (result, mid) = wsc._mqttc.subscribe('/encoders/18:fe:34:d2:6f:68/health', qos=0)
  118. print(result, mid)
  119. (result, mid) = wsc._mqttc.subscribe('/encoders/18:fe:34:d2:6f:68/health', qos=0)
  120. print(result, mid)
  121. wsc.activateEncoder('18:fe:34:d2:6f:68')
  122. # print(wsc.subscribedEncoders)
  123. # time.sleep(2)
  124. # wsc.deactivateEncoder('18:fe:34:d2:6f:68')
  125. # print(wsc.subscribedEncoders)
  126. time.sleep(10)
  127. wsc.killWSC()