Protocolo MQTT e MQTT abrem projeto de cliente no Delphi
O protocolo MQTT é usado para mensagens na Internet das coisas. Antes de tudo, é interessante porque é suportado pelos maiores provedores de serviços em nuvem, como IBM, Microsoft, Amazon.Você pode obter uma conta nesses serviços gratuitamente, configurar um serviço para receber mensagens MQTT lá e assistir a vida útil de seus dispositivos por meio desses serviços, por exemplo, em uma casa inteligente. Além disso, por meio desses serviços, os dispositivos podem se comunicar entre si.Uma demonstração da conexão do cliente com o serviço MQTT da nuvem IBM Bluemix está incluída.Breve descrição.
O MQTT é extremamente primitivo: com um cabeçalho curto, sem controle de integridade, não impõe restrições à estrutura, codificação ou esquema de dados. O único requisito de dados em cada pacote é que eles devem ser acompanhados por um identificador para o canal de informações. Esse identificador na especificação é chamado Nome do Tópico ou um tópico mais simples. Os dados são transmitidos para pacotes através de TCP. A quantidade de dados em um pacote pode variar de um byte a 268.435.455 bytes. Muito flexível! Embora os serviços de nuvem pública imponham restrições mais rigorosas, até vários kilobytes.O protocolo MQTT requer um intermediário de dados. Essa é a ideia central da tecnologia. Todos os dispositivos enviam dados apenas para o corretor e também recebem dados dele. Um broker é um programa que atua como um servidor TCP com um banco de dados dinâmico.O banco de dados do broker, em particular, contém uma tabela com todos os pacotes recebidos com indexação por tópicos desses pacotes. Ao receber o pacote, o broker o envia a todos os dispositivos na rede de acordo com sua assinatura. Para que o dispositivo receba algo do intermediário, ele deve se inscrever no tópico. Os tópicos surgem dinamicamente na assinatura ou na chegada de um pacote com este tópico. Você também pode cancelar a inscrição no tópico. Assim, os tópicos são um mecanismo conveniente para organizar relacionamentos de diferentes tipos: um para muitos, muitos para um e muitos para muitos. Se o pacote não tiver um assinante, ele será descartado. Se o assinante não estiver conectado, o pacote será excluído imediatamente no banco de dados do broker ou aguardará que o assinante se conecte por algum tempo especificado na configuração. O comportamento é determinado pelo atributo QoS do pacote.O que mais é importante aqui.
• Os dispositivos são os primeiros a estabelecer contato com um corretor. I.e. os dispositivos podem estar localizados atrás de NATs (Network Address Translators) e podem não ter endereços IP estáticos, o que não interfere na comunicação.• SSL pode ser usado para criptografar o tráfego. Mas você pode trabalhar sem SSL, mesmo com os serviços IBM, o que facilita a depuração.• Em casos extremamente difíceis, os agentes do MQTT permitem conectar-se a eles através do protocolo WebSocket na porta 80.• A porta do protocolo MQTT padrão também pode ser alterada arbitrariamente.• O cliente / clientes com uma interface gráfica com o usuário e o broker podem estar localizados no mesmo computador. I.e. a solução pode ser absolutamente local e escalar para global com um clique.• Diferentes corretores podem se conectar assinando mensagens um do outro.• O conceito de tópicos se encaixa bem com a tecnologia de banco de dados NoSQL. Para o mesmo objetivo, os serviços em nuvem incentivam os usuários a usar a codificação de dados JSON.Projetos abertos
A escolha dos corretores MQTT é bastante grande. Mas, estranhamente, praticamente não há clientes convenientes com uma interface de usuário de janela no Windows. E esse cliente para dominar o protocolo MQTT é simplesmente necessário, porque há muitas nuances práticas do trabalho dos corretores além do escopo das especificações, e todas elas precisam ser estudadas e testadas de alguma forma.Foi decidido implementar o cliente MQTT no Delphi.O Google para Delphi pode oferecer apenas o componente TMQTTClient. Mas este é um componente antigo e não funciona. A maioria dos outros clientes escritos em Java, Erlang, Haskell, Javscript no Delphi são muito difíceis de integrar.Encontrado o único projeto adequado - MosquittoEscrito em puro C-i. Compila para diferentes sistemas operacionais. Possui scripts de geração de projeto para o Visual Studio. Na saída do Windows, obtemos arquivos DLL com a implementação da funcionalidade do cliente e do broker. O uso de C é encorajador em termos de velocidade. E bibliotecas dinâmicas escritas em C se conectam facilmente aos programas Delphi.O próprio Delphi, representado pelo Embarcadero RAD Studio XE8, é uma ferramenta muito poderosa para criar interfaces de usuário flexíveis e convenientes para o Windows, especialmente se estiver equipado com DevExpress, TeeChart, RxLib, FireDAC, etc.Ferramentas necessárias
Vamos precisar do ambiente de desenvolvimento do MS Visual Studio 2015 . Ele irá compilar o projeto Mosquitto e todos os projetos de apoio dos quais o Mosquitto depende . Como alternativa, o Mosquitto para Windows pode ser compilado usando o pacote Cygwin , mas o Visual Studio parecia mais conveniente.Para gerar arquivos de projeto do Visual Studio, você precisa baixar e instalar o utilitário Cmake . Fonte cmake.orgE é claro que você precisa do RAD Studio XE8 . Além disso, no RAD Studio, a versão do pacote do componente DevExpress VCL não inferior a 14.2.2 deve ser instalada. Embora isso não seja de importância fundamental, o design da interface do usuário pode ser facilmente refazido para os componentes padrão do RAD Studio.Procedimento de instalação do software
O Mosquitto depende de vários projetos de terceiros, são eles:• OpenSSL v 1.0.2e . Fonte - http://slproweb.com/download/Win32OpenSSL-1_0_2e.exe• Pthreads v 2.9.1 . Fonte - ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip• Libwebsockets v 1.4 . Fonte - https://github.com/warmcat/libwebsocketsFaça o download desses projetos.OpenSSL não compilar, e imediatamente demorar de dois para o arquivo desejado: libeay32.dll e ssleay32.dll do diretório bin . Muitas vezes acontece que eles já estão instalados no computador de outros projetos. Isso deve ser verificado.PthreadsTambém não compilar, e tomar o arquivo já compilado pthreadVC2.dll do diretório dll \ x86 .Libwebsockets vem sem arquivos pré-compilados e sem um projeto para o Visual Studio, mas possui um arquivo de configuração CMakeLists.txt . Nesse caso, usando o utilitário Cmake , geramos o arquivo de projeto do Visual Studio em um diretório separado (diretório libwebsockets_VS_proj). E, em seguida, abrindo o arquivo de projeto gerado no Visual Studio, compilamos. Nós obtemos o arquivo websockets.dll que precisamos .Após todas as etapas anteriores, você pode compilar o projeto Mosquitto. Aqui, você também precisa primeiro gerar o arquivo de projeto do Visual Studio (diretório Mosquitto_VS_proj) a partir do arquivo de configuração CMakeLists.txt anexado . O projeto gerado não funciona muito bem, você precisará alterar os caminhos para alguns arquivos e bibliotecas de cabeçalho externos, incluir algumas macros no projeto e modificar levemente os textos de origem. Como resultado, obtemos o arquivo mosquitto.dll .Para simplificar, todos os arquivos e a estrutura de diretórios dos projetos mencionados estão contidos no arquivo anexado ao artigo.Juntamente com a biblioteca do cliente, a compilação do projeto Mosquitto nos fornece o arquivo executável do broker do MQTT - mosquitto.exe .Assim, obtemos imediatamente o cliente e o broker MQTT, ou seja, quase tudo o que você precisa para organizar uma Internet eficaz das coisas.Criando um projeto de cliente MQTT no Delphi
Para integrar a biblioteca mosquitto.dll ao Delphi, você precisa criar um módulo de declaração de função de biblioteca no Object Pascal . Para fazer isso, a conversão de arquivos tem sido realizada mosquitto.h arquivo MOSQUITTO.PAS .O projeto do cliente é muito simples, consiste em apenas 4 arquivos de origem. O cliente demonstra a conexão e a desconexão, formando uma vontade ( Vontade ), enviando dados com o pacote PUBLISH ao intermediário, recebendo dados com o pacote PUBLISH do intermediário, assinando e cancelando a inscrição.O programa salva todos os atributos de conexão, referidos pelo termo perfil na tabela de perfis armazenados no disco. Os logs dos pacotes PUBLISH recebidos e enviados também são salvos no disco separadamente .Método de Uso do Cliente
Execute o arquivo TMQTTC.exe .Para ter alguém para comunicar a equipe corretor de execução de teste Run_mosquitto.cmd no diretório Mosquitto_1_4_5_bin . Por conveniência, o broker está configurado para conectar-se sem verificação de SSL e senha.Preencha os campos como na captura de tela.
Senha e nome de usuário são opcionais. No navegador, clique no botão de confirmação para salvar os dados na tabela. Em seguida, clique no botão Conectar .Após a conexão, os comandos de publicação e assinatura ficam disponíveis. Comandos PING cliente mosquitto gera automaticamente.Para que o cliente obtenha alguma coisa, você deve executar novamente o programa TMQTTC.exe com um identificador de cliente diferente e assinar um cliente para receber dados de outro.Conecte-se ao IBM Bluemix
A primeira coisa a fazer é obter uma conta no BluemixDepois de receber uma conta, vamos ao nosso painel de controle no Bluemix . Aqui você deve mudar imediatamente para a região sul dos EUA . Para fazer isso, clique no ícone da conta no canto superior direito e altere o valor no campo Região . Existem três regiões no total, mas o sul dos EUA oferece a oportunidade de experimentar a maioria dos serviços. Em seguida, crie espaço . A tela deve parecer uma imagem abaixo. Aqui, a organização INDEMSYS e Space INDEMSYS SPACE são criadas .
Agora clique em CATALOG no menu superior. Descemos para o fundo e escolhemosFundação Internet das Coisas .
Por padrão, não alteramos os campos propostos e clique em Criar
Fundação da Internet das Coisas - este é um serviço que inclui o intermediário MQTT e a interface com o usuário.Após criar na janela exibida, clique no botão Iniciar painel .
Este é um painel de controle da IoT. Agora precisamos criar dispositivos. Clique em Adicionar dispositivo . Nas caixas de diálogo exibidas, crie um tipo de dispositivo ( Criar tipo de dispositivo ). Dê a ele o nome Tipo1, não preencha os campos restantes para simplificar. Clique em Avançar -> Avançar -> Criar -> Avançar. Atribua o nome ao dispositivo Device1. Próximo Próximo -> Próximo -> Próximo -> Adicionar. Como resultado, obtemos a seguinte janela:
É isso aí, temos todos os detalhes para conectar nosso primeiro dispositivo ao Bluemix do broker do MQTT .Testaremos se nosso cliente pode se conectar a ele. Digite os detalhes na janela do cliente.
Como você pode ver, o cliente se conectou com sucesso ao Bluemix . Aqui você deve prestar atenção ao nome do host. Começa com o ID da organização obtido ao criar a Internet of Things Foundation . O campo ID do usuário também é composto e é codificado como: d : < ID da organização >: < Tipo de dispositivo >: < ID do dispositivo >. O campo Nome do usuário contém uma sequência fixause-token-auth .Os tópicos de mensagens para o intermediário Bluemix , diferentemente do intermediário Mosquitto, não podem conter dados arbitrários. Eles são codificados de acordo com certas regras. Essas regras devem ser estudadas na documentação da Internet of Things Foundation . A captura de tela mostra um dos possíveis tópicos válidos.Repositório do projeto: https://github.com/Indemsys/Delphi_MQTT_mosquittoSource: https://habr.com/ru/post/pt388231/
All Articles