Original: Inglês
Tradutor: Rodolfo Vieira
Essa biblioteca do Arduino é uma implementação para um acessório nativo do Apple HomeKitESP8266 Arduino core, e funciona sem uma "bridge" (ponte) adicional.
Este projeto é principalmente baseado no esp-homekit para ESP-OPEN-RTOS.
Eu portei a implementação do RTOS-based do 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).
Aproveite a build "one-key", "one-key" upload, e trabalhe ligando diversas outras bibliotecas do Arduino com Apple HomeKit!
Aqui está a discussão 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.
A biblioteca foi feita com o ESP8266 Arduino Core 2.6.3. Versões anteriores podem compilar com erros.
Confira a pasta do "ESP32 HomeKit"
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.
O WolfSSL
usado para o ESP32 é baseado na versão 4.3.0-stable
sem Suporte a Aceleração de Hardware.
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).
O armazenamento do HomeKit no ESP32 é baseado no nvs
.
- Preinit: ~0.53s
- Pair Setup Step 1/3: ~0s (A criptografia pesada é computada no passo de pré-inicialização)
- Pair Setup Step 2/3: ~0.53s
- Pair Setup Step 3/3: ~0.20s
- Pair Verify Step 1/2: ~0.05s
- Pair Verify Step 2/2: ~0.02s
- Preinit: ~2.2s
- Pair Setup Step 1/3: ~0s (A criptografia pesada é computada no passo de pré-inicialização)
- Pair Setup Step 2/3: ~2.5s
- Pair Setup Step 3/3: ~0.1s
- Pair Verify Step: ~0.06s
- Pair Verify Step: ~0.03s
Este readme será refatorado na próxima versão.
111-11-111
-
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++.
homekit_accessory_t *accessories[] = ... homekit_server_config_t config = { .accessories = accessories, .password = "111-11-111", //.on_event = on_homekit_event, //opcional //.setupId = "ABCD" //opcional };
-
No seu sketch
#include <arduino_homekit_server.h>; //access the config defined in C code extern "C" homekit_server_config_t config; void setup() { WiFi.begin(ssid, password); arduino_homekit_setup(&config); } void loop() { arduino_homekit_loop(); }
Pronto.
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.
- Preinit: ~9,1s (Você pode ver o acessório no seu aplicativo CASA para iOS após a Pré-inicialização)
- Pair Setup Step 1/3: ~0s (A criptografia pesada é computada no passo de pré-inicialização)
- Pair Setup Step 2/3: ~12.1s
- Pair Setup Step 3/3: ~0.8s (A configuração de pareamento apenas é precessada quando pareado a primeira vez com o dispositivo iOS)
- Pair Verify Step 1/2: ~0.3s
- Pair Verify Step 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)
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.
O heap é critico para o suporte do ESP8266 com TCP/IP completo. O ESP8266 trava facilmente quando a memória é inferior a ~5000.
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.
Aqui estão os valores de heap livres rodando o sketch:
- Inicialização (Boot): ~26000
- Durante a pré-inicialização: ~22000
- Pareamento: ~17000 (or even low when crypto computing)
- Pareado e conectado com o dispositivo iOS: ~21700
- Pareado e sem um device iOS conectado: ~23400
Após a otimização da memória na versão v1.1.0:
- Inicialização (Boot): ~46000
- Durante a pré-inicialização: ~41000
- Pareamento: ~37000 (ou ainda menor com criptografia computacional)
- Pareado e conectado com o dispositivo iOS: ~41700
- Pareado e sem um device iOS conectado: ~43000
- Baseado no wolfssl-3.13.0-stable.
- Código fonte limpo: os arquivos não utilizados foram removidos.
CURVE25519_SMALL
eED25519_SMALL
: ESP8266 não consegue rodar diretamente sem oSMALL
definido uma vez que a memória não seja suficiente. Mas a versão NÃOSMALL
é mais rápida. Eu marquei o grandege_precomp base[32][8]
com PROGMEM para o armazenar na Flash (por volta de 70KB). Oge_double_scalarmult_vartime
também pode não rodar pela falta de heap. Eu definiESP_GE_DOUBLE_SCALARMULT_VARTIME_LOWMEM
nouser_settings.h
para usar a versão LOWMEM doge_double_scalarmult_vartime
noge_low_mem.c
. Isso é um trade-off de performance e memória. Se você quiser mais espaço em Flash, você deve definirCURVE25519_SMALL
eED25519_SMALL
e não definirESP_GE_DOUBLE_SCALARMULT_VARTIME_LOWMEM
nouser_settings.h
(isso fará com que os Passos de Verificação vão levar aproximadamente 1.2s + 0.9s)integer.c
(operaçoes com big integer):MP_16BIT
eESP_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.
- O pareamente de dados é armazenado no endereço da
EEPROM
no ESP8266 Arduino core. - 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) - O
EEPROM
é 4096B no ESP8266, esse projeto utiliza no máximo [0,1408B) - Veja os comentários no
storge.c
e ESP8266-EEPROM-doc. EEPROM
de [1408, 4096) é mais seguro para você usar.- Esse projeto NÃO utiliza
FS(file system)
, então você pode utilizarFS
livremente.
- Existem watchdogs via hardware e software no ESP8266 Arduino core. A criptografia computacional pesada levará o watchdog a resetar.
- Existe uma API que habilita/desabilita o watchdog via software no ESP8266 Arduino core.
- Eu encontrei o esp_hw_wdt para habilitar/desabilitar o watchdog via hardware.
- Os dois watchdogs são desabilitados durante a
Pré-inicialização
ePasso de Configuração do Pareamento 2/3
.
- Placa: Generic ESP8266 Module (para habilitar todas as configurações)
- Flash Size: ao menos 470KB para o sketch (veja a seção
WolfSSL
se quiser um sketch menor) - LwIP Variant: v2 Lower Memory (para menor uso de memória)
- Debug Level: Nenhum (para menor uso de memória)
- Espressif FW: nonos-sdk 2.2.1+119(191122) (o qual usei para rodar esse projeto)
- SSL Support: Basic SSL ciphers (menor uso de ROM)
- VTables: Flash (talvez não faça diferença)
- Erase Flash: selecione
All Flash Contents
quando você fizer o upload pela primeira vez - CPU Frequency: 160MHz (OBRIGATÓRIO)
ESP8266WiFi
(WiFiServer e WiFiClient) são usadas para conexão tcp.ESP8266mDNS
é usado para advertising (Bonjour)
- Versão do ESP32 Arduino (ESP32 Arduino é baseado no RTOS e não é difícil de portar).
- Veja esp-homekit-demo
- Cheque a saída da sua porta serial com example_serial_output.txt
- Otimização de memória: Constantes String/byte movidas o máximo possível para Flash. A seção
RODATA
dobin
é de apenas 4672. Aproximadamente ~20K extra de free-heap está disponível nessa versão em comparação com a v1.0.1. - Upload ESP8266WiFi_nossl_noleak, da versão
nossl
enoleak
oficial da bibliotecaESP8266WiFi
do Arduino Core 2.6.3. Remoção de todo códigoSSL
para salvar memória(extra ~3K) sendo que o HomeKit não requer SSL. Coreção de memory-leak noWiFiClinet.stop()
ao adicionartcp_abandon(_pcb, 0)
nostop()
, baseado na ideia doesp8266/Arduino/pull/2767.
- Redução do
winsize
de3
para2
(mesma performance) para diminuir o heap requirido. O pareamento consegue ser feito com diminuição de free-heap de ~14000. - Especificando o MDNS roda no IPAddress do STA para certificar que o HomeKit consegue trabalhar com alguma biblioteca SoftAp-based WiFi-Config.
- Renomeado os
HTTP_METHOD
(s) nohttp_parser.h
para evitar erros de multipla definição quando estiver usando oESP8266WebServer
em conjunto.