Merge pull request #19 from techdada/master

mqtt client ssl enabled
This commit is contained in:
2018-10-27 15:30:18 +03:00
committed by GitHub
2 changed files with 41 additions and 10 deletions
+3
View File
@@ -4,6 +4,9 @@ mqtt:
username: username username: username
password: passw0rd password: passw0rd
prefix: home prefix: home
#secure mqtt. uncomment to enable ssl:
#ca: "config/roots.pem"
#tls_version: "tlsv1.2"
#send report as json #send report as json
json: False json: False
+37 -9
View File
@@ -1,5 +1,7 @@
import paho.mqtt.client as mqtt import paho.mqtt.client as mqtt
import logging import logging
import os
import ssl
from queue import Queue from queue import Queue
from threading import Thread from threading import Thread
import json import json
@@ -15,6 +17,8 @@ class Mqtt:
password = "" password = ""
server = "localhost" server = "localhost"
port = 1883 port = 1883
ca = None
tlsvers = None
prefix = "home" prefix = "home"
_client = None _client = None
@@ -41,6 +45,10 @@ class Mqtt:
self.server = mqttConfig.get("server", "localhost") self.server = mqttConfig.get("server", "localhost")
self.port = mqttConfig.get("port", 1883) self.port = mqttConfig.get("port", 1883)
self.prefix = mqttConfig.get("prefix", "home") self.prefix = mqttConfig.get("prefix", "home")
self.ca = mqttConfig.get("ca",None)
self.tlsvers = self._get_tls_version(
mqttConfig.get("tls_version","tlsv1.2")
)
self.json = mqttConfig.get("json", False) self.json = mqttConfig.get("json", False)
self._queue = Queue() self._queue = Queue()
self._threads = [] self._threads = []
@@ -52,8 +60,16 @@ class Mqtt:
self._client.username_pw_set(self.username, self.password) self._client.username_pw_set(self.username, self.password)
self._client.on_message = self._mqtt_process_message self._client.on_message = self._mqtt_process_message
self._client.on_connect = self._mqtt_on_connect self._client.on_connect = self._mqtt_on_connect
self._client.connect(self.server, self.port, 60) if (self.ca != None):
self._client.tls_set(
ca_certs=self.ca,
cert_reqs=ssl.CERT_REQUIRED,
tls_version=self.tlsvers
)
self._client.tls_insecure_set(False)
self._client.connect(self.server, self.port, 60)
# run message processing loop # run message processing loop
t1 = Thread(target=self._mqtt_loop) t1 = Thread(target=self._mqtt_loop)
t1.start() t1.start()
@@ -115,19 +131,22 @@ class Mqtt:
def _mqtt_process_message(self, client, userdata, msg): def _mqtt_process_message(self, client, userdata, msg):
_LOGGER.info("Processing message in " + str(msg.topic) + ": " + str(msg.payload) + ".") _LOGGER.info("Processing message in " + str(msg.topic) + ": " + str(msg.payload) + ".")
parts = msg.topic.split("/")
if len(parts) < 4: # need to strip prefix to make parts assignment reliable
parts = msg.topic.replace(self.prefix+"/","").split("/")
partlen = len(parts)
if len(parts) < 3:
# should we return an error message ? # should we return an error message ?
return return
model = parts[1] model = parts[0]
query_sid = parts[2] # sid or name part query_sid = parts[1] # sid or name part
param = parts[3] # param part param = parts[2] # param part
method = None method = None
if len(parts) > 4: if len(parts) > 3:
method = parts[4]
else:
method = parts[3] method = parts[3]
else:
method = parts[2]
name = "" # we will find it next name = "" # we will find it next
sid = query_sid sid = query_sid
@@ -144,6 +163,7 @@ class Mqtt:
sid = current_sid sid = current_sid
name = sidname name = sidname
isFound = True isFound = True
_LOGGER.debug("Found " + sid + " = " + name)
break break
else: else:
_LOGGER.debug(sidmodel + "-" + sidname + " is not " + model + "-" + query_sid + ".") _LOGGER.debug(sidmodel + "-" + sidname + " is not " + model + "-" + query_sid + ".")
@@ -202,3 +222,11 @@ class Mqtt:
bright = 255 bright = 255
value = int('%02x%02x%02x%02x' % (bright, r, g, b), 16) value = int('%02x%02x%02x%02x' % (bright, r, g, b), 16)
return value return value
def _get_tls_version(self,tlsString):
switcher = {
"tlsv1": ssl.PROTOCOL_TLSv1,
"tlsv1.1": ssl.PROTOCOL_TLSv1_1,
"tlsv1.2": ssl.PROTOCOL_TLSv1_2
}
return switcher.get(tlsString,ssl.PROTOCOL_TLSv1_2)