|
| 1 | +# Arduino HomeKit ESP8266 (PT-BR) |
| 2 | + |
| 3 | +**Original:** [Inglês](https://github.com/Mixiaoxiao/Arduino-HomeKit-ESP8266) |
| 4 | + |
| 5 | +**Tradutor:** [Rodolfo Vieira](https://github.com/rodolfovieira95) |
| 6 | +## Biblioteca para ESP8266/ESP32 Arduino de um server de acessório para o Apple HomeKit |
| 7 | + |
| 8 | +Essa biblioteca do Arduino é uma implementação para um acessório nativo do Apple HomeKit[ESP8266 Arduino core](https://github.com/esp8266/Arduino), e funciona sem uma "bridge" (ponte) adicional. |
| 9 | + |
| 10 | +Este projeto é principalmente baseado no [esp-homekit](https://github.com/maximkulkin/esp-homekit) para [ESP-OPEN-RTOS](https://github.com/SuperHouse/esp-open-rtos). |
| 11 | + |
| 12 | +Eu portei a implementação do RTOS-based do [esp-homekit](https://github.com/maximkulkin/esp-homekit) para o ambiente puro do Arduino, focado em uma build de projeto fácil e rápida usando a IDE do Arduino (ou Eclipse com sloeber, PlatformIO). |
| 13 | + |
| 14 | +Aproveite a build "one-key", "one-key" upload, e trabalhe ligando diversas outras bibliotecas do Arduino com Apple HomeKit! |
| 15 | + |
| 16 | +Aqui está a [discussão](https://github.com/HomeACcessoryKid/Arduino-HomeKit/issues/1) sobre a necessidade do RTOS para implementar o Apple HomeKit, e o projeto é a prova de conceito de que o Apple HomeKit pode ser implementado e funciona sem o RTOS. |
| 17 | + |
| 18 | +A biblioteca foi feita com o ESP8266 Arduino Core 2.6.3. Versões anteriores podem compilar com erros. |
| 19 | + |
| 20 | + |
| 21 | +## ESP32 agora é suportado (2020-04-15) |
| 22 | + |
| 23 | +Confira a pasta do "ESP32 HomeKit" |
| 24 | + |
| 25 | +Isso é a versão "only-can-work" (apenas-pode-funcionar) para o ESP32 sem o merge na biblioteca original. Ainda há algumas melhorias a serem realizadas. |
| 26 | + |
| 27 | +O `WolfSSL` usado para o ESP32 é baseado na versão `4.3.0-stable` sem **Suporte a Aceleração de Hardware**. |
| 28 | + |
| 29 | +O HomeKit rodando no ESP32 tem uma **BOA PERFORMANCE** em que a configuração do pareamento pode ser feito em até ˜1,2s e a verificação do pareamento em < 0,1s (10x mais rápido que o ESP8266). |
| 30 | + |
| 31 | +O armazenamento do HomeKit no ESP32 é baseado no `nvs`. |
| 32 | + |
| 33 | +#### Performance COM a Aceleração de Hardware no ESP32 |
| 34 | + |
| 35 | +* Pré-inicialização: ~0.53s |
| 36 | +* Passo de Configuração do Pareamento 1/3: ~0s (A criptografia pesada é computada no passo de pré-inicialização) |
| 37 | +* Passo de Configuração do Pareamento 2/3: ~0.53s |
| 38 | +* Passo de Configuração do Pareamento 3/3: ~0.20s |
| 39 | +* Passo de Verificação do Pareamente 1/2: ~0.05s |
| 40 | +* Passo de Verificação do Pareamente 2/2: ~0.02s |
| 41 | + |
| 42 | +#### Performance SEM a Aceleração de Hardware no ESP32 |
| 43 | + |
| 44 | +* Pré-inicialização: ~2.2s |
| 45 | +* Passo de Configuração 1/3: ~0s (A criptografia pesada é computada no passo de pré-inicialização) |
| 46 | +* Passo de Configuração do Pareamento 2/3: ~2.5s |
| 47 | +* Passo de Configuração do Pareamento 3/3: ~0.1s |
| 48 | +* Passo de Verificação 1/2 do Pareamente: ~0.06s |
| 49 | +* Passo de Verificação 2/2 do Pareamente: ~0.03s |
| 50 | + |
| 51 | +## O conteúdo a seguir é apenas para o ESP8266 |
| 52 | + |
| 53 | +Este readme será refatorado na próxima versão. |
| 54 | + |
| 55 | +## Preview |
| 56 | + |
| 57 | + |
| 58 | + |
| 59 | + |
| 60 | +## Código de configuração do sketch de exemplo |
| 61 | + |
| 62 | +``111-11-111`` |
| 63 | + |
| 64 | + |
| 65 | +## Usabilidade |
| 66 | + |
| 67 | +1. Defina o seu acessório em um arquivo .c e aproveite a declaração da "Macro" convenientementeto estilizada. Você pode definir seu acessório em um arquivo .ino usando código C++. |
| 68 | + |
| 69 | + ```C |
| 70 | + homekit_accessory_t *accessories[] = ... |
| 71 | + homekit_server_config_t config = { |
| 72 | + .accessories = accessories, |
| 73 | + .password = "111-11-111", |
| 74 | + //.on_event = on_homekit_event, //opcional |
| 75 | + //.setupId = "ABCD" //opcional |
| 76 | + }; |
| 77 | + ``` |
| 78 | + |
| 79 | +2. No seu sketch |
| 80 | + ```C |
| 81 | + #include <arduino_homekit_server.h>; |
| 82 | + |
| 83 | + //access the config defined in C code |
| 84 | + extern "C" homekit_server_config_t config; |
| 85 | + |
| 86 | + void setup() { |
| 87 | + WiFi.begin(ssid, password); |
| 88 | + arduino_homekit_setup(&config); |
| 89 | + } |
| 90 | + |
| 91 | + void loop() { |
| 92 | + arduino_homekit_loop(); |
| 93 | + } |
| 94 | + ``` |
| 95 | +Pronto. |
| 96 | + |
| 97 | +## Performance |
| 98 | + |
| 99 | +Aviso: Você deve definir a CPU do ESP8266 rodando em 160MHz (ao menos durante o processo de pareamento), para evitar que o tcp-socket disconecte do dispositivo iOS causado pelo timeout. |
| 100 | + |
| 101 | +* Pré-inicialização: ~9,1s (Você pode ver o acessório no seu aplicativo CASA para iOS após a Pré-inicialização) |
| 102 | +* Passo de Configuração do Pareamento 1/3: ~0s (A criptografia pesada é computada no passo de pré-inicialização) |
| 103 | +* Passo de Configuração do Pareamento 2/3: ~12.1s |
| 104 | +* Passo de Configuração do Pareamento 3/3: ~0.8s (A configuração de pareamento apenas é precessada quando pareado a primeira vez com o dispositivo iOS) |
| 105 | +* Passo de Verificação do Pareamente 1/2: ~0.3s |
| 106 | +* Passo de Verificação do Pareamente 2/2: ~0.8s (O passo de verificação é requerido toda vez que o iOS conecta ou reconecta com o ESP8266 para estabelecer uma conexão segura) |
| 107 | + |
| 108 | +Todo processo de pareamento leva ~14s após você inserir o código de configuração no seu iPhone. Note que a Pré-inicialização requer ~9s antes de iniciar o pareamento. |
| 109 | + |
| 110 | + |
| 111 | +## Heap (memória) |
| 112 | + |
| 113 | +O heap é critico para o suporte do ESP8266 com TCP/IP completo. O ESP8266 trava facilmente quando a memória é inferior a ~5000. |
| 114 | + |
| 115 | +Eu tentei fazer a criptografia do WolfSSL funcionar no ESP8266 com uma performance melhor e com um trade-off de memória menor. Veja em detalhes na próxima seção. |
| 116 | + |
| 117 | +Aqui estão os valores de heap livres rodando o sketch: |
| 118 | + |
| 119 | +* Inicialização (Boot): ~26000 |
| 120 | +* Durante a pré-inicialização: ~22000 |
| 121 | +* Pareamento: ~17000 (or even low when crypto computing) |
| 122 | +* Pareado e conectado com o dispositivo iOS: ~21700 |
| 123 | +* Pareado e sem um device iOS conectado: ~23400 |
| 124 | + |
| 125 | +Após a otimização da memória na versão v1.1.0: |
| 126 | + |
| 127 | +* Inicialização (Boot): ~46000 |
| 128 | +* Durante a pré-inicialização: ~41000 |
| 129 | +* Pareamento: ~37000 (ou ainda menor com criptografia computacional) |
| 130 | +* Pareado e conectado com o dispositivo iOS: ~41700 |
| 131 | +* Pareado e sem um device iOS conectado: ~43000 |
| 132 | + |
| 133 | + |
| 134 | +## WolfSSL |
| 135 | + |
| 136 | +* Baseado no wolfssl-3.13.0-stable. |
| 137 | +* Código fonte limpo: os arquivos não utilizados foram removidos. |
| 138 | +* `CURVE25519_SMALL` e `ED25519_SMALL`: ESP8266 não consegue rodar diretamente sem o `SMALL` definido uma vez que a memória não seja suficiente. Mas a versão NÃO `SMALL` é mais rápida. Eu marquei o grande `ge_precomp base[32][8]` com PROGMEM para o armazenar na Flash (por volta de 70KB). O `ge_double_scalarmult_vartime` também pode não rodar pela falta de heap. Eu defini `ESP_GE_DOUBLE_SCALARMULT_VARTIME_LOWMEM` no `user_settings.h` para usar a versão LOWMEM do `ge_double_scalarmult_vartime` no `ge_low_mem.c`. Isso é um trade-off de performance e memória. Se você quiser mais espaço em Flash, você deve definir `CURVE25519_SMALL` e `ED25519_SMALL` e não definir `ESP_GE_DOUBLE_SCALARMULT_VARTIME_LOWMEM` no `user_settings.h` (isso fará com que os Passos de Verificação vão levar aproximadamente 1.2s + 0.9s) |
| 139 | +* `integer.c`(operaçoes com big integer): `MP_16BIT` e `ESP_FORCE_S_MP_EXPTMOD` são definidos para melhorar a performance no ESP8266. `ESP_INTEGER_WINSIZE` (o valor é 3) é definido para evitar o travamento por conta da exaustão da memória e os valores de {3, 4, 5} são de performance similar. |
| 140 | + |
| 141 | +## Armazenamento |
| 142 | + |
| 143 | +* O pareamente de dados é armazenado no endereço da `EEPROM` no ESP8266 Arduino core. |
| 144 | +* Esse projeto não utiliza a biblioteca `EEPROM` com cache de dados para reduzir o uso de memória (chama diretamente a leitura e escrita de flash) |
| 145 | +* O `EEPROM` é 4096B no ESP8266, esse projeto utiliza no máximo [0,1408B) |
| 146 | +* Veja os comentários no `storge.c` e [ESP8266-EEPROM-doc](https://arduino-esp8266.readthedocs.io/en/2.6.3/libraries.html#eeprom). |
| 147 | +* `EEPROM` de [1408, 4096) é mais seguro para você usar. |
| 148 | +* Esse projeto NÃO utiliza `FS(file system)`, então você pode utilizar `FS` livremente. |
| 149 | + |
| 150 | + |
| 151 | +## WatchDog |
| 152 | + |
| 153 | +* Existem watchdogs via hardware e software no ESP8266 Arduino core. A criptografia computacional pesada levará o watchdog a resetar. |
| 154 | +* Existe uma API que habilita/desabilita o watchdog via software no ESP8266 Arduino core. |
| 155 | +* Eu encontrei o [esp_hw_wdt](https://github.com/ComSuite/esp_hw_wdt) para habilitar/desabilitar o watchdog via hardware. |
| 156 | +* Os dois watchdogs são desabilitados durante a `Pré-inicialização` e `Passo de Configuração do Pareamento 2/3`. |
| 157 | + |
| 158 | +## Recomendação de configurações da IDE |
| 159 | + |
| 160 | +* Placa: Generic ESP8266 Module (para habilitar todas as configurações) |
| 161 | +* Flash Size: ao menos 470KB para o sketch (veja a seção `WolfSSL` se quiser um sketch menor) |
| 162 | +* LwIP Variant: v2 Lower Memory (para menor uso de memória) |
| 163 | +* Debug Level: Nenhum (para menor uso de memória) |
| 164 | +* Espressif FW: nonos-sdk 2.2.1+119(191122) (o qual usei para rodar esse projeto) |
| 165 | +* SSL Support: Basic SSL ciphers (menor uso de ROM) |
| 166 | +* VTables: Flash (talvez não faça diferença) |
| 167 | +* Erase Flash: selecione `All Flash Contents` quando você fizer o upload pela primeira vez |
| 168 | +* CPU Frequency: 160MHz (OBRIGATÓRIO) |
| 169 | + |
| 170 | +## Porta do Arduino |
| 171 | + |
| 172 | +* `ESP8266WiFi` (WiFiServer e WiFiClient) são usadas para conexão tcp. |
| 173 | +* `ESP8266mDNS` é usado para advertising (Bonjour) |
| 174 | + |
| 175 | +## TODO |
| 176 | + |
| 177 | +* Versão do ESP32 Arduino (ESP32 Arduino é baseado no RTOS e não é difícil de portar). |
| 178 | + |
| 179 | + |
| 180 | +## Mais exemplos e demos |
| 181 | + |
| 182 | +* Veja [esp-homekit-demo](https://github.com/maximkulkin/esp-homekit-demo) |
| 183 | + |
| 184 | +## Troubleshooting |
| 185 | + |
| 186 | +* Cheque a saída da sua porta serial com [example_serial_output.txt](https://raw.github.com/Mixiaoxiao/Arduino-HomeKit-ESP8266/master/extras/example_serial_output_v1.1.0.txt) |
| 187 | + |
| 188 | + |
| 189 | +## Change Log |
| 190 | + |
| 191 | +#### v1.1.0 |
| 192 | +* Otimização de memória: Constantes String/byte movidas o máximo possível para Flash. A seção `RODATA` do `bin` é de apenas 4672. Aproximadamente ~20K extra de free-heap está disponível nessa versão em comparação com a v1.0.1. |
| 193 | +* Upload [ESP8266WiFi_nossl_noleak](https://github.com/Mixiaoxiao/Arduino-HomeKit-ESP8266/tree/master/extras/ESP8266WiFi_nossl_noleak/), da versão `nossl` e `noleak` oficial da biblioteca `ESP8266WiFi` do Arduino Core 2.6.3. Remoção de todo código `SSL` para salvar memória(extra ~3K) sendo que o HomeKit não requer SSL. Coreção de memory-leak no `WiFiClinet.stop()` ao adicionar `tcp_abandon(_pcb, 0)` no `stop()`, baseado na ideia do[esp8266/Arduino/pull/2767](https://github.com/esp8266/Arduino/pull/2767). |
| 194 | + |
| 195 | +#### v1.0.1 |
| 196 | +* Redução do `winsize` de `3` para `2` (mesma performance) para diminuir o heap requirido. O pareamento consegue ser feito com diminuição de free-heap de ~14000. |
| 197 | +* Especificando o MDNS roda no IPAddress do STA para certificar que o HomeKit consegue trabalhar com alguma biblioteca SoftAp-based WiFi-Config. |
| 198 | +* Renomeado os`HTTP_METHOD`(s) no `http_parser.h` para evitar erros de multipla definição quando estiver usando o `ESP8266WebServer` em conjunto. |
| 199 | + |
| 200 | +## Agradecimentos |
| 201 | +* [esp-homekit](https://github.com/maximkulkin/esp-homekit) |
| 202 | +* [esp-homekit-demo](https://github.com/maximkulkin/esp-homekit-demo) |
| 203 | +* [esp_hw_wdt](https://github.com/ComSuite/esp_hw_wdt) |
| 204 | +* [WolfSSL/WolfCrypt](https://www.wolfssl.com/products/wolfcrypt-2/) |
| 205 | +* [cJSON](https://github.com/DaveGamble/cJSON) |
| 206 | +* [cQueue](https://github.com/SMFSW/cQueue) |
| 207 | + |
0 commit comments