Instalando a extensão Mosquitto-PHP no Ubuntu

E ai, bora instalar a extensão Mosquitto-PHP? Testado e sendo usado em dois servidores com Ubuntu 16+, um local e um externo. Não sabe a versão do seu? Use o comando no terminal:

1
lsb_release -a

O comando acima irá retornar algo como:

1
2
3
4
Distributor ID:	Ubuntu
Description: Ubuntu 16.04 LTS
Release: 16.04
Codename: xenial

Certo, chega de perder tempo olhando versão. Primeiro, temos que instalar o pacote libmosquitto-dev, em alguns sistemas derivados do Red Hat é provável que seja chamado de libmosquitto-devel, mas, se não for, tente a outra forma.

1
sudo apt-get install libmosquitto-dev

Já ia me esquecendo, a primeira vez que fui instalar usando o PECL e seguindo o tutorial do próprio Github deles, não deu muito certo, eu tive que pesquisar e tentar outras maneiras, até que achei uma solução e funcionou, mas mesmo assim houve alguns problemas no decorrer da instalação, então, aqui eu mostro como instalei e funcionou sem nenhum problema e sem nenhum erro antes, durante e nem depois da instalação. Se der algum problema no seu, pesquise e ache uma solução, mas creio que dará tudo certo.

Agora vamos clonar o repositório da extensão para uma pasta qualquer, eu costumo jogar tudo na /tmp, mas é você quem decide.

1
git clone https://github.com/mgdm/Mosquitto-PHP.git

E vamos entrar na pasta…

1
cd Mosquitto-PHP/

E agora? Vamos instalar a extensão de fato.

1
phpize

1
./configure --with-mosquitto=/path/to/libmosquitto
1
make
1
make test

Em alguns casos, aqui não é necessário usar sudo, mas em outros é! Então, faça de acordo com sua máquina.

1
sudo make install

Já instalado, está quase pronto. Agora precisamos ativar a extensão nas configurações (php.ini) do PHP. No meu caso, o PHP se encontra instalado em /etc/php/7.0/.

Abra e altere o arquivo php.ini. Se você não sabe como usar o vim, olhe aqui.

1
sudo vi /etc/php/7.0/cli/php.ini

E adicione a seguinte linha em extension no PHP Cli

1
extension=mosquitto.so

Abra e altere o arquivo php.ini no FPM também.

1
sudo vi /etc/php/7.0/fpm/php.ini

E adicione a seguinte linha em extension no PHP FPM

1
extension=mosquitto.so

Como usar? Darei um exemplo simples para ouvir o tópico “casa

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Inicia o cliente
$c = new \Mosquitto\Client;

// Se o seu mosquitto não possuir usuário e senha, basta remover a linha seguinte.
$c->setCredentials('USUARIO_MQTT', 'SENHA_MQTT');

// Conecta no broker/servidor mosquitto
$c->connect('IP_DO_MOSQUITTO');

// Quando usa o "#", você está dizendo que tudo que chegar para o subscribe após a / (barra), ele irá receber.
// Lembrando que você pode subscrever em vários tópicos, basta adicionar uma linha abaixo da outra.
$c->subscribe('casa/#', 0);

// Quando chegar uma mensagem ao subscribe no tópico "casa"
$c->onMessage(function($m) use ($c) {
print_r($m);
});

// Coloca em loop
$c->loopForever(0);

Tudo beleza? Salve o aquivo acima como mqttext.php em algum lugar na sua máquina. Dai, corre no seu terminal e digita o seguinte:

1
php mqttext.php

Envie uma publicação (usando o MQTT.js ou o paho-mqtt ou qualquer outro que você quiser, só para teste) para o canal casa e veja a mágina acontecer.

E para publicar uma mensagem usando a extensão Mosquitto-PHP? Simples também!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Inicia o cliente
$c = new Mosquitto\Client;

// Quando conectar, envia a publicação
$c->onConnect(function() use ($c) {
$c->publish('casa/sala', 'Enviando para a Sala da Casa', 1);
});

// Se o seu mosquitto não possuir usuário e senha, basta remover a linha seguinte.
$c->setCredentials('USUARIO_MQTT', 'SENHA_MQTT');

// Conecta no broker/servidor mosquitto
$c->connect('IP_DO_MOSQUITTO');

for ($i = 0; $i < 100; $i++) {
// Necessário para que a extensão funcione
// Faz um loop até enviar
$c->loop(1);
}

Salve o arquivo acima como mqttpub.php.

Faça um teste mais legal ainda, quando você instalou o broker mosquitto, ele vem com comandos para sub e pub, abra uma nova aba ou janela do seu terminal, e inicie o mosquitto_sub da seguinte maneira:

1
mosquitto_sub -h IP_DO_MOSQUITTO -t casa/# -q 1

Caso tenha usuário e senha

1
mosquitto_sub -h IP_DO_MOSQUITTO -t casa/# -q 1 -u USUARIO -P SENHA

Beleza, ele vai rodar em loop, abra uma nova aba ou janela novamente, e execute o arquivo mqttpub.php que você criou ali em cima.

1
php mqttpub.php

Repare que na aba onde está rodando o mosquitto_sub vai aparecer a mensagem “Enviando para a Sala da Casa“ publicada pelo mqttpub.php uando a extensão Mosquitto-PHP. Doido né?

Quer mais sobre a extensão Mosquitto-PHP? Então, aqui está o Github deles e aqui a documentação.


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

Executando comandos de Apple Script no Node.js

Para mim, automatizar tarefas no Mac é meio que uma diversão. Por exemplo, scripts para backup e sincronização no Google Drive, Dropbox e HD externo, envio de SMS quando tais backups chegam ao fim, execução de comandos bash personalizados e etc.

Recentemente criei um projeto em node que recebe comandos atavés de um MQTT Broker (usando publisher, claro!) que executa certas tarefas no Mac, uma vez que costumo sair do escritório e deixá-lo ligado. E o que mais uso, são Apple Scripts.

Precisei executar alguns Apple Scripts através do Node.js e encontrei a biblioteca node-osascript, não tenho muito o que falar, só que funciona perfeitamente.

Enfim, aqui eu instalei o pacote global

1
npm install node-osascript -g

E para testar, crie um script (o mesmo do exemplo na página do pacote), porém mudei para ativar o Google Chrome. Se ele estiver fechado, será aberto e se já estiver aberto, será focado/ativado.

Salve o script abaixo como index.js em qualquer pasta que você quiser.

1
2
3
4
5
6
var osascript = require('node-osascript');

osascript.execute('tell application "Chrome" to activate', function(err, result, raw){
if (err) return console.error(err)
console.log(result, raw)
});

Execute o script com o node e seja feliz.

1
node index.php

Para ver como funciona, você pode testar o Apple Script sem o node, usando o terminal do Mac:

1
osascript -e 'tell application "Chrome" to activate'

Não gosto de usar aplicativos prontos pois, para começar eu nunca encontro um que me atenda da forma que preciso, além de alguns custarem um preço absurdo (eu pelo menos não pago). Segundo, é legal criar esses scripts e aprender um pouco mais sobre node, apple scripts, javascript e etc. E tem mais, porquê pagar 30.. 50 dólares se eu posso fazer a mesma coisa em algumas horas?


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

Diferenças entre os diversos modelos de Arduino

O lance aqui hoje é rápido, você sabe a diferença entre os modelos de Arduino? Se não sabe, essa é a hora camarada.

I

Essa tabela acima é bem legal, ela explica e resume tudo. Na empresa utilizamos muito o Nano, Pro Mini e o NodeMCU (que não está na lista) para produtos finais e o Uno para testes.

Mas, para mais detalhes você pode acessar ela lá no Blog do FilipeFlop e aqui você pode ver a imagem em tamanho real.


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

Criar uma paginação customizada no Laravel com dados de uma collection

Talvez você seja um programador fodão em Laravel e fale “Mais isso todo mundo sabe fazer”. É ai que você se engana meu coleguinha, trabalho com Laravel a bastante tempo e posso dizer com toda certeza, muita gente tem dificuldade no momento de criar uma instância customizada de paginação com Laravel.

Logo abaixo, encontra-se uma função usando os recursos do Laravel, mas você pode criar uma classe, uma pacote ou seja la o que for necessário no seu caso.

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
27
28
29
30
31
32
33
if (!function_exists('paginator_instance')) {

/**
* Cria uma intância personalizada do paginator, a qual pode ser usada em retornos de collect e retornis customizados
* @param collect/model $items Itens a serem paginados
* @param array $requests Requests que devem ser passados na paginação, por exemplo, uma busca (query) e etc
* @param int $perPage Quantidade de itens por página
* @param int $currentPage Página atual, normalmente vazio pois usa padrão do Laravel
* @param array $options Opções de paginação, normalmente, usa o padrão do Laravel
* @return paginator/collect Paginator com resultados
*/
function paginator_instance($items, $requests = [], $perPage = 10, $currentPage = null, array $options = [])
{
// Monta $perPage
$perPage = $perPage;

// Pega a página atual
// Se não preenchido, usa o método resolveCurrentPage() da \Illuminate\Pagination\LengthAwarePaginator
$page = $currentPage ? $currentPage : \Illuminate\Pagination\LengthAwarePaginator::resolveCurrentPage();

// Monta collection com itens para paginacao
$currentPageSearchResults = collect($items)->slice(($page - 1) * $perPage, $perPage)->all();

// Cria a paginação
$paginator = (new \Illuminate\Pagination\LengthAwarePaginator($currentPageSearchResults, count($items), $perPage, $page, $options >= 1 ? $options : [
'path' => \Illuminate\Pagination\Paginator::resolveCurrentPath(),
'pageName' => 'page',
]));

// Retorna os dados montado e com paginação
return $paginator->appends($requests);
}
}

Fácil né? Poisé!
Entenda melhor a classe LengthAwarePaginator e aqui você pode ver o arquivo completo no Github.


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

Alterar Collection de uma tabela no MySQL

Com a chegada do Laravel 5.4, nós preferimos mudar a collection de algumas tabelas do nosso banco de dados, não vou explicar o que mudou, nem o porquê, mas você pode ver aqui.

Mas, para tal ação é só executar a seguinte query no console do MySQL ou no seu gerenciador preferido de banco de dados.

1
ALTER TABLE  SUA_TABELA CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

É isso, sem muita frescura.


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

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