Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PROTOCOLO DE COMUNICAÇÃO SONUS HOME <--> SONUS HOME APP
- A comunicação se dá por comandos/respostas ou por notificação de eventos. Comandos são peticionados pelo app e recebem, obrigatoriamente, uma resposta.
- Todo comando seguirá esta assinatura:
- {
- "type": "tipo de mensagem",
- "value": pode ter qualquer formato, inclusive ser nulo, a depender do tipo de mensagem
- }
- Antes de enviar a string, prefixar um número identificador de mensagem de 5 caracteres aleatórios. A ideia é que, se uma mensagem acabar ficando maior que o MTU, as suas partes possam ser montadas de novo sem embaralhar-se com outras mensagens. A terminação da mensagem é indicada por um caractere de '%'.
- Na hora de enviar a resposta, a mesma lógica será respeitada: CÓDIGO + resposta + %. O código do comando correspondente é reaproveitado. A resposta é um JSON que varia de caso a caso. Em muitos casos ela é nula; deve ser enviada mesmo assim.
- As notificações serão identificadas por meio de códigos especiais (não aleatórios), como ELOUD, EOBST ou EPWRC. Após o código, um número incremental de 3 dígitos é adicionado para que notificações possam ser discernidas, mesmo quando fragmentadas em múltiplos pacotes. Mais detalhes na sequência.
- A seguir, considerações sobre autenticação da comunicação entre celular e Sonus.
- 1. Quando um smartphone conecta-se ao Sonus, a sessão BT estará inicialmente bloqueada. Enquanto bloqueada, o único comando aceito é o de desbloqueio de sessão.
- 2. O desbloqueio é intermediado pelo servidor. O Sonus gera um nonce, que é uma string aleatória. Internamente, atribui um prazo de expiração curto para este nonce. O nonce é entregue por BT ao smartphone, que irá, por sua vez, encaminhar o nonce recebido ao servidor.
- 3. Se o servidor julgar que o usuário requerente está autorizado a configurar o Sonus, ele devolverá uma digest sobre o nonce. Esta digest é produzida com uma chave privada, sendo que a contraparte pública dela já está gravada na flash do Sonus.
- 4. Se autorizado, o app encaminhará a assinatura do nonce ao Sonus. Sendo respeitado prazo de expiração, a sessão deverá ser desbloqueada.
- Lista de comandos previstos:
- type: getSessionUnlockNonce
- value: null
- - Resposta: {"nonce": string}
- type: unlockSession,
- value: assinatura do nonce recebida do servidor, codificada em base64
- - Resposta: {"success": true/false}
- type: getDeviceStatus
- value: null
- - Resposta: {
- "currentSsidBase64": string/null, // codificada em b64
- "internetAvailable": true/false,
- "rtcValid": bool,
- "powered": bool,
- "obstructed": bool,
- "firmwareVersion": int,
- "obstructionSensitivity": "low"/"medium"/"high",
- "loudnessThreshold": int,
- "ledsEnabled": bool
- }
- type: getWifiNetworks
- value: null
- - Resposta: [
- {
- "ssidBase64": string, // codificada em b64
- "strength": int,
- "protected": boolean
- },
- ...
- ]
- type: connectWifi
- value: {"ssidBase64": string, "passwordBase64": string/null}
- - Resposta: {"result": success/wrongPassword/missing/noInternet}
- type: setObstructionSensitivity
- value: "low"/"medium"/"high"
- - Resposta: null
- type: setLedsEnabled
- value: true/false
- - Resposta: null
- type: setThreshold
- value: int
- - Resposta: null
- Lista de notificações previstas:
- código: ELOUD
- corpo: {"loudness": float, "timestamp": data no formato ISO8601}
- código: EOBST
- corpo: {"obstructed": true/false}
- código: EPWRC
- corpo: {"powered": bool, "routerReachable": bool}
- EXEMPLOS:
- Conectando o Wi-Fi, considerando um MTU de 40 caracteres:
- comando: código_aleatório + {"ssid": base64("Rede exemplo"), "password": base64("senha123")} + %
- Digamos que o código seja DFEYJ. As seguintes mensagens são enviadas:
- - DFEYJ{"ssid": "UmVkZSBleGVtcGxv", "passw
- - DFEYJord": "c2VuaGExMjM="}%
- Cada parte começa com o código DFEYJ. A última parte termina com um %. A mensagem tem, no máximo, 40 caracteres devido ao MTU hipotético.
- Seguindo para a resposta: mesmo_codigo + {"result": "success"} + %
- Produz a mensagem: DFEYJ{"result": "success"}%
- Seguindo para outro exemplo, o Sonus enviará notificações de medições instantâneas.
- mensagem completa: ELOUD + 001 + {"loudness": 66.8, "timestamp": 2026-11-04T20:47:44.618328+00:00} + %
- se ela precisar ser dividida, será desta forma:
- - ELOUD + 001 + parte_1
- - ELOUD + 001 + parte_2 + %
- A próxima notificação deste mesmo tipo usará o código 002. Ao chegar em 999, o contador reseta.
Add Comment
Please, Sign In to add comment