segunda-feira, 6 de abril de 2020

WINDOWS 7 ACESSANDO NINA

CRIANDO UMA APLICAÇÃO EM NODEJS (WINDOWS 7) PARA ACESSAR OS 

MÓDULOS NINA

O objetivo deste BLOG é demonstrar como é possível utilizar o NODEJS para criar uma aplicação no WINDOWS 7 (ble não nativo) para fazer um SCAN nos dispositivos NINA que estejam fazendo advertising de dados. Foi utilizado o EVK-NINA-W para o teste o qual foi utilizado para ser o peripheral para SCAN e criado alguns serviços!


A Node.js BLE (Bluetooth Low Energy) central module.


O que é Node.js?

Node.js não é uma linguagem de programação. Você programa utilizando a linguagem JavaScript, a mesma usada há décadas no client-side das aplicações web. Javascript é uma linguagem de scripting interpretada, embora seu uso com Node.js guarde semelhanças com linguagens compiladas, uma vez que máquina virtual V8 (veja mais adiante) faz etapas de pré-compilação e otimização antes do código entrar em operação.

Node.js não é um framework Javascript. Ele está mais para uma plataforma de aplicação, na qual você escreve seus programas com Javascript que serão compilados, otimizados e interpretados pela máquina virtual V8. Essa VM é a mesma que o Google utiliza para executar Javascript no browser Chrome, e foi a partir dela que o criador do Node.js, Ryan Dahl, criou o projeto. O resultado desse processo híbrido é entregue como código de máquina server-side, tornando o Node.js muito eficiente na sua execução e consumo de recursos.

Node.js é uma tecnologia assíncrona que trabalha em uma única thread de execução. Por assíncrona entenda que cada requisição ao Node.js não bloqueia o processo do mesmo, atendendo a um volume absurdamente grande de requisições ao mesmo tempo mesmo sendo single thread.

Imagine que existe apenas um fluxo de execução (chamado de Event Loop). Quando chega uma requisição, ela entra nesse fluxo, a máquina virtual Javascript verifica o que tem de ser feito, delega a atividade (consultar dados no banco, por exemplo) e volta a atender novas requisições enquanto este processamento paralelo está acontecendo. Quando a atividade termina (já temos os dados retornados pelo banco), ela volta ao fluxo principal para ser devolvida ao requisitante.

Isso é diferente do funcionamento tradicional da maioria das linguagens de programação, que trabalham com o conceito de multi-threading, onde, para cada requisição recebida, cria-se uma nova thread para atender à mesma. Isso porque a maioria das linguagens tem comportamento bloqueante na thread em que estão, ou seja, se uma thread faz uma consulta pesada no banco de dados, a thread fica travada até essa consulta terminar.


Esse modelo de trabalho tradicional, com uma thread por requisição (multi-thread) é mais fácil de programar, mas mais oneroso para o hardware, consumindo muito mais recursos.

Requisitos para instalação para o Aplicativo BLE


  • INSTALE O VISUAL STUDIO COMMUNITY (custom, programming language: Visual C++) https://visualstudio.microsoft.com/pt-br/
  • INSTALE PYTHON 2.7 (habilite o PATH) (www.python.org)
  • INSTALE NODEJS (www.nodejs.org)
Tenha em mãos um destes BLE USB



  • ZADIG (http://zadig.akeo.ie/)

Baixe o Zadig e execute-o - é apenas um executável
Vá para Opções -> Listar todos os dispositivos
Escolha o seu adaptador BLE (o meu é CSR8510 A10)
Certifique-se de que o WinUSB esteja definido como o driver



  • BAIXE OS EXEMPLOS NOBLE EM C:\ QUE SE ENCONTRAM EM

Se você tem o GIT instalado no seu PC, pode usar
C:\git clone https://github.com/noble/noble
ou pegar o ZIP e descompactar em C:\




  • INSTALE OS PACOTES DO NODEJS



  • ENTRE EM EXEMPLOS E EXECUTE
C:\noble\examples>node advertisement-discovery.js


Agora marque o MAC do dispositivo CONNECTABLE seu, no caso, db:9c:ed:d2:a2:f7

E execute

C:\noble\examples>node peripheral-explorer.js db:9c:ed:d2:a2:f7


Veja os serviços e caracteristicas do BLE peripheral

SOBRE BLE (RESUMO)

Esta é uma breve introdução ao BLE e não chega perto de toda a história.

O BLE não é uma atualização para o Bluetooth Classic, é um sistema diferente com diferentes usos pretendidos. O BLE funciona de uma maneira muito diferente do Bluetooth anterior. O BLE foi projetado para aplicações de baixa energia e consegue isso usando pacotes de dados pequenos e pouco frequentes. Na verdade, ele não foi projetado para conexões contínuas e grandes quantidades de dados. Para isso, o Bluetooth Classic é uma escolha melhor. Em essência, o BLE atinge seu baixo consumo de energia por não estar conectado com muita frequência, ao contrário do Bluetooth Classic, que mantém uma conexão constante.

Existem duas maneiras pelas quais os dispositivos BLE podem se comunicar; Emissora + Observadora e Central + Periférica.

Com o Broadcaster + Observer, não há uma conexão padrão, o Broadcaster, geralmente algum tipo de sensor, envia sinais periódicos (pacotes de publicidade) que o Observer escuta. O radiodifusor normalmente não sabe se algo está escutando ou não.
O cenário Central + Periférico é mais parecido (mas não exatamente o mesmo) que a conexão clássica. Quando o dispositivo central (mestre) encontra um dispositivo periférico (escravo) ao qual deseja se conectar, inicia uma conexão e assume a função principal de gerenciar a conexão e os tempos.
Como o Bluetooth Classic pressupõe que você usará uma única conexão, a conexão será estabelecida por um tempo e não precisará ser particularmente rápida na conexão. O BLE, por outro lado, foi projetado para fazer muitas conexões de curto prazo e, portanto, foi projetado para conectar e desconectar muito rapidamente.

BLE é tudo sobre serviços e características. Um serviço é uma coleção de características relacionadas e uma característica é onde os dados estão. Em um dispositivo BLE típico, você pode ter um serviço que contém características relacionadas às propriedades dos módulos, como; o nome do fabricante, o nome do dispositivo, o ID do firmware e / ou o número da versão. Também pode ter um segundo serviço que agrupa as características que mantêm os dados reais. Podem ser coisas como temperatura, umidade, brilho. Isso significa que, para usar o BLE, você geralmente precisa conhecer as características que deseja usar (mais especificamente os UUIDs para as características).

Com o BLE, os valores dessas propriedades estão disponíveis o tempo todo. Se você quiser saber o nome do fabricante, leia a válvula na característica do nome do fabricante. Se você quiser saber a temperatura, leia o valor da característica de temperatura. Isso é muito diferente de como o Bluetooth clássico funciona. Com o Bluetooth clássico, você tem apenas um canal de comunicação e todos os dados são enviados por um canal.

Cada serviço e característica possui um identificador exclusivo chamado UUID. Este é basicamente um número de 24 bits.

PREPARANDO AMBIENTE PARA PROGRAMAR O NINA W102

Baixe e instale a última versão da IDE do Arduino

https://www.arduino.cc/en/Main/Software

Execute a IDE do Arduino e click em files-->preferences


e digite
https://dl.espressif.com/dl/package_esp32_index.json e click OK

Vá agora em Tools > Board > Boards Manager



Procure por "ESP32 by Espressif" e instale


Aguarde alguns minutos para instalação do SDK. 

Selecione em tools-->board o módulo u-blox NINA-W10 series



Crie um Sketch novo e copie o programa abaixo

Exemplo ble_server

/*
    Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleServer.cpp
    Ported to Arduino ESP32 by Evandro Copercini
    updates by chegewara
*/

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");

  BLEDevice::init("Long name works now");
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setValue("Hello World says Neil");
  pService->start();
  // BLEAdvertising *pAdvertising = pServer->getAdvertising();  // this still is working for backward compatibility
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);  // functions that help with iPhone connections issue
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
  Serial.println("Characteristic defined! Now you can read it in your phone!");
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(2000);
}
Atualize os BINS abaixo do Package ESP32

INSTALE AS BLE LIBS DE KOLBAN

Agora compile



Selecione a COM, pressione o botão BOOT e então RESET no EVK-NINA-W e transfira o programa




OBERVE OS ID

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

Veja o SCAN encontrou o Serviço!



Mãos à obra, faça um exemplo para ler a Característica!

Veja os métodos aqui



BLE SCAN PC COM VISUAL C#

Projeto completo


Questões: suporte@smartcore.com.br

FONTES: 


https://www.youtube.com/watch?v=mL9B8wuEdms&app=desktop


Sobre a SMARTCORE

A SmartCore fornece módulos para comunicação wireless, biometria, conectividade, rastreamento e automação.
Nosso portfólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.
Mais detalhes em www.smartcore.com.br