169 lines
6.4 KiB
Markdown
169 lines
6.4 KiB
Markdown
# esp32-ir
|
|
|
|
ИК приёмник/передатчик на ESP32-C6, управляемый локально через REPL или удалённо по HTTP API.
|
|
|
|
- **Приёмник** — GPIO20
|
|
- **Передатчик** — GPIO19
|
|
|
|
## Файлы
|
|
|
|
| Файл | Назначение |
|
|
| ---------------- | ------------------------------------------------------------------- |
|
|
| `capture.py` | захват ИК-сигнала с приёмника |
|
|
| `transmit.py` | воспроизведение сохранённого сигнала через ИК-светодиод (PWM 38кГц) |
|
|
| `wifi_server.py` | HTTP-сервер для удалённого управления |
|
|
| `.env` | секреты (WiFi, API-ключ) — см. ниже |
|
|
| `main.py` | автозапуск сервера при включении платы |
|
|
| `dotenv.py` | самописный экземпляр для получения переменных окружения |
|
|
|
|
---
|
|
|
|
## Локальное использование (через REPL)
|
|
|
|
### Воспроизвести сигнал по имени
|
|
```python
|
|
from transmit import send_code
|
|
send_code("power")
|
|
```
|
|
|
|
### Сделать новую запись
|
|
```python
|
|
from capture import capture_raw, save_code
|
|
data = capture_raw()
|
|
save_code("name", data)
|
|
```
|
|
|
|
### Посмотреть записи
|
|
```python
|
|
from capture import list_codes
|
|
list_codes()
|
|
```
|
|
|
|
### Удалить старые файлы/коды
|
|
```python
|
|
import os
|
|
os.remove("test.py") # удалить конкретный файл
|
|
|
|
import json
|
|
with open("codes.json", "w") as f:
|
|
json.dump({}, f) # очистить все коды
|
|
```
|
|
|
|
---
|
|
|
|
## HTTP API
|
|
|
|
### Запуск сервера вручную
|
|
```python
|
|
import wifi_server
|
|
wifi_server.main()
|
|
```
|
|
При старте сервер подключается к WiFi (данные из `.env`) и выводит в консоль свой IP:
|
|
```
|
|
WiFi подключен. IP адрес: 192.168.1.123
|
|
Сервер запущен: http://192.168.1.123/
|
|
```
|
|
|
|
### Автозапуск
|
|
Сервер поднимается автоматически при каждом включении/перезагрузке платы через `main.py`:
|
|
```python
|
|
import wifi_server
|
|
wifi_server.main()
|
|
```
|
|
|
|
---
|
|
|
|
### Конфигурация (`.env`)
|
|
|
|
```
|
|
WIFI_SSID=ИмяСети
|
|
WIFI_PASSWORD=Пароль
|
|
API_KEY=длинный_секретный_ключ
|
|
```
|
|
|
|
Если `API_KEY` не задан — сервер работает **без авторизации** (только для локальных тестов).
|
|
|
|
---
|
|
|
|
### Авторизация
|
|
|
|
Все эндпоинты, кроме `/`, требуют ключ из `API_KEY`. Передавайте его любым из двух способов:
|
|
|
|
**Query-параметр:**
|
|
```
|
|
?key=длинный_секретный_ключ
|
|
```
|
|
|
|
**Заголовок:**
|
|
```
|
|
X-API-Key: длинный_секретный_ключ
|
|
```
|
|
|
|
Без ключа или с неверным — ответ `401 Unauthorized`.
|
|
|
|
---
|
|
|
|
### Эндпоинты
|
|
|
|
| Метод | Путь | Описание |
|
|
| ----- | ---------------------------------- | --------------------------------------------------------------------------- |
|
|
| `GET` | `/` | статус сервера, список эндпоинтов (без авторизации) |
|
|
| `GET` | `/list` | список сохранённых кодов с количеством импульсов |
|
|
| `GET` | `/send?code=ИМЯ` | воспроизвести сохранённый код |
|
|
| `GET` | `/record?code=ИМЯ&timeout_ms=5000` | записать новый код (наведите пульт и нажмите кнопку в течение `timeout_ms`) |
|
|
| `GET` | `/delete?code=ИМЯ` | удалить сохранённый код |
|
|
|
|
---
|
|
|
|
### Примеры использования
|
|
|
|
**Проверить, что сервер жив:**
|
|
```bash
|
|
curl http://192.168.1.123/
|
|
```
|
|
|
|
**Посмотреть список записанных команд:**
|
|
```bash
|
|
curl "http://192.168.1.123/list?key=длинный_секретный_ключ"
|
|
```
|
|
```json
|
|
{"codes": {"power": 67, "tv_power": 23, "light_toggle": 67}}
|
|
```
|
|
|
|
**Воспроизвести команду:**
|
|
```bash
|
|
curl "http://192.168.1.123/send?code=power&key=длинный_секретный_ключ"
|
|
```
|
|
```json
|
|
{"status": "ok", "sent": "power"}
|
|
```
|
|
|
|
**Записать новую команду** (после запроса наведите пульт на приёмник и нажмите кнопку):
|
|
```bash
|
|
curl "http://192.168.1.123/record?code=fan_speed1&key=длинный_секретный_ключ"
|
|
```
|
|
```json
|
|
{"status": "ok", "saved": "fan_speed1", "pulses": 67}
|
|
```
|
|
Если сигнал не поймали за отведённое время — `408 Request Timeout`.
|
|
|
|
**Удалить команду:**
|
|
```bash
|
|
curl "http://192.168.1.123/delete?code=fan_speed1&key=длинный_секретный_ключ"
|
|
```
|
|
```json
|
|
{"status": "ok", "deleted": "fan_speed1"}
|
|
```
|
|
|
|
**С заголовком вместо query-параметра:**
|
|
```bash
|
|
curl -H "X-API-Key: длинный_секретный_ключ" "http://192.168.1.123/send?code=power"
|
|
```
|
|
|
|
---
|
|
|
|
## Заметки
|
|
|
|
- Сервер однопоточный: во время `/record` (ожидание сигнала с пульта) остальные запросы не обрабатываются.
|
|
- Трафик идёт по обычному HTTP без шифрования — ключ защищает от случайных запросов в локальной сети, но не является криптостойкой защитой.
|
|
- IP адрес платы может меняться при переподключении к роутеру — для стабильности рекомендуется закрепить IP за MAC-адресом в настройках роутера (DHCP reservation). |