bernardolansing

Protocolo de comunicação BT Sonus Home

Nov 3rd, 2026 (edited)
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.48 KB | None | 0 0
  1. PROTOCOLO DE COMUNICAÇÃO SONUS HOME <--> SONUS HOME APP
  2.  
  3. 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.
  4.  
  5. Todo comando seguirá esta assinatura:
  6. {
  7. "type": "tipo de mensagem",
  8. "value": pode ter qualquer formato, inclusive ser nulo, a depender do tipo de mensagem
  9. }
  10. 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 '%'.
  11.  
  12. 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.
  13.  
  14. 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.
  15.  
  16.  
  17.  
  18. A seguir, considerações sobre autenticação da comunicação entre celular e Sonus.
  19.  
  20. 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.
  21.  
  22. 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.
  23.  
  24. 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.
  25.  
  26. 4. Se autorizado, o app encaminhará a assinatura do nonce ao Sonus. Sendo respeitado prazo de expiração, a sessão deverá ser desbloqueada.
  27.  
  28. Lista de comandos previstos:
  29.  
  30. type: getSessionUnlockNonce
  31. value: null
  32.  
  33. - Resposta: {"nonce": string}
  34.  
  35. type: unlockSession,
  36. value: assinatura do nonce recebida do servidor, codificada em base64
  37.  
  38. - Resposta: {"success": true/false}
  39.  
  40. type: getDeviceStatus
  41. value: null
  42.  
  43. - Resposta: {
  44. "currentSsidBase64": string/null, // codificada em b64
  45. "internetAvailable": true/false,
  46. "rtcValid": bool,
  47. "powered": bool,
  48. "obstructed": bool,
  49. "firmwareVersion": int,
  50. "obstructionSensitivity": "low"/"medium"/"high",
  51. "loudnessThreshold": int,
  52. "ledsEnabled": bool
  53. }
  54.  
  55. type: getWifiNetworks
  56. value: null
  57.  
  58. - Resposta: [
  59. {
  60. "ssidBase64": string, // codificada em b64
  61. "strength": int,
  62. "protected": boolean
  63. },
  64. ...
  65. ]
  66.  
  67. type: connectWifi
  68. value: {"ssidBase64": string, "passwordBase64": string/null}
  69.  
  70. - Resposta: {"result": success/wrongPassword/missing/noInternet}
  71.  
  72. type: setObstructionSensitivity
  73. value: "low"/"medium"/"high"
  74.  
  75. - Resposta: null
  76.  
  77. type: setLedsEnabled
  78. value: true/false
  79.  
  80. - Resposta: null
  81.  
  82. type: setThreshold
  83. value: int
  84.  
  85. - Resposta: null
  86.  
  87. Lista de notificações previstas:
  88.  
  89. código: ELOUD
  90. corpo: {"loudness": float, "timestamp": data no formato ISO8601}
  91.  
  92. código: EOBST
  93. corpo: {"obstructed": true/false}
  94.  
  95. código: EPWRC
  96. corpo: {"powered": bool, "routerReachable": bool}
  97.  
  98.  
  99. EXEMPLOS:
  100.  
  101. Conectando o Wi-Fi, considerando um MTU de 40 caracteres:
  102.  
  103. comando: código_aleatório + {"ssid": base64("Rede exemplo"), "password": base64("senha123")} + %
  104. Digamos que o código seja DFEYJ. As seguintes mensagens são enviadas:
  105. - DFEYJ{"ssid": "UmVkZSBleGVtcGxv", "passw
  106. - DFEYJord": "c2VuaGExMjM="}%
  107. 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.
  108.  
  109. Seguindo para a resposta: mesmo_codigo + {"result": "success"} + %
  110. Produz a mensagem: DFEYJ{"result": "success"}%
  111.  
  112. Seguindo para outro exemplo, o Sonus enviará notificações de medições instantâneas.
  113.  
  114. mensagem completa: ELOUD + 001 + {"loudness": 66.8, "timestamp": 2026-11-04T20:47:44.618328+00:00} + %
  115. se ela precisar ser dividida, será desta forma:
  116. - ELOUD + 001 + parte_1
  117. - ELOUD + 001 + parte_2 + %
  118.  
  119. 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