Geolocalização via IP com Linkit Smart 7688 4

Dentre as diversas possibilidades de se obter dados de geolocalização em um projeto de eletrônica temos também vários serviços da web que podem nos fornecer esses dados. Esses serviços podem ser uma alternativa a utilizar módulos GPS.

LINKIT-SMART-7688-NODEJS

Neste tutorial iremos mostrar como programar uma Linkit Smart 7688 usando a linguagem Node.js para que obtenha seus dados de geolocalização aproximados utilizando a API do site ip-api.com e mostre-os em uma página web utilizando Google Maps.

Um pouco sobre a Linkit Smart 7688

A Linkit Smart 7688 é uma pequena placa de desenvolvimento que tem como sistema operacional o OpenWRT, uma distribuição Linux focada em sistemas embarcados com conectividade. Pelo fato da placa usar Linux temos um grande leque de possibilidades de linguagem de programação que podem ser usadas. As linguagens suportadas vão desde C/C++ até Python e Node.js. É uma placa para todos os gostos.

Imagem inferior Linkit Smart

Além de diversas possibilidades de software, a Linkit Smart 7688 conta com diversas interfaces de hardware como UART, I2C, PWM entre outras. Você ainda pode utilizar um cartão micro SD para salvar dados e até fazer um datalogger.

Dados de Geolocalização com ip-api.com

A API do site ip-api.com funciona de forma muito simples bastando apenas fazer uma requisição HTTP GET em uma URL contendo os dados que se deseja obter como resposta. Como exemplo inicial, abra seu navegador e acesse a URL http://ip-api.com/json. Você poderá ver na tela do seu navegador dados da sua localização em formato JSON.

IP API dados Json

É possível também fazer uma requisição de apenas alguns dados. Para isso vamos usar a URL http://ip-api.com/json/?fields=8405 que nos retorna apenas cidade, país, latitude, longitude, IP e estado. Você pode escolher os dados que deseja neste link.

IP API dados Json

Utilizando a API com a Linkit Smart 7688 e Node.js

Para utilizar a API de geolocalização desenvolvemos uma pequena aplicação em Node.js que é capaz de obter os dados de geolocalização e exibir esses dados em uma página do Google Maps. Para servir a página Web utilizamos Express.js, para fazer a requisição GET utilizamos o request.js e para transmitir os dados de geolocalização para a página Web utilizamos o socket.io. Utilizamos também a API do Google Maps para exibir um marcador no mapa na posição de latitude e longitude obtida.

O Node.js já vem instalado na Linkit bastando apenas um editor de texto como vim ou nano para começar a desenvolver. É necessário também que a Linkit esteja conectada na mesma rede local de onde será acessada.

Para instalar a aplicação de geolocalização você precisará acessar sua Linkit Smart utilizando um conversor USB-serial ou acessá-la através de SSH. Ao entrar no terminal de comando, clone o servidor do repositório do GitHub:

git clone https://github.com/giobauermeister/linkit-smart-ip-geolocation.git

Entre na pasta clonada e instale o servidor utilizando o npm:

cd linkit-smart-ip-geolocation
npm install

Então finalmente execute a aplicação:

node app.js

A página Web estará disponível para acesso no endereço http://mylinkit.local:3000. Abra um navegador em seu computador no endereço, aperte o botão “Get Location” e então você verá a localização aproximada de sua Linkit.

Geolocalização com Linkit Smart 7688

Explorando o código da aplicação Node.js

Dentro do código da aplicação Node.js podemos ver algumas funções essenciais para que a Linkit consiga obter seus dados de geolocalização aproximados.

A função abaixo espera pelo evento btnClicked que ocorre quando o botão “Get Location” é clicado no navegador. Assim que o botão é clicado, a função makeLocationRequest() é chamada.

io.on('connection', function (socket) {
 socket.on('btnClicked', function () {
   console.log("Button get location clicked!");
   makeLocationRequest();
 });
});

A função makeLocationRequest() por sua vez faz a requisição GET e obtém como resposta os dados de geolocalização em formato JSON que são salvos na variável “locationData”. A variável “locationData” é então enviada para a página Web no navegador.

function makeLocationRequest() {
 request('http://ip-api.com/json/?fields=8405', function (error, response, body) {
   if (!error && response.statusCode == 200) {
     console.log(body) // print location to console
     var locationData = body
     io.emit('locationEvent', locationData);
   }
 });
}

A função seguinte é responsável por disponibilizar o arquivo index.html (Página Web) que está na pasta public, quando o endereço http://mylinkit.local:3000 é acessado pelo navegador.

app.get('/', function (req, res) {
 res.sendFile(__dirname + '/index.html');
});

E finalmente a função server.listen é repsonsável por iniciar o servidor no endereço http://mylinkit.local:3000.

server.listen(3000, function () {
 var port = server.address().port
 console.log('Server listening on mylinkit.local:%s...', port);
});

O código completo da aplicação em Node.js pode ser encontrado aqui, e o código completo da página Web em HTML e Javascript pode ser encontrado aqui.

Conclusão

Se você ainda não tem um módulo GPS para usar em seu projeto, ensinamos nesse tutorial como usar os serviços do site ip-api.com para obter dados aproximados de geolocalização. O princípio ensinado aqui pode ser implementado em qualquer plataforma de hardware com a qual seja possível trabalhar com protocolo HTTP e desenvolvimento em linguagem Node.js como Raspberry Pi, Beaglebone entre outras.

Para ter dados mais precisos utilize um módulo GPS como o GPS Shield para Arduino. Veja no tutorial Usando Arduino GPS Shield com o Google My Maps para saber como utilizar um módulo de GPS em seu projeto.

Gostou de obter dados de geolocalização com a Linkit Smart? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

4 Comentários

  1. Olá, tudo bem ?

    Gostei muito da abordagem e achei sensacional, porém não tenho essa placa. Tenho uma Onion Omega2 que é bem parecida, no caso consigo fazer o mesmo nela ?

    1. Olá André,

      Que bom que gostou do post!

      A placa Onion Omega2 roda Linux então creio que seja possível sim. Bastaria o Nodejs estar instalado no sistema.
      Encontrei alguns tutoriais que podem te ajudar:
      https://wiki.onion.io/Tutorials/Installing-NodeJS
      https://docs.onion.io/omega2-docs/installing-and-using-nodejs.html

      Depois poste os resultados pra gente!

      Abraço!

  2. A ideia é até legal porém a localização que ele apresentará diz respeito ao seu provedor, ou seja, pode haver uma diferença gigante.

    Mas se a ideia é somente saber o país e a cidade, pode ser que funcione em aplicações específicas.

    1. Olá Bruno,

      Que bom que gostou da idéia!

      Isso mesmo como você disse. Como deixei claro no post, a localização é aproximada. Portanto irá haver uma diferença.
      A solução funciona muito bem e pode ser usada em diversas aplicações.

      Por exemplo: Imagine uma rede de postos de gasolina espalhados pelo brasil ou pelo mundo. Cada posto é monitorado. Quando houver algum problema em algum posto ou bomba de gasolina, ele envia uma notificação com a localização para uma central. Colocar um módulo GPS em cada posto ou bomba para ficar estático, e ainda precisar de módulos WiFi ou 3G para enviar dados, seria talvez inviável e sairia mais caro com certeza.

      Essa é mais uma solução que pode ser usada para complementar um projeto IoT.
      Também como foi falado no post, para obter dados mais precisos de geolocalização, recomenda-se um módulo GPS.

      Espero que coloque em prática o projeto!

      Abraço!