Mqtt cliente múltiplas configurações podem ser definidas


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

Insira a descrição da imagem aqui

A função principal

Função de configuração

Quando o software é iniciado, ele primeiro encontra o arquivo de configuração e MQTT_CONFIG.jsongera 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
Insira a descrição da imagem aqui

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ãomingw64
  • 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.
    Insira a descrição da imagem aqui

Compilar

Aqui, pegue o lado da janela como exemplo
1. UseqtcreatorAbra o libmqttclient.proarquivo 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:
Insira a descrição da imagem aqui
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 libpasta contém o arquivo de biblioteca qmqtt14.2
  • src/mqttclient/releaseExistem arquivos de biblioteca do cliente de interface da IU no diretório
  • includeExistem 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, QtMqttdois diretórios.
2, os arquivos de biblioteca qmqtt gerados pelo compilador (fonte lib código compilador-gerado): Qt5Mqtt.dll, Qt5Mqtt.acopiados para o seu projeto mqtt/libdiretó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/QtMqttdiretó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. mqttCrie um mqttclient.priarquivo 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.pripara o diretório criado no diretório-raiz do código-fonte do seu projeto mqtt.
7. .proAdicione 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, QtMqttdois diretórios.
3, irá compilar os arquivos de biblioteca qmqtt gerados (fonte lib código compilador-gerado): Qt5Mqtt.dll, Qt5Mqtt.acopiados para o seu projeto mqtt/libdiretório
4, copie qmqtt todos os arquivos de cabeçalho (sob (compilador fonte gerado incluem diretório)), para o seu mqtt/QtMqttSob 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.dllcopie-o para o mqtt/libdiretó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. mqttCrie um mqttclient.priarquivo 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

.proAdicione o seguinte em seu arquivo de projeto :(Não pode fazer)

# mqttclient
include(mqtt/mqttclient.pri)

8. Copie libmqttclient\src\mqttclienttodos 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.harquivo 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.

Acho que você gosta

Origin blog.csdn.net/weixin_42892101/article/details/108301272
Recomendado
Clasificación