mirror of
https://github.com/g4klx/DMRGateway
synced 2025-12-24 07:15:38 +08:00
Add optional MQTT authentication.
This commit is contained in:
24
Conf.cpp
24
Conf.cpp
@@ -183,6 +183,9 @@ m_mqttAddress("127.0.0.1"),
|
|||||||
m_mqttPort(1883U),
|
m_mqttPort(1883U),
|
||||||
m_mqttKeepalive(60U),
|
m_mqttKeepalive(60U),
|
||||||
m_mqttName("dmr-gateway"),
|
m_mqttName("dmr-gateway"),
|
||||||
|
m_mqttAuthEnabled(false),
|
||||||
|
m_mqttUsername(),
|
||||||
|
m_mqttPassword(),
|
||||||
m_dynamicTGControlEnabled(false),
|
m_dynamicTGControlEnabled(false),
|
||||||
m_remoteCommandsEnabled(false)
|
m_remoteCommandsEnabled(false)
|
||||||
{
|
{
|
||||||
@@ -989,6 +992,12 @@ bool CConf::read()
|
|||||||
m_mqttKeepalive = (unsigned int)::atoi(value);
|
m_mqttKeepalive = (unsigned int)::atoi(value);
|
||||||
else if (::strcmp(key, "Name") == 0)
|
else if (::strcmp(key, "Name") == 0)
|
||||||
m_mqttName = value;
|
m_mqttName = value;
|
||||||
|
else if (::strcmp(key, "Auth") == 0)
|
||||||
|
m_mqttAuthEnabled = ::atoi(value) == 1;
|
||||||
|
else if (::strcmp(key, "Username") == 0)
|
||||||
|
m_mqttUsername = value;
|
||||||
|
else if (::strcmp(key, "Password") == 0)
|
||||||
|
m_mqttPassword = value;
|
||||||
} else if (section == SECTION::DYNAMIC_TG_CONTROL) {
|
} else if (section == SECTION::DYNAMIC_TG_CONTROL) {
|
||||||
if (::strcmp(key, "Enable") == 0)
|
if (::strcmp(key, "Enable") == 0)
|
||||||
m_dynamicTGControlEnabled = ::atoi(value) == 1;
|
m_dynamicTGControlEnabled = ::atoi(value) == 1;
|
||||||
@@ -1696,6 +1705,21 @@ std::string CConf::getMQTTName() const
|
|||||||
return m_mqttName;
|
return m_mqttName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CConf::getMQTTAuthEnabled() const
|
||||||
|
{
|
||||||
|
return m_mqttAuthEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CConf::getMQTTUsername() const
|
||||||
|
{
|
||||||
|
return m_mqttUsername;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CConf::getMQTTPassword() const
|
||||||
|
{
|
||||||
|
return m_mqttPassword;
|
||||||
|
}
|
||||||
|
|
||||||
bool CConf::getDynamicTGControlEnabled() const
|
bool CConf::getDynamicTGControlEnabled() const
|
||||||
{
|
{
|
||||||
return m_dynamicTGControlEnabled;
|
return m_dynamicTGControlEnabled;
|
||||||
|
|||||||
8
Conf.h
8
Conf.h
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2015,2016,2017,2019,2020,2023 by Jonathan Naylor G4KLX
|
* Copyright (C) 2015,2016,2017,2019,2020,2023,2025 by Jonathan Naylor G4KLX
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -238,6 +238,9 @@ public:
|
|||||||
unsigned short getMQTTPort() const;
|
unsigned short getMQTTPort() const;
|
||||||
unsigned int getMQTTKeepalive() const;
|
unsigned int getMQTTKeepalive() const;
|
||||||
std::string getMQTTName() const;
|
std::string getMQTTName() const;
|
||||||
|
bool getMQTTAuthEnabled() const;
|
||||||
|
std::string getMQTTUsername() const;
|
||||||
|
std::string getMQTTPassword() const;
|
||||||
|
|
||||||
// The Dynamic TG Control section
|
// The Dynamic TG Control section
|
||||||
bool getDynamicTGControlEnabled() const;
|
bool getDynamicTGControlEnabled() const;
|
||||||
@@ -395,6 +398,9 @@ private:
|
|||||||
unsigned short m_mqttPort;
|
unsigned short m_mqttPort;
|
||||||
unsigned int m_mqttKeepalive;
|
unsigned int m_mqttKeepalive;
|
||||||
std::string m_mqttName;
|
std::string m_mqttName;
|
||||||
|
bool m_mqttAuthEnabled;
|
||||||
|
std::string m_mqttUsername;
|
||||||
|
std::string m_mqttPassword;
|
||||||
|
|
||||||
bool m_dynamicTGControlEnabled;
|
bool m_dynamicTGControlEnabled;
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ static CDMRGateway* gateway = nullptr;
|
|||||||
const char* HEADER1 = "This software is for use on amateur radio networks only,";
|
const char* HEADER1 = "This software is for use on amateur radio networks only,";
|
||||||
const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
|
const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
|
||||||
const char* HEADER3 = "commercial networks is strictly prohibited.";
|
const char* HEADER3 = "commercial networks is strictly prohibited.";
|
||||||
const char* HEADER4 = "Copyright(C) 2017-2024 by Jonathan Naylor, G4KLX and others";
|
const char* HEADER4 = "Copyright(C) 2017-2025 by Jonathan Naylor, G4KLX and others";
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
@@ -373,7 +373,7 @@ int CDMRGateway::run()
|
|||||||
if (m_conf.getRemoteCommandsEnabled())
|
if (m_conf.getRemoteCommandsEnabled())
|
||||||
subscriptions.push_back(std::make_pair("command", CDMRGateway::onCommand));
|
subscriptions.push_back(std::make_pair("command", CDMRGateway::onCommand));
|
||||||
|
|
||||||
m_mqtt = new CMQTTConnection(m_conf.getMQTTAddress(), m_conf.getMQTTPort(), m_conf.getMQTTName(), subscriptions, m_conf.getMQTTKeepalive());
|
m_mqtt = new CMQTTConnection(m_conf.getMQTTAddress(), m_conf.getMQTTPort(), m_conf.getMQTTName(), m_conf.getMQTTAuthEnabled(), m_conf.getMQTTUsername(), m_conf.getMQTTPassword(), subscriptions, m_conf.getMQTTKeepalive());
|
||||||
ret = m_mqtt->open();
|
ret = m_mqtt->open();
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -150,6 +150,9 @@ Suffix=3
|
|||||||
Address=127.0.0.1
|
Address=127.0.0.1
|
||||||
Port=1883
|
Port=1883
|
||||||
Keepalive=60
|
Keepalive=60
|
||||||
|
Auth=0
|
||||||
|
Username=mmdvm
|
||||||
|
Password=mmdvm
|
||||||
Name=dmr-gateway
|
Name=dmr-gateway
|
||||||
|
|
||||||
[Dynamic TG Control]
|
[Dynamic TG Control]
|
||||||
|
|||||||
@@ -88,11 +88,13 @@
|
|||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;HAVE_LOG_H</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;HAVE_LOG_H</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>C:\Program Files\mosquitto\devel;C:\Program Files</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>ws2_32.lib;mosquitto.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>C:\Program Files\mosquitto\devel</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PreBuildEvent>
|
<PreBuildEvent>
|
||||||
<Command>prebuild.cmd</Command>
|
<Command>prebuild.cmd</Command>
|
||||||
@@ -105,11 +107,13 @@
|
|||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;HAVE_LOG_H</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;HAVE_LOG_H</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>C:\Program Files\mosquitto\devel;C:\Program Files</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>ws2_32.lib;mosquitto.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>C:\Program Files\mosquitto\devel</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PreBuildEvent>
|
<PreBuildEvent>
|
||||||
<Command>prebuild.cmd</Command>
|
<Command>prebuild.cmd</Command>
|
||||||
@@ -128,13 +132,15 @@
|
|||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;HAVE_LOG_H</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;HAVE_LOG_H</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>C:\Program Files\mosquitto\devel;C:\Program Files</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>ws2_32.lib;mosquitto.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>C:\Program Files\mosquitto\devel</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PreBuildEvent>
|
<PreBuildEvent>
|
||||||
<Command>prebuild.cmd</Command>
|
<Command>prebuild.cmd</Command>
|
||||||
@@ -149,13 +155,15 @@
|
|||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;HAVE_LOG_H</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;HAVE_LOG_H</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>C:\Program Files\mosquitto\devel;C:\Program Files</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>ws2_32.lib;mosquitto.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>C:\Program Files\mosquitto\devel</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
<PreBuildEvent>
|
<PreBuildEvent>
|
||||||
<Command>prebuild.cmd</Command>
|
<Command>prebuild.cmd</Command>
|
||||||
@@ -183,6 +191,7 @@
|
|||||||
<ClInclude Include="Hamming.h" />
|
<ClInclude Include="Hamming.h" />
|
||||||
<ClInclude Include="Log.h" />
|
<ClInclude Include="Log.h" />
|
||||||
<ClInclude Include="MMDVMNetwork.h" />
|
<ClInclude Include="MMDVMNetwork.h" />
|
||||||
|
<ClInclude Include="MQTTConnection.h" />
|
||||||
<ClInclude Include="PassAllPC.h" />
|
<ClInclude Include="PassAllPC.h" />
|
||||||
<ClInclude Include="PassAllTG.h" />
|
<ClInclude Include="PassAllTG.h" />
|
||||||
<ClInclude Include="QR1676.h" />
|
<ClInclude Include="QR1676.h" />
|
||||||
@@ -230,6 +239,7 @@
|
|||||||
<ClCompile Include="Hamming.cpp" />
|
<ClCompile Include="Hamming.cpp" />
|
||||||
<ClCompile Include="Log.cpp" />
|
<ClCompile Include="Log.cpp" />
|
||||||
<ClCompile Include="MMDVMNetwork.cpp" />
|
<ClCompile Include="MMDVMNetwork.cpp" />
|
||||||
|
<ClCompile Include="MQTTConnection.cpp" />
|
||||||
<ClCompile Include="PassAllPC.cpp" />
|
<ClCompile Include="PassAllPC.cpp" />
|
||||||
<ClCompile Include="PassAllTG.cpp" />
|
<ClCompile Include="PassAllTG.cpp" />
|
||||||
<ClCompile Include="QR1676.cpp" />
|
<ClCompile Include="QR1676.cpp" />
|
||||||
|
|||||||
@@ -149,6 +149,9 @@
|
|||||||
<ClInclude Include="RemoteControl.h">
|
<ClInclude Include="RemoteControl.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="MQTTConnection.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="Conf.cpp">
|
<ClCompile Include="Conf.cpp">
|
||||||
@@ -280,5 +283,8 @@
|
|||||||
<ClCompile Include="RemoteControl.cpp">
|
<ClCompile Include="RemoteControl.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="MQTTConnection.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -23,10 +23,13 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
CMQTTConnection::CMQTTConnection(const std::string& host, unsigned short port, const std::string& name, const std::vector<std::pair<std::string, void (*)(const unsigned char*, unsigned int)>>& subs, unsigned int keepalive, MQTT_QOS qos) :
|
CMQTTConnection::CMQTTConnection(const std::string& host, unsigned short port, const std::string& name, const bool authEnabled, const std::string& username, const std::string& password, const std::vector<std::pair<std::string, void (*)(const unsigned char*, unsigned int)>>& subs, unsigned int keepalive, MQTT_QOS qos) :
|
||||||
m_host(host),
|
m_host(host),
|
||||||
m_port(port),
|
m_port(port),
|
||||||
m_name(name),
|
m_name(name),
|
||||||
|
m_authEnabled(authEnabled),
|
||||||
|
m_username(username),
|
||||||
|
m_password(password),
|
||||||
m_subs(subs),
|
m_subs(subs),
|
||||||
m_keepalive(keepalive),
|
m_keepalive(keepalive),
|
||||||
m_qos(qos),
|
m_qos(qos),
|
||||||
@@ -59,6 +62,9 @@ bool CMQTTConnection::open()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_authEnabled)
|
||||||
|
::mosquitto_username_pw_set(m_mosq, m_username.c_str(), m_password.c_str());
|
||||||
|
|
||||||
::mosquitto_connect_callback_set(m_mosq, onConnect);
|
::mosquitto_connect_callback_set(m_mosq, onConnect);
|
||||||
::mosquitto_subscribe_callback_set(m_mosq, onSubscribe);
|
::mosquitto_subscribe_callback_set(m_mosq, onSubscribe);
|
||||||
::mosquitto_message_callback_set(m_mosq, onMessage);
|
::mosquitto_message_callback_set(m_mosq, onMessage);
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ enum class MQTT_QOS : int {
|
|||||||
|
|
||||||
class CMQTTConnection {
|
class CMQTTConnection {
|
||||||
public:
|
public:
|
||||||
CMQTTConnection(const std::string& host, unsigned short port, const std::string& name, const std::vector<std::pair<std::string, void (*)(const unsigned char*, unsigned int)>>& subs, unsigned int keepalive, MQTT_QOS qos = MQTT_QOS::EXACTLY_ONCE);
|
CMQTTConnection(const std::string& host, unsigned short port, const std::string& name, const bool authEnabled, const std::string& username, const std::string& password, const std::vector<std::pair<std::string, void (*)(const unsigned char*, unsigned int)>>& subs, unsigned int keepalive, MQTT_QOS qos = MQTT_QOS::EXACTLY_ONCE);
|
||||||
~CMQTTConnection();
|
~CMQTTConnection();
|
||||||
|
|
||||||
bool open();
|
bool open();
|
||||||
@@ -47,6 +47,9 @@ private:
|
|||||||
std::string m_host;
|
std::string m_host;
|
||||||
unsigned short m_port;
|
unsigned short m_port;
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
|
bool m_authEnabled;
|
||||||
|
std::string m_username;
|
||||||
|
std::string m_password;
|
||||||
std::vector<std::pair<std::string, void (*)(const unsigned char*, unsigned int)>> m_subs;
|
std::vector<std::pair<std::string, void (*)(const unsigned char*, unsigned int)>> m_subs;
|
||||||
unsigned int m_keepalive;
|
unsigned int m_keepalive;
|
||||||
MQTT_QOS m_qos;
|
MQTT_QOS m_qos;
|
||||||
|
|||||||
Reference in New Issue
Block a user