Оригинал: Английский
Перевел: ph4nt0m7
Эта Arduino библиотека представляет собой нативную реализацию Apple HomeKit аксессуара для ESP8266 Arduino core, и работает без каких-либо дополнительных мостов.
Этот проект основан на esp-homekit для ESP-OPEN-RTOS.
Я перенес реализацию esp-homekit на основе RTOS в чистую среду Arduino, нацеленную на простую и быструю сборку проекта с использованием Arduino IDE (или Eclipse с sloeber, PlatformIO).
Наслаждайтесь сборкой и загрузкой "в один клик", работайте над связыванием различных других библиотек Arduino с Apple HomeKit!
Вот обсуждение о том, что для запуска Apple HomeKit требуется RTOS, и этот проект является доказательством концепции того, что Apple HomeKit может быть реализован и нормально работать без RTOS.
Эта библиотека построена с помощью ESP8266 Arduino Core 2.6.3. Более ранние версии могут компилироваться с ошибками.
Для ESP32 смотреть Arduino-HomeKit-ESP32. HomeKit, работающий на ESP32, имеет ОТЛИЧНУЮ ПРОИЗВОДИТЕЛЬНОСТЬ, которая в 10 раз быстрее, чем ESP8266.
111-11-111
- Определите свой аксессуар в файле .c, чтобы воспользоваться объявлением как "Макро". Вы также можете определить свой аксессуар в файле .ino, используя код C++.
homekit_accessory_t *accessories[] = ... homekit_server_config_t config = { .accessories = accessories, .password = "111-11-111", //.on_event = on_homekit_event, //optional //.setupId = "ABCD" //optional };
- В вашем скетче
#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(); }
Все.
Примечание. Вы должны настроить процессор ESP8266 на работу на частоте 160 МГц (по крайней мере, во время процесса сопряжения), чтобы избежать отключения tcp-сокета от устройства iOS, вызванного тайм-аутом.
- Preinit: ~9.1s (После данного шага вы можете увидеть ваш аксессуар в приложении "Дом")
- Pair Setup Step 1/3: ~0s (Тяжелые крипто-вычисления выполняются в Preinit)
- Pair Setup Step 2/3: ~12.1s
- Pair Setup Step 3/3: ~0.8s (Настройка пары обрабатывается только при первом сопряжении с устройством iOS)
- Pair Verify Step 1/2: ~0.3s
- Pair Verify Step 2/2: ~0.8s (Шаг проверки требуется каждый раз, когда iOS подключается или повторно подключается к ESP8266 для установления безопасного сеанса)
Весь процесс сопряжения занимает ~14 секунд после того, как вы введете код настройки на своем iPhone. Обратите внимание, что Preinit требует ~9 секунд, прежде чем вы сможете начать сопряжение.
Heap-память имеет решающее значение для ESP8266 с полной поддержкой TCP/IP. ESP8266 легко падает, когда памяти меньше ~5000.
Я попытался заставить криптографию WolfSSL безопасно работать на ESP8266 с лучшей производительностью и меньшим объемом памяти или компромиссом. Подробнее см. в следующем разделе.
Вот значения свободной heap-памяти для запуска примерного скетча:
- Загрузка: ~26000
- Preinit завершен: ~22000
- Сопряжение: ~17000 (или еще ниже при крипто-вычислениях)
- Сопряжено и подключено к одному устройству iOS: ~21700
- Сопряжено, но устройство iOS не подключено: ~23400
После оптимизации памяти в v1.1.0:
- Загрузка: ~46000
- Preinit завершен: ~41000
- Сопряжение: ~37000 (или еще ниже при крипто-вычислениях)
- Сопряжено и подключено к одному устройству iOS: ~41700
- Сопряжено, но устройство iOS не подключено: ~43000
- На основе wolfssl-3.13.0-stable.
- Чистый исходный код: неиспользуемые файлы удаляются..
CURVE25519_SMALL
иED25519_SMALL
: ESP8266 не может работать напрямую безSMALL
определений, так как памяти не хватает. Но версия безSMALL
быстрее. Я пометил большойge_precomp base[32][8]
с помощью PROGMEM, чтобы сохранить ее во флэш-памяти (около 70 КБ). Такжеge_double_scalarmult_vartime
не может работать из-за нехватки heap-памяти. Я определилESP_GE_DOUBLE_SCALARMULT_VARTIME_LOWMEM
вuser_settings.h
, чтобы использовать версию LOWMEMge_double_scalarmult_vartime
вge_low_mem.c
. Это компромисс между производительностью и памятью. Если вам нужно больше флэш-памяти, вы должны определитьCURVE25519_SMALL
иED25519_SMALL
и отменить определениеESP_GE_DOUBLE_SCALARMULT_VARTIME_LOWMEM
вuser_settings.h
(это приведет к тому, что этапы проверки парыPair Verify
займут 1,2 с + 0,9 с).integer.c
(операции с большими целыми числами):MP_16BIT
иESP_FORCE_S_MP_EXPTMOD
определены для лучшей производительности в ESP8266.ESP_INTEGER_WINSIZE
(по умолчанию = 3) определено, чтобы избежать сбоя, вызванного нехваткой памяти, а значения {3, 4, 5} имеют аналогичную производительность.
- Данные сопряжения хранятся в
EEPROM
в ядре ESP8266 Arduino. - Этот проект не использует библиотеку
EEPROM
с кэшем данных для уменьшения использования памяти (напрямую вызывает flash_read и write). EEPROM
составляет 4096 байт в ESP8266, в этом проекте используется максимум [0, 1408) байт.- Смотрите комментарии в
storge.c
и ESP8266-EEPROM-doc. EEPROM
в [1408, 4096) безопасно для использования.- Этот проект НЕ использует
FS (файловая система)
, поэтому вы можете использоватьFS
свободно.
- В ядре ESP8266 Arduino есть программные и аппаратные сторожевые таймеры. Тяжелые криптографические вычисления приведут к сбросу сторожевого таймера.
- В ядре ESP8266 Arduino есть отключение/включение API программного сторожевого таймера..
- Я нашел esp_hw_wdt для отключения/включения аппаратного сторожевого таймера.
- Два сторожевых таймера отключены во время
Preinit
иPair Setup Step 2/3
.
- Плата: Generic ESP8266 Module (чтобы получить все настройки)
- Flash Size: как минимум 470KB для скетчей (см. раздел
WolfSSL
, если вам нужен эскиз меньшего размера) - LwIP Variant: v2 Lower Memory (для меньшего использования памяти)
- Debug Level: Ничего (для меньшего использования памяти)
- Espressif FW: nonos-sdk 2.2.1+119(191122) (использовал его для создания этого проекта)
- SSL Support: Basic SSL ciphers (меньшее использование ПЗУ)
- VTables: Flash (неважно, может быть)
- Erase Flash: выберите
All Flash Contents
при первой загрузке - CPU Frequency: 160MHz (необходимо)
ESP8266WiFi
(WiFiServer и WiFiClient) используется для TCP-подключения.ESP8266mDNS
нужно для Bonjour.
- Проверьте свой последовательный вывод с помощью example_serial_output.txt
- Добавлен
yield()
во время криптографических вычислений, чтобы предотвратить отключение Wi-Fi. Идея взята у BbIKTOP-issues80 - Добавлен один новый пример.
- Небольшие улучшения.
- Новые примеры.
- Оптимизация памяти: максимально возможное перемещение строковых/байтовых констант во Flash. Раздел
RODATA
файлаbin
имеет размер всего 4672. Доступно около 20 КБ свободной кучи по сравнению с версией 1.0.1. - Загруженны ESP8266WiFi_nossl_noleak, версии
nossl
иnoleak
официальной библиотекиESP8266WiFi
для Arduino Core 2.6.3. Удалены все кодыSSL
для экономии памяти (дополнительно ~ 3 КБ), поскольку HomeKit не требует SSL. Исправьте утечку памяти вWiFiClinet.stop()
, добавивtcp_abandon(_pcb, 0)
вstop()
, основываясь на идее esp8266/Arduino/pull/2767.
- Уменьшен
winsize
с3
до2
(такая же производительность), чтобы уменьшить требуемую heap-память. Сопряжение может быть выполнено с низкой свободной heap-памятью ~14000. - Теперь MDNS работает на IP-адресе STA, чтобы гарантировать, что HomeKit может работать с некоторыми библиотеками WiFi-Config на основе SoftAP.
- Переименованы
HTTP_METHOD
(ы) вhttp_parser.h
, чтобы избежать ошибок множественного определения при совместном использованииESP8266WebServer
.