Usando o paho-mqtt para Python

Bom, você já deve entender de Python né? Senão, estude e volte aqui.

O lance aqui é simples com paho-mqtt, para ouvir um tópico, façamos o seguinte:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Para instalar o paho-mqtt use o comando pip install paho-mqtt
import paho.mqtt.client as mqtt

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):

# O subscribe fica no on_connect pois, caso perca a conexão ele a renova
# Lembrando que quando usado o #, você está falando que tudo que chegar após a barra do topico, será recebido
client.subscribe("topico/#")

# Callback responável por receber uma mensagem publicada no tópico acima
def on_message(client, userdata, msg):
print(msg.topic+" - "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

# Seta um usuário e senha para o Broker, se não tem, não use esta linha
client.username_pw_set("USUARIO", password="SENHA")

# Conecta no MQTT Broker, no meu caso, o Mosquitto
client.connect("IP_OU_URL_BROKER", PORTA, 60)

# Inicia o loop
client.loop_forever()

Para publicar, faça o seguinte

1
2
3
4
5
# Importa o publish do paho-mqtt
import paho.mqtt.publish as publish

# Publica
publish.single("topico/teste", "Oi, aqui é um teste", hostname="IP_OU_URL_BROKER")

Na publicação, você passa todos os parâmetros no publish, como QOS, porta, auth e etc. Tudo muito fácil né? Quer saber mais? Leia a documentação do paho-mqtt


Dicas por Gercil Junio - https://gercil.me

Mostrar informações das portas USB no Mac

Só abrir o Terminal e digitar o comando:

1
system_profiler SPUSBDataType

Irá aparecer algo como:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
USB:

USB 2.0 Bus:

Host Controller Driver: AppleUSBEHCIPCI
PCI Device ID: 0x1e2d
PCI Revision ID: 0x0004
PCI Vendor ID: 0x8086

Hub:

Product ID: 0x0024
Vendor ID: 0x8087 (Intel Corporation)
Version: 0.00
Speed: Up to 480 Mb/sec
Location ID: 0x1a100000 / 1
Current Available (mA): 1000
Current Required (mA): 0
Extra Operating Current (mA): 0
Built-In: Yes


Dicas por Gercil Junio - https://gercil.me

Abrir pasta do Finder no Terminal e vice-versa no Mac

Eu acredito que você já saiba trabalhar no Terminal do Mac, configurar e usar inclusive o bash_profile. Se não sabe, dê uma olhada aqui e aqui também

Certo, vamos criar uma função no nosso arquivo de configuração .bash_profile normalmente no Mac ele fica no diretório base do seu usuário.

Para abrir uma pasta que está ativa no Finder dentro do Terminal:

1
2
3
4
finder_term() {
# Neste caso "of" é somente um alias customizado criado para excução
of=`osascript -e 'tell application "Finder" to if (count of Finder windows) > 0 then get POSIX path of (target of front Finder window as text)'` && [ -n "$of" ] && cd "$of" && pwd
}

Para abrir uma pasta que está ativa no Terminal dentro do Finder. Neste caso não iremos criar uma função e sim um alias:

1
alias term_finder='open -a Finder .'

Pronto, salve o seu arquivo .bash_profile e “atualize” ele digitando no Terminal o comando:

1
source ~/.bash_profile

Para testar, abra uma pasta no Finder e com ela ativa, abra o Terminal e digite:

1
finder_term

Pressione RETURN/ENTER e ele vai abrir a pasta do Finder dentro do seu Terminal.

Pronto, agora feche a janela do Finder e na mesma janela do Terminal digite:

1
term_finder

Pressione RETURN/ENTER e ele vai abrir a pasta do Terminal em uma janela do Finder.


Dicas por Gercil Junio - https://gercil.me

Lei de Ohm e Resistores, você conhece e sabe?

Um dos componentes eletrônicos mais usados pelo menos quando o assunto é Arduino e seus agregados, é o resistor. No início é complicado mas com o tempo você vai pegando o jeito. E não se preocupe também, na internet hoje em dia tem MUITO material para estudar, prontos e etc.

Existem diversos vídeos bem complexos e com muita teoria, cálculos e mais cálculos, então selecionei dois que são bem diretos e explica bem!

Selecionei alguns vídeos legais, que falam sobre resistores e a tal lei de ohm.

Como calcular o resistor adequado


Dicas por Gercil Junio - https://gercil.me

Verificando se um conteúdo ou palavra existe dentro de arquivos com PHP e Laravel

Isso mesmo que você leu. Sem enrolação vamos executar esse código logo. Mais uma vez, como na postagem anterior, iremos criar como uma função simples, mas você usa como quiser.

1
2
3
4
5
6
if (!function_exists(('file_has_content'))) {
function file_has_content($file, $subject)
{
return str_contains(file_get_contents(base_path($file)), $subject);
}
}

Para usar é simples, levando em consideração que usa dois helpers do Laravel, o str_contains e o base_path, vamos fazer o seguinte:

1
file_has_content('composer.json', 'require-dev');

Provavelmente o código acima irá retornar true uma vez que na instalação padrão do Laravel, existe require-dev no composer.json que está na base do projeto Laravel.


Dicas por Gercil Junio - https://gercil.me

Turbine as Collection do Laravel com o Laravel Collection Macros da Spatie

Que as Collections do Laravel são legais e que ajudam muito na hora de desenvolver todo mundo sabe. Mas em muitas ocasiões faltam funções que precisamos e não existe, para isso você tem duas opções, criar suas próprias collections ou usar pacotes de terceiros.

É ai que entra a Spatie, eles criaram um pacote para Laravel, o Laravel Collection Macros.

Mesmo assim, no nosso caso aqui na empresa ainda faltam algumas funções, mas enfim, o foco aqui não é falar disso e isso também não tira o mérito do pacote da Spatie.

Hoje em dia, AINDA vejo MUITOS programadores resistentes a usar pacotes e até mesmo frameworks, acreditam?

Poisé, eu mesmo não acredito! Particularmente acho isso muita ignorância mas não julgo ninguém, em toda minha experiência posso falar com toda a certeza, usar pacotes de terceiros e frameworks não é uma vergonha e sim um ganho gigantesco de tempo e sem perder a qualidade do seu desenvolvimento.

Então meu amigo, a menos que você esteja entrando no mundo da programação agora e não entende de nada AINDA, use e abuse de pacotes e frameworks.

Mas voltando ao pacote, para instalar vá a pasta do seu projeto Laravel e use o composer

1
composer require spatie/laravel-collection-macros

Depois, adicione o provider no arquivo app.php que está na pasta config dentro da pasta do seu projeto Laravel

1
Spatie\CollectionMacros\CollectionMacroServiceProvider::class,

E depois? Use, use e use! Para saber quais collections o pacote possui, entra la no Github deles, tem tudo! Os que mais usamos aqui são:

Rapaiz, o dd() usado nesse contexto ai, é sinistrão!


Dicas por Gercil Junio - https://gercil.me

Quer aprender a programar para web sem enrolação?

Quer aprender a programar sem frescura? Deixa eu dar uma dica então. Eu aprendi a programar em 1 mês (a 17 anos atrás, lembrando que isto está sendo escrito em 2017), na minha época tudo era mais difícil, mais complicado, nem internet eu tinha só livros (em portugês) e uma documentação em inglês que não adiantava de nada porquê eu não sabia inglês.

Hoje em dia, tem muito, muito, mas muito conteúdo grátis por ai, para ser explorado e estudado. Já falei, que tem muito mesmo? Mas para facilitar, reuni alguns cursos grátis que eu acredito ser um (ótimo) ponta pé inicial. Melhor que muitos pagos por ai.


Curso de Algoritmo e Lógica

https://www.youtube.com/playlist?list=PLHz_AreHm4dmSj0MHol_aoNYCSGFqvfXV

Curso HTML5 Completo

https://www.youtube.com/playlist?list=PLHz_AreHm4dlAnJ_jJtV29RFxnPHDuk9o

Curso de Banco de Dados MySQL

https://www.youtube.com/playlist?list=PLHz_AreHm4dkBs-795Dsgvau_ekxg8g1r

Curso PHP Iniciantes

https://www.youtube.com/playlist?list=PLHz_AreHm4dm4beCCCmW4xwpmLf6EHY9k

Curso de POO PHP (Programação Orientada a Objetos)

https://www.youtube.com/playlist?list=PLHz_AreHm4dmGuLII3tsvryMMD7VgcT7x


Tem MUITAS outras coisas para aprender mas o básico é isso, te aconselho a iniciar do primeiro para o último. O Curso de Algoritmo e Lógica e o Curso HTML5 Completo são os principais para quem quer começar a programar e já focar em web.

Dai você me fala “Quanta coisa, a neim to com preguiça!“.

Eu também tive preguiça no início quando vi um livro de mais de mil páginas, eu li todas? Claro que não (kkk).

Na medida que eu fui entendendo como as coisas funcionavam logo no início do livro, eu comecei a fazer testes reais e fui testando, no que fui testando também fui encontrando erros e aprendendo com eles.

Tempo quem perde é relógio sem pilha meu chapa! Sabia?


Dicas por Gercil Junio - https://gercil.me

Pub / Sub com Laravel e Redis

Eu nem precisava fazer este artigo, pois na documentação do laravel tem exemplos, explica tudo. Mas beleza!

Para quem não sabe, Redis é um banco de dados NoSQL e ele funciona com a idéia de chave-valor. O valor (e também a chave) pode ser qualquer coisa, eu uso muito para arrays e até mesmo para views que não mudam muito e podem ser cacheadas para carregar uma página web mais rápido. Se quiser saber mais sobre Redis, da-lhe Google.

O Laravel é um framework para PHP robusto e que faz praticamente tudo o que você precisar, é simplesmente perfeito! Na empresa, usamos ele em todos os nosso projetos. Claro, usamos outras tecnologias também, mas a base de tudo gira em torno do Laravel.

Primeiro, precisamos criar um comando no Artisan para testarmos o nosso Subscribe.

1
php artisan make:command SubTestCommand

Isso, agora vai lá no seu arquivo SubTestCommand.php, adicione a Facade do Redis:

1
use Illuminate\Support\Facades\Redis;

Dê uma assinatura pra ele “redis:subscribe“, uma descrição “Redis subscribe test“ ou qualquer outra descrição que você quiser, ou copie como está na documentação do laravel, você quem sabe.

Continuando… No método handle que é onde executa o comando, coloque o seguinte:

1
2
3
4
5
Redis::psubscribe(['casa/*'], function ($message, $channel) {
// $message é a mensagem recebida, obviamente
// $channel é o canal o qual foi enviada a publicação
echo "\nMensagem: ".$message."\n\nCanal: ".json_encode(explode('/', $channel))."\n";
});

Na documentação do laravel existe duas formas de usar o subscribe, que é Redis::subscribe() e Redis::psubscribe() a diferença entre um e outro é que o primeiro não aceita curinga (wildcard) e o segundo aceita. Mas, se você quer saber mais, olhe ai na documentação, lá explica tudo. Mas o que eu expliquei aqui já é o suficiente acredito.

Beleza, tudo lindo e funcionando até agora. Mas temos que executar o comando e criar um publish né? Certo, para executar o comando que criamos no Laravel faça o seguinte

1
php artisan redis:subscribe

Certo, agora precisamos enviar uma publicação para o canal “casa“, para testes vamos usar o Laravel Tinker, corre lá no terminal, onde está instalado o Laravel que você está usando para testes, e digite o comando:

1
php artisan tinker

O Tinker será iniciado e nele iremos digitar o seguinte:

1
Illuminate\Support\Facades\Redis::publish('casa/sala', json_encode(['comando' => 'ligar-luz']));

Repare que na janela do terminal onde está executando o comando artisan redis:subscribe irá receber uma mensagem. Pronto, agora faça a seu gosto.

No artigo, eu usei exemplo enviando um comando para uma casa, mas, você pode usar isso em qualquer lugar, seja software, hardware ou IoT, até porquê quando se diz respeito a IoT eu prefiro usar o MQTT.


Dicas por Gercil Junio - https://gercil.me

Procure portas no macOS e saiba quais processos estão usando elas

Olha essa linha de comando que coisinha mais simples e cheia de graça.

1
lsof -i tcp:8000

Falei macOS, mas estou usando o OS X El Capitain. Na linha acima, vai mostrar o seguinte

1
2
COMMAND   PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
VBoxHeadl 2011 wow 24u IPv4 0xd0e6a899f3a4fa03 0t0 TCP *:irdmi (LISTEN)

Na minha porta 8000 quem (ou o quê) está usando é o Virtual Box rodando o Laravel Homestead.

Não tem Mac? Fazer o quê, demorei a ter um também! Paciência!


Dicas por Gercil Junio - https://gercil.me

Precisando de um Cliente MQTT para usar no Arduino?

Não vou explicar como instalar uma Biblioteca na Arduino IDE, está cheio de tutoriais no Google, de qualquer forma, aqui tem um, aqui tem outro e aqui tem mais outro (vídeo) tutorial.

Então, conheça o PubSubClient, esse caboco é danado! Todos sabemos (ou não) que o MQTT trabalha com publicações e subscrições!

Não entendeu? Bora lá então, quando você envia um comando para um servidor MQTT, você usa um publish, ou seja, você faz uma publicação para o servidor MQTT, e se existe uma publicação ele precisa receber ela, ler e executar uma algo, correto?

É ai que entra o subscribe, ele basicamente, fica o tempo todo “ouvindo“ se existe novas publicações e se existe ele recebe, de acordo com o tópico e o conteúdo desta publicação você executa uma ação como por exemplo ligar uma luz, fechar um portão e etc.

No próprio GitHub deles, existem ótimos exemplos como usar com autenticação, sem e por ai vai.

Primeiro, você tem que incluir ele no seu código do Arduino, como?

1
#include <PubSubClient.h>

Depois você cria o client

1
PubSubClient client(server, 1883, CALLBACK_SUB, CLIENT_ETHERNET_OU_WIFI);

Publish

1
client.publish("tópico","mensagem");

Subscribe

1
client.subscribe("tópico");

Enfim, olhe este exemplo no Github deles, é bem legal e você vai entender bem melhor, porquê criar o que já foi criado? Bora ganhar tempo galera.

Mesmo assim, ainda está com dificuldades? Bom, eu acho difícil isso estar acontecendo mas vamos lá, aqui tem a documentação completa do PubSubClient.

Pronto, foi? Deu certo? #tchaubrigado


Dicas por Gercil Junio - https://gercil.me

Macro Request no Laravel

Para mim uma das coisas mais fascinantes no Laravel, são os Macros, muito pouco falados na documentação (ou não), enfim, são demais.

Os Macros eles basicamente servem, para extender os métodos de uma biblioteca ou seja la o que for. Então, conseguimos criar “customizações” de acordo com a nossa necessidade.

Por aqui eu vou mostrar, como utilizar um Macro para o Requests do Laravel.

Primeiro, vamos criar um provider usando o artisan

1
php artisan make:provider MacroServiceProvider

Depois de criado, vá na pasta config, abra o arquivo app.php e adicione o seguinte Provider

1
App\Providers\MacroServiceProvider::class,

Isso, agora vá na pasta do seu projeto Laravel em app/Providers e abra o MacroServiceProvider.php

Já abriu? Agora vamos adicionar a classe Request do Laravel para uso:

1
use Illuminate\Http\Request;

O início do seu Provider ficará mais ou menos assim

1
2
3
4
5
6
7
8
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Http\Request;

class MacroServiceProvider extends ServiceProvider
{
...

Certo, agora vamos criar o Macro, para isso dentro do método boot() coloque o seguinte código:

1
2
3
Request::macro('isEdit', function(){
return $this->is('/editar');
});

Para usar:

1
2
3
4
5
6
7
// Com helper request() do Laravel para ser chamado em uma view por exemplo
if(request()->isEdit())
echo("Estou editando o bagui");

// Sem o helper
if($request->isEdit())
echo("Estou editando o bagui");

O que aconteceu ai? Eu explico! Quando chama o Macro isEdit() ele vai buscar usando o método is() do Request do Laravel, se a rota atual é a rota de edição retorna true, se não, false.

Quase tudo no Laravel tem Macros, olha só:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Illuminate\Routing\UrlGenerator;
UrlGenerator::macro('nomeMacro', function(){ ... });

use Illuminate\Support\Collection;
Collection::macro('nomeMacro', function(){ ... });

use Illuminate\Routing\Router;
Router::macro('nomeMacro', function(){ ... });

use Illuminate\Support\Str;
Str::macro('nomeMacro', function(){ ... });

use Illuminate\Support\Arr;
Arr::macro('nomeMacro', function(){ ... });

… E muito mais!

Como eu descobri onde o Laravel usa Macros?

Não sei se foi a forma correta e blá blá blá mas para mim e minha equipe funcionou perfeitamente. O código principal do Framework Laravel, o núcleo dele, o chamado Illuminate, contém todas as classes e métodos utilizados, enfim o “coraçnao” do framework, você pode acessá-lo aqui.

Por exemplo, para o Request, normalmente é utilizado o Illuminate\Http\Request, se você abrir este arquivo, você verá que ele usa a Trait Macroable que é responsável pelos Macros, então adivinha meu chegado…

Um exemplo real do uso de macros, é o pacote Laravel Collection Macros que falei no post anterior, olha só o código dos macros dele.


Dicas por Gercil Junio - https://gercil.me

Instalando, testando e conhecendo o MQTT no Ubuntu

Já mostrei como fazer no macOS, no Ubuntu não é muito diferente, é até mais simples.

Primeiro passo, instalar o Mosquitto usando o apt-get.

1
sudo apt-get install mosquitto mosquitto-clients

Simples, ou não? Use o mosquitto_sub e o mosquitto_pub para brincar e fazer seus testes!

1
mosquitto_sub -t topic/home

1
mosquitto_pub -t topic/home -m "Ubuntu work!"

Quer proteger o seu Mosquitto?

Defina nas configurações do mosquitto para não aceitar usuários anônimos, abra o arquivo de configuração usando o editor vim mesmo.

1
sudo vim /etc/mosquitto/mosquitto.conf

ou

1
sudo vim /etc/mosquitto/conf.d/default.conf

E adicione (ou altere) a linha onde está o allow_anonymous para false

1
allow_anonymous false

Se estiver comentado, descomente! E se não existe a linha? Crie!

Depois, adicione a linha informando o local do seu arquivo de senhas

1
password_file /etc/mosquitto/passwd

Feito isto reinicie o Mosquitto:

1
service mosquitto restart

E agora, vamos adicionar um usuário e senha:

1
sudo mosquitto_passwd -c /etc/mosquitto/passwd USUARIO

Quando você pressionar RETURN/ENTER, ele vai pedir uma senha!
Defina uma senha, confirme e pressione RETURN/ENTER movamente.

E agora você precisa passar o usuário e senha nos seus testes!

1
mosquitto_sub -t topic/home -u USUARIO -P SENHA

1
mosquitto_pub -t topic/home -m "Proteção sinistra!" -u USUARIO -P SENHA

Quer definir o HOST e a PORTA manualmente? Faça o seguinte:

1
mosquitto_sub -t topic/home -h 127.0.0.1 -p 1883

e também na publicação:

1
mosquitto_pub -t topic/home -m "Wowwww padrim, to em casa!" -h 127.0.0.1 -p 1883

Gosta de Python ou Node.js? Então conheça o pacote paho-mqtt para Python e o MQTT.js para Node.js, eles são uma belezura. Tem também para PHP que é bem legal e funciona perfeitamente com a extensão Mosquitto-PHP, eu particularmente uso ele para comunicação com uma API desenvolvida para o Laravel.

Quer finalizar o Mosquitto? Claro, somente se você quiser, não é necessário!

1
service mosquitto stop

Quer saber mais sobre Mosquitto e MQTT? Cola la no google, tem tudo!


Dicas por Gercil Junio - https://gercil.me

Instalando, testando e conhecendo o MQTT no macOS

Eu acredito que quem chegou até aqui, já saiba bastante sobre programação. Então não vou explicar o que é Mosquitto, MQTT e nem Homebrew, a idéia aqui é ser direto e mostrar como deixar as coisas funcionando.

Primeiro, vamos instalar o Homebrew, caso não o tenha feito ainda.

1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Segundo, vamos instalar o Mosquitto usando o Homebrew.

1
brew install mosquitto

Quando termina a instalação, é mostrado como colocar para iniciar o MQTT server na inicialização do sistema. Simples!

1
ln -sfv /usr/local/opt/mosquitto/*.plist ~/Library/LaunchAgents

Então, precisamos iniciar o Mosquitto, certo? É mamão com açucar!

1
launchctl load /usr/local/Cellar/mosquitto/1.4.10_1/homebrew.mxcl.mosquitto.plist

Legal né? Agora, você pode usar o mosquitto_sub e o mosquitto_pub para brincar e fazer seus testes!

1
mosquitto_sub -t topic/home

1
mosquitto_pub -t topic/home -m "Wowwww padrim, to em casa!"

Opa, mas espera ai! Eu não quero o meu Mosquitto livre pra qualquer um acessar né? Bora colocar senha então!

Antes de mais nada, você precisa definir o mosquitto para não aceitar usuários anônimos, abra o arquivo de configuração usando o editor vim mesmo.

1
sudo vim /usr/local/Cellar/mosquitto/1.4.10_1/etc/mosquitto/mosquitto.conf

E adicione (ou altere) a linha onde está o allow_anonymous para false

1
allow_anonymous false

Se estiver comentado, descomente!
Feito isto reinicie o Mosquitto. Para tal, você pode parar e iniciar novamente o serviço usando os comandos citados no início e no fim deste artigo.

E agora, vamos adicionar um usuário e senha:

1
mosquitto_passwd -c /usr/local/Cellar/mosquitto/1.4.10_1/etc/mosquitto/pwfile USUARIO

Quando você pressionar RETURN/ENTER, ele vai pedir uma senha!
Defina uma senha, confirme e pressione RETURN/ENTER movamente.

E agora você precisa passar o usuário e senha nos seus testes não é mesmo? Simples de novo!

1
mosquitto_sub -t topic/home -u USUARIO -P SENHA

1
mosquitto_pub -t topic/home -m "Noh, agora to protegido!" -u USUARIO -P SENHA

Quer definir o HOST e a PORTA manualmente?

1
mosquitto_sub -t topic/home -h 127.0.0.1 -p 1883

1
mosquitto_pub -t topic/home -m "Wowwww padrim, to em casa!" -h 127.0.0.1 -p 1883

Gosta de Python ou Node.js? Então conheça o pacote paho-mqtt para Python e o MQTT.js para Node.js, esses caras são demais. Tem também para PHP que é bem legal e funciona perfeitamente com a extensão Mosquitto-PHP, eu particularmente uso ele para comunicação com uma API desenvolvida em Laravel.

Cansou de brincar e fazer seus testes? Se quiser, pode finalizar o seu Mosquitto!

1
launchctl unload /usr/local/Cellar/mosquitto/1.4.10_1/homebrew.mxcl.mosquitto.plist

Quer saber mais sobre Mosquitto e MQTT? La no google tem muito material, até o que você não precisa saber e nunca vai usar na sua vida.


Dicas por Gercil Junio - https://gercil.me

Proudly powered by Hexo and Theme by Hacker
© 2020 Faz-B Man