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() {
};