Múltiplas configurações baseadas no cliente QTmqtt
Projetos recentes para usar mqtt, é claro, agora mqtt já são componentes padrão da era das coisas, e antes que o uso da biblioteca mosquitto de interface baseada em terminal C não seja feito, agora com base na
qmqtt开源库14.2
interface escrita de ui, é claro, o futuro pode freqüentemente chamam, Foi encapsulado na forma de uma biblioteca.
Imagem de efeito
A função principal
Função de configuração
Quando o software é iniciado, ele primeiro encontra o arquivo de configuração e MQTT_CONFIG.json
gera uma nova configuração padrão.
O lado do Windows procura a inicialização do programa por padrão, o
lado do Linux procura por ele no diretório / etc
O formato do conteúdo é o seguinte:
- Por que existem quatro configurações, porque foi originalmente previsto para começar com várias configurações ou se conectar a várias plataformas
- No momento, a função de multi-configuração está disponível, mas não há lugar para a interface da interface, portanto, não há interface para alternar a configuração na interface do usuário
{
"MQTT_CONFIG": [
{
"MqttConfigNum": "Client_0",
"MqttKeepAlive": 300,
"MqttServerAddr": "broker.hivemq.com",
"MqttServerIp": "192.168.50.128",
"MqttServerPort": 1883,
"MqttUserKey": "123456",
"MqttUserName": "admin",
"PublishTopic": [
{
"MqttPUBQos": 0,
"MqttPublishTopic": ""
}
],
"SubscribeTopic": [
{
"MqttSUBQos": 0,
"MqttSubscribeTopic": ""
}
]
},
{
"MqttConfigNum": "Client_1",
"MqttKeepAlive": 300,
"MqttServerAddr": "broker.hivemq.com",
"MqttServerIp": "192.168.50.128",
"MqttServerPort": 1883,
"MqttUserKey": "123456",
"MqttUserName": "admin",
"PublishTopic": [
{
"MqttPUBQos": 0,
"MqttPublishTopic": ""
}
],
"SubscribeTopic": [
{
"MqttSUBQos": 0,
"MqttSubscribeTopic": ""
}
]
},
{
"MqttConfigNum": "Client_2",
"MqttKeepAlive": 300,
"MqttServerAddr": "broker.hivemq.com",
"MqttServerIp": "192.168.50.128",
"MqttServerPort": 1883,
"MqttUserKey": "123456",
"MqttUserName": "admin",
"PublishTopic": [
{
"MqttPUBQos": 0,
"MqttPublishTopic": ""
}
],
"SubscribeTopic": [
{
"MqttSUBQos": 0,
"MqttSubscribeTopic": ""
}
]
},
{
"MqttConfigNum": "Client_3",
"MqttKeepAlive": 300,
"MqttServerAddr": "broker.hivemq.com",
"MqttServerIp": "192.168.50.128",
"MqttServerPort": 1883,
"MqttUserKey": "123456",
"MqttUserName": "admin",
"PublishTopic": [
{
"MqttPUBQos": 0,
"MqttPublishTopic": ""
}
],
"SubscribeTopic": [
{
"MqttSUBQos": 0,
"MqttSubscribeTopic": ""
}
]
}
]
}
Detecção de rede
Não há nada a dizer sobre isso. A maioria das detecções na Internet são de que o bloqueio não é adequado para operações de interface. Aqui, fui alterado para não-bloqueio assíncrono, que é uma função otimizada.
- Quando a rede está anormal, um sinal anormal será enviado para notificação assíncrona.
Função de depuração
- Após a função de depuração ser ativada, uma pequena caixa de entrada aparecerá na parte inferior da área da mensagem para editar o conteúdo a ser enviado. Neste momento, preencha o tópico a ser enviado no tópico da área de publicação, qos é 0 e clique em Enviar.
- Se você se inscreveu no mesmo tópico do tópico de envio, poderá receber a mensagem enviada e exibi-la na área de mensagens.
Publicar tópico
Atualmente, as mensagens de publicação são restritas (consistentes com a lógica de operação de assinatura), ou seja, somente quando o tópico na coluna publicar chamar a interface de envio, ele poderá ser enviado.
Transferir este cliente
Condição prévia
Baixe o
endereço de download do código fonte deste cliente O ponto está definido para 3, não é meu pote que está alto.
Confirmação de modificação antes da compilação
- O Windows compila o código-fonte, o compilador o usa por padrão
mingw64
- Função de criptografia SSL , a função de criptografia SSL não está habilitada no Linux por padrão no código-fonte. Como a maior parte do desenvolvimento do lado linux é embutido, a maior parte da compilação do código-fonte qt e itens de recorte cancelam o link de junção openssl, se necessário para habilitá-lo, modifique o código-fonte você mesmo e cancele o julgamento da Macro.
Compilar
Aqui, pegue o lado da janela como exemplo
1. UseqtcreatorAbra o libmqttclient.pro
arquivo do projeto de origem , configure o compilador para mingw64 e selecione a versão de lançamento para compilar.
Os resultados da compilação são os seguintes:
Compilar e gerar dois arquivos de biblioteca: 1. Arquivos de biblioteca de clientemqttclient 2. O arquivo de biblioteca qmqtt14.2 do qual o cliente dependeQt5Mqtt
- Qual
lib
pasta contém o arquivo de biblioteca qmqtt14.2 src/mqttclient/release
Existem arquivos de biblioteca do cliente de interface da IU no diretórioinclude
Existem arquivos de cabeçalho qmqtt14.2
Portando o cliente mqtt para seu projeto
Método de origem
1, com base no diretório raiz do diretório de origem do projeto mqtt
, crie o próximo diretório mqtt lib
, QtMqtt
dois diretórios.
2, os arquivos de biblioteca qmqtt gerados pelo compilador (fonte lib código compilador-gerado): Qt5Mqtt.dll
, Qt5Mqtt.a
copiados para o seu projeto mqtt/lib
diretório
3, cópia (sob o diretório incluem (fonte compilador-gerado)) qmqtt todos os arquivos de cabeçalho, para o seu 4. No mqtt/QtMqtt
diretório
do projeto , adicione o seguinte ao arquivo .pro do projeto:
# qmqtt windows
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/mqtt/lib/ -lQt5Mqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/mqtt/lib/ -lQt5Mqttd
INCLUDEPATH += $$PWD/mqtt/QtMqtt/ $$PWD/mqtt/
DEPENDPATH += $$PWD/mqtt/QtMqtt/
win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/libQt5Mqtt.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/libQt5Mqttd.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/Qt5Mqtt.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/Qt5Mqttd.lib
# qmqtt linux
unix:!macx: LIBS += -L$$PWD/mqtt/lib/
unix:!macx: LIBS += -lQt5Mqtt
5. mqtt
Crie um mqttclient.pri
arquivo no diretório do seu projeto e
preencha o seguinte:
SOURCES += \
customerwidgetitem.cpp \
libmqttclient.cpp
HEADERS += \
customerwidgetitem.h \
libmqttclient_global.h \
libmqttclient.h \
ui_libmqttclient.h
6. Copie os arquivos envolvidos no diretório do código-fonte ( libmqttclient\src\mqttclient
) mqttclient.pri
para o diretório criado no diretório-raiz do código-fonte do seu projeto mqtt
.
7. .pro
Adicione o seguinte em seu arquivo de projeto
# mqttclient
include(mqtt/mqttclient.pri)
Depois que as etapas acima forem concluídas, a interface fornecida por mqttClient pode ser chamada.
Por exemplo:
1. O arquivo de cabeçalho contendo o cliente
#include <mqtt/libmqttclient.h> /**< mqttclient*/
2. Instanciação
Libmqttclient *MqttWindow;
/*mqttclient设置窗口显示*/
MqttWindow = new Libmqttclient(800 ,600 ,QString("192.168.50.128"));
/*连接mqttclient窗口关闭信号*/
connect(MqttWindow ,&Libmqttclient::MqttwindowIsClose ,this ,&MainWindow::slotShowMainWindow);
/*连接mqttclient自启动连接服务器异常信号*/
connect(MqttWindow ,&Libmqttclient::NetworkPingError ,this ,&MainWindow::slotShowNetErrDialog);
/*连接mqttclient窗口要求显示键盘的信号*/
connect(MqttWindow ,&Libmqttclient::show_keyboard ,this ,&MainWindow::slotprocessedit);
3. Chamar display
MqttWindow->show();
Maneira de biblioteca
1. Confirme se a compilação do código-fonte foi concluída com êxito (os arquivos de biblioteca relevantes são gerados conforme o esperado).
2, construído no diretório raiz do diretório de origem do projeto mqtt
, crie o próximo diretório mqtt lib
, QtMqtt
dois diretórios.
3, irá compilar os arquivos de biblioteca qmqtt gerados (fonte lib código compilador-gerado): Qt5Mqtt.dll
, Qt5Mqtt.a
copiados para o seu projeto mqtt/lib
diretório
4, copie qmqtt todos os arquivos de cabeçalho (sob (compilador fonte gerado incluem diretório)), para o seu mqtt/QtMqtt
Sob o projeto diretório
5 . Copie o arquivo de biblioteca mqttclient compilado (no diretório src / mqttclient / release gerado pela compilação do código-fonte): mqttclient.dll
copie-o para o mqtt/lib
diretório do projeto .
6. Adicione o seguinte ao arquivo .pro do projeto:
# qmqtt windows
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/mqtt/lib/ -lQt5Mqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/mqtt/lib/ -lQt5Mqttd
INCLUDEPATH += $$PWD/mqtt/QtMqtt/ $$PWD/mqtt/
DEPENDPATH += $$PWD/mqtt/QtMqtt/
win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/libQt5Mqtt.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/libQt5Mqttd.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/Qt5Mqtt.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/Qt5Mqttd.lib
# qmqtt linux
unix:!macx: LIBS += -L$$PWD/mqtt/lib/
unix:!macx: LIBS += -lQt5Mqtt
#mqttclient
LIBS += -L$$PWD/mqtt/lib/
LIBS += -lmqttclient
7. mqtt
Crie um mqttclient.pri
arquivo no diretório do seu projeto (Não pode fazer)
Preencha o seguinte conteúdo: (Não pode fazer)
HEADERS += \
$$PWD/customerwidgetitem.h \
$$PWD/libmqttclient.h \
$$PWD/libmqttclient_global.h \
$$PWD/ui_libmqttclient.h
.pro
Adicione o seguinte em seu arquivo de projeto :(Não pode fazer)
# mqttclient
include(mqtt/mqttclient.pri)
8. Copie libmqttclient\src\mqttclient
todos os arquivos com o sufixo .h no diretório do código-fonte ( ) para o diretório criado no diretório-raiz do código-fonte do seu projeto mqtt
.
Depois de concluir as etapas acima, você pode chamar a interface.
Descrição da Interface
Veja o libmqttclient.h
arquivo para detalhes da interface
static bool NetworkConnectCheck(QString netaddr); /**< 检测与指定外网的连接*/
void SetReconnectInterval(qint32 msec); /**< 设置重连检测周期*/
void NetworkPingCheck(QString netaddr); /**< 检测指定ip是否能够ping通*/
void SwitchClientConfig(quint8 clientNum = 0); /**< 切换客户端配置*/
void setUsername(QString &user ,QString &Key ,bool Writeflash = false ,quint8 configindex = 0); /**< 设置用户名和密码*/
void setHostIPAddr(QString &addr ,bool Writeflash = false ,quint8 configindex = 0);/**< 设置主机IP地址*/
void setHostRealmAddr(QString &addr ,bool Writeflash = false ,quint8 configindex = 0);/**< 设置主机域名地址*/
void setHostPort(quint16 port ,bool Writeflash = false ,quint8 configindex = 0);/**< 设置主机端口地址*/
void setProtocolVersion(QMqttClient::ProtocolVersion protocolVersion);/**< 设置版本*/
void setWillMsgConfig(const QString &willTopic ,const QByteArray &willMessage ,quint8 willQoS = 0 ,bool willRetain = false);/**< 设置遗属消息*/
void setCleanSession(bool cleanSession = true);/**< false表示创建一个持久会话,在客户端断开连接时,会话仍然保持并保存离线消息,直到会话超时注销*/
QMqttClient::ClientState GetMqttConnectState()const;/**< 获取mqtt连接状态 0未连接 1连接中 2已连接*/
void UNsubscribe_all(); /**< 取消全部订阅*/
void UNpublish_all(); /**< 取消全部发布*/
qint32 PublishMsg(QString topicStr ,QByteArray msg);/**< 发布消息*/
bool RemoveSubscribeToic(QString topic ,bool Writeflash = false ,quint8 configindex = 0); /**< 删除指定订阅,选择是否写入到配置*/
bool RemovePublishToic(QString topic ,bool Writeflash = false ,quint8 configindex = 0); /**< 删除指定发布,选择是否写入到配置*/
bool AddSubscribeToic(QString topic ,qint32 qosvalue ,bool Writeflash = false ,quint8 configindex = 0); /**< 新增指定订阅,选择是否写入到配置*/
bool AddPublishToic(QString topic ,qint32 qosvalue ,bool Writeflash = false ,quint8 configindex = 0); /**< 新增指定发布,选择是否写入到配置*/
Sinal fornecido:
void MqttwindowIsClose(); /**< 通知父窗口显示*/
void show_keyboard(QWidget * ,QLineEdit *,QString,QString); /**< 通知显示键盘*/
void NetworkPingError(); /**< 网络连接错误*/
void MessageReceived(const QByteArray &message, const QMqttTopicName &topic = QMqttTopicName());/**< 接收到新消息信号*/
void StartReconnectTimer();/**< 重新连接启动*/
Exemplo interativo
Use qtcreator para criar uma janela principal
Contém arquivos de cabeçalho de interface
#include <mqtt/libmqttclient.h>
Crie um ponteiro de janela mqttclient de membro privado
private:
Libmqttclient *MqttWindow;
Instancie, especifique o tamanho da janela do cliente mqttclient 800*600
, o ip do servidor mqtt de conexão padrão é192.168.50.128
/*mqttclient设置窗口显示*/
MqttWindow = new Libmqttclient(800 ,600 ,QString("192.168.50.128"));
Conecte sinais relacionados ao mqttclient
/*连接mqttclient窗口关闭信号*/
connect(MqttWindow ,&Libmqttclient::MqttwindowIsClose ,this ,&MainWindow::slotShowMainWindow);
/*连接mqttclient自启动连接服务器异常信号*/
connect(MqttWindow ,&Libmqttclient::NetworkPingError ,this ,&MainWindow::slotShowNetErrDialog);
/*连接mqttclient窗口要求显示键盘的信号*/
connect(MqttWindow ,&Libmqttclient::show_keyboard ,this ,&MainWindow::slotprocessedit);
Sinais relacionados ao processamento da janela principal
/*显示主窗口*/
void MainWindow::slotShowMainWindow()
{
this->show();
}
/*显示网络错误*/
void MainWindow::slotShowNetErrDialog()
{
QMessageBox::critical(this,tr("Error"),tr("<p><span style='color: rgb(255, 0, 80);font-size: 24px;'>初始连通mqtt服务器失败.</span></p>"));
}
/*显示键盘信号*/
void MainWindow::slotprocessedit(QWidget *pObject ,QLineEdit *pwidget ,QString title ,QString edittext)
{
if(KeyboardUI->isHidden() == false)
{
return;
}
pLastCallobj = pObject;
pLastCallwidget = pwidget;
KeyboardUI->showKeyboard(title ,edittext);
}
Ok, basta escrever o suficiente. A interface possui comentários no código-fonte para uso flexível.