|
@@ -20,18 +20,22 @@
|
|
|
#define _CFG_KEY_NAME_TLS_CL_CRT_FILE "tlsClCrtFile"
|
|
|
#define _CFG_KEY_NAME_TLS_CL_KEY_FILE "tlsClKeyFile"
|
|
|
#define _CFG_KEY_NAME_TLS_PSK "tlsPsk"
|
|
|
-#define _CFG_KEY_NAME_LAST_WILL_MESSAGE "lastWillMessage"
|
|
|
+#define _CFG_KEY_NAME_LAST_WILL_MSG_STR "lastWillMsgStr"
|
|
|
+#define _CFG_KEY_NAME_LAST_WILL_MSG_INT "lastWillMsgInt"
|
|
|
#define _CFG_KEY_NAME_LAST_WILL_TOPIC "lastWillTopic"
|
|
|
#define _CFG_KEY_NAME_LAST_WILL_QOS "lastWillQos"
|
|
|
#define _CFG_KEY_NAME_LAST_WILL_RETAIN "lastWillRetain"
|
|
|
#define _CFG_KEY_NAME_LAST_WILL_ON_EXIT "lastWillOnExit"
|
|
|
-#define _CFG_KEY_NAME_LAST_WILL_ON_EXIT_MSG "lastWillOnExitMsg"
|
|
|
-#define _CFG_KEY_NAME_CONNECT_MESSAGE "connectMessage"
|
|
|
+#define _CFG_KEY_NAME_LAST_WILL_ON_EXIT_MSG_STR "lastWillOnExitMsgStr"
|
|
|
+#define _CFG_KEY_NAME_LAST_WILL_ON_EXIT_MSG_INT "lastWillOnExitMsgInt"
|
|
|
+#define _CFG_KEY_NAME_CONNECT_MSG_STR "connectMsgStr"
|
|
|
+#define _CFG_KEY_NAME_CONNECT_MSG_INT "connectMsgInt"
|
|
|
#define _CFG_KEY_NAME_CONNECT_TOPIC "connectTopic"
|
|
|
#define _CFG_KEY_NAME_CONNECT_QOS "connectQos"
|
|
|
#define _CFG_KEY_NAME_CONNECT_RETAIN "connectRetain"
|
|
|
#define _CFG_KEY_NAME_MAX_KEEP_ALIVE "maxKeepAlive"
|
|
|
-#define _CFG_KEY_NAME_PREFIX_STRING "topicPrefix"
|
|
|
+#define _CFG_KEY_NAME_TOPIC_PREFIX_STRING "topicPrefix"
|
|
|
+#define _CFG_KEY_NAME_DISABLE_TOPIC_PREFIX "disableTopicPrefix"
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
@@ -39,13 +43,17 @@ CMqttClConfig::CMqttClConfig(const char *pszShmUuid) : m_strShmID(formatString("
|
|
|
m_nBrokerPort(0),
|
|
|
m_nDefaultQOS(0),
|
|
|
m_bDefaultRetain(MQTTCL_DEFAULT_RETAIN),
|
|
|
+ m_nLastWillMessage(0),
|
|
|
m_nLastWillQos(m_nDefaultQOS),
|
|
|
m_bLastWillRetain(MQTTCL_DEFAULT_RETAIN),
|
|
|
m_bHasLastWill(false),
|
|
|
m_bLastWillOnExit(false),
|
|
|
+ m_nLastWillOnExitMsg(0),
|
|
|
+ m_nConnectMessage(0),
|
|
|
m_nConnectQos(m_nDefaultQOS),
|
|
|
m_bConnectRetain(MQTTCL_DEFAULT_RETAIN),
|
|
|
m_bHasConnect(false),
|
|
|
+ m_bDisableTopicPrefix(false),
|
|
|
m_bHasPrefix(false),
|
|
|
m_nTlsMode(0),
|
|
|
m_nMaxKeepAlive(MQTTCL_DEFAULT_MAX_KEEP_ALIVE_TIME)
|
|
@@ -77,7 +85,7 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
|
|
|
if(!(pjtCfg = ::json_load_file(pszCfgFilePath, JSON_REJECT_DUPLICATES, &err)))
|
|
|
{
|
|
|
- rlf.Error("CMqttClConfig::LoadCfg: %s!\n", err.text);
|
|
|
+ rlf.Error("LoadCfg: Error loading file %s: %s!\n", pszCfgFilePath, err.text);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -89,17 +97,12 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
if(!GetIntValue(jtCfg, _CFG_KEY_NAME_TLS_MODE, m_nTlsMode, strErr))
|
|
|
{
|
|
|
m_nTlsMode = MQTTCL_TLS_MODE_OFF;
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: %s! TLS will not be used!\n", strErr.c_str());
|
|
|
+ rlf.Warning("LoadCfg: TLS will not be used!\n");
|
|
|
}
|
|
|
- else if(m_nTlsMode < MQTTCL_TLS_MODE_OFF)
|
|
|
+ else if((m_nTlsMode < MQTTCL_TLS_MODE_OFF) || (m_nTlsMode > MQTTCL_TLS_MODE_PSK))
|
|
|
{
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: Invalid TLS mode: %d! TLS will be disabled!\n", m_nTlsMode);
|
|
|
- m_nTlsMode = MQTTCL_TLS_MODE_OFF;
|
|
|
- }
|
|
|
- else if(m_nTlsMode > MQTTCL_TLS_MODE_PSK)
|
|
|
- {
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: Invalid TLS mode: %d! TLS mode will be set to PSK!\n", m_nTlsMode);
|
|
|
- m_nTlsMode = MQTTCL_TLS_MODE_PSK;
|
|
|
+ rlf.Error("LoadCfg: Invalid TLS mode: %d! No way to continue!\n", m_nTlsMode);
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
@@ -107,7 +110,7 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
|
|
|
if(!GetStringValue(jtCfg, _CFG_KEY_NAME_BROKER_ADDR, m_strBrokerAddr, strErr))
|
|
|
{
|
|
|
- rlf.Error("CMqttClConfig::LoadCfg: %s!\n", strErr.c_str());
|
|
|
+ rlf.Error("LoadCfg: %s!\n", strErr.c_str());
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -117,11 +120,11 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
if(!GetIntValue(jtCfg, _CFG_KEY_NAME_BROKER_PORT, m_nBrokerPort, strErr))
|
|
|
{
|
|
|
m_nBrokerPort = (m_nTlsMode > MQTTCL_TLS_MODE_OFF) ? 8883 : 1883;
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: %s! Using default broker port %d!\n", strErr.c_str(), m_nBrokerPort);
|
|
|
+ rlf.Info("LoadCfg: Using default broker port %d!\n", m_nBrokerPort);
|
|
|
}
|
|
|
else if(m_nBrokerPort < 0 || m_nBrokerPort > 0xffff)
|
|
|
{
|
|
|
- rlf.Error("CMqttClConfig::LoadCfg: Invalid broker port number: %d!\n", m_nBrokerPort);
|
|
|
+ rlf.Error("LoadCfg: Invalid broker port number: %d! No way to continue!\n", m_nBrokerPort);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -131,18 +134,22 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
if(!GetIntValue(jtCfg, _CFG_KEY_NAME_DEFAULT_QOS, m_nDefaultQOS, strErr))
|
|
|
{
|
|
|
m_nDefaultQOS = MQTTCL_DEFAULT_QOS;
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: %s! Using default QOS: %d!\n", strErr.c_str(), m_nDefaultQOS);
|
|
|
+ rlf.Info("LoadCfg: Using default QOS: %d!\n", m_nDefaultQOS);
|
|
|
}
|
|
|
else if(m_nDefaultQOS < MQTTCL_MIN_QOS)
|
|
|
{
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: Invalid QOS: %d - using %d!\n", m_nDefaultQOS, MQTTCL_MIN_QOS);
|
|
|
+ rlf.Warning("LoadCfg: Invalid QOS: %d - adjusted to %d!\n", m_nDefaultQOS, MQTTCL_MIN_QOS);
|
|
|
m_nDefaultQOS = MQTTCL_MIN_QOS;
|
|
|
}
|
|
|
else if(m_nDefaultQOS > MQTTCL_MAX_QOS)
|
|
|
{
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: Invalid QOS: %d - using %d!\n", m_nDefaultQOS, MQTTCL_MAX_QOS);
|
|
|
+ rlf.Warning("LoadCfg: Invalid QOS: %d - adjusted to %d!\n", m_nDefaultQOS, MQTTCL_MAX_QOS);
|
|
|
m_nDefaultQOS = MQTTCL_MAX_QOS;
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ rlf.Info("LoadCfg: Default QOS: %d!\n", m_nDefaultQOS);
|
|
|
+ }
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
// defaultRetain
|
|
@@ -150,18 +157,35 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
if(!GetBoolValue(jtCfg, _CFG_KEY_NAME_DEFAULT_RETAIN, m_bDefaultRetain, strErr))
|
|
|
{
|
|
|
m_bDefaultRetain = MQTTCL_DEFAULT_RETAIN;
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: %s! Using default retain \"%s\"!\n", strErr.c_str(), m_bDefaultRetain ? "true" : "false");
|
|
|
+ rlf.Info("LoadCfg: Using default retain \"%s\"!\n", m_bDefaultRetain ? "true" : "false");
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
- // lastWillMessage
|
|
|
+ // lastWillMsgStr
|
|
|
|
|
|
- if(!GetStringValue(jtCfg, _CFG_KEY_NAME_LAST_WILL_MESSAGE, m_strLastWillMessage, strErr))
|
|
|
+ if(GetStringValue(jtCfg, _CFG_KEY_NAME_LAST_WILL_MSG_STR, m_strLastWillMessage, strErr))
|
|
|
{
|
|
|
- rlf.Info("CMqttClConfig::LoadCfg: %s! No Last Will Message provided.\n", strErr.c_str());
|
|
|
+ m_bHasLastWill = true;
|
|
|
+ rlf.Info("LoadCfg: Last Will - String message: \"%s\".\n", m_strLastWillMessage.c_str());
|
|
|
}
|
|
|
|
|
|
- if((m_bHasLastWill = !m_strLastWillMessage.empty()))
|
|
|
+ /////////////////////////////////////////////////////////////////////////
|
|
|
+ // lastWillMsgInt
|
|
|
+
|
|
|
+ if(!m_bHasLastWill)
|
|
|
+ {
|
|
|
+ if(GetInt64Value(jtCfg, _CFG_KEY_NAME_LAST_WILL_MSG_INT, m_nLastWillMessage, strErr))
|
|
|
+ {
|
|
|
+ m_bHasLastWill = true;
|
|
|
+ rlf.Info("LoadCfg: Last Will - Numeric message: %lld.\n", m_nLastWillMessage);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ rlf.Warning("LoadCfg: %s! No Last Will Message provided.\n", strErr.c_str());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(m_bHasLastWill)
|
|
|
{
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
// lastWillTopic
|
|
@@ -169,7 +193,7 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
if(!GetStringValue(jtCfg, _CFG_KEY_NAME_LAST_WILL_TOPIC, m_strLastWillTopic, strErr))
|
|
|
{
|
|
|
m_strLastWillTopic = MQTTCL_DEFAULT_LAST_WILL_CONNECT_TOPIC;
|
|
|
- rlf.Info("CMqttClConfig::LoadCfg: %s! Setting Last Will Topic to default: \"%s\".\n", strErr.c_str()), m_strLastWillTopic.c_str();
|
|
|
+ rlf.Info("LoadCfg: %s! Setting Last Will Topic to default: \"%s\".\n", strErr.c_str(), m_strLastWillTopic.c_str());
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
@@ -178,7 +202,7 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
if(!GetIntValue(jtCfg, _CFG_KEY_NAME_LAST_WILL_QOS, m_nLastWillQos, strErr))
|
|
|
{
|
|
|
m_nLastWillQos = m_nDefaultQOS;
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: %s! Using default Last Will Qos: %d!\n", strErr.c_str(), m_nLastWillQos);
|
|
|
+ rlf.Info("LoadCfg: %s! Using default Last Will QOS: %d!\n", strErr.c_str(), m_nLastWillQos);
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
@@ -186,8 +210,8 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
|
|
|
if(!GetBoolValue(jtCfg, _CFG_KEY_NAME_LAST_WILL_RETAIN, m_bLastWillRetain, strErr))
|
|
|
{
|
|
|
- m_bLastWillRetain = MQTTCL_DEFAULT_RETAIN;
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: %s! Using default Last Will retain: %s!\n", strErr.c_str(), m_bLastWillRetain ? "true" : "false");
|
|
|
+ m_bLastWillRetain = m_bDefaultRetain;
|
|
|
+ rlf.Info("LoadCfg: %s! Using default Last Will retain: \"%s\"!\n", strErr.c_str(), m_bLastWillRetain ? "true" : "false");
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
@@ -196,39 +220,83 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
if(!GetBoolValue(jtCfg, _CFG_KEY_NAME_LAST_WILL_ON_EXIT, m_bLastWillOnExit, strErr))
|
|
|
{
|
|
|
m_bLastWillOnExit = false;
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: %s! No Last Will on Exit.\n", strErr.c_str());
|
|
|
+ rlf.Warning("LoadCfg: %s! No Last Will on Exit.\n", strErr.c_str());
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if(m_bLastWillOnExit)
|
|
|
{
|
|
|
/////////////////////////////////////////////////////////////////
|
|
|
- // lastWillOnExitMsg
|
|
|
+ // lastWillOnExitMsgStr, lastWillOnExitMsgInt
|
|
|
|
|
|
- if(!GetStringValue(jtCfg, _CFG_KEY_NAME_LAST_WILL_ON_EXIT_MSG, m_strLastWillOnExitMsg, strErr))
|
|
|
+ if(GetStringValue(jtCfg, _CFG_KEY_NAME_LAST_WILL_ON_EXIT_MSG_STR, m_strLastWillOnExitMsg, strErr))
|
|
|
{
|
|
|
- m_strLastWillOnExitMsg = m_strLastWillMessage;
|
|
|
- rlf.Info("CMqttClConfig::LoadCfg: %s! Setting Last Will Exit Message to default: \"%s\".\n", strErr.c_str()), m_strLastWillOnExitMsg.c_str();
|
|
|
+ rlf.Info("LoadCfg: Last Will on Exit - String message: \"%s\".\n", m_strLastWillOnExitMsg.c_str());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(GetInt64Value(jtCfg, _CFG_KEY_NAME_LAST_WILL_ON_EXIT_MSG_INT, m_nLastWillOnExitMsg, strErr))
|
|
|
+ {
|
|
|
+ rlf.Info("LoadCfg: Last Will on Exit - Numeric message: %lld.\n", m_nLastWillOnExitMsg);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(!m_strLastWillMessage.empty())
|
|
|
+ {
|
|
|
+ m_strLastWillOnExitMsg = m_strLastWillMessage;
|
|
|
+ rlf.Info("LoadCfg: Setting Last Will Exit Message to Last Will string: \"%s\".\n", m_strLastWillOnExitMsg.c_str());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ m_nLastWillOnExitMsg = m_nLastWillMessage;
|
|
|
+ rlf.Info("LoadCfg: Setting Last Will Exit Message to Last Will numeric: %lld.\n", m_nLastWillOnExitMsg);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
- // connectMessage
|
|
|
+ // connectMsgStr
|
|
|
|
|
|
- if(!GetStringValue(jtCfg, _CFG_KEY_NAME_CONNECT_MESSAGE, m_strConnectMessage, strErr))
|
|
|
+ if(GetStringValue(jtCfg, _CFG_KEY_NAME_CONNECT_MSG_STR, m_strConnectMessage, strErr))
|
|
|
{
|
|
|
- rlf.Info("CMqttClConfig::LoadCfg: %s! No Connect Message provided.\n", strErr.c_str());
|
|
|
+ m_bHasConnect = true;
|
|
|
+ rlf.Info("LoadCfg: Connect - String message: \"%s\".\n", m_strConnectMessage.c_str());
|
|
|
}
|
|
|
|
|
|
- if((m_bHasConnect = !m_strConnectMessage.empty()))
|
|
|
+ /////////////////////////////////////////////////////////////////////////
|
|
|
+ // connectMsgInt
|
|
|
+
|
|
|
+ if(!m_bHasConnect)
|
|
|
+ {
|
|
|
+ if(GetInt64Value(jtCfg, _CFG_KEY_NAME_CONNECT_MSG_INT, m_nConnectMessage, strErr))
|
|
|
+ {
|
|
|
+ m_bHasConnect = true;
|
|
|
+ rlf.Info("LoadCfg: Connect - Numeric message: %lld.\n", m_nConnectMessage);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ rlf.Warning("LoadCfg: %s! No Connect message provided.\n", strErr.c_str());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(m_bHasConnect)
|
|
|
{
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
// connectTopic
|
|
|
|
|
|
if(!GetStringValue(jtCfg, _CFG_KEY_NAME_CONNECT_TOPIC, m_strConnectTopic, strErr))
|
|
|
{
|
|
|
- m_strConnectTopic = m_strLastWillTopic;
|
|
|
- rlf.Info("CMqttClConfig::LoadCfg: %s! Setting Connect Topic to default: \"%s\".\n", strErr.c_str()), m_strLastWillTopic.c_str();
|
|
|
+ if(m_bHasLastWill)
|
|
|
+ {
|
|
|
+ m_strConnectTopic = m_strLastWillTopic;
|
|
|
+ rlf.Info("LoadCfg: %s! Setting Connect Topic to Last Will Topic: \"%s\".\n", strErr.c_str(), m_strConnectTopic.c_str());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ m_strConnectTopic = MQTTCL_DEFAULT_LAST_WILL_CONNECT_TOPIC;
|
|
|
+ rlf.Info("LoadCfg: %s! Setting Connect Topic to default: \"%s\".\n", strErr.c_str(), m_strConnectTopic.c_str());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
@@ -236,8 +304,8 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
|
|
|
if(!GetIntValue(jtCfg, _CFG_KEY_NAME_CONNECT_QOS, m_nConnectQos, strErr))
|
|
|
{
|
|
|
- m_nConnectQos = m_nLastWillQos;
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: %s! Using default Connect Qos: %d!\n", strErr.c_str(), m_nConnectQos);
|
|
|
+ m_nConnectQos = m_nDefaultQOS;
|
|
|
+ rlf.Info("LoadCfg: %s! Using default Connect Qos: %d!\n", strErr.c_str(), m_nConnectQos);
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
@@ -245,8 +313,8 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
|
|
|
if(!GetBoolValue(jtCfg, _CFG_KEY_NAME_CONNECT_RETAIN, m_bConnectRetain, strErr))
|
|
|
{
|
|
|
- m_bConnectRetain = m_bLastWillRetain;
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: %s! Using default Last Will retain: %s!\n", strErr.c_str(), m_bConnectRetain ? "true" : "false");
|
|
|
+ m_bConnectRetain = m_bDefaultRetain;
|
|
|
+ rlf.Info("LoadCfg: %s! Using default Last Will retain: %s!\n", strErr.c_str(), m_bConnectRetain ? "true" : "false");
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -256,7 +324,12 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
if(!GetIntValue(jtCfg, _CFG_KEY_NAME_MAX_KEEP_ALIVE, m_nMaxKeepAlive, strErr))
|
|
|
{
|
|
|
m_nMaxKeepAlive = MQTTCL_DEFAULT_MAX_KEEP_ALIVE_TIME;
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: %s! Using default Keep-alive time: %d!\n", strErr.c_str(), m_nMaxKeepAlive);
|
|
|
+ rlf.Info("LoadCfg: %s! Using default Keep-alive time: %d!\n", strErr.c_str(), m_nMaxKeepAlive);
|
|
|
+ }
|
|
|
+ else if(m_nMaxKeepAlive < MQTTCL_MIN_MAX_KEEP_ALIVE_TIME)
|
|
|
+ {
|
|
|
+ rlf.Warning("LoadCfg: Adjusting max keep-alive time from %d to %d!\n", m_nMaxKeepAlive, MQTTCL_MIN_MAX_KEEP_ALIVE_TIME);
|
|
|
+ m_nMaxKeepAlive = MQTTCL_MIN_MAX_KEEP_ALIVE_TIME;
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
@@ -264,8 +337,7 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
|
|
|
if(!GetStringValue(jtCfg, _CFG_KEY_NAME_DEVICE_PREFIX, m_strDevicePrefix, strErr))
|
|
|
{
|
|
|
- m_strDevicePrefix = MQTTCL_DEVICE_PREFIX;
|
|
|
- rlf.Warning("CMqttClConfig::LoadCfg: %s! Using default device prefix \"%s\"!\n", strErr.c_str(), m_strDevicePrefix.c_str());
|
|
|
+ rlf.Warning("LoadCfg: %s! Using empty device prefix!\n", strErr.c_str());
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
@@ -273,23 +345,45 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
|
|
|
if(GetStringValue(jtCfg, _CFG_KEY_NAME_DEVICE_ID, m_strDeviceID, strErr))
|
|
|
{
|
|
|
- rlf.Info("CMqttClConfig::LoadCfg: Using configured device ID: \"%s\"!\n", m_strDeviceID.c_str());
|
|
|
+ rlf.Info("LoadCfg: Using configured device ID: \"%s\"!\n", m_strDeviceID.c_str());
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_strDeviceID = CreateDeviceID(m_strDevicePrefix.c_str());
|
|
|
+ rlf.Info("LoadCfg: Using automatic device ID: \"%s\"!\n", m_strDeviceID.c_str());
|
|
|
+ }
|
|
|
+
|
|
|
+ /////////////////////////////////////////////////////////////////////
|
|
|
+ // disableTopicPrefix
|
|
|
+
|
|
|
+ if(!GetBoolValue(jtCfg, _CFG_KEY_NAME_DISABLE_TOPIC_PREFIX, m_bDisableTopicPrefix, strErr))
|
|
|
+ {
|
|
|
+ m_bDisableTopicPrefix = false;
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
- // topicPrefix string
|
|
|
+ // topicPrefix
|
|
|
|
|
|
- if(!GetStringValue(jtCfg, _CFG_KEY_NAME_PREFIX_STRING, m_strPrefix, strErr))
|
|
|
+ if(!m_bDisableTopicPrefix)
|
|
|
{
|
|
|
- m_strPrefix = formatString("%s/%s", GetDeviceID(), GetShmID());
|
|
|
+ if(GetStringValue(jtCfg, _CFG_KEY_NAME_TOPIC_PREFIX_STRING, m_strTopicPrefix, strErr))
|
|
|
+ {
|
|
|
+ rlf.Info("LoadCfg: Using configured topic prefix: \"%s\"!\n", m_strTopicPrefix.c_str());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ m_strTopicPrefix = formatString("%s/%s", GetDeviceID(), GetShmID());
|
|
|
+ rlf.Info("LoadCfg: Using automatic topic prefix: \"%s\"!\n", m_strTopicPrefix.c_str());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ m_strTopicPrefix.clear();
|
|
|
+ rlf.Warning("LoadCfg: Topic prefix disabled!\n");
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
- // m_nTlsMode == (MQTTCL_TLS_MODE_CRT || MQTTCL_TLS_MODE_PSK)
|
|
|
+ // if m_nTlsMode != MQTTCL_TLS_MODE_OFF
|
|
|
|
|
|
if(m_nTlsMode == MQTTCL_TLS_MODE_CRT)
|
|
|
{
|
|
@@ -298,7 +392,7 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
|
|
|
if(!GetStringValue(jtCfg, _CFG_KEY_NAME_TLS_CA_CRT_FILE, m_strTlsCaCrtFile, strErr))
|
|
|
{
|
|
|
- rlf.Error("CMqttClConfig::LoadCfg: %s!\n", strErr.c_str());
|
|
|
+ rlf.Error("LoadCfg: %s! TLS-Mode = %d and no Certificate Authority file provided! No way to continue!\n", strErr.c_str(), m_nTlsMode);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -307,7 +401,7 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
|
|
|
if(!GetStringValue(jtCfg, _CFG_KEY_NAME_TLS_CL_CRT_FILE, m_strTlsClCrtFile, strErr))
|
|
|
{
|
|
|
- rlf.Error("CMqttClConfig::LoadCfg: %s!\n", strErr.c_str());
|
|
|
+ rlf.Error("LoadCfg: %s! TLS-Mode = %d and no public Key Certificate file provided! No way to continue!\n", strErr.c_str(), m_nTlsMode);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -316,7 +410,7 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
|
|
|
if(!GetStringValue(jtCfg, _CFG_KEY_NAME_TLS_CL_KEY_FILE, m_strTlsClKeyFile, strErr))
|
|
|
{
|
|
|
- rlf.Error("CMqttClConfig::LoadCfg: %s!\n", strErr.c_str());
|
|
|
+ rlf.Error("LoadCfg: %s! TLS-Mode = %d and no private Key file provided! No way to continue!\n", strErr.c_str(), m_nTlsMode);
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
@@ -327,7 +421,7 @@ bool CMqttClConfig::LoadCfg(const char *pszCfgFilePath, CLogfile &rlf)
|
|
|
|
|
|
if(!GetStringValue(jtCfg, _CFG_KEY_NAME_TLS_PSK, m_strTlsPSK, strErr))
|
|
|
{
|
|
|
- rlf.Error("CMqttClConfig::LoadCfg: %s!\n", strErr.c_str());
|
|
|
+ rlf.Error("LoadCfg: %s! TLS-Mode = %d and no Preshared Key provided! No way to continue!\n", strErr.c_str(), m_nTlsMode);
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
@@ -394,6 +488,26 @@ bool CMqttClConfig::GetIntValue(CJson_t &rjtParent, const char *pszKey, int &rnV
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
+bool CMqttClConfig::GetInt64Value(CJson_t &rjtParent, const char *pszKey, long long &rnVal, std::string &strErr)
|
|
|
+{
|
|
|
+ CJson_t jtVal;
|
|
|
+
|
|
|
+ if(GetValue(rjtParent, pszKey, jtVal, strErr))
|
|
|
+ {
|
|
|
+ if(json_is_integer(jtVal.operator const json_t*()))
|
|
|
+ {
|
|
|
+ rnVal = (long long)::json_integer_value(jtVal);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ strErr = formatString("\"%s\" (type=%d) is not an integer value", pszKey, jtVal.Type());
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
bool CMqttClConfig::GetStringValue(CJson_t &rjtParent, const char *pszKey, std::string &rstrVal, std::string &strErr)
|
|
|
{
|
|
|
CJson_t jtVal;
|
|
@@ -477,6 +591,9 @@ const char* CMqttClConfig::GetMacAddress(std::string &s)
|
|
|
std::string CMqttClConfig::CreateDeviceID(const char *pszDevicePrefix)
|
|
|
{
|
|
|
std::string m, s;
|
|
|
- s = formatString("%s-%s", pszDevicePrefix, CMqttClConfig::GetMacAddress(m));
|
|
|
+ if(pszDevicePrefix && *pszDevicePrefix)
|
|
|
+ s = formatString("%s-%s", pszDevicePrefix, CMqttClConfig::GetMacAddress(m));
|
|
|
+ else
|
|
|
+ CMqttClConfig::GetMacAddress(s);
|
|
|
return s;
|
|
|
}
|