Vinculação à conta¶
A vinculação é um procedimento único: o dispositivo recebe um token de vinculação de uso único, troca no portal por um segredo permanente e salva o segredo na NVS. Depois ele conecta sozinho ao portal a cada reinício. Enquanto não tem segredo, o dispositivo fica em modo de configuração e espera um token.
No app iDryer¶
- O dispositivo está na rede (veja Wi-Fi), o celular na mesma rede.
- Conectar novo dispositivo → passo Vinculação (se o dispositivo já estiver na rede, toque no chip do passo no topo da janela) → Vincular.
- O app encontra o dispositivo na rede local, pega um token no portal, entrega ao dispositivo e espera o portal confirmar que o dispositivo está online.
- Depois de Dispositivo vinculado, o dispositivo está na lista do portal e do app.
O log antes da vinculação:
[BOOT] WiFi ok, logs enabled
[INFO ] CLOUD: WiFi connected, IP: 192.168.1.42, RSSI: -55 dBm, …
…
[INFO ] CLOUD: binding-v3: no secret — awaiting pairing token (SETUP)
Depois:
[INFO ] CLOUD: binding-v3: pairing token received (… chars)
[INFO ] CLOUD: binding-v3: activating with pairing token (serial=DEVICE_… mcu=-)
[INFO ] CLOUD: binding-v3: activated, deviceId=… -> Ready
…
[INFO ] MQTT: Connected! …
O instalador web de firmware passa o token pela USB com o comando PAIR_TOKEN (veja abaixo).
Desvinculação¶
A desvinculação no app ou no portal chega ao dispositivo como o comando revoke. Todo firmware precisa do handler:
// Desvinculação no app ou no portal: apagar o segredo e esperar uma nova vinculação.
s_link.onCommand("revoke", [](JsonObjectConst) { s_link.handleRevoke(); });
handleRevoke() apaga o segredo e mantém a rede: o dispositivo volta a esperar a vinculação. Sem o handler, o segredo fica no dispositivo, e só dá para vincular de novo depois de WIPE_IDENTITY.
Comandos pela USB¶
Depois de entrar na rede, o núcleo aceita linhas na porta serial (115200, cada linha termina com uma quebra de linha):
| Comando | Resposta | O que faz |
|---|---|---|
STATUS |
STATUS:state=… wifi=… ip=… cloud=… serial=… mcu=… fw=… part=… |
estado: state é bound (vinculado) ou setup (espera um token), cloud é online/offline |
WIPE_IDENTITY |
WIPE_IDENTITY:OK |
apaga o segredo como revoke; a rede continua |
PAIR_TOKEN:<token> |
PAIR_TOKEN:OK, PAIR_TOKEN:ERROR, PAIR_TOKEN:ERROR:ALREADY_BOUND |
passa um token de vinculação; um dispositivo vinculado não aceita |
STATUS
STATUS:state=setup wifi=1 ip=192.168.1.42 cloud=offline serial=DEVICE_… mcu=- fw=0.1.0 part=…
Antes de entrar na rede, a porta está ocupada pelo Improv e os comandos não respondem. Num build com IDRYER_DEV_REPL, a porta é do produto e esses comandos não existem: veja Configuração detalhada.
Se não deu certo¶
- o app não acha o dispositivo: celular e dispositivo na mesma rede; redes de convidados costumam bloquear a descoberta de dispositivos;
PAIR_TOKEN:ERROR:ALREADY_BOUND, ou o dispositivo é de outra conta: desvincule no portal ou envieWIPE_IDENTITYe vincule de novo.