Pular para o conteúdo principal

wave

Funções para interação local com outros dispositivos através do protocolo mhoWAVE. Com esse protocolo é possível transmitir objetos com outros dispositivos da linha sem fio, a comunicação é baseada em Wi-Fi peer to peer, sem necessidade de um roteador Wi-Fi para estabelecer conexão entre os dispositivos.

É possível estabelecer comunicação One-Way, Two-Way ou Mesh (como repetidor).

Características

  • Comunicação unicast criptografada ou não criptografada do tipo peer to peer;
  • Até 250 bytes de payload podem ser transportados;
  • Até 150 metros de distância com visada;
  • Até 400 metros de distância com visada no modo long-range;
  • Até 10 receptores conectados, utilizando criptografia;
  • Até 20 receptores conectados ao total, considerando peers criptografados e não criptografados.

wave.init

Inicia a configuração do protocolo. Ou seja, este dispositivo envia dados para outros dispositivos.

wave.init(long_range = false);

Resposta: true/falha

Onde:

  • long_range: define se o modo long range será utilizado, caso não informado não será utilizado.

wave.setup_emitter

Configura o dispositivo atual como um emissor. Ou seja, este dispositivo envia dados para outros dispositivos.

wave.setup_emitter();

Resposta: true/falha


wave.setup_receiver

Configura o dispositivo atual como um receptor. Ou seja, este dispositivo recebe dados de outros dispositivos.

wave.setup_receiver();

Resposta: true/falha


wave.add_receiver

Adiciona dispositivos que irão receber dados deste dispositivo. Ou seja, este dispositivo irá enviar dados para os dispositivos configurados aqui. É possível definir o canal de comunicação Wi-Fi e a chave de criptografia.

wave.add_receiver(mac, channel = 0, encrypt = "");

Resposta: true/falha

Onde:

  • mac: String que contem o endereço MAC do dispositivo que vai receber os dados deste dispositivo;
  • channel: canal de operação do Wi-Fi, definido como 0 caso não informado;
  • encrypt: chave de criptografia, deve ser a mesma definida no outro dispositivo.

wave.send

Envia objetos para os dispositivos que estão listados como receptores.

wave.send(mac, obj);

Resposta: true/falha

Onde:

  • mac: String que contem o endereço MAC do dispositivo que vai receber os dados deste dispositivo;
  • obj: objeto que guarda as informações de interesse dos outros dispositivos.

wave_callback

Função de callback que é chamada sempre que uma mensagem é recebida.

let wave_callback = function(mac, payload) {
log(mac);
log(payload);
};

Onde:

  • mac: String que contem o endereço MAC do dispositivo que enviou a mensagem;
  • payload: objeto com os dados de interesse da mensagem.


Exemplos

1 - Sem criptografia, One-Way

Neste exemplo temos dois dispositivos em uma comunicação One-Way.

  • Keeper #1: Este dispositivo envia dados para o outro dispositivo, este dispositivo tem o MAC fictício de EE:EE:EE:EE:EE:AA;
  • Keeper #2: Este dispositivo recebe dados do outro dispositivo, este dispositivo tem o MAC fictício de AA:AA:AA:AA:AA:BB;

Código para o Keeper #1 - Emissor:

let mac_keeper2 = "AA:AA:AA:AA:AA:BB";

let setup = function() {
wave.init();
wave.setup_emitter();
wave.add_receiver(mac_keeper2);
};

let loop = function() {
let envia_wave = {DI1: io.readDI(1), AI1: io.readAI(1, 'i', 0, 10)};
wave.send(mac_keeper2, envia_wave);
delay(5000);
};

Código para o Keeper #2 - Receptor:

let wave_callback = function(mac, payload) {
log("dado recebido do dispositivo => ", mac);
log(payload);
io.setDO(1, payload.DI1);
};

let setup = function() {
wave.init();
wave.setup_receiver();
};

let loop = function() {

};

2 - Sem criptografia, Two-Way

Neste exemplo temos dois dispositivos em uma comunicação Two-Way.

  • Keeper #1: Este dispositivo envia e recebe dados, este dispositivo tem o MAC fictício de EE:EE:EE:EE:EE:AA;
  • Keeper #2: Este dispositivo envia e recebe dados, este dispositivo tem o MAC fictício de AA:AA:AA:AA:AA:BB;

Código para o Keeper #1:

let mac_keeper2 = "AA:AA:AA:AA:AA:BB";

let wave_callback = function(mac, payload) {
log("dado recebido do dispositivo => ", mac);
log(payload);
io.setDO(1, payload.DI1);
};

let setup = function() {
wave.init();
wave.setup_receiver();
wave.setup_emitter();
wave.add_receiver(mac_keeper2);
};

let loop = function() {
let envia_wave = {DI1: io.readDI(1), AI1: io.readAI(1, 'i', 0, 10)};
wave.send(mac_keeper2, envia_wave);
delay(5000);
};

Código para o Keeper #2:

let mac_keeper1 = "EE:EE:EE:EE:EE:AA";

let wave_callback = function(mac, payload) {
log("dado recebido do dispositivo => ", mac);
log(payload);
io.setDO(1, payload.DI1);
};

let setup = function() {
wave.init();
wave.setup_receiver();
wave.setup_emitter();
wave.add_receiver(mac_keeper1);
};

let loop = function() {
let envia_wave = {DI1: io.readDI(1), AI1: io.readAI(1, 'i', 0, 10)};
wave.send(mac_keeper1, envia_wave);
delay(5000);
};

3 - Sem criptografia, Mesh

Neste exemplo temos três dispositivos em que um deles está atuando apenas como repetidor.

  • Keeper #1: Este dispositivo envia dados para o dispositivo final e para o repetidor, este dispositivo tem o MAC fictício de EE:EE:EE:EE:EE:AA;
  • Keeper #2: Este dispositivo recebe dados do repetidor e do dispositivo principal, este dispositivo tem o MAC fictício de AA:AA:AA:AA:AA:BB;
  • Keeper #R1: Este dispositivo recebe dados do Keeper #1 e envia-os para o Keeper #2, este dispositivo tem o MAC fictício de AA:AA:AA:AA:AA:CC;

Código para o Keeper #1 - Emissor:

let mac_keeper2 = "AA:AA:AA:AA:AA:BB";
let mac_keeperR1 = "AA:AA:AA:AA:AA:CC";

let setup = function() {
wave.init();
wave.setup_emitter();
wave.add_receiver(mac_keeper2);
wave.add_receiver(mac_keeperR1);
};

let loop = function() {
let envia_wave = {DI1: io.readDI(1), AI1: io.readAI(1, 'i', 0, 10)}; //payload padrão
let envia_wave_rep = {mac: mac_keeper2, payload: envia_wave}; //payload para o dispositivo repetidor
wave.send(mac_keeper2, envia_wave); //envia para o dispositivo principal
wave.send(mac_keeperRep1, envia_wave_rep); //envia para o repetidor
delay(50);
};

Código para o Keeper #R1 - Repetidor:

let mac_keeper2 = "AA:AA:AA:AA:AA:BB";

let wave_callback = function(mac, payload) {
log("dado recebido do dispositivo => ", mac);
log(payload);
wave.send(mac_keeper2, payload.payload); //envia o payload original para o keeper 2
};

let setup = function() {
wave.init();
wave.setup_receiver();
wave.setup_emitter();
wave.add_receiver(mac_keeper2);
};

let loop = function() {

};

Código para o Keeper #2 - Receptor:

let wave_callback = function(mac, payload) {
log("dado recebido do dispositivo => ", mac);
log(payload);
io.setDO(1, payload.DI1);
};

let setup = function() {
wave.init();
wave.setup_receiver();
};

let loop = function() {

};