Конструктор прошивки ESP8266(no OS)
(обновлено: 27 May 2021, 07:38:28)
Это общая документация по чипу ESP8266. Обратите внимание, что этот чип считается устаревшим, хотя и очень популярным — на смену ему пришел чип ESP32.
Для начала необходимо определить сколько памяти установлено на модуле ESP8266. Встречаются варианты модулей, с установленной памятью 512 кбайт(4 мегабита) , а так же 4мбайт(32 мегабита) и 1 мбайт(8 мегабит). Почти все разновидности ESP-12 и новые ESP-07 имеют на борту 4 мегабайта. Объем памяти можно определить по маркировке flash чипа, посмотреть в программе Flash Download Tool или на вкладке /debug. Маркировка имеет вид 25QXX, где XX — объем в мегабитах, например 25Q32 имеет на борту 32 мегабита=4 мегабайта.
Данная документация в целом относиться к прошивке ESP8266 без операционной системы(no OS) на устаревшем SDK. Существует вариант прошивки ESP8266 с RTOS операционной системой — это более перспективный вариант прошивки с большими возможностями.
Определение размера памяти по вкладке ip_adr/debug:
Вкладка debug содержит разную полезную информацию, в том числе и реальный размер чипа флеш памяти в строке Flash real size, а так же размер памяти, установленный в прошивающей программе Flash set size, который важен для правильной поддержки OTA.
Если вы не зарегистрированы в конструкторе, то вы можете скачать собранные прошивки на главной странице, где доступны 2 облегченных варианта прошивки:
-Вариант с поддержкой OTA с объемом памяти чипа 1мбайт и выше. Необходимо обязательно выбирать в прошивающей программе размер памяти 1мбайт !! Модули с размером flash памяти 512кб не поддерживаются режимом OTA !!
-Вариант без поддержки OTA.Если размер получаемого файла(одним файлом) более 496кб, то требуется поддержка flash памяти не менее 1 мегабайта !! По сравнению с режимом OTA в этом варианте количество включенных опций можно включить значительно меньше.
Возможность дальнейшего обновления прошивки по OTA доступна только у кого есть активированные ключи !
Если у вас имеются проблемы со стартом прошивки, то обязательно смотрим ниже абзац про решение проблем с прошивкой !
Сборка прошивки в конструкторе
Конструктор позволяет собрать прошивку под свои требования, включив в прошивку только те функции и датчики, которые нужны.
Не имеет смысла включать все опции в прошивке — в этом случае прошивка может не собраться так как не влезет в модуль. Лучше прошивку пересобрать снова, если вы хотите испытать другие опции.
Некоторые опции имеют дополнительные настройки, которые находятся в значке-шестеренке. Там можно выбрать доступное количество например термостатов или других опций.
При первоначальной сборке прошивки рекомендуется воспользоваться опцией OTA , чтобы следующее обновление было возможно через интернет без использования подключения программатора. С опцией OTA количество опций можно включить больше, но требуется чтобы память на модуле была не меньше 1 мегабайта !!
Кроме OTA так же рекомендуется включать опции NVS настройки 2 и Экспорт/Импорт настроек. NVS настройки 2 решает проблему со смещением(повреждением) настроек при изменении списка или настроек опций при обновлении прошивки.
При сборке прошивки можно выбирать разный SDK. Рекомендуемая версия SDK 1.3.0. В новых версиях замечена проблема с режимом точки доступа (Safe Mode)(???) , но нет проблем с надежностью связи с роутером. SDK — это набор библиотек и функций от производителя чипа для работы устройства.
После нажатия кнопки «скомпилировать» через некоторое время конструктор прошивки выдаст ссылки для скачивания:
В режиме без OTA можно прошить файлы прошивки одним файлом — тогда все настройки модуля, если они были сбросятся. Если вы обновляете прошивку и не хотите чтобы настройки удалились, то необходимо обновлять прошивку двумя файлами по адресам, которые указаны в имени файла.
В режиме OTA достаточно залить прошивку одним файлом. Но 0x81000.bin может потребоваться, если вы хотите обновить прошивку по кабелю после использования OTA, когда загружен файл user2.bin(отображается в debug) — в этом случае обновление прошивки одним файлом не обновит активную прошивку.
Подключение модуля для прошивки
Для прошивки ESP8266 необходим USB-UART переходник или Arduino. ESP8266 необходимо обеспечить напряжение питания 3.3в и током 200..300мА. Питание 3.3в от ARDUINO или от USB-UART подключать не рекомендуется — модуль может работать не стабильно из-за нехватки тока. Рекомендуется использовать стабилизатор вида 1117.
Подключение ESP8266 к USB-UART: Необходимо подключить общие выводы GND(минус). RX у USB-UART на TX ESP, TX у USB-UART на RX ESP. Подключаем так же источник питания 3.3в.
Подключение ESP8266 к Arduino: Необходимо подключить общие выводы GND(минус).RX у Arduino на RX ESP, TX у Arduino на TX ESP. Подключаем так же источник питания 3.3в. RESET у Arduina необходимо подключить к GND.
На модуле ESP8266 вывод CH_EN необходимо подключить к +3.3в для того, чтобы включить чип.
GPIO 0 на время программирования, перед включением питания необходимо подключить к GND(земля). После успешной прошивки GPIO 0 нужно отключить от GND. Если на модуле выведен GPIO 15, то его необходимо подключить на GND через резистор 10кОм на постоянной основе !!
Если у вас модуль esp8266 имеет уже на борту USB-UART (например Wemos, NodeMCU) , то указанные выше действия проводить не требуется.
Прошивка модуля
Для начала необходимо установить драйвера для вашего USB-UART переходника или Arduinы.
Прошивка через Nodemcu Flasher: Устанавливаем на вкладке Advanced Параметр Flash size в соответствии выбранным размером flash памяти (в байтах). Режим работы flash ставим QIO (при использовании GPIO 9/10 — DIO). Остальные параметры не трогаем. Указываем на вкладке Config путь на файл прошивки с адресом 0x0000. На вкладке Operation выбираем COM порт и жмем кнопку FLASH.
Прошивка через Flash download tool: Действия аналогичны.
Прошивка через Flasher for WiFi-IoT.com . Программа имеет русскоязычный интерфейс и поддерживается как Windows, так и Linux системы. На данный момент прошивка идет только по 0x0000 адресу файла «Скачать одним файлом (0x00000)». При установленном API ключе возможна автоматическая загрузка заранее собранной прошивки напрямую из конструктора(только с режимом OTA). Для очистки памяти вместо бланка можно использовать опцию «стереть чип перед прошивкой».
Для модулей ESP8285 и модулях с памятью PN25F08B требуется установка режима памяти DOUT !!
Прошивка через esptool. Пример команды esptool.py —port /dev/ttyUSB0 write_flash -fs 8m 0x00000 esp8266.bin . где -fs 8m размер flash памяти модуля в мегабитах !
Скорость COM порта рекомендуется ставить не выше 115200.
Перед первой прошивкой рекомендуется залить в модуль blank по адресу 0x0000 , особенно, если в модуле до этого использовалась какая либо другая прошивка.
Прошивка файла ESP INIT DATA
Рекомендуется прошить в модуль файл esp_init_data_default.bin с калибровками по умолчанию, эти настройки влияют на работу wifi и adc. В большинстве случаев модули работают корректно без этого файла. Последние SDK могут вообще не запускаться без данного файла.
Адрес прошивки файла зависит от установленного размера flash памяти:
0x7c000 для 512 kB.
0xfc000 для 1 MB.
0x3fc000 для 4 MB.
0xffc000 для 16 MB.
Так же данные настройки можно загрузить подав GET команду http://[IP]/configinit?def=1 , последние SDK сами прописывают данные настройки.
Запуск модуля
При первом включении модуль включается в режим safe mode автоматически так как не содержит имени точки доступа. В режиме safe mode в эфире появится точка с именем WiFi-IoT, к которой можно подключится используя смартфон или ноутбук.
В режим safe mode еще можно попасть, замкнув между собой RX и TX и перезапустив модуль или нажать 3 раза подрят (с интервалом нажатия около секунды) кнопку RESET на ESP8266.
Далее возможны два варианта подключения к модулю:
1. Используя Captive Portal мобильное устройство выведет уведомление о подключении, при нажатии на которое происходит автоматическое открытие главной веб страницы модуля. Можно так же зайти в модуль введя в браузере адрес iot.local (или любое другое, например iot.ru).
2. После успешного коннекта заходим вручную по адресу http://192.168.4.1 используя веб браузер.
Далее настраиваем подключение на свой роутер на вкладке main веб интерфейса.Необходимо вбить в поля WiFi options данные своей точки доступа. Для подключения к роутеру выбираем режим «Station mode». После нажатия кнопки set ниже появится IP адрес, на который можно заходить внутри своей беспроводной сети.
Далее обновляем страницу и видим внизу IP адрес, на который уже можно будет заходить внутри Вашей локальной сети.
Тут же вы можете установить свой логин и пароль на странички настроек веб интерфейса. Длинна логина и пароля не более 8 символов. Пароль затребуется на все вкладки настроек. А при установленной опции «Full Security» и на все GET запросы управления. В режиме safe mode пароль не запрашивается !
На данной вкладке можно задать имя модулю, которое будет отображаться на главной и в системе flymon, а так же в топике на MQTT сервере.
Указанные выше действия выполнять не требуется, если прошивка была собрана с опцией Настройки по умолчанию , где были заранее прописаны параметры роутера и IP адрес. После успешной прошивки и перезагрузки сразу можно заходить на указанный IP адрес модуля внутри своей wi-fi сети.
Решение проблем с прошивкой
Иногда, после сторонних прошивок или мусора модуль может не запустится и необходимо выполнить дополнительные действия. Необходимо затереть flash память пустым бланком по адресу 0x00000. Далее уже прошиваем саму прошивку снова.
У некоторых пользователей даже после зачистки бланком модуль не стартует или стартует только при установленном режиме 512 кб или 4мб, возможно это связано с низким качеством flash памяти или частичной её несовместимостью с чипом ESP8266. По некоторым сведениям от пользователей помогает замена чипа памяти.
Если на главной странице модуля выводится сообщение «Error flash size ! (code 0x1)», то это значит была прошита прошивка 1мегабайт в режиме 512кб. При этом включается режим Safe Mode и возможны сбои в работе модуля из-за таких неверных настроек. Убедитесь, что на модуле установлен необходимый размер памяти — это видно на веб вкладке ИП_АДРЕС/debug в строке Flash real size. Режим объема памяти указывается в прошивающей программе.
Если на главной странице модуля выводится сообщение «Error flash size ! (code 0x2)», то это модуль имеет всего 512кб flash памяти и это значит, что необходимо использовать прошивку без включенного режима 1 мегабайт или не использовать OTA. Можно так же перепаять микросхему flash памяти на более ёмкую.
ВАЖНО !! Если модуль не может получить IP адрес. Висит постоянно статус connect , то рекомендуется вписать IP адрес вручную ниже. Для этого необходимо выбрать режим Static IP и вписать IP модуля и IP шлюза(IP роутера). После этого можно заходить на модуль уже внутри сети по IP адресу, который указали в настройках..
Иногда статус connect может висеть, если тип шифрования на роутере включен, который не поддерживается чипом ESP8266.
Решение проблем с компиляцией.
Ошибка компиляции возможна из-за:
1. Превышен размер IRAM области памяти, прошивка не умещается. Требуется уменьшить количество опции или выбрать другой SDK. Чем новее SDK , тем меньше влазит опций. Проблема нехватки памяти не так заметна при использовании RTOS прошивки.
2. Ошибка в коде — маловероятная причина, но возможна после обновления кода или конфликта опций ранее не замеченный. Сообщить об ошибке можно через обратную связь на сайте или в чате Телеграм, указав код ошибки.
Сохранение настроек в файл
Этот метод является устаревшим, рекомендуется воспользоваться опцией Экспорт/Импорт настроек.
Настройки модуля можно сохранить в файл, исключая настройки WI-FI, состояния GPIO, список датчиков DS18B20. Файл необходимо скачать по адресу ИП_АДРЕС/configsave.bin . Записывается обратно в модуль через программатор по адресу 0x3C000 для 512кб прошивки, 0x7C000 — для 1мб. Настройки можно скачать и через esptool.py используя пример ниже подставив нужный адрес.
Скачать настройки WI-FI можно по адресу ИП_АДРЕС/configsave.bin?pg=66 для 512кб, ИП_АДРЕС/configsave.bin?pg=130 для 1 мег. Скачать через esptool.py можно командой esptool.py read_flash 0x7E000 4096 mywifi_settings.bin для 512 кб (Для 1024кб адрес будет 0xfe000).
Полезные ссылки:
Видеоинструкция по настройке от Umka.
Видеоинструкция по настройке от Genia1no_prosto
Видеоинструкция по настройке от Sergiy (ArmoR)
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.
Already on GitHub?
Sign in
to your account
Closed
jarda195 opened this issue
Sep 17, 2017
· 26 comments
Closed
FLASH_SIZE problem > update error
#3616
jarda195 opened this issue
Sep 17, 2017
· 26 comments
Comments
I use ESP WROOM 02 and I have this problem with ESP8266httpUpdate.. First 20 pcs ESP WROOM 02 working ok.. my sketch has 320.000 byte, update ok.. I purchased next 100 pcs but update with error ‘bin for wrong flash size’.. restart and update not working.. for first 20 pcs function getFlashChipRealSize returned 4.000.000 and new 100pcs returned 2.080.000 only.. ESP Wroom 02 is same, maybe not same production serie. (I assume — 4.000.000 /8/1024 = 488 kB and 2.080.00/8/1024 = 253kB) . Function system_get_flash_size_map(); returned FLASH_SIZE_32M_MAP_512_512 (both)
FlashId = 1392840 not working
FlashId = 1458337 workong
My sketch (on Arduino 1.65 and W8) is 95% sleep and 5 % sending 30 byte…
after compiling: 311 263 byte (29%) max is 1 044 464 byte. (ESPDuino )
- How I can change this value ? (from 2.080.000 to 4.000.000)
- Why is differenc between two ESP WROOM 02 and ESP WROOM 02 ?
SDK ( 1.5.3(aec24ac9) both) over function sdk = system_get_sdk_version();
Thank for responde..
jarda195
changed the title
Problem with ESP8266httpUpdate
FLASH_SIZE problem
Sep 17, 2017
jarda195
changed the title
FLASH_SIZE problem
FLASH_SIZE problem > update error
Sep 17, 2017
@jarda195 this is not the right place to ask for help for your particular project or module. This is an issue tracker, meant for tracking issues in the core.
Please refer to esp8266.com or stackoverflow for assistance.
@vicnevicne actually, I suspect this one really is a core issue, related to autodetection of the flash size. I have seen more than one issue of this type now.
@jarda195 I somehow doubt it will help, but to be thorough: please try with latest git.
@igrr do you know who wrote that part of the code? It seems the autodetection rules need to be changed.
@devyte It’s historically appeared because get_flash_size uses some assumptions about the format of the flash ID which doesn’t always hold true for all flash vendors.
Indeed, the rule is a simple bit shift, when using getFlashChipRealSize
Alright, let’s use this issue to cover the problem. I’ll close the others that seem to be duplicates, and reference this one.
@davisonja if the current rule doesn’t hold for all vendors, then we need a new uber-rule of sorts. As things stand, it seems like ESPs that don’t hold to the current rule aren’t usable.
If necessary, a per-vendor rule table will need to be maintained, even though that would likely get ugly.
Unless there is some other way to get the flash chip size?
@jarda195 could you please use esptool.py flash_id command to check flash chip device id on both types of modules? Thanks.
per #3618:
ESP WROOM 02 flash vendor: A1h : FM (32MB) and ESP WROOM 02 flash vendor: C8h : GD (16MB)
The last time I looked at this, the existing code appeared to be using a
sensible default based on a common standard usage. It’s come up before, and
there are references to existing discussions in other projects that have
had the same issue with flash ID formats not necessarily being consistent.
The end conclusion seems to be there isn’t a good answer, aside from a
table that gets built up over time, but the existing rule (using the third
byte as X in `1 << X`) works the majority of the time.
If we can get the result of `spi_flash_get_id` I’m happy to build a table
…
@davisonja Something I noticed, not sure how usefule it may be:
returned 2.080.000
As afar as I know, flash chips don’t come in fractionary numbers, but in powers of 2, as in 512KB, 1MB, 2MB, 4MB, 8MB, 16MB, 32MB. A calculated flash size like 2.080.000 is obviously invalid. This info could be used to assert or at least a warning.
@devyte I translated that into 2,080,000 as in a number using ‘.’s as thousands separators rather than ‘,’
This was referenced
Jan 6, 2018
@davisonja it seems that the flash detection thing is getting worse very quickly. Are you available to help out with it?
Arduino 1.8.5
Core 2.4
Several different esp-01 makers from several Chinese suppliers are all using this PUYA 4Mbit flash chip:
http://www.puyasemi.com/attached/file/20171027/20171027183954_35795.pdf
Out of the last 100 esp-01’s I’ve received in the last couple of weeks, only 18 had chips other than the PUYA. So it seems likely that lots more modules will be appearing with this flash chip family on-board.
The «Upload Sketch Data» plug in works. It can write to these flash chips no problem. A sketch can then read the data, but sketches can not write to SPIFFS.
How is it that the plug in can write to these chips but a sketch can’t???
Could you please run esptool.py flash_id command on the board which has this issue?
I have the flash ID from a Get_Flash_Data sketch. If the below doesn’t have what you need I can run up esptool. Just let me know.
Flash chip information:
Flash chip Id: 00146085 (for example: Id=001640E0 Manuf=E0, Device=4016 (swap bytes))
Sketch thinks Flash RAM is size: 0.50 MB
Actual size based on chip Id: 1.00 MB … given by (2^( «Device» — 1) / 8 / 1024
Flash frequency: 40.00 MHz
Flash write mode: QIO
I’m seeing something similar as I documented in #4061.
What I see is that after flashing a SPIFFS and then running a sketch, the sketch does not find any files in the FS. Below is the output from a sketch that dumps & tests the flash/SPIFFS (see #4061). Flash ID included below.
#####################
Firmware:
Chip Id: 0042A910
Core version: 2_4_0
SDK version: 2.1.0(deb1901)
Boot version: 31
Boot mode: 1
Flash chip information:
Flash chip Id: 001440E0 (for example: Id=001640E0 Manuf=E0, Device=4016 (swap bytes))
Sketch thinks Flash RAM is size: 0.50 MB
Actual size based on chip Id: 1.00 MB … given by (2^( «Device» — 1) / 8 / 1024
Flash frequency: 40.00 MHz
Flash write mode: DIO
File system (SPIFFS):
Total KB: 51.72 KB
Used KB: 0.00 KB
Block size: 4096
Page size: 256
Maximum open files: 5
Maximum path length: 32
SPIFFS directory {/} :
CPU frequency: 80 MHz
#####################file open failed
====== Reading from SPIFFS file =======
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
@weswitt I just replied on #4061. @igrr has the ChipID of the new flash chips that is an issue and he or others are looking into a solution. I’ll help you as far as I’m able over on #4061, it’ll save cluttering this issue for now.
@igrr Sorry Ivan, that was a typo, my bad The chips on all 75 odd boards are 8Mbit chips as per the datasheet. I don’t think it’s a size issue though. I think there’s something different about this PUYA family of chips.
What I find strange is that the Arduino (1.8.0~1.8.5) Sketch Data Upload plugin can write to the PUYA chip no problem but the SPIFFS.println function cannot. This is way above my pay grade but maybe the former writes in bigger blocks than the latter. One thing I spotted in the data sheet section on the configure register. There’s a DP bit that sets the page size to 256 or 512.
I’m grabbing at straws here, but my business is hanging by a thread as I’ve got orders coming in and I’m down to my last few modules with BergMicro flash chips on-board.
@igrr If it would help at all I could overnight post one of these modules to Roger Clarke in Melbourne. I’m sure you and he could speak the same language and get to the bottom of this in a flash (pun intended
Ok, thanks for the clarification.
I will check tomorrow if we have any P25Q80H chips in the office. If not, will order a few to do a test.
In the meantime, please run the following sketch on a board with this PUYA chip, and share the full output you get. Note that this sketch will also format SPIFFS partition. Before uploading it, please go to Arduino IDE Tools menu, and select Debug Port: Serial, Debug Level: CORE.
https://gist.github.com/igrr/964b0d139ce63fcee07c8c1f1facb24d
By the way, @ondabeach, let’s continue with your issue in #4061. I think the issue you are seeing is not related to flash chips size detection.
Thanks @igrr, I must admit I was a bit surprised when the write fail issue was merged with this one. I’ll load that sketch and report the output back on #4061.
Apologies for linking that one. Since I started combing through the issues, the only reasons for flash problems I have seen, where one manufacturer works and another doesn’t, is the autodetection rules, and misconfiguration (e.g. QIO set when the pins are in use), and this didn’t sound like the latter.
No problem @devyte, I know you guys are multitasking to the max. This is the first time I’ve had an issue I couldn’t resolve with my usual brute force hacker approach. Any and all assistance is greatly appreciated. Being a one man band doesn’t give me the time to get in under the hood and see what makes it all tick. I’m dying to know how the «Sketch Data Upload» can write to this chip when the SPIFFS.??? functions can’t. I don’t even know where to start looking. Anyhow, @igrr ‘s got the bit between his teeth so I’m confident of a resolution sooner rather than later.
Has a solution been found to this issue yet as I have 4 ESP chis with these memory modules and was hoping to use them for a project?
Yes, it has. See this other bug: #4061
There’s a patch for Esp.CPP which implements a different write procedure for these chips.
The whole PUYA broken flash was fixed by @TD-er with #5493 . See that issue for the steps you need to take after updating to the latest builds. Closing.
Для начала необходимо определить сколько памяти установлено на модуле ESP8266. Встречаются варианты модулей, с установленной памятью 512 кбайт(4 мегабита) , а так же 4мбайт(32 мегабита). Редко, но попадаются с флеш памятью 1 мбайт(8 мегабит). Почти все разновидности ESP-12 и новые ESP-07 имеют на борту 4 мегабайта. Объем памяти можно определить по маркировке flash чипа, посмотреть в программе Flash Download Tool или на вкладке /debug. Маркировка имеет вид 25QXX, где XX — объем в мегабитах, например 25Q32 имеет на борту 32 мегабита=4 мегабайта.
Определение размера памяти по вкладке ip_adr/debug:
Вкладка debug содержит разную полезную информацию, в том числе и реальный размер чипа флеш памяти в строке Flash real size, а так же размер памяти, установленный в прошивающей программе Flash set size, который важен для правильной поддержки OTA.
Если у вас нет купленых ключей, то прошивку можно скачать на страничке проекта, где доступны2 облегченных варианта прошивки:
-Вариант с поддержкой OTA с объемом памяти чипа 1мбайт. Данная прошивка прошивается и в модули и с бОльшим объемом flash. Необходимо обязательно выбирать в прошивающей программе размер памяти 1мбайт !! Модули с 512кб не поддерживаются !!
-Вариант без поддержки OTA. Подходит для любого объема flash памяти. Необходимо обязательно выбирать в прошивающей программе размер памяти 512кбайт !!
Возможность дальнейшего обновления прошивки по OTA доступна только у кого есть активированные ключи !
Прошивку можно собрать так же в конструкторе прошивки , где необходимо выбрать настройки для поддержки OTA и объема flash 1 мегабайт.
При использовании OTA и с объемом 512кб невозможно одновременно использовать множество опций конструктора, а так же использовать новые SDK, т.к. прошивка в модуль не помещается !!
Если у вас имеются проблемы со стартом прошивки, то обязательно смотрим ниже абзац про решение проблем с прошивкой !
Подключение модуля для прошивки
Для прошивки ESP8266 необходим USB-UART переходник или Arduino. ESP8266 необходимо обеспечить напряжение питания 3.3в и током 200..300мА. Питание 3.3в от ARDUINO или от USB-UART подключать не рекомендуется — модуль может работать не стабильно из-за нехватки тока. Рекомендуется использовать стабилизатор вида 1117.
Подключение ESP8266 к USB-UART: Необходимо подключить общие выводы GND(минус). RX у USB-UART на TX ESP, TX у USB-UART на RX ESP. Подключаем так же источник питания 3.3в.
Подключение ESP8266 к Arduino: Необходимо подключить общие выводы GND(минус).RX у Arduino на RX ESP, TX у Arduino на TX ESP. Подключаем так же источник питания 3.3в. RESET у Arduina необходимо подключить к GND.
На модуле ESP8266 вывод CH_EN необходимо подключить к +3.3в для того, чтобы включить чип.
GPIO 0 на время программирования, перед включением питания необходимо подключить к GND(земля). После успешной прошивки GPIO 0 можно отключить от GND. Если на модуле выведен GPIO 15, то его необходимо подключить на GND через резистор 10кОм на постоянной основе !!
Прошивка модуля
Для начала необходимо установить драйвера для вашего USB-UART переходника или Arduinы.
Прошивка через Nodemcu Flasher: Устанавливаем на вкладке Advanced Параметр Flash size в соотвествии выбранным размером flash памяти (в байтах). Остальные параметры не трогаем. Указываем на вкладке Config путь на файл прошивки с адресом 0x0000. На вкладке Operation выбираем COM порт и жмем кнопку FLASH.
Прошивка через Flash download tool: Описание в разработке(Действия аналогичны).
Прошивка через esptool. Пример команды esptool.py —port /dev/ttyUSB0 write_flash -fs 8m 0x00000 esp8266.bin . где -fs 8m параметр нужен только для указания размера при одномегабайтовой прошивке.
Скорость COM порта рекомендуется ставить не выше 115200.
Запуск модуля
После успешной прошивки необходимо запустить режим safe mode, замкнув между собой RX и TX и перезапустив модуль или нажать 3 раза подрят (с интервалом нажатия около секунды) кнопку RESET на ESP8266. В эфире появится точка с именем homessmart , к которой можно подключится используя смартфон или ноутбук.
После успешного коннекта заходим по адресу http://192.168.4.1 . Настраиваем подключение на свой роутер на вкладке main веб интерфейса. Необходимо вбить в поля WiFi options данные своей точки доступа. Для подключения к роутеру выбираем режим «Station mode». После нажатия кнопки set ниже появится IP адрес, на который можно заходить внутри своей беспроводной сети.
Далее обновляем страницу и видим внизу IP адрес, на который уже можно будет заходить внутри Вашей локальной сети.
Тут же вы можете установить свой логин и пароль на странички настроек веб интерфейса. По умолчанию логин esp8266, пароль 0000. Длинна логина и пароля не более 8 символов. Пароль затребуется на все вкладки настроек. А при установленной опции «Full Security» и на все GET запросы управления. В режиме safe mode пароль не запрашивается !
На данной вкладке можно задать имя модулю, которое будет отображаться на главной и в системе flymon, а так же в топике на MQTT сервере.
Решение проблем с прошивкой
Иногда, после сторонних прошивок или мусора модуль может не запустится и необходимо выполнить дополнительные действия. Необходимо затереть flash память пустым бланком по адресу 0x00000. Если вы используйте прошивку с размером 1 мегабайт, то качаем этот бланк. Далее уже прошиваем саму прошивку снова.
У некоторых пользователей даже после зачистки бланком модуль не стартует или стартует только при установленном режиме 512 кб или 4мб, возможно это связано с низким качеством flash памяти или частичной её несовместимостью с чипом ESP8266. Обратите внимание, что если даже у вас получилось запустить прошивку в режиме 4мб, то обновление по OTA в таком режиме не пройдет — модуль не запустится после обновления. По некоторым сведениям от пользователей помогает замена чипа памяти.
Если на главной странице модуля выводится сообщение «Error flash size ! (code 0x1)«, то это значит была прошита прошивка 1мегабайт в режиме 512кб. При этом включается режим Safe Mode и возможны сбои в работе модуля из-за таких неверных настроек. Убедитесь, что на модуле установлен необходимый размер памяти — это видно на веб вкладке ИП_АДРЕС/debug в строке Flash real size. Режим объема памяти указывается в прошивающей программе.
Если на главной странице модуля выводится сообщение «Error flash size ! (code 0x2)«, то это модуль имеет всего 512кб flash памяти и это значит, что необходимо использовать прошивку без включенного режима 1 мегабайт или не использовать OTA. Можно так же перепаять микросхему flash памяти на более ёмкую.
ВАЖНО !! Если модуль не может получить IP адрес. Висит постоянно статус connect , то рекомендуется вписать IP адрес вручную ниже. Для этого необходимо выбрать режим Static IP и вписать IP модуля и IP шлюза(IP роутера). После этого можно заходить на модуль уже внутри сети по IP адресу, который указали в настройках..
Сохранение настроек в файл
Настройки модуля можно сохранить в файл, исключая настройки WI-FI, состояния GPIO, список датчиков DS18B20. Файл необходимо скачать по адресу ИП_АДРЕС/configsave.bin . Записывается обратно в модуль через программатор по адресу 0x3C000 для 512кб прошивки, 0x7C000 — для 1мб. Настройки можно скачать и через esptool.py используя пример ниже подставив нужный адрес.
Скачать настройки WI-FI можно по адресу ИП_АДРЕС/configsave.bin?pg=66 для 512кб, ИП_АДРЕС/configsave.bin?pg=130 для 1 мег. Скачать через esptool.py можно командой esptool.py read_flash 0x7E000 4096 mywifi_settings.bin для 512 кб (Для 1024кб адрес будет 0xfe000).
Полезные ссылки:
Видеоиструкция по настройке от Umka
-
#1
Всем привет. Попытался прошить свой ESP — 01S через Flash download tool 3.9.2 используя ESP8266_NONOS_SDK 3.0.5 версии. Прошивал я, думая что у меня есть 8Mb, поэтому был спокоен. После прошивки на ЕСП безостановочно начал мигать синий светодиод и при попытке просмотреть монитор порта на 74880 бод начал безостановочно вываливать вот такой текст:
— The partition table size is larger than flash size 0x80000 —
please check partition type 6 addr:fd000 len:3000
system_partition_table_regist fail
V2
Mo
rf_cal[0] !=0x05,is 0x00
ets Jan 8 2013,rst cause:1, boot mode: (3,7)
load 0x40100000, len 2592, room 16
tail 0
chksum 0xf3
load 0x3ffe8000, len 764, room 8
tail 4
chksum 0x92
load 0x3ffe82fc, len 676, room 4
tail 0
chksum 0x22
csum 0x22
2nd boot version : 1.7(5d6f877)
SPI Speed : 40MHz
SPI Mode : QIO
SPI Flash Size & Map: 4Mbit(256KB+256KB)
jump to run user1 @ 1000
correct flash map
mismatch map 2,spi_size_map 0
system param partition error
После я нашел статью, в которой говорилось что если у моего ЕСП память 512 Kb, то мне нужно залить esp_init_data_default.bin немного по другому адресу (сначала указал этот путь 0xfc000, а потом я указал 0x7c000. Я так и сделал, но не помогло. Неудачную прошивку еще не сносил. Помогите пожалуйста решить проблему с обновлением прошивки в моем случае и безопасно снести неудавшуюся прошивку. В интернете видел способ (для ESP32) с закидыванием пустого файла на 4MB по пути 0х0000, не знаю насколько это безопасно в моем случае и можно ли так вообще делать с ESP — 01S.
pvvx
Активный участник сообщества
-
#3
Для Flash на 512 килобайт очень мало вариантов прошивок с нормальным функционалом…
Стирать, писать всю Flash вдоль и поперек совершенно безопасно. Поддержка прошивки Flash в ESP8266 встроена в ROM, т.е. работает всегда, в независимости что там во внешней Flash.
-
#4
Для Flash на 512 килобайт очень мало вариантов прошивок с нормальным функционалом…
Стирать, писать всю Flash вдоль и поперек совершенно безопасно. Поддержка прошивки Flash в ESP8266 встроена в ROM, т.е. работает всегда, в независимости что там во внешней Flash.
Здравствуйте, в таком случае подскажите пожалуйста: мне для проекта в универе нужно сделать «Умный вентилятор». Все компоненты до этого я подсоединял к Arduino UNO. Некоторые комплектующие, такие как температурный датчик, ультрасоник питаются от 5v. Смогу ли я купив NodeMCU v3 заместо ESP — 01S и подключив его к ардуино, использовать его для передачи данных? Я бы подключил все к NodeMCU, но там есть только выход на 3.3v. Не знаю, подойдет ли это для моего проекта. В интернете нашел схему подключения NodeMCU v3 к Arduino UNO, прикреплю её ниже. Так же снизу закреплю структурную схему моего задания без подключения сетевого модуля.
-
115.7 KB
Просмотры: 8 -
107.4 KB
Просмотры: 8
-
#5
Если вентилятор «умный», то ему и одной NodeMCU достаточно
-
#6
Если вентилятор «умный», то ему и одной NodeMCU достаточно
Моторчику то в самый раз будет, но вот разве DHT11 и HC — SR04 от питания в 3.3v не откиснут?
-
#7
А что мешает запитать их от 5В?
-
#8
А что мешает запитать их от 5В?
Так разве на NodeMCU есть вывод на 5v? Я сколько смотрел, только на 3.3v выводы видел
-
291.3 KB
Просмотры: 3
-
#9
Там есть вывод Vin, на котором будет 5В если NodeMCU подключена к usb. Или туда можно подать те-же 5 В от внешнего источника питания. Вывод 3.3 В — это выход встроенного на плате стбилизатора вход которого соединен с Vin. DHT11 можно питать и от 3 В. Выход SR04 подключить к esp через конвертер уровней (хотя по сети ходит инфа что входы ESP толерантны к 5В, но ИМХО лучше перебдеть).
-
Всем привет! Откопал тут из ящика старое устройство на ESP32, которое пролежало там больше месяца. Включение показало, что всё работает нормально, но та же самая прошивка не загружается. Вот лог:
Скетч использует 135538 байт (10%) памяти устройства. Всего доступно 1310720 байт.
Глобальные переменные используют 11124 байт (3%) динамической памяти, оставляя 283788 байт для локальных переменных. Максимум: 294912 байт.
C:UsersantonDocumentsArduinohardwareespressifesp32/tools/esptool.exe —chip esp32 —port COM7 —baud 921600 —before default_reset —after hard_reset write_flash -z —flash_mode dio —flash_freq 80m —flash_size detect 0xe000 C:UsersantonDocumentsArduinohardwareespressifesp32/tools/partitions/boot_app0.bin 0x1000 C:UsersantonDocumentsArduinohardwareespressifesp32/tools/sdk/bin/bootloader.bin 0x10000 C:UsersantonAppDataLocalTemparduino_build_431498/Blink.ino.bin 0x8000 C:UsersantonAppDataLocalTemparduino_build_431498/Blink.ino.partitions.bin
esptool.py v2.1
Connecting…….._
Chip is ESP32D0WDQ6 (revision 1)
Uploading stub…
Running stub…
Stub running…
Changing baud rate to 921600
Changed.
Configuring flash size…
Warning: Could not auto-detect Flash size (FlashID=0x0, SizeID=0x0), defaulting to 4MB
Compressed 8192 bytes to 47…Writing at 0x0000e000… (100 %)
[здесь зависает на несколько минут]
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 9362.0 kbit/s)…A fatal error occurred: Timed out waiting for packet header
A fatal error occurred: Timed out waiting for packet headerИтак, что мне не нравится. Во-первых, как мы видим, скетч имеет размер около 132 КБ, но esptool пишет, что сжал 8 КБ в 47 байт(!). Во-вторых, он не смог определить размер флеш-памяти. В-третьих, происходит ошибка.
Вспомнил, что в текущей, уже загруженной прошивке есть функция просмотра файловой системы на флеш-памяти. После вывода первых четырёх (это число не меняется) файлов происходит Guru Meditation Error. Отслеживание при помощи ESP Exception Decoder показало, что ошибка произошла в функции чтения памяти, которую написали разработчики arduino-esp32.
Полагаю, что что-то произошло с памятью, но раз прошивка запускается, то очевидно, что это «что-то» произошло в области, следующей за прошивкой и этими четырьмя файлами.Какие предположения?
-
После полной разборки схемы всё заработало как часы. Возможно, проблема была в большом потреблении, но я не думаю, что SD карта, дисплей ILI9341 и клавиатура так много потребляют.
-
smeedy
- Posts: 15
- Joined: Sun Jan 22, 2017 10:35 pm
Constant reboot and «Could not auto-detect Flash size» when flashing
Hi all,
I have some 10 identical custom boards made, with one acting somewhat irregular. It keeps rebooting on a
Code: Select all
rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
Falling back to built-in command interpreter.
OK
>ets Jun 8 2016 00:22:57
rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
..
Pulling IO0 low will put it in the waiting for download, but flashing will lead to a
Code: Select all
Flashing binaries to serial port /dev/cu.usbserial-FTXVKLTN (app at offset 0x10000)...
esptool.py v2.0-beta3
Connecting....
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Warning: Could not auto-detect Flash size (FlashID=0xffffff, SizeID=0xff), defaulting to 4MB
Flash params set to 0x0220
A fatal error occurred: Timed out waiting for packet content
make: *** [flash] Error 2
I’m sort of sure I’ve seen this one working, but I might have give it a push when using a faulty FTDI cable (lot of garbage in between the default boot message) and trying to flash it the first time. Switching cables did work out for all the others, but now I’m stuck on this one.
Should I pull out the hot air and change the chip?
kind regards,
Martijn
-
ESP_Angus
- Posts: 2344
- Joined: Sun May 08, 2016 4:11 am
Re: Constant reboot and «Could not auto-detect Flash size» when flashing
Postby ESP_Angus » Wed Apr 26, 2017 1:30 am
From the symptoms, I’d guess one of these problems (most likely first):
- Cold joint on the SPI flash signal connections (at either the ESP32 or the SPI flash chip)
- Power problems with the SPI flash rail (brownouts or a cold joint somewhere in the power rail or decoupling.)
- Bad SPI flash chip.
Switching cables did work out for all the others, but now I’m stuck on this one.
I’m not sure exactly what you mean, but it makes it sound like something may possibly be borderline in the design. How are the ESP32s powered?
-
smeedy
- Posts: 15
- Joined: Sun Jan 22, 2017 10:35 pm
Re: Constant reboot and «Could not auto-detect Flash size» when flashing
Postby smeedy » Wed Apr 26, 2017 6:31 pm
I had GPIO6 connected to the Din of a neopixel in the design. See a previous post on this on. We did a hardwire patch on the boards using GPIO19 instead and releasing the IO6. All nine are playing nice now and we can indeed light the SK8612. This one has the bootloop.
Boards are powered from a FTDI connector and/or from 5V USB with an LM117MP33. See the details on the attached screenshots. I’m not expecting problems here.
On the part of switching cables.. Indeed a little vague. I suspected a faulty cable, but all cables eventually turned out working fine on all the other PCBs and devboards. So come to think of it, this particular board gave the interference from the start, and trying to flash it probably corrupted the bootloader.
So this looks something on this specimen. So I can start brushing up my basic skills on the ROM console, or I can solder on a new WROOM32 as all the electricals measure out fine.
Thanks for your time,
Martijn
- Attachments
-
- Screen Shot 2017-04-26 at 20.21.09.png (70.17 KiB) Viewed 11212 times
-
- Screen Shot 2017-04-26 at 20.21.25.png (18.36 KiB) Viewed 11212 times
Who is online
Users browsing this forum: No registered users and 29 guests
разделы: Интернет вещей , дата: 21 ноября 2018г.
Собственная плата с модулем ESP12E
Появившись четыре года назад, модули на базе чипа ESP8266 наделали много шума, прежде всего своей ценой. Производителем чипов была на тот момент никому неизвестная китайская фирма «Espressif Systems», зарегистрированная в Шанхае. Спустя некоторое время, многие фирмы представили на рынок аналогичные модули собственного изготовления, но по цене они были (и есть) в два — пять раз дороже модулей на ESP8266.
В 2016-ом году, фирма «Espressif Systems» представила на рынок ESP32, который существенно превосходил по своим возможностям ESP8266, и интерес к ESP8266 начал сходить на нет.
ESP32 это двухядерный микроконтроллер, или SoC если угодно, работающий на частоте 240MHz и снабженный радио-интерфейсами: WIFI стандарта 802.11 n (2.4 GHz), с пропускной способностью до 150 Mbps, и Bluetooth Low Energy стандарта 4.2, который был принят четыре года назад. ЦПУ имеет архитектуру Xtensa, есть аппаратная поддержка чисел с плавающей запятой, 7-уровневый конвейер, 520 кБ(!) ОЗУ, и многое другое (см. документацию: ESP32 Datasheet).
Если конкурентов ESP8266 изготавливают все кому не лень, то у ESP32 конкурентов с сопоставимой ценой фактически нет.
Модули на ESP8266 послужили основой для огромного количества «умных розеток» и им подобных устройств. Если говорить о ESP12 модулях, то здесь имеется около 50 Кбайт ОЗУ, 4 Мбайт флеш-памяти, частота ЦПУ 80МГц, встроенный WiFi контроллер. При этом цена за все это добро — около двух долларов. К сожалению, фирма производитель не предоставляет документацию на чип. Модули поставляются как готовые устройства с AT-интерфейсом и с возможностью программирования через Arduino IDE, используя для этого официальный SDK. Поэтому все изыскания относительно устройства аппаратной части ESP8266 являются результатом исследования энтузиастов.
В статье разбирается подключение, прошивка, и работа с AT командами ESP8266. Изначально статья была целиком посвящена только ESP8266, но впоследствии я решил добавить главу о перепрошивке модуля с ESP32. AT команды в ESP32 практически все те же, что и в ESP8266, так что, все сказанное относительно работы с AT-командам ESP8266 можно отнести и к ESP32.
Большая часть материала статьи посвящена режиму работы ESP8266, когда он работает в режиме WIFI модема с AT-интерфейсом. Разбираются типовые вопросы: как настроить, что-то скачать, переслать свои данные на сервер, и т.д. Предполагается, что уровень знаний читателя о сетях нулевой. Поэтому я постарался расписать всё максимально доходчиво. Для наглядности, показана работа с программами tcpdump и Wireshark для анализа трафика ESP8266. В качестве вспомогательного оборудования используется WiFi роутер с прошивкой OpenWRT, но вместо него можно использовать любой компьютер с Linux.
-
Список используемой документации:
- ESP8266 Overview | Espressif Systems Страница продукта на сайте производителя.
- ESP8266EX Resources | Espressif Systems Страница с материалами на сайте производителя.
-
ESP8266 SDK
Getting Started Guide - ESP8266 Technical Reference
- ESP-01/07/12 Series Modules User’s Manual
- ESP8266 AT Instruction Set
- ESP8266 AT Command Examples
- ESP32 AT Instruction Set and Examples
- Netcat Cheat Sheet
- Xtensa Instruction Set Architecture (ISA)
- Статья: «ESP8266 — подключение и обновление прошивки – esp8266»
- Статья на хабре: «Reverse Engineering ESP8266 — часть 1»
- Статья на хабре: «Reverse Engineering ESP8266 — часть 2»
- ESP8266 быстрый старт
- ESP8266 продолжение. Модуль ESP-12
- Статья на хабре: «Новые ревизии модулей на базе ESP8266 не умеют писать в SPI Flash»
- Книга Дэвида Тейнсли «Linux и UNIX: программирование в shell. Руководство разработчика», глава 29 «Сценарии cgi».
Содержание:
-
I. Описание ESP8266
- Распиновка и подключение модулей ESP12
- Формат загрузочного лога, режимы работы SPI флеш-памяти
- Баг в Linux драйвере USB-UART преобразователя CP2102
-
II. Прошивка ESP8266
- Использование esptool
- Первый способ прошивки
- Второй способ прошивки
- Третий способ прошивки
- Прошивка модуля ESP12E AT-интерпретатором версии 1.7.0 (август 2018г)
-
III. Использование связки ESP8266 + OpenWRT
- Связка OpenWRT + ESP8266, использование сниффера tcpdump и анализатора траффика Wireshark для иследования трафика ESP8266
- Получение даты и времени через сеть, используя NTP
-
IV. Связь ESP8266 с Web сервером на OpenWRT
- Связь ESP8266 с Web сервером на OpenWrt: настройка OpenWRT
- АТ-команды для установки TCP/UDP соединения
- Получение web-страницы от сервера на OpenWRT
- Получение лога погоды от сервера на OpenWRT
-
V. Связь ESP8266 с Web сервером на OpenWRT посредством CGI скриптов
- Управление OpenWRT через ESP8266 посредством CGI интерфейса
- Отправка данных от ESP8266 на web-сервер OpenWRT через GET запрос
- Отправка данных от ESP8266 на web-сервер OpenWRT через POST запрос
-
VI. Прозрачный режим соединения (UART-WiFi passthrough)
- Управление Linux/OpenWRT используя режим «UART-WiFi passthrough»
-
VI. Плата NodeMCU с модулем ESP-WROOM-32
- Прошивка ESP32 в интерпретатор AT-команд
1) Распиновка и подключение модулей ESP12
Распиновка модулей ES8266
Т.к. я счастливый обладатель двух модулей ESP12E и одного NodeMCU v.3 (он тоже на базе ESP12E), то далее речь пойдёт именно о них.
Распиновка модуля ESP12E:
Перед впаиванием модуля в плату я сделал фото обратной стороны модуля, где были нанесены обозначения выводов, после чего фотографию совместил со схемой распиновки: «вид сверху» :
Замечу, что модуль имеет светодиод подключённый к GPIO_2.
Модули ESP12E/ESP12F были спроектированы компанией Ai-Thinker. У них на сайте имеется хороший мануал по модулям их производства: ESP-01/07/12 Series Modules User’s Manual. Но фактически, модули могут изготавливаются в Китае кем угодно.
Посмотреть модельный ряд модулей Ai-Thinker на базе чипа ESP8266, можно на следующей картинке:
Из всего ряда в ходу сейчас остались: ESP01 который имеет выводы с шагом 2.5 мм, ESP07 который имеет разъём для внешней антенны, и ESP12E/ESP12F. Замечу, что модули ESP01 идут с флешкой на 1 мегабайт, а первые модели шли вообще с 512кБ флеш-памяти.
Распиновка модуля Nodemcu v.3:
Здесь имеется две кнопки: «RESET», и непонятная кнопка «FLASH». Непонятна она потому, что прошивка у NodeMCU происходит в автоматическом режиме, кнопку «FLASH» для этого зажимать не нужно. Также NodeMCU имеет линейный стабилизатор на 3.3 Вольт и USB-UART преобразователь на чипе CP2102. Данную плату можно использовать с беспаячной макеткой, в то время как вариант платы с чипом ch340g туда уже не влазит. Т.е. влазить то он влазит, но при этом закрывает все контактные ячейки.
К недостаткам платы NodeMCU я отнесу то, что она не умеет работать с режимом глубокого сна ESP8266 (deep sleep). После «засыпания» проснуться ESP8266 уже не может, приходится нажимать Reset.
Фирма «Espressif Systems» выпускает свой модуль на базе ESP8266 под обозначением ESP-WROOM-02. В документации во всех примерах используется именно он. Данный модуль имеет сертификат FCC для продажи на территории США:
Заметьте, что на плате имеется знак чувствительности к электростатике. Зимой при сухом воздухе это особенно актуально.
Подключение модуля
Если плату NodeMCU можно сразу подключать к USB-порту компьютера, то с модулем ESP12 придётся немного повозится.
Нам понадобится USB-UART преобразователь с 3.3 вольтовой логикой, паяльник и несколько проводов. В ESP8266 SDK Getting Started Guide приводится следующая схема подключения:
На фотографии слева видны три провода ведущие к USB-UART преобразователю, «земля» подключена к GPIO_0 и GPIO_15, питание 3.3 Вольт подаётся на EN-пин.
Выглядит это так:
Обратите внимание на жёлтый провод с коннектором. При включении, ESP8266 проверяет состояние GPIO_0. Если он оказывается подключён к «земле», то ESP8266 входит в режим прошивки и какое-то время ждёт, поступление прошивки через UART. Т.о. для прошивки ESP8266 контакт GPIO_0 должен быть подтянут к «земле», для обычной работы он должен быть свободен.
В случае использования модуля ESP12E, подключение будет таким:
Здесь кроме всего прочего, в питанию подтягивается ещё и RESET.
Но всё-таки скрутки проводов — это не дело. Мой взгляд на али привлёк такой адаптер:
Здесь уже есть пара подтягивающих резисторов: GPIO_15 к «земле» и CP_PD/EN к питанию. Отсутствует нижняя группа контактов, но она используется чипом ESP8266 для соединения с флеш-памятью, т.е. для вас она бесполезна. На обратной стороне адаптера имеется опциональная площадка для линейного регулятора на 3.3В в корпусе SOT-89, но вот конденсаторы для него впаивать некуда, так что это площадка бесполезна. В макетку этот адаптер тоже не запихнёшь, габариты не позволят. Но в остальном, на мой взгляд это лучше чем скрутка проводов.
И все-таки я решил делать свою плату. Я уже упоминал, что весной у меня была возможность заказать два комплекта печатных плат в Китае. И если первым комплектом была STM8 Board, то вторым комплектом я заказал платы для ESP8266.
В качестве схемы я выбрал простую схему из статьи «ESP8266 — подключение и обновление прошивки – esp8266»:
Я не пытался предварительно собрать её на макетке, чтобы проверить работоспособность, или найти ошибки. Поэтому косяки я отлавливал уже на «железе»
Что же с этой схемой не так? Во-первых, здесь перепутаны контакты GPIO_4 и GPIO_5. К счастью, в моем случае это оказалось не принципиально. Во-вторых, здесь не хватает кнопки на CH_PD/EN. Этот пин отключает питание esp8266. Когда требуется перепрошить ESP12, то приходится выполнять такую последовательность: «Отключите CH_PD от питания, подключите GPIO0 модуля к GND, подключите обратно CH_PD модуля.» Мне приходилось просто отключать питание ESP12. Повторять это последовательность по двадцать раз кряду — сильно утомляет. Кнопка с фиксацией на CH_PD/EN и светодиод индикации питания решила бы все проблемы. В принципе, можно использовать USB хаб с кнопками вкл/выкл для питания такой платы. Это удобно. В третьих, здесь не помешали бы подтягивающие резисторы на свободных GPIO. В HiZ состоянии они смогут значительно уменьшить энергопотребление. Если даже они не нужны, то их можно и не впаивать.
К преимуществам данной схемы я могу отнести то, что режим энергосбережения deep sleep здесь работает без каких-либо вопросов. Сам бы я не скоро догадался, что для этого надо ставить резистор на GPIO16.
Вариант платы который у меня получился по этой схеме:
Здесь есть линейный стабилизатор на 3.3 В, кнопка Reset, джампер на GPIO_0, и штыревой разъём для USB-UART преобразователя на чипе FT232RL.
Как я уже сказал, не хватает кнопки питания.
Ещё хотелось бы коснуться темы автозагрузки прошивки в ESP8266, т.е. когда не надо вручную соединять GPIO_0 с землёй для перепрошивки. В статье: «ESP8266 — подключение и обновление прошивки – esp8266» предлагается такая схема с автозагрузкой прошивки:
В руководстве Ai-Thinker я нашёл на мой взгляд более грамотную, схему узла автозагрузки:
В любом случае, для дальнейшей работы вполне сгодится недорогая плата NodeMCU, в которой есть эта самая автозагрузка (правда там не работает ражим энергосбережения «deep sleep»).
2) Формат загрузочного лога, режимы работы SPI флеш-памяти
Для того что бы можно было приступить к изучению AT-команд ESP8266, сначала нужно научиться перепрошивать этот самый ESP8266. Актуальная на настоящий момент версия AT-интерпретатора — 1.7.0, и мне хотелось бы рассказывать о работе именно с этой версией AT-интерпретатора.
Если вы только что приобрели модуль ESP12, то там уже должен быть уже прошит интерпретатор AT-команд, скорее всего какой-нибудь старой версии. В модулях которые я приобрёл, прошивка оказалось годичной давности.
Нам потребуется терминальная программа, и т.к. в дальнейшем все-равно придётся использовать Arduino IDE, то я буду использовать монитор последовательного порта Arduino IDE.
После подключения к ESP12, в мониторе последовательного порта нужно будет выставить окончание строки: «NL & CR» и скорость порта 115200 бод. После нужно подать команду: «AT» и в ответ должно прийти «ОК»:
Если отклик «OK» был получен, то ваш модуль ESP12 в порядке и можно начинать работу с ним. В противном случае попробуйте перезагрузить ESP8266 и попробовать снова.
Предположим, что ваш модуль в порядке. Для начала полезно будет взглянуть на загрузочный лог. Для этого смените скорость порта в терминальной программе на 74880 бод и нажмите Reset для перезагрузки ESP8266. В терминале появится такой лог:
ets Jan 8 2013,rst cause:2, boot mode:(3,6) load 0x40100000, len 2408, room 16 tail 8 chksum 0xe5 load 0x3ffe8000, len 776, room 0 tail 8 chksum 0x84 load 0x3ffe8310, len 632, room 0 tail 8 chksum 0xd8 csum 0xd8 2nd boot version : 1.6 SPI Speed : 40MHz SPI Mode : QIO SPI Flash Size & Map: 32Mbit(512KB+512KB) jump to run user1 @ 1000 rf cal sector: 1017 rf[112] : 00 rf[113] : 00 rf[114] : 01 SDK ver: 2.0.0(5a875ba) compiled @ Aug 9 2016 15:12:27 phy ver: 1055, pp ver: 10.2 "�j��
На что нужно смотреть в этом логе?
Версия загрузчика:
2nd boot version : 1.6
Версия загрузчика, версия SDK и версия AT-интерфейса — это разные вещи. За формат загрузочного лога отвечает именно загрузчик. Актуальная на данный момент версия загрузчика — 1.7.
В данном случае загрузчик нам сразу печатает версию SDK:
SDK ver: 2.0.0(5a875ba) compiled @ Aug 9 2016 15:12:27
Имеем SDK двухлетней давности, актуальная версия SDK на настоящий момент — 3.0.0.
SPI Flash Size & Map: 32Mbit(512KB+512KB)
Это формат прошивки: имеется 32-мегабитная флешка, 512кБ отведено под SDK, ещё 512 кБ отведено под пользовательскую прошивку. Заметьте, это не тест. Вместо , 32Mbit может быть запросто и меньший размер при фактически 32Mbit флешке. Это нормально. Идём дальше:
SPI Speed : 40MHz SPI Mode : QIO
Согласно документации на чип winbond 25q32 (Datasheet) может работать на максимальной частоте 100MHz. При этом поддерживаются четыре режима работы: Stndard SPI, Dual SPI, Quad SPI и QPI. Dual SPI эквивалентен скорости работы: частота SPI x 2. Режимы Quad и QPI эквивалентны по скорости работы: частота SPI x 4. «Расплатой» за такие фокусы служит использование дополнительных GPIO для обмена. В вики проекта esptool имеется табличка с режимами работы флеш-памяти ESP8266:
Option Mode Name Pins Used Speed (ESP8266 & ESP32) qio Quad I/O 4 pins used for address & data Fastest qout Quad Output 4 pins used for data Approx 15% slower than qio dio Dual I/O 2 pins used for address & data Approx 45% slower than qio dout Dual Output 2 pins used for data Approx 50% slower than qio
Судя по этой публикации: «Новые ревизии модулей на базе ESP8266 не умеют писать в SPI Flash», сейчас в ESP модулях используется флешка PUYA P25Q80 (Datasheet). С ней могут быть нюансы. Еще одним нюансом является то, что при использовании флешки на 4 мегабайта и больше, следует использовать режим DIO.
В вики сайта esp8266.com имеется карта памяти ESP8266 с определением границ различных регионов, составленная в результате исследования чипа. Я приведу её сокращённую версию взятую из статьи — «Reverse Engineering ESP8266 — часть 1»:
Диапазон Описание 0x3FFE8000
—
0x3FFFBFFFоперативная память для пользовательских приложений. При старте модуля может инициализироваться значениями из пользовательской прошивки. 0x3FFFC000
—
0x3FFFFFFFсистемная оперативная память 0x40000000
—
0x4000FFFFсистемный ROM. Отсюда стартует процессор, загружается пользовательская прошивка и здесь находятся основные системные библиотеки. 0x40100000
—
0x4010FFFFоперативная память, содержит пользовательскую прошивку 0x40240000
—
0x40271FFFвторая часть пользовательской прошивки. Здесь находятся код подключенных библиотек и SDK. Подмаплено к flash по адресу 40000h.
В логе печатается результат проверки контрольных сумм регионов: iram1 и dram0. Контрольной суммой является результат последовательно выполнения операции исключающего ИЛИ (XOR).
load 0x40100000, len 2408, room 16 tail 8 chksum 0xe5 load 0x3ffe8000, len 776, room 0 tail 8 chksum 0x84 load 0x3ffe8310, len 632, room 0 tail 8 chksum 0xd8 csum 0xd8
Теперь обратим внимание на эту строку загрузчика:
jump to run user1 @ 1000
Здесь осуществляется переход на пользовательскую программу, в данном случае это AT-интерпретатор.
"�j��
Это выводится слово: «ready».
3) Баг в Linux драйвере USB-UART преобразователя CP2102
Сейчас я хочу рассказать об одной проблеме, которая касается только Linux-пользователей. Linux-драйвер USB-UART преобразователя CP2102, который используется в платах NodeMCU не умеет работать на скорости 74880 бод. Проявляется это в такой ошибке:
Я проверял на трёх чипах CP2102, все они выдавали такую ошибку. Это означает, что скорость 74880 бод на них не работает. И например лог загрузки такой платы выглядит так:
Здесь нечитаемыми символами идёт вывод версии SDK. На первый взгляд проблема может показаться несущественной. Но когда вы прошьёте ESP8266 какой-нибудь глючной прошивкой, то ошибки вам будут сыпаться именно на скорости 74880. И вы их прочитать не сможете. Повторю ещё раз, что эта проблема имеется только в Linux-драйвере. В Windows всё работает как часы. Версия моего ядра: 4.4.12, надеюсь в более свежих версиях этот баг уже исправлен.
4) Использование esptool
Для прошивки ESP8266 будем использовать флешер — esptool. Это программа с открытым кодом компании «Espressif Systems». Домашняя страница проекта: https://github.com/espressif/esptool. Программа устанавливается следующей командой:
$ pip install esptool
Проверяем:
$ esptool.py -h usage: esptool [-h] [--port PORT] [--baud BAUD] {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash,verify_flash,erase_flash,version} ... esptool.py v1.2 - ESP8266 ROM Bootloader Utility positional arguments: {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash,verify_flash,erase_flash,version} Run esptool {command} -h for additional help load_ram Download an image to RAM and execute dump_mem Dump arbitrary memory to disk read_mem Read arbitrary memory location write_mem Read-modify-write to arbitrary memory location write_flash Write a binary blob to flash run Run application code in flash image_info Dump headers from an application image make_image Create an application image from binary files elf2image Create an application image from ELF file read_mac Read MAC address from OTP ROM chip_id Read Chip ID from OTP ROM flash_id Read SPI flash manufacturer and device ID read_flash Read SPI flash content verify_flash Verify a binary blob against flash erase_flash Perform Chip Erase on SPI flash version Print esptool version optional arguments: -h, --help show this help message and exit --port PORT, -p PORT Serial port device --baud BAUD, -b BAUD Serial port baud rate used when flashing/reading
Подключим ESP8266 к компьютеру и попробуем установить контакт:
$ esptool.py chip_id esptool.py v1.2 Connecting... Chip ID: 0x0041280f
$ esptool.py flash_id esptool.py v1.2 Connecting... Manufacturer: ef Device: 4016
Перед вводом команд нужно выполнить процедуру: «а) отключить питание от ESP8266; б) установить перемычку между GPIO_0 и GND; в) включить питание на ESP8266; г) перед вводом команды нажать Reset, подождать одну секунду, и нажать enter для ввода команды». Такую процедуру следует повторять каждый раз при использовании esptool. Для возвращения в нормальный режим работы следует выполнить обратную последовательность: «а) отключить питание от ESP8266; б) убрать перемычку с пинов GPIO_0 и GND; в) включить питание на ESP8266». Если необходимо выполнить несколько команд, то переключаться каждый раз между нормальным и режимом прошивки не нужно. Переключаетесь в режим прошивки, после чего жмёте reset перед каждой командой. Если у вас плата NodeMCU или любая другая плата с возможностью автоматической прошивки, то ничего этого делать не надо, там всё делается автоматически.
Перед тем, как что либо прошивать, скорее всего вам захочется сохранить имеющуюся прошивку. Делается это следующей командой:
$ esptool.py --port /dev/ttyUSB0 read_flash 0x00000 0x400000 ./esp8266_firmware.bin
Здесь первое число 0х00000 — это начальный адрес для считывания, второе число 0х400000 — это размер прошивки т.е. 4 мегабайта.
После ввода команды запустится процесс считывания прошивки который займёт примерно минут пять или шесть:
esptool.py v1.2 Connecting... Running Cesanta flasher stub... Reading 4194304 @ 0x0... 4194304 (100 %) Read 4194304 bytes at 0x0 in 391.9 seconds (85.6 kbit/s)..
5) Первый способ прошивки
Теперь мы можем уже что-нибудь прошить. Поначалу, прошивки которые лежат на сайте «Espressif Systems» у меня сыпали логами с ошибками (с последней прошивкой, которая была выложена на сайте Espressif в августе (SDK 3.0.0) в самом деле имеются сложности, но об этом позже), собирать прошивку самому у меня не было желания, поэтому самым простым способом оказалось взять прошивку на сайте ElectroDragon: «ESP8266 AT-Command firmware — ElectroDragon». Там имеется хорошая вики с инструкций по прошивке.
На сайте ElectroDragon: «ESP8266 AT-Command firmware — ElectroDragon» имеется две прошивки, первая подчёркнута красным, вторая обведена синим:
Самый простой способ прошивки — это прошивка одним файлом, как прошиваются микроконтроллеры. С ESP8266 тоже можно так работать. Скачаем и распакуем второй файл, который подчёркнут красным (альтернативная ссылка). Там будут два файла: AiThinker_ESP8266_DIO_32M_32M_20160615_V1.5.4.bin, AiThinker_ESP8266_DIO_8M_8M_20160615_V1.5.4.bin и Readme следующего содержания:
******************************************************************
AiThinker_ESP8266_DIO_8M_8M_20160615_V1.5.4.binMD5: 8E9E9252317A9BCA67673C17B9E3E075
FirmWare Infomation:
SPI MODE: DIO
Flash Size: 8Mbit
File Size: 8Mbit
SPI SPEED: 40MHz
SDK Version: V1.5.4
Release Date: 2016.6.15******************************************************************
AiThinker_ESP8266_DIO_32M_32M_20160615_V1.5.4.binMD5: B561B49242DC88EA5CBFCAB0CF287BF5
FirmWare Infomation:
SPI MODE: DIO
Flash Size: 32Mbit
File Size: 32Mbit
SPI SPEED: 40MHz
SDK Version: V1.5.4
Release Date: 2016.6.15******************************************************************
How to download:
1. Please select the firmware in ESP_DOWNLOAD_TOOL_V2.4;
2. The address should write 0x00000;
3. If you don’t know how to config your download panel, please checked the «DoNotChgBin». That will be download the bin as default setting.More infomation please visit http://www.ai-thinker.com/
If you have any question, please send your mail to support@aithinker.com
Файлы AiThinker_ESP8266_DIO_32M_32M_20160615_V1.5.4.bin, AiThinker_ESP8266_DIO_8M_8M_20160615_V1.5.4.bin это прошивки для плат с флешками на 8Mbit и 32Mbit. В разделе «FirmWare Infomation» указаны режимы флеш-памяти для прошивки. Т.к. на ESP12 установлена флешка на 32Mbit, то нам для прошивки понадобится файл: «AiThinker_ESP8266_DIO_32M_32M_20160615_V1.5.4.bin».
Проверяем контрольную сумму:
$ md5sum AiThinker_ESP8266_DIO_32M_32M_20160615_V1.5.4.bin b561b49242dc88ea5cbfcab0cf287bf5 AiThinker_ESP8266_DIO_32M_32M_20160615_V1.5.4.bin
Ок. Контрольная сумма совпадает. Тогда прошиваем следующей командой:
esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash -fm dio -ff 40m -fs 32m 0x00000 ./AiThinker_ESP8266_DIO_32M_32M_20160615_V1.5.4.bin
Здесь опции: «-fm dio -ff 40m -fs 32m» задают режим работы флеш памяти, которые были указаны в «FirmWare Infomation». Число 0х00000 — это адрес с которого начинается запись. После ввода команды запустится счётчик с процентами выполнения. Процесс прошивки займёт опять же минут пять или шесть:
esptool.py v1.2 Connecting... Running Cesanta flasher stub... Flash params set to 0x0240 Writing 4194304 @ 0x0... 4194304 (100 %) Wrote 4194304 bytes at 0x0 in 362.7 seconds (92.5 kbit/s)... Leaving...
После завершения прошивки открываем терминал и вводим тестовую команду «AT», если в ответ пришло «OK», значит все в порядке, у нас все получилось.
Далее нам понадобится справочник по AT командам. Они варьируются в зависимости от версии SDK, но мы пока будем использовать только самые базовые. Справочник нужно будет скачать с сайта «Espressif Systems»:
Прямая ссылка на актуальную версию справочника — ESP8266 AT Instruction Set.
Команды АТ-интерфейса можно сравнить с переменными, функциями или может быть с функторами в обычной программе. Соответственно, у этих функций/команд можно запросить текущие параметры (Query Command), тогда после имени команды используется знак вопроса. Можно назначить свои параметры (Set Command), когда после имени команды используется символ «=». Можно запустить команду на выполнение (Execute Command). Также имеется тест команды (Test Command») когда проверяется, поддерживается ли данная команда данным АТ-интерпретатором. Для теста используется комбинация символов: «=?». Не все команды поддерживают все четыре типа обращения к ним, поэтому некоторые из них выглядят как операторы, другие как переменные, третьи как функторы.
Первым делом нам понадобится информация о версиях имеющегося на борту ПО. Она извлекается с помощью команды: AT+GMR
AT+GMR — Вывод информации о версиях ПО
Execute Command: AT+GMR Отклик: <AT version info>
<SDK version info>
<compile time>
OKПараметры: • <AT version info>: версия AT-интерпретатора.
• <SDK version info>: версия SDK.
• <compile time>: дата компиляции BIN-файла.
Выполняем:
AT+GMR AT version:1.1.0.0(May 11 2016 18:09:56) SDK version:1.5.4(baaeaebb) Ai-Thinker Technology Co. Ltd. Jun 13 2016 11:29:20 OK
На сайте ElectroDragon: «ESP8266 AT-Command firmware — ElectroDragon» прошивки время от времени обновляются, вот отчёт о версиях ПО прошивки которую я брал там летом:
AT+GMR AT version:0.40.0.0(Aug 8 2015 14:45:58) SDK version:1.3.0 Ai-Thinker Technology Co.,Ltd. Build:1.3.0.2 Sep 11 2015 11:48:04 OK
Вот ещё отчёт прошивки которая была зашита к купленных мною модулях:
AT+GMR AT version:1.3.0.0(Jul 14 2016 18:54:01) SDK version:2.0.0(5a875ba) Farylink Technology Co., Ltd. v1.0.0.2 May 11 2017 22:23:58 OK
Я думаю, что если бы это были оригинальные модули Ai-Thinker, то здесь бы не стояло упоминание какой-то непонятной фирмы: «Farylink Technology Co., Ltd.»
Теперь для обновления прошивки из «облака» нам понадобиться подключиться к интернет. Для этого нам понадобится следующие команды:
AT+CWMODE_CUR — Установка текущего режима Wi-Fi; Конфигурация НЕ СОХРАНЯЕТСЯ во флеш-памяти
Команды: Test Command:
AT+CWMODE_CUR=?Query Command:
AT+CWMODE_CUR?
Назначение: запрашивает текущий режим работы Wi-Fi ESP8266.Set Command:
AT+CWMODE_CUR=<режим>
Назначение: устанавливает текущий режим работы Wi-Fi ESP8266.Отклик: +CWMODE_CUR:<режим>
OK+CWMODE_CUR:<режим>
OKOK Параметры: <режим>:
‣ 1: Station mode
‣ 2: SoftAP mode
‣ 3: SoftAP+Station modeЗамечания: Конфигурация НЕ СОХРАНЯЕТСЯ во флеш-памяти Примеры: AT+CWMODE_CUR=3
AT+CWMODE_DEF — Установка режима Wi-Fi по умолчанию; Конфигурация сохраняется во флеш-памяти
Команды: Test Command:
AT+CWMODE_DEF=?Query Command:
AT+CWMODE_DEF?
Назначение: запрашивает текущий режим работы Wi-Fi ESP8266.Set Command:
AT+CWMODE_DEF=<режим>
Назначение: устанавливает режим работы Wi-Fi по умолчанию.Отклик: +CWMODE_DEF:<режим>
OK+CWMODE_DEF:<режим>
OKOK Параметры: <режим>:
‣ 1: Station mode
‣ 2: SoftAP mode
‣ 3: SoftAP+Station modeЗамечания: Изменённое значение будет сохранено в области параметров Примеры: AT+CWMODE_DEF=3
Устанавливаем режим клиента (Station):
AT+CWMODE_CUR=1OK
Поверяем:
AT+CWMODE_CUR?
+CWMODE_CUR:1OK
Смотрим какой режим работы Wifi установлен по умолчанию:
AT+CWMODE_DEF?
+CWMODE_DEF:2OK
Теперь нам нужно найти точку доступа. Делается это с помощью команды AT+CWLAP:
AT+CWLAP — вывод списка точек доступа WiFi
Команды: Set Command:
AT+CWLAP[=<ssid>,<mac>,<channel>,<scan_type>, <scan_time_min>,<scan_time_max>]
Действие: выполняет поиск точки
доступа с определённым SSID
и/или MAC-адресом, на определённом канале.Execute Command:
AT+CWLAP
Действие: выводит список всех доступных точек доступа WiFi.Отклик: +CWLAP:<ecn>,<ssid>,<rssi>,<mac>,<channel>,
<freq offset>,<freq cali>,
<pairwise_cipher>,<group_cipher>,<bgn>,<wps>OK
+CWLAP:<ecn>,<ssid>,<rssi>,<mac>,<channel>,
<freq offset>,<freq cali>,
<pairwise_cipher>,<group_cipher>,<bgn>,<wps>OK
Параметры:
- [<scan_type>]: не обязательный параметр
‣ 0: активное сканирование
‣ 1: пассивное сканирование- [<scan_time_min>] : не обязательный параметр, задаётся в мс, диапазон: [0,1500]
‣ При активном сканировании, <scan_time_min> задаёт минимальное время сканирования каждого канала, по умолчанию равно 0
‣ При пассивном сканировании, значение параметра <scan_time_min> не имеет значения и оно может быть пропущено.- [<scan_time_max>] : не обязательный параметр, задаётся в мс, диапазон: [0,1500]
‣ При активном сканировании, <scan_time_max> задаёт максимальное время сканирования для каждого канала; если значение сброшено в ноль, то будет использоваться значение по умолчанию 120 мс.
‣ При пассивном сканировании, <scan_time_max> задаёт время сканирования каждого канала, по умолчанию используется значение в 360 мс- <ecn>: метод шифрования:
‣ 0: OPEN
‣ 1: WEP
‣ 2: WPA_PSK
‣ 3: WPA2_PSK
‣ 4: WPA_WPA2_PSK
‣ 5: WPA2_Enterprise (AT can NOT connect to WPA2_Enterprise AP for now.)- <ssid>: строковый параметр, задаёт SSID точки доступа.
- <rssi>: уровень сигнала.
- <mac>: строковый параметр, задаёт MAC адрес точки доступа.
- <channel>: номер канала.
- <freq offset>: frequency offset of AP; unit: KHz. The value of ppm is <freq offset>/2.4.
- <freq calibration>: calibration for frequency offset.
- <pairwise_cipher>:
‣ 0:CIPHER_NONE
‣ 1:CIPHER_WEP40
‣ 2:CIPHER_WEP104
‣ 3:CIPHER_TKIP
‣ 4:CIPHER_CCMP
‣ 5:CIPHER_TKIP_CCMP
‣ 6:CIPHER_UNKNOWN- <group_cipher>:задаёт тип шифра, значения такие же как и для <pairwise_cipher>
- <bgn>:
‣ bit0 управляет 802.11b режимом; bit1 управляет 802.11g режимом; bit2 управляет 802.11n режимом;
‣ Если значение bit установлено в 1, то соответствующий 802.11 режим будет включён; Если бит будет сброшен в ноль, соответствующий 802.11 режим будет отключён.- <wps>:0 — WPS будет отключено; 1 — WPS будет включено.
Примеры: поиск определённой точки доступа:
AT+CWLAP=»Wi-Fi»,»ca:d7:19:d8:a6:44″,6
или поиск точки доступа по SSID:
AT+CWLAP=»Wi-Fi»
или включение режима пассивного сканирования:
AT+CWLAP=,,,1,,
Сканируем воздух:
AT+CWLAP +CWLAP:(4,"ROSTELECOM_F0DB",-89,"2c:e4:12:3d:f0:dc",1,-24,0) +CWLAP:(4,"TP-LINK_A469B8",-92,"b0:48:7a:a4:69:b8",1,11,0) +CWLAP:(4,"WiFi-DOM.ru-5723",-89,"cc:7b:36:b3:1f:79",1,-9,0) +CWLAP:(4,"Russkikh",-93,"f0:b4:29:d6:8d:f2",1,-4,0) +CWLAP:(4,"WiFi-DOM.ru-1784",-84,"ac:64:62:83:19:08",2,13,0) +CWLAP:(3,"Keenetic-7788",-91,"04:bf:6d:97:08:e4",4,21,0) +CWLAP:(3,"servant",-75,"14:cc:20:33:44:4e",6,11,0) +CWLAP:(4,"WiFi-DOM.ru-5838",-92,"d4:76:ea:20:02:38",6,-19,0) +CWLAP:(4,"ASUS",-90,"00:1a:2b:3c:ff:02",7,6,0) +CWLAP:(4,"elektrik018",-87,"f0:7d:68:95:b8:e2",9,-7,0) +CWLAP:(4,"DOM.RU",-89,"c0:4a:00:4d:3f:7c",10,20,0) +CWLAP:(3,"NETGEAR_146",-76,"c4:3d:c7:8f:44:74",11,-2,0) +CWLAP:(3,"Alien",-22,"00:90:4c:c1:00:00",11,10,0) +CWLAP:(4,"WiFi-DOM.ru-1587",-85,"a0:ec:81:23:5a:b1",11,1,0) +CWLAP:(4,"Brute",-59,"40:f2:01:c1:25:2b",11,10,0) +CWLAP:(4,"WiFi-DOM.ru-8332",-79,"20:89:87:94:d6:ed",11,-12,0) +CWLAP:(3,"MTSRouter-9B1812",-90,"1c:5f:2b:9b:18:12",13,6,0) OK
AT+CWJAP_CUR — подключение к точке доступа, конфигурация НЕ сохраняется во флеш-памяти
Команды: Query Command:
AT+CWJAP_CUR?
Действие: печатает точку доступа к которой в данный момент подключён ESP8266.Set Command:
AT+CWJAP_CUR=<ssid>,<pwd>,[<bssid>][,<pci_en>]
Действие: подключается к указанной точке доступа.Отклик: +CWJAP_CUR:<ssid>,<bssid>,<channel>,<rssi> OK
OK или
+CWJAP_CUR:<error code>
FAIL
Параметры: <ssid>: строковый параметр показывающий SSID целевой точки доступа.
- <ssid>: SSID целевой точки доступа.
- <pwd>: пароль, максимум 64 символа ASCII.
- [<bssid>]: опциональный параметр к качестве которого используется MAC-адрес целевой точки доступа. Используется когда несколько точек доступа имеют одинаковый SSID.
- [<pci_en>]: опциональный параметр который отключает подключение по WEP и к открытым точкам доступа. Может использоваться для PCI аутентификация.
- <error code>: (for reference only)
‣ 1: истечение таймаута.
‣ 2: неверный пароль.
‣ 3: не получается найти точку доступа.
‣ 4: ошибка соединения.Эта команда требует чтобы ESP8266 находился в режиме клиента (Station). Эскейп-последовательности используются, когда SSID или пароль содержат в себе специальные символы, такие как: , или ” или .
Замечания: Изменения конфигурации НЕ сохраняются во флеш-памяти. Примеры: AT+CWJAP_CUR=»abc»,»0123456789″ К примеру, для подключения к точке доступа: «ab,c» с паролем: «0123456789»», следует выполнить следующую команду:
AT+CWJAP_CUR=»ab\,c»,»0123456789″\»
Если несколько точект доступа имеют одинаковый SSID: «abc», то подключиться можно через BSSID:
AT+CWJAP_CUR=»abc»,»0123456789″,»ca:d7:19:d8:a6:44″
AT+CWJAP_DEF — подключение к точке доступа, конфигурация сохраняется во флеш-памяти
Команды: Query Command:
AT+CWJAP_DEF?
Действие: печатает точку доступа к которой в данный момент подключён ESP8266.Set Command:
AT+CWJAP_DEF=<ssid>,<pwd>,[<bssid>][,<pci_en>]
Действие: подключается к указанной точке доступа.Отклик: +CWJAP_DEF:<ssid>,<bssid>,<channel>,<rssi> OK
OK или
+CWJAP_DEF:<error code>
FAIL
Параметры: <ssid>: строковый параметр показывающий SSID целевой точки доступа.
- <ssid>: SSID целевой точки доступа.
- <pwd>: пароль, максимум 64 символа ASCII.
- [<bssid>]: опциональный параметр к качестве которого используется MAC-адрес целевой точки доступа. Используется когда несколько точек доступа имеют одинаковый SSID.
- [<pci_en>]: опциональный параметр который отключает подключение по WEP и к открытым точкам доступа. Может использоваться для PCI аутентификация.
- <error code>: (for reference only)
‣ 1: истечение таймаута.
‣ 2: неверный пароль.
‣ 3: не получается найти точку доступа.
‣ 4: ошибка соединения.Эта команда требует чтобы ESP8266 находился в режиме клиента (Station). Эскейп-последовательности используются, когда SSID или пароль содержат в себе специальные символы, такие как: , или ” или .
Замечания: Изменения конфигурации сохранются во флеш-памяти. Примеры: AT+CWJAP_DEF=»abc»,»0123456789″ К примеру, для подключения к точке доступа: «ab,c» с паролем: «0123456789»», следует выполнить следующую команду:
AT+CWJAP_DEF=»ab\,c»,»0123456789″\»
Если несколько точек доступа имеют одинаковый SSID: «abc», то подключиться можно через BSSID:
AT+CWJAP_DEF=»abc»,»0123456789″,»ca:d7:19:d8:a6:44″
Подключаемся к точке доступа:
AT+CWJAP_CUR="Alien","password"
WIFI CONNECTED
WIFI GOT IPOK
Далее смотрим IP адрес который получил ESP8266:
AT+CIFSR — показать локальный IP адрес
Execute Command: AT+CIFSR Отклик: +CIFSR:APIP,<SoftAP IP address>
+CIFSR:APMAC,<SoftAP MAC address>
+CIFSR:STAIP,<Station IP address>
+CIFSR:STAMAC,<Station MAC address>
OKПараметры: <IP address>:
IP адрес ESP8266 в режиме SoftAP;
IP адрес ESP8266 в режиме клиента (Station)
<MAC address>:
MAC адрес ESP8266 в режиме SoftAP;
MAC адрес ESP8266 в режиме клиента (Station).Замечания: Station IP можно получить только когда ESP8266 находится в режиме клиента и при этом подключён к точке доступа
AT+CIFSR
+CIFSR:STAIP,"192.168.1.125"
+CIFSR:STAMAC,"60:01:94:41:28:0f"OK
Пробуем достучаться до интернета :
AT+PING — посылка Ping пакета
Set Command: AT+PING=<IP>
Действие: посылка ping пакета.Отклик: +<time> OK
или
+timeout
ERROR
Параметры:
- <IP>: IP хоста или имя домена
- <time>: время отклика на ping
Примеры: AT+PING=»192.168.1.1″ AT+PING=»www.baidu.com»
AT+PING="ya.ru"
+32OK
Обновление прошивки из «облака» осуществляется с помощью команды CIUPDATE:
AT+CIUPDATE — Обновление прошивки через Wi-Fi
Execute Command: AT+CIUPDATE Действие: обновление ПО
Отклик: +CIPUPDATE:<n> OK
Параметры отклика:
- <n>:
‣ 1: поиск сервера.
‣ 2: подключение к серверу.
‣ 3: запрос версии ПО.
‣ 4: запуск обновления.Замечания:
- Скорость обновления зависит от скорости интернет-соединения.
- ERROR будет возвращён, если обновление прервётся из-за неудовлетворительного интернет-соединения. Подождите некоторое время, прежде чем повторять попытку.
Замечания:
- При использовании Espressif’s AT BIN (/ESP8266_NONOS_SDK/bin/at), команда AT+CIUPDATE загрузит новый AT BIN из облака Espressif.
- Если используется скомпилированная самостоятельно прошивка AT BIN, то самостоятельно нужно скомпилировать и обновление для AT+CIUPDATE. Espressif предоставляет в SDK пример локального обновления в (/ESP8266_NONOS_SDK/example/at).
- После обновления рекомендуется выполнить AT+RESTORE для восстановления установок по умолчанию.
Обновляем:
AT+CIUPDATE +CIPUPDATE:1 +CIPUPDATE:2 +CIPUPDATE:3 +CIPUPDATE:4 OK
Обновление занимает где-то одну минуту. После обновления выполняем сброс настроек:
AT+RESTORE — Сброс к заводским настройкам
Execute Command: AT+RESTORE Отклик: OK Параметры: Выполнение этой команды сбросит все настройки сохранённые на флешке, что вернёт прошивку к заводским настройкам. После выполнения команды чип будет перезагружен.
В случае, если использовались команды с суффиксом CUR, то для сброса будет достаточно обычного Reset:
AT+RST — Перезагрузка модуля
Execute Command: AT+RST Отклик: OK Параметры: отсутствуют
Выполняем сброс:
Обратите внимание, что вектор старта программы изменился с 0х01000 на 0х81000. Если теперь перешить загрузчик который вернёт вектор старта на 0х01000, то будет запускаться старая прошивка. Т.е. она никуда не делась.
Проверяем версии ПО:
AT+GMR AT version:1.2.0.0(Jul 1 2016 20:04:45) SDK version:1.5.4.1(39cb9a32) Ai-Thinker Technology Co. Ltd. v1.5.4.1-a Nov 30 2017 15:54:51 OK
Обновился AT-интерпретатор с версии «AT version:1.1.0.0(May 11 2016 18:09:56)» до «AT version:1.2.0.0(Jul 1 2016 20:04:45)». Негусто.
6) Второй способ прошивки
На самом деле ESP8266 почти никогда не прошивается одним файлом. Во-первых это долго, во-вторых неудобно. ESP8266 прошивается по регионам. Загрузчик в один регион, SDK в другой, AT-bin в третий. Это быстрее и удобнее, хотя поначалу может сбить с толку. Исключением является создание и восстановление backup прошивки.
Скачаем теперь с сайта «ESP8266 AT-Command firmware — ElectroDragon» прошивку обведённую синим (альтернативная ссылка):
После распаковки архива у нас будет следующая структура файлов и каталогов:
$ tree . . └── ├── │ ├── user1.2048.new.5.bin │ └── user2.2048.new.5.bin ├── │ ├── user1.1024.new.2.bin │ └── user2.1024.new.2.bin ├── README.md ├── blank.bin ├── boot_v1.5.bin ├── esp_init_data_default.bin └── ├── eagle.flash.bin └── eagle.irom0text.bin 4 directories, 11 files
Подозреваю, что предполётный инструктаж будет находится в файле README.md:
# BOOT MODE
## download
### Flash size 8Mbit: 512KB+512KB
boot_v1.2+.bin 0x00000
user1.1024.new.2.bin 0x01000
esp_init_data_default.bin 0xfc000 (optional)
blank.bin 0x7e000 & 0xfe000### Flash size 16Mbit: 512KB+512KB
boot_v1.2+.bin 0x00000
user1.1024.new.2.bin 0x01000
esp_init_data_default.bin 0x1fc000 (optional)
blank.bin 0x7e000 & 0x1fe000### Flash size 16Mbit-C1: 1024KB+1024KB
boot_v1.2+.bin 0x00000
user1.2048.new.5.bin 0x01000
esp_init_data_default.bin 0x1fc000 (optional)
blank.bin 0xfe000 & 0x1fe000
### Flash size 32Mbit: 512KB+512KB
boot_v1.2+.bin 0x00000
user1.1024.new.2.bin 0x01000
esp_init_data_default.bin 0x3fc000 (optional)
blank.bin 0x7e000 & 0x3fe000
### Flash size 32Mbit-C1: 1024KB+1024KB
boot_v1.2+.bin 0x00000
user1.2048.new.5.bin 0x01000
esp_init_data_default.bin 0x3fc000 (optional)
blank.bin 0xfe000 & 0x3fe000# NON-BOOT MODE
## download
eagle.flash.bin 0x00000
eagle.irom0text.bin 0x10000
blank.bin
Flash size 8Mbit: 0x7e000 & 0xfe000
Flash size 16Mbit: 0x7e000 & 0x1fe000
Flash size 16Mbit-C1: 0xfe000 & 0x1fe000
Flash size 32Mbit: 0x7e000 & 0x3fe000
Flash size 32Mbit-C1: 0xfe000 & 0x3fe000
esp_init_data_default.bin (optional)
Flash size 8Mbit: 0xfc000
Flash size 16Mbit: 0x1fc000
Flash size 16Mbit-C1: 0x1fc000
Flash size 32Mbit: 0x3fc000
Flash size 32Mbit-C1: 0x3fc000## compile
modify eagle.app.v6.ld, as
irom0_0_seg : org = 0x40210000, len = 0x6C000NOTICE: UPDATE is not supported in non-boot mode; 4Mbit Flash is not supported in non-boot mode;
# Update steps
1.Make sure TE(terminal equipment) is in sta or sta+ap modeAT+CWMODE=3
OK2.Make sure TE got ip address
AT+CWJAP=»ssid»,»12345678″
OKAT+CIFSR
192.168.1.1343.Let’s update
AT+CIUPDATE
+CIPUPDATE:1 found server
+CIPUPDATE:2 connect server
+CIPUPDATE:3 got edition
+CIPUPDATE:4 start startOK
NOTICE: If there are mistakes in the updating, then break update and print ERROR.
Т.к. у нас флешка на 32Mbit, нас будет интересовать фрагмент выделенный красным.
Очищаем флешку:
$ esptool.py -p /dev/ttyUSB0 erase_flash esptool.py v1.2 Connecting... Running Cesanta flasher stub... Erasing flash (this may take a while)... Erase took 6.8 seconds
После чего, руководствуясь адресами в выделенном красным фрагменте, составляем следующую команду:
$ esptool.py -p /dev/ttyUSB0 write_flash -fm dio -ff 40m -fs 32m 0x00000 ./AT_bin/boot_v1.5.bin 0x01000 ./AT_bin/512+512/user1.1024.new.2.bin 0x3fc000 ./AT_bin/esp_init_data_default.bin 0x7e000 ./AT_bin/blank.bin 0x3fe000 ./AT_bin/blank.bin
Прошиваем:
$ esptool.py -p /dev/ttyUSB0 write_flash -fm dio -ff 40m -fs 32m 0x00000 ./AT_bin/boot_v1.5.bin 0x01000 ./AT_bin/512+512/user1.1024.new.2.bin 0x3fc000 ./AT_bin/esp_init_data_default.bin 0x7e000 ./AT_bin/blank.bin 0x3fe000 ./AT_bin/blank.bin esptool.py v1.2 Connecting... Running Cesanta flasher stub... Flash params set to 0x0240 Writing 4096 @ 0x0... 4096 (100 %) Wrote 4096 bytes at 0x0 in 0.4 seconds (90.5 kbit/s)... Writing 401408 @ 0x1000... 401408 (100 %) Wrote 401408 bytes at 0x1000 in 34.7 seconds (92.6 kbit/s)... Writing 4096 @ 0x3fc000... 4096 (100 %) Wrote 4096 bytes at 0x3fc000 in 0.4 seconds (90.4 kbit/s)... Writing 4096 @ 0x7e000... 4096 (100 %) Wrote 4096 bytes at 0x7e000 in 0.4 seconds (90.3 kbit/s)... Writing 4096 @ 0x3fe000... 4096 (100 %) Wrote 4096 bytes at 0x3fe000 in 0.4 seconds (90.5 kbit/s)... Leaving...
Проверяем:
AT OK AT+GMR AT version:1.1.0.0(May 11 2016 18:09:56) SDK version:1.5.4(baaeaebb) compile time:May 20 2016 15:06:44 OK
Далее, так же как предыдущем случае обновляем прошивку:
AT+CWMODE_CUR=1 OK AT+CWLAP +CWLAP:(4,"WiFi-DOM.ru-5723",-90,"cc:7b:36:b3:1f:79",1,-9,0) +CWLAP:(3,"DIR-48",-91,"28:10:7b:f2:65:ea",1,13,0) +CWLAP:(4,"WiFi-DOM.ru-1784",-87,"ac:64:62:83:19:08",2,21,0) +CWLAP:(3,"Keenetic-4263",-91,"10:7b:ef:5d:17:64",3,3,0) +CWLAP:(3,"Keenetic-7788",-90,"04:bf:6d:97:08:e4",4,20,0) +CWLAP:(3,"servant",-79,"14:cc:20:33:44:4e",6,11,0) +CWLAP:(4,"Super S",-83,"f8:1a:67:50:32:ee",6,10,0) +CWLAP:(4,"WiFi-DOM.ru-5838",-92,"d4:76:ea:20:02:38",6,-17,0) +CWLAP:(4,"WiFi-DOM.ru-8332",-81,"20:89:87:94:d6:ed",11,-12,0) +CWLAP:(4,"Brute",-67,"40:f2:01:c1:25:2b",11,10,0) +CWLAP:(4,"ROSTELECOM_F0DB",-87,"2c:e4:12:3d:f0:dc",11,-24,0) +CWLAP:(3,"Alien",-33,"00:90:4c:c1:00:00",11,10,0) +CWLAP:(3,"Дмитрий",-87,"d4:6e:0e:64:e5:86",12,3,0) OK AT+CWJAP_CUR="Alien","password" WIFI CONNECTED WIFI GOT IP OK AT+CIFSR +CIFSR:STAIP,"192.168.1.125" +CIFSR:STAMAC,"60:01:94:41:28:0f" OK AT+PING="ya.ru" +34 OK AT+CIUPDATE +CIPUPDATE:1 +CIPUPDATE:2 +CIPUPDATE:3 +CIPUPDATE:4 ERROR AT+PING="ya.ru" +33 OK AT+CIUPDATE +CIPUPDATE:1 +CIPUPDATE:2 +CIPUPDATE:3 +CIPUPDATE:3 +CIPUPDATE:4 OK
По логу видно что в даннном случае не обошлось без ошибки при обновлении. Процедуру пришлось повторять. И несмотря на то, что я использовал команды с суффиксом CUR, после перезагрузки ESP8266 вновь подключается в точке доступа.
Делаем RESTORE, затем смотрим на версии того что прилетело по воздуху:
AT+GMR AT version:1.6.2.0(Apr 13 2018 11:10:59) SDK version:2.2.1(6ab97e9) compile time:Jun 7 2018 19:34:27 Bin version(Wroom 02):1.6.2 OK
Вот это уже лучше, прошивка этого года. Пробуем дать команду из свежего SDK:
AT+SYSRAM — Проверка оставшейся свободной памяти в ОЗУ
Query Command: AT+SYSRAM? Отклик: +SYSRAM:<remaining RAM size> OK
Параметры отклика: <remaining RAM size>: оставшаяся свободная память в байтах.
Выполняем:
AT+SYSRAM?
+SYSRAM:33432OK
Имеем свободные 32 кбайта ОЗУ. Это уже что-то.
7) Третий способ прошивки
На самом деле, совсем не обязательно так все усложнять, мне просто хотелось показать процесс обновления прошивки «по воздуху». Прошивки с такой возможностью таки и называются: «over the air» или «OTA».
Для загрузки нужной прошивки мы можем зайти на сайт ESP8266EX Resources | Espressif Systems и скачать прошивку нужной версии. В этом случае ничего обновлять уже не придётся.
Как я уже говорил, с прошивкой AT-интерпретатора последней версии 1.7 имеются проблемы, она не поддерживает флешки 32Mbit, но мы можем загрузить прошивку версии 1.6. Это та же версия, что мы получили через обновление, но стартовать она будет с адреса 0x01000, а не 0х81000.
Скачиваем прошивку версии 1.6.2:
$ esptool.py -p /dev/ttyUSB0 write_flash -fm dio -ff 40m -fs 32m 0x00000 ./boot_v1.7.bin 0x01000 ./at/512+512/user1.1024.new.2.bin 0x3fc000 ./esp_init_data_default_v05.bin 0x7e000 ./blank.bin 0x3fe000 ./blank.bin
После распаковки архива видим следующую структуру файлов и каталогов:
$ tree . . ├── │ ├── │ │ ├── user1.2048.new.5.bin │ │ └── user2.2048.new.5.bin │ ├── │ │ ├── user1.1024.new.2.bin │ │ └── user2.1024.new.2.bin │ └── README.md ├── │ ├── │ │ ├── user1.2048.new.5.bin │ │ └── user2.2048.new.5.bin │ ├── │ │ ├── user1.1024.new.2.bin │ │ └── user2.1024.new.2.bin │ └── README.md ├── blank.bin ├── boot_v1.2.bin ├── boot_v1.6.bin ├── boot_v1.7.bin ├── esp_init_data_default_v05.bin └── esp_init_data_default_v08.bin 6 directories, 16 files
В README.md имеются следующие указания для нашей флешки:
### Flash size 32Mbit: 512KB+512KB
boot_v1.2+.bin 0x00000
user1.1024.new.2.bin 0x01000
esp_init_data_default.bin 0x3fc000 (optional)
blank.bin 0x7e000 & 0x3fe000
В соответствии с этими указаниями, составляем команду для прошивки ESP8266:
$ esptool.py -p /dev/ttyUSB0 write_flash -fm dio -ff 40m -fs 32m 0x00000 ./boot_v1.7.bin 0x01000 ./at/512+512/user1.1024.new.2.bin 0x3fc000 ./esp_init_data_default_v05.bin 0x7e000 ./blank.bin 0x3fe000 ./blank.bin
Прошивка занимает примерно секунд сорок. После перезагрузки сразу будет доступен AT-интерпретатор версии 1.6.2.
Прошивка модуля ESP12E AT-интерпретатором версии 1.7.0
Если верить примечанию к выпуску, АT-интерпретатор на SDK версии 3.0.0 примечателен оптимизацией работы с ОЗУ в результате чего экономится около 17 кБайт(!) ОЗУ. Кроме того, имеются какие-то сложности с форматом прошивки из-за чего рекомендуется использовать формат 16Mbit или 32Mbit-C1.
К сожалению, формат 32MBit-C1 использовать не получилось. Здесь: Flashing AT 1.7.0 binary firmware in 32m-c1 mode not working было подсказано временное решение — использовать формат 16Mbit-C1.
После распаковки архива с прошивкой получаем следующую структуру каталогов:
$ tree . . ├── │ ├── │ │ ├── user1.2048.new.5.bin │ │ └── user2.2048.new.5.bin │ └── README.md ├── │ ├── │ │ ├── user1.2048.new.5.bin │ │ └── user2.2048.new.5.bin │ └── README.md ├── blank.bin ├── boot_v1.2.bin ├── boot_v1.6.bin ├── boot_v1.7.bin ├── esp_init_data_default_v05.bin └── esp_init_data_default_v08.bin 4 directories, 12 files
В README.md для формата 16Mbit-C1 указаны следующие границы регионов:
### Flash size 16Mbit-C1: 1024KB+1024KB
boot_v1.2+.bin 0x00000
user1.2048.new.5.bin 0x01000
esp_init_data_default.bin 0x1fc000
blank.bin 0xfe000 & 0x1fe000
Прошиваем ESP8266 следующей командой:
$ esptool.py -p /dev/ttyUSB0 write_flash -fm qio -ff 40m -fs 16m-c1 0x00000 ./boot_v1.7.bin 0x01000 ./at/1024+1024/user1.2048.new.5.bin 0x1fc000 ./esp_init_data_default_v05.bin 0xfe000 ./blank.bin 0x1fe000 ./blank.bin
После прошивки получаем следующий лог загрузки:
Проверяем версии SDK и AT-интерпретатора:
AT+GMR AT version:1.7.0.0(Aug 16 2018 00:57:04) SDK version:3.0.0(d49923c) compile time:Aug 23 2018 16:58:12 Bin version(Wroom 02):v1.7.0 OK
Смотрим на размер свободной ОЗУ:
AT+SYSRAM? +SYSRAM:68304 OK
Как видно, «лёгким движением руки», свободная память увеличилась до 65 кБайт.
Настройка OpenWRT
# ifconfig br-lan Link encap:Ethernet HWaddr 00:90:4C:C0:00:00 inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:586247 errors:0 dropped:172 overruns:0 frame:0 TX packets:765349 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:80654767 (76.9 MiB) TX bytes:927523774 (884.5 MiB) eth0 Link encap:Ethernet HWaddr 00:90:4C:C0:00:00 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1211990 errors:0 dropped:5813 overruns:0 frame:0 TX packets:989428 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1049054139 (1000.4 MiB) TX bytes:570831642 (544.3 MiB) Interrupt:4 eth0.1 Link encap:Ethernet HWaddr 00:90:4C:C0:00:00 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:336656 errors:0 dropped:0 overruns:0 frame:0 TX packets:409897 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:64973771 (61.9 MiB) TX bytes:475515814 (453.4 MiB) eth0.2 Link encap:Ethernet HWaddr 00:90:4C:C0:00:00 inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:870395 errors:0 dropped:414 overruns:0 frame:0 TX packets:580252 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:953212514 (909.0 MiB) TX bytes:87848472 (83.7 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1478 errors:0 dropped:0 overruns:0 frame:0 TX packets:1478 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:138346 (135.1 KiB) TX bytes:138346 (135.1 KiB) wlan0 Link encap:Ethernet HWaddr 00:90:4C:C1:00:00 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:262475 errors:0 dropped:0 overruns:0 frame:0 TX packets:371714 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:32 RX bytes:29702085 (28.3 MiB) TX bytes:467137364 (445.4 MiB)
# df -h Filesystem Size Used Available Use% Mounted on rootfs 2.0G 80.4M 1.8G 4% / /dev/root 2.0M 2.0M 0 100% /rom tmpfs 14.3M 592.0K 13.7M 4% /tmp tmpfs 512.0K 0 512.0K 0% /dev /dev/sda2 2.0G 80.4M 1.8G 4% / /dev/sda3 1.6G 37.2M 1.5G 2% /home
# cat /etc/config/network config switch 'eth0' option name 'eth0' option reset '1' option enable_vlan '1' config switch_vlan option device 'eth0' option vlan '1' option ports '1 2 3 4 5t' config switch_vlan option device 'eth0' option vlan '2' option ports '0 5t' config interface 'loopback' option ifname 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config globals 'globals' option ula_prefix 'fdf3:a699:4f2f::/48' config interface 'lan' option ifname 'eth0.1' option force_link '1' option type 'bridge' option proto 'static' option ipaddr '192.168.1.10' option netmask '255.255.255.0' option dns '78.85.0.1' option ip6assign '60' config interface 'wan' option ifname 'eth0.2' option proto 'dhcp'
# cat /etc/config/fstab global automount option from_fstab 1 option anon_mount 0 config global autoswap option from_fstab 1 option anon_swap 0 config mount option target / option device /dev/sda2 option fstype ext3 option options rw,sync option enabled 1 option enabled_fsck 0 config mount option target /home option device /dev/sda3 option fstype ext3 option options rw,sync option enabled 1 option enabled_fsck 0 config swap option device /dev/sda1 option enabled 1
# free total used free shared buffers Mem: 29268 23160 6108 0 3572 -/+ buffers: 19588 9680 Swap: 102396 0 102396
# netstat -l Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:www 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:domain 0.0.0.0:* LISTEN tcp 0 0 OpenWrt.lan:ssh 0.0.0.0:* LISTEN netstat: /proc/net/tcp6: No such file or directory udp 0 0 0.0.0.0:domain 0.0.0.0:* udp 0 0 0.0.0.0:bootps 0.0.0.0:* udp 0 0 0.0.0.0:ntp 0.0.0.0:* netstat: /proc/net/udp6: No such file or directory netstat: /proc/net/raw6: No such file or directory Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 652 /var/run/ubus.sock
# cat /etc/config/wireless config wifi-device 'radio0' option type 'mac80211' option macaddr '00:90:4c:c1:00:00' option channel '11' config wifi-iface option device 'radio0' option network 'lan' option mode 'ap' option ssid 'Alien' option encryption 'psk2' option key 'password'
config system option hostname 'OpenWrt' option zonename 'Europe/Samara' option timezone 'SAMT-4' option conloglevel '8' option cronloglevel '8' config timeserver 'ntp' list server '0.openwrt.pool.ntp.org' list server '1.openwrt.pool.ntp.org' list server '2.openwrt.pool.ntp.org' list server '3.openwrt.pool.ntp.org' option enabled '1' option enable_server '1'
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere syn_flood tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN input_rule all -- anywhere anywhere input all -- anywhere anywhere Chain FORWARD (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED forwarding_rule all -- anywhere anywhere forward all -- anywhere anywhere reject all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere output_rule all -- anywhere anywhere output all -- anywhere anywhere Chain forward (1 references) target prot opt source destination zone_lan_forward all -- anywhere anywhere zone_wan_forward all -- anywhere anywhere Chain forwarding_lan (1 references) target prot opt source destination Chain forwarding_rule (1 references) target prot opt source destination Chain forwarding_wan (1 references) target prot opt source destination Chain input (1 references) target prot opt source destination zone_lan all -- anywhere anywhere zone_wan all -- anywhere anywhere Chain input_lan (1 references) target prot opt source destination Chain input_rule (1 references) target prot opt source destination Chain input_wan (1 references) target prot opt source destination Chain output (1 references) target prot opt source destination zone_lan_ACCEPT all -- anywhere anywhere zone_wan_ACCEPT all -- anywhere anywhere Chain output_rule (1 references) target prot opt source destination Chain reject (5 references) target prot opt source destination REJECT tcp -- anywhere anywhere reject-with tcp-reset REJECT all -- anywhere anywhere reject-with icmp-port-unreachable Chain syn_flood (1 references) target prot opt source destination RETURN tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN limit: avg 25/sec burst 50 DROP all -- anywhere anywhere Chain zone_lan (1 references) target prot opt source destination input_lan all -- anywhere anywhere zone_lan_ACCEPT all -- anywhere anywhere Chain zone_lan_ACCEPT (5 references) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere Chain zone_lan_DROP (0 references) target prot opt source destination DROP all -- anywhere anywhere DROP all -- anywhere anywhere Chain zone_lan_REJECT (0 references) target prot opt source destination reject all -- anywhere anywhere reject all -- anywhere anywhere Chain zone_lan_forward (1 references) target prot opt source destination zone_wan_ACCEPT all -- anywhere anywhere forwarding_lan all -- anywhere anywhere zone_lan_ACCEPT all -- anywhere anywhere Chain zone_wan (1 references) target prot opt source destination ACCEPT udp -- anywhere anywhere udp dpt:bootpc ACCEPT icmp -- anywhere anywhere icmp echo-request ACCEPT igmp -- anywhere anywhere input_wan all -- anywhere anywhere zone_wan_REJECT all -- anywhere anywhere Chain zone_wan_ACCEPT (2 references) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere Chain zone_wan_DROP (0 references) target prot opt source destination DROP all -- anywhere anywhere DROP all -- anywhere anywhere Chain zone_wan_REJECT (2 references) target prot opt source destination reject all -- anywhere anywhere reject all -- anywhere anywhere Chain zone_wan_forward (1 references) target prot opt source destination zone_lan_ACCEPT esp -- anywhere anywhere zone_lan_ACCEPT udp -- anywhere anywhere udp dpt:isakmp forwarding_wan all -- anywhere anywhere zone_wan_REJECT all -- anywhere anywhere
# cat /etc/config/firewall config defaults option syn_flood 1 option input ACCEPT option output ACCEPT option forward REJECT # Uncomment this line to disable ipv6 rules # option disable_ipv6 1 config zone option name lan list network 'lan' option input ACCEPT option output ACCEPT option forward ACCEPT config zone option name wan list network 'wan' list network 'wan6' option input REJECT option output ACCEPT option forward REJECT option masq 1 option mtu_fix 1 config forwarding option src lan option dest wan # We need to accept udp packets on port 68, # see https://dev.openwrt.org/ticket/4108 config rule option name Allow-DHCP-Renew option src wan option proto udp option dest_port 68 option target ACCEPT option family ipv4 # Allow IPv4 ping config rule option name Allow-Ping option src wan option proto icmp option icmp_type echo-request option family ipv4 option target ACCEPT config rule option name Allow-IGMP option src wan option proto igmp option family ipv4 option target ACCEPT # Allow DHCPv6 replies # see https://dev.openwrt.org/ticket/10381 config rule option name Allow-DHCPv6 option src wan option proto udp option src_ip fe80::/10 option src_port 547 option dest_ip fe80::/10 option dest_port 546 option family ipv6 option target ACCEPT config rule option name Allow-MLD option src wan option proto icmp option src_ip fe80::/10 list icmp_type '130/0' list icmp_type '131/0' list icmp_type '132/0' list icmp_type '143/0' option family ipv6 option target ACCEPT # Allow essential incoming IPv6 ICMP traffic config rule option name Allow-ICMPv6-Input option src wan option proto icmp list icmp_type echo-request list icmp_type echo-reply list icmp_type destination-unreachable list icmp_type packet-too-big list icmp_type time-exceeded list icmp_type bad-header list icmp_type unknown-header-type list icmp_type router-solicitation list icmp_type neighbour-solicitation list icmp_type router-advertisement list icmp_type neighbour-advertisement option limit 1000/sec option family ipv6 option target ACCEPT # Allow essential forwarded IPv6 ICMP traffic config rule option name Allow-ICMPv6-Forward option src wan option dest * option proto icmp list icmp_type echo-request list icmp_type echo-reply list icmp_type destination-unreachable list icmp_type packet-too-big list icmp_type time-exceeded list icmp_type bad-header list icmp_type unknown-header-type option limit 1000/sec option family ipv6 option target ACCEPT # include a file with users custom iptables rules config include option path /etc/firewall.user ### EXAMPLE CONFIG SECTIONS # do not allow a specific ip to access wan #config rule # option src lan # option src_ip 192.168.45.2 # option dest wan # option proto tcp # option target REJECT # block a specific mac on wan #config rule # option dest wan # option src_mac 00:11:22:33:44:66 # option target REJECT # block incoming ICMP traffic on a zone #config rule # option src lan # option proto ICMP # option target DROP # port redirect port coming in on wan to lan #config redirect # option src wan # option src_dport 80 # option dest lan # option dest_ip 192.168.16.235 # option dest_port 80 # option proto tcp # port redirect of remapped ssh port (22001) on wan #config redirect # option src wan # option src_dport 22001 # option dest lan # option dest_port 22 # option proto tcp # allow IPsec/ESP and ISAKMP passthrough config rule option src wan option dest lan option proto esp option target ACCEPT config rule option src wan option dest lan option dest_port 500 option proto udp option target ACCEPT ### FULL CONFIG SECTIONS #config rule # option src lan # option src_ip 192.168.45.2 # option src_mac 00:11:22:33:44:55 # option src_port 80 # option dest wan # option dest_ip 194.25.2.129 # option dest_port 120 # option proto tcp # option target REJECT #config redirect # option src lan # option src_ip 192.168.45.2 # option src_mac 00:11:22:33:44:55 # option src_port 1024 # option src_dport 80 # option dest_ip 194.25.2.129 # option dest_port 120 # option proto tcp
9) Связка OpenWRT + ESP8266, использование сниффера tcpdump и анализатора Wireshark для исследования трафика ESP8266
У меня имеется точка доступа с установленной OpenWRT. Это позволяет мне полностью контролировать трафик идущий с ESP8266. OpenWRT, кстати, в наши времена можно установить почти на любую «кофеварку». Народ изгаляется и ставит OpenWRT на всякое барахло: Руководство по доведению «до кондиции» клона популярного китайского мини-роутера Hame A15, он же «unbranded A5-V11», я же пользуюсь классикой — DIR-320 rev.A2. DIR-320 имеет репутацию «неубиваемого роутера». Даже после прошивки его в OpenWRT, все-равно можно вызвать родной загрузчик для восстановления прошивки. Это часто выручало меня на первых порах, когда в результате неудачной настройки, до OpenWRT становилось невозможно достучаться из сети.
Установка OpenWRT на роутер позволяет, по сути, превратить его в одноплатный компьютер. У меня установлена версия «Attitude Adjustment 12.09», в качестве корневого раздела используется флешка на 4 GB. Это позволяет устанавливать приложения без оглядки на занимаемое ими пространство, кроме того, на роутере можно размещать простенькие сайты, для которых не планируется высокая загруженность. OpenWRT может работать в паре с ESP8266, беря на работу по парсингу страниц, работу с защищенными соединениями и разграничении подсетей.
Итак, сбрасываем ESP8266 командой: «AT+RESTORE», на OpenWRT запускаем tcpdump командой: «tcpdump -i wlan0 -n», после чего ESP8266 подключаем точке доступа с OpenWRT:
AT+CWMODE_CUR=1 OK AT+CWJAP="Alien","password" WIFI CONNECTED WIFI GOT IP OK
Syslog в OpenWRT выводится по команде: «logread», и в данном случае, при подключении ESP8266 можно будет увидеть следующую картинку:
Nov 10 08:30:20 OpenWrt daemon.info hostapd: wlan0: STA 60:01:94:41:28:0f IEEE 802.11: authenticated Nov 10 08:30:20 OpenWrt daemon.info hostapd: wlan0: STA 60:01:94:41:28:0f IEEE 802.11: associated (aid 1) Nov 10 08:30:20 OpenWrt daemon.info hostapd: wlan0: STA 60:01:94:41:28:0f WPA: pairwise key handshake completed (RSN) Nov 10 08:30:20 OpenWrt daemon.info dnsmasq-dhcp[2108]: DHCPDISCOVER(br-lan) 60:01:94:41:28:0f Nov 10 08:30:20 OpenWrt daemon.info dnsmasq-dhcp[2108]: DHCPOFFER(br-lan) 192.168.1.11 60:01:94:41:28:0f Nov 10 08:30:20 OpenWrt daemon.info dnsmasq-dhcp[2108]: DHCPREQUEST(br-lan) 192.168.1.11 60:01:94:41:28:0f Nov 10 08:30:20 OpenWrt daemon.info dnsmasq-dhcp[2108]: DHCPACK(br-lan) 192.168.1.11 60:01:94:41:28:0f ESP12_A
Здесь, сначала через демон hostapd устанавливается беспроводное соединение. MAC адрес «60:01:94:41:28:0f» в данном случае — это мой ESP8266. После чего, DHCP в соответствии с моей настройкой, выдает клиенту с данным MAC адресом локальный IP «192.168.1.11» и обозначает его хост как «ESP12_A». За этот процесс отвечает следующее правило в /etc/config/dhcp:
config host option name 'ESP12_A' option mac '60:01:94:41:28:0f' option ip '192.168.1.11'
Замечу, что для поддержки WiFi у меня в OpenWRT установлен пакет wpad-mini, который обеспечивает минимальный функционал и не занимает много места.
tcpdump при этом выдаёт нам следующий лог:
08:30:20.171350 60:01:94:41:28:0f > ff:ff:ff:ff:ff:ff Null Unnumbered, xid, Flags [Response], length 6: 01 00 08:30:20.183276 EAPOL key (3) v2, len 95 08:30:20.188693 EAPOL key (3) v1, len 117 08:30:20.194392 EAPOL key (3) v2, len 151 08:30:20.200214 EAPOL key (3) v1, len 95 08:30:20.257746 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 60:01:94:41:28:0f, length 308 08:30:20.258239 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 60:01:94:41:28:0f, length 308 08:30:20.261535 IP 192.168.1.10.67 > 192.168.1.11.68: BOOTP/DHCP, Reply, length 300 08:30:20.273383 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 60:01:94:41:28:0f, length 308 08:30:20.273797 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 60:01:94:41:28:0f, length 308 08:30:20.280894 IP 192.168.1.10.67 > 192.168.1.11.68: BOOTP/DHCP, Reply, length 300 08:30:20.286433 ARP, Request who-has 192.168.1.11 tell 0.0.0.0, length 28 08:30:20.286763 ARP, Request who-has 192.168.1.11 tell 0.0.0.0, length 28 08:30:20.473236 ARP, Request who-has 192.168.1.11 tell 0.0.0.0, length 28 08:30:20.473464 ARP, Request who-has 192.168.1.11 tell 0.0.0.0, length 28 08:30:20.973475 ARP, Request who-has 192.168.1.11 tell 192.168.1.11, length 28 08:30:20.973769 ARP, Request who-has 192.168.1.11 tell 192.168.1.11, length 28
Пока клиент не авторизируется, то он может общатся только на протоколе EAPOL, через который в данном случае происходит авторизация. После авторизации идет получение параметров сети через BOOTP-протокол.
С помощью tcpdump можно записать сессию в отдельный файл, что бы потом его можно было внимательно исследовать в программе-анализаторе трафика Wireshark. Выполняем в OpenWRT команду:
# tcpdump -i wlan0 -n -w alien.cap
После завершения сессии, копируем файл alien.cap на локальную машину:
$ scp root@alien:/root/alien.cap ./
Затем открываем файл alien.cap в Wireshark.
Wireshark это ещё один «швейцарский нож» который умеет декодировать множество сетевых протоколов. Для примера, посмотрим на запрос к DHCP и увидим в теле сообщения запрашиваемые параметры:
В ответе DHCP сервера видим какие параметры ему предложили для работы в сети:
Ок, идём дальше. Посмотрим какие DNS использует ESP8266:
AT+CIPDNS_CUR — Задание пользовательских DNS серверов, настройки НЕ сохраняются во флеш-памяти
Команды: Query Command:
AT+CIPDNS_CUR?
Действие: показать текущие DNS сервераSet Command:
AT+CIPDNS_CUR=<enable>[,<DNS server0>,<DNS server1>]
Действие: задать пользовательские DNS сервераОтклик: [+CIPDNS_CUR:<DNS server0>] [+CIPDNS_CUR:<DNS server1>]
OK
OK Параметры:
- <enable>:
‣ 0: отключает заданные пользователем DNS сервера;
‣ 1: включает заданные пользователем DNS сервера.- <DNS server0>: необязательный параметр, задание первого DNS сервера;
- <DNS server1>: необязательный параметр, задание второго DNS сервера.
Примеры AT+CIPDNS_CUR=1,»208.67.220.220″ Замечания:
- При команде: AT+CIPDNS_CUR=0 (отключает заданные пользователем DNS сервера), будет использован DNS сервер по умолчанию: «208.67.222.222». Так же DNS сервер может быть задан роутером при конфигурации через DHCP.
- При команде: AT+CIPDNS_CUR=1 (включает заданные пользователем DNS сервера, но параметр <DNS server> не задан), будет использоваться сервер: «208.67.222.222» как DNS сервер по умолчанию.
AT+CIPDNS_DEF — Задание пользовательских DNS серверов, настройки сохраняются во флеш-памяти
Команды: Query Command:
AT+CIPDNS_DEF?
Действие: показать текущие DNS сервераSet Command:
AT+CIPDNS_DEF=<enable>[,<DNS server0>,<DNS server1>]
Действие: задать пользовательские DNS сервераОтклик: [+CIPDNS_DEF:] [+CIPDNS_DEF:<DNS server1>]
OK
OK Параметры:
- <enable>:
‣ 0: отключает заданные пользователем DNS сервера;
‣ 1: включает заданные пользователем DNS сервера.- <DNS server0>: необязательный параметр, задание первого DNS сервера;
- <DNS server1>: необязательный параметр, задание второго DNS сервера.
Примеры AT+CIPDNS_DEF=1,»208.67.220.220″ Замечания:
- Конфигурация будет сохранена во флеш-памяти.
- При команде: AT+CIPDNS_CUR=0 (отключает заданные пользователем DNS сервера), будет использован DNS сервер по умолчанию: «208.67.222.222». Так же DNS сервер может быть задан роутером при конфигурации через DHCP.
- При команде: AT+CIPDNS_CUR=1 (включает заданные пользователем DNS сервера, но параметр <DNS server> не задан), будет использоваться сервер: «208.67.222.222» как DNS сервер по умолчанию.
Смотрим какие DNS используются по умолчанию:
AT+CIPDNS_CUR? +CIPDNS_CUR:192.168.1.10 +CIPDNS_CUR:208.67.222.222 OK
Первый сервер — это шлюз, второй — это сервер проекта OpenDNS.
Задаем DNS яндекса:
AT+CIPDNS_CUR=1,"77.88.8.8","77.88.8.1" OK AT+CIPDNS_CUR? +CIPDNS_CUR:77.88.8.8 +CIPDNS_CUR:77.88.8.1 OK
Проверяем:
AT+PING="ya.ru" +35 OK
В tcpdump при этом появляются следующие строки:
07:34:35.982725 IP 192.168.1.11.4096 > 77.88.8.8.53: 43482+ A? ya.ru. (23) 07:34:36.014821 IP 77.88.8.8.53 > 192.168.1.11.4096: 43482 1/0/0 A 87.250.250.242 (39) 07:34:36.018460 IP 192.168.1.11 > 87.250.250.242: ICMP echo request, id 44975, seq 1, length 40 07:34:36.050192 IP 87.250.250.242 > 192.168.1.11: ICMP echo reply, id 44975, seq 1, length 40
Здесь, в первой строке идёт запрос к нашему DNS-серверу, чтобы тот предоставил IP адрес сервера «ya.ru». Во второй строке DNS сервер возвращает IP адрес: «87.250.250.242» . В третей строке идет сам ICMP запрос, а в четвёртой — ответ. Всё работает.
10) Получение даты и времени через сеть, используя NTP
Одним из наиболее очевидным способов применения ESP8266 в электронике, на мой взгляд, является синхронизация RTC по сетевому протоколу NTP. Даже если вы используете RTC повышенной точности, например: DS3231, это не избавляет вас от нудной процедуры подводки часов, которая зачастую упирается в удобство интерфейса. Не во всех устройствах рационально прикручивать кейпад, для коррекции даты и времени.
Для работы с NTP серверами имеются следующие AT-команды:
AT+CIPSNTPCFG — настройка SNTP
Команды: Query Command:
AT+CIPSNTPCFG?Set Command:
AT+CIPSNTPCFG=<enable>[,<timezone>][,<SNTP server0>,<SNTP server1>,<SNTP server2>]Отклик: +CIPSNTPCFG:<enable>,<timezone>,<SNTP server1>[,<SNTP server2>,<SNTP server3>] OK
OK Параметры:
- <enable>:
‣ 0: SNTP отключён;
‣ 1: SNTP включён.- <timezone>: часовой пояс; допустимые значения: [-11,13]; Если SNTP отключено, то <timezone> не используется
- <SNTP server0>: необязательный параметр, задаёт первый SNTP сервер;
- <SNTP server1>: необязательный параметр, задаёт второй SNTP сервер;
- <SNTP server2>: необязательный параметр, задаёт третий SNTP сервер.
Примеры AT+CIPSNTPCFG=1,8,»cn.ntp.org.cn»,»ntp.sjtu.edu.cn»,»us.pool.ntp.org» Замечания: Если параметры <SNTP server> не заданы, то по умолчанию будут использоваться следующие сервера: будут использоваться по: «cn.ntp.org.cn»,»ntp.sjtu.edu.cn», и «us.pool.ntp.org».
AT+CIPSNTPTIME — получение текущей даты и времени по SNTP
Query Command: AT+CIPSNTPTIME? Отклик: +CIPSNTPTIME:<time> OK
Параметры отклика: <time>: SNTP time Например:
+CIPSNTPTIME: Thu Aug 04 14:48:05 2016
OK
Примеры использования: AT+CWMODE=1 //установить WiFi режим клиента AT+CWJAP=»DemoAP»,»password» //подключиться к роутеру
AT+CIPSNTPCFG=1,8 //задать часовой пояс
AT+CIPSNTPTIME? //получить текущее время
OpenWRT может выступать в качестве SNTP сервера поэтому я указываю его адрес в качестве сервера, после чего запрашиваю текущее время:
OK AT+CIPSNTPCFG=1,4,"192.168.1.10" OK AT+CIPSNTPTIME? +CIPSNTPTIME:Sun Nov 11 21:59:56 2018 OK
В tcpdump при этом появляются следующие строки:
21:59:09.411350 IP 192.168.1.11.4097 > 192.168.1.10.123: NTPv4, Client, length 48 21:59:09.434194 IP 192.168.1.10.123 > 192.168.1.11.4097: NTPv4, Server, length 48
Здесь первая срока — это запрос к серверу, а вторая — ответ сервера.
11) Связь ESP8266 с Web сервером на OpenWrt: настройка OpenWRT
Теперь рассмотрим вопрос организации связи ESP8266 с точкой доступа на OpenWRT. Допустим, программа или скрипт на OpenWRT ищет какую-либо информацию в интернет, и через ESP8266 её нужно вывести на дисплей. В составе OpenWRT имеется Web сервер uhttpd на котором крутится веб интерфейс LUCI, его и будем использовать. Север настраивается через конфиг /etc/config/uhttpd. LUCI мы трогать не будем, вместо этого создадим конфиг для нового сайта. Для этого, в конфиг: /etc/config/uhttpd добавим следующий раздел:
config uhttpd 'site' list listen_http '0.0.0.0:8010' list listen_http '[::]:8010' option home '/site' option rfc1918_filter '1' option max_requests '3' option max_connections '25' option cgi_prefix '/cgi-bin' option script_timeout '60' option network_timeout '30' option http_keepalive '20' option tcp_keepalive '1' option ubus_prefix '/ubus
Как не трудно догадаться, директорией для сайта будет папка: «/site», директорией CGI будет папка: «/site/cgi-bin», а рабочим портом: «8010». Структура папки «site» пусть пока будет такой:
$ tree site ├── ├── index.html └── └── weather.txt 2 directories, 2 files
Где index.html — обычная «заглушка»:
<?xml version="1.0" encoding="utf-8"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> </head> <body style="background-color: white"> <h3>Hello World!</h3> </body> </html>
После редактирования конфига и добавления директории «/site», перезапускаем web-сервер:
# /etc/init.d/uhttpd restart
Проверяем:
# netstat -l Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:8010 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:www 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:domain 0.0.0.0:* LISTEN tcp 0 0 OpenWrt.lan:ssh 0.0.0.0:* LISTEN netstat: /proc/net/tcp6: No such file or directory udp 0 0 0.0.0.0:domain 0.0.0.0:* udp 0 0 0.0.0.0:bootps 0.0.0.0:* udp 0 0 0.0.0.0:ntp 0.0.0.0:* netstat: /proc/net/udp6: No such file or directory netstat: /proc/net/raw6: No such file or directory Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 650 /var/run/ubus.sock
Видим, что открыт наш порт 8010. Теперь с локальной машины пробуем с помощью curl подать на Web-сервер GET-запрос:
$ curl alien:8010 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> </head> <body style="background-color: white"> <h3>Hello World!</h3> </body> </html>
В ответ мы получили свою html страницу, и значит, здесь все ОК. Ради любопытства посмотрим, что нам скажет nmap:
$ nmap -sV alien Starting Nmap 7.12 ( https://nmap.org ) at 2018-11-12 13:10 +04 Nmap scan report for alien (192.168.1.10) Host is up (0.00067s latency). Not shown: 996 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh Dropbear sshd 2011.54 (protocol 2.0) 53/tcp open domain dnsmasq 2.62 80/tcp open http LuCI Lua http config 8010/tcp open http BusyBox http 1.19.4 Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 46.36 seconds
Здесь на 80-м порту висит LUCI, а на 8010 наш сайт. Теперь можно подключиться к нему через ESP8266. Но для этого нам нужно будет ознакомится с набором AT-команд для установления TCP/UDP соединения.
АТ-команды для установки TCP/UDP соединения
Прежде всего хочу коснуться терминологии. В ESP8266 имеется два режима TCP/UDP соединения: обычный нормальный режим, и режим «UART-Wi-Fi passthrough», который также называется прозрачным (transparent mode). Режим «UART-Wi-Fi passthrough» это мостовое соединение вида: «UART over WIFI», этакий UART по воздуху. Фактически это выглядит как чат на две персоны. Включается он командой: «AT+CIPMODE=1», а выключается последовательностью: «+++». Сейчас мы режима «UART-Wi-Fi passthrough» касаться не будем, но он часто упоминается в описании команд, поэтому я предварительно решил рассказать о нем.
AT+CIPMUX — включение или отключение режима нескольких подключений
Команды: Query Command: AT+CIPMUX?
Set Command: AT+CIPMUX=<mode>
Действие: установить тип соединения
Отклик: +CIPMUX:<mode> OK
OK Параметры: <mode>: ‣ 0: режим одиночного подключения
‣ 1: режим нескольких подключенийЗамечения:
- По умолчанию используется режим одиночного соединения
- Режим нескольких подключений может быть включен только тогда, когда отключен прозрачный режим (AT+CIPMODE=0).
- Этот режим может быть изменен только после отключения отключения всех активных соединений.
- Если включен TCP сервер, то его следует отключить (AT+CIPSERVER=0) перед тем, как устанавливать режим одиночного соединения.
Пример: AT+CIPMUX=1
AT+CIPMODE — установить режим соединения
Команды: Query Command: AT+CIPMODE?
Действие: возвращает текущий режим соединения.
Set Command: AT+CIPMODE=<mode>
Действие: устанавливает режим соединения.
Отклик: +CIPMODE:<mode> OK
OK Параметры: <mode>: ‣ 0: нормальный режим соединения.
‣ 1: UART-Wi-Fi passthrough mode (прозрачный режим соединения), может быть установлен при использовании режима одиночного соединения или в UDP режиме, когда удалённые IP-адрес и порт не могут быть изменены.Замечения:
- Конфигурация не сохраняется во флеш-памяти.
- Если в при режиме «UART-Wi-Fi passthrough» рвётся связь, то ESP8266 пытается восстановить ее переподключением, до тех пор пока, не получит символы +++ которые означают завершение режима «UART-Wi-Fi passthrough» и возврат к нормальному режиму. При дисконнекте в нормальном режиме, ESP8266 не будет пытаться переподключиться заново.
Пример: AT+CIPMODE=1
AT+CIPSTART — установка TCP соединения, UDP передачи или SSL соединения
Установка TCP соединения
Set Command: Одиночное соединение (когда +CIPMUX=0): AT+CIPSTART=<type>,<remote IP>,<remote port>[,<TCP keep alive>]
Множественное соединение: (когда +CIPMUX=1): AT+CIPSTART=<link ID>,<type>,<remote IP>,<remote port>[,<TCP keep alive>]
Отклик: OK или
ERROR
Если соединение уже было установлено, то вернет: ALREADY CONNECTED
Параметры:
- <link ID>: ID соединения: от 0 до 4. Применимо только для множественного режима соединения.
- <type>: строковый параметр указывающий тип соединения: «TCP», «UDP» или «SSL».
- <remote IP>: строковый параметр содержащий удалённый IP адрес.
- <remote port>: удаленный порт.
- [<TCP keep alive>]: определение времени удержания TCP соединения: «keep-alive»; по умолчанию выключено.
‣ 0: отключение TCP keep-alive.
‣ 1 ~7200: определение интервала в секундах.Примеры: AT+CIPSTART=»TCP»,»iot.espressif.cn»,8000
AT+CIPSTART=»TCP»,»192.168.101.110″,1000Для большей информации смотрите документ: ESP8266 AT Command Examples
Установка UDP соединения
Set Command: Одиночное соединение (когда +CIPMUX=0): AT+CIPSTART=<type>,<remote IP>,<remote port>[,(<UDP local port>),(<UDP mode>)]
Множественное соединение: (когда +CIPMUX=1): AT+CIPSTART=<link ID>,<type>,<remote IP>,<remote port>[,(<UDP local port>),(<UDP mode>)]
Отклик: OK или
ERROR
Если соединение уже было установлено, то вернет: ALREADY CONNECTED
Параметры:
- <link ID>: ID соединения: от 0 до 4. Применимо только для множественного режима соединения.
- <type>: строковый параметр указывающий тип соединения: «TCP», «UDP» или «SSL».
- <remote IP>: строковый параметр содержащий удалённый IP адрес.
- <remote port>: удаленный порт.
- [<UDP local port>]: необязательный параметр, указывает UDP порт ESP8266.
- [<UDP mode>]: необязательный параметр, для прозрачной UDP передачи должен быть сброшен в ноль.
‣ 0: целевой объект UDP передачи не может быть изменен; это значение используется по умолчанию.
‣ 1: целевой объект UDP передачи может быть изменен один раз.
‣ 2: целевой объект UDP передачи возможно менять.Замечание: <UDP local port> должен быть задан перед <UDP mode>.
Примеры: AT+CIPSTART=»UDP»,»192.168.101.110″,1000,1002,2 Для большей информации смотрите документ: ESP8266 AT Command Examples
Установка SSL соединения
Set Command: AT+CIPSTART=[<link ID>,]<type>,<remote IP>,<remote port>[,<TCP keep alive>] Отклик: OK или
ERROR
Если соединение уже было установлено, то вернет: ALREADY CONNECTED
Параметры:
- <link ID>: ID соединения: от 0 до 4. Применимо только для множественного режима соединения.
- <type>: строковый параметр указывающий тип соединения: «TCP», «UDP» или «SSL».
- <remote IP>: строковый параметр содержащий удалённый IP адрес.
- <remote port>: удаленный порт.
- [<TCP keep alive>]: определение времени удержания TCP соединения: «keep-alive»; по умолчанию выключено.
‣ 0: отключение TCP keep-alive.
‣ 1 ~7200: определение интервала в секундах.Замечания:
- ESP8266 может устанавливать только одно SSL соединение.
- SSL не поддерживает режим прозрачного соединения (UART-Wi-Fi passthrough mode).
- SSL соединению необходим большой объем памяти, иначе это может привести к перезагрузке ESP8266. Память для SSL соединения можно выделить командой AT+CIPSSLSIZE=<size>, где size — размер буфера.
Примеры: AT+CIPSTART=»SSL»,»iot.espressif.cn»,8443
AT+CIPSEND — отправка данных
Команды: Set Command:
- Одиночное соединение: (при +CIPMUX=0)
AT+CIPSEND=<length>- Множественные соединения:(при +CIPMUX=1)
AT+CIPSEND=<link ID>,<length>- При UDP сессии может быть указан удаленный IP-адрес и порт:
AT+CIPSEND=[<link ID>,]<length> [,<remote IP>,<remote port>]Действие: задание длины данных в нормальном режиме передачи (не «UART-WIFI passthrough mode»).
Execute Command: AT+CIPSEND
Действие: объявлет начало передачи данных в прозрачном режиме.Отклик: Отправка данных определенной длины. Возвращает значок > после передачи «Set Command». Значок означает, что можно начать передавать данные. Когда длина данных достигнет размера заданного в параметре <length>, данные начнут передаваться. Если соединение не удастся установить или оно будет прервано, то будет возвращенно: ERROR
Если данные были переданны успешно, то будет возвращенно:
SEND OK
Если же это не удалось, то вернется:
SEND FAIL
Возвращает значок «>» после подачи команды. После этого, ESP8266 удерживает соединение посылая пакеты с интервалом 20 мс и максимальной длиной пакета 2048 байт. Когда будет получен пакет содержащий три последовательных символа плюс: «+++», то соединение разрывается и ESP8266 возвращается в обычный командный режим. Команда может использоваться только в прозрачном режиме которе требует одиночного режима соединения(+CIPMUX=0)
Для UDP режима, значение <UDP mode> должно быть установлено в нуль, прежде чем подавать команду AT+CIPSTART.
Параметры:
- <link ID>: ID соединения: от 0 до 4. Применимо для множественного режима соединения.
- <length>: длина данных, максимальное значение: 2048 байта.
- [<remote IP>]: удаленный IP адрес, может быть установлен для UDP сессии.
- [<remote port>]: удаленный порт, может быть установлен для UDP сессии.
Примеры: Для большей информации смотрите документ ESP8266 AT Command Examples.
AT+CIPCLOSE — Закрытие TCP/UDP/SSL соединения
Команды: Set Command (используется только при множественном соединении): AT+CIPCLOSE=<link ID>
Действие: закрывает TCP/UDP соединение.(Про закрытие SSL соединения в оригинале ничего не сказано. Прим переводчика.)
Execute Command (используется только при множественном соединении): AT+CIPCLOSE
Отклик: OK Параметры: <link ID>: где ID это номер закрываемого соединения (от 1 до 4). Когда ID равен 5, то это означает, что нужно закрыть все соединения. В режиме сервера, ID=5 не имеет какого-либо эффекта.
AT+CWQAP — отключение от точки доступа
Execute Command: AT+CWQAP Отклик: OK Параметры: отсутствуют.
13) Получение web-страницы или текстового файла от сервера на OpenWRT
Итак, попробуем получить html страницу которую мы разместили на веб-сервере OpenWRT.
Подключаемся к точке доступа:
AT+CWMODE_CUR=1 OK AT+CWJAP="Alien","password" WIFI CONNECTED WIFI GOT IP OK
Устанавливаем TCP-соединение:
AT+CIPSTART="TCP","192.168.1.10",8010 CONNECT OK
Отправляем http запрос из 18 байт, где текст запроса составляет 14 байт, плюс четыре байта отводится на комбинацию завершения: «rnrn»
AT+CIPSEND=18 OK >
После того, как появится символ «>», нужно будет ввести команду:
GET / HTTP/1.0
После ввода команды нужно еще раз ввести пустой Enter. Если всё было сделано правильно, то вернется наша html страница:
> Recv 18 bytes SEND OK +IPD,17:HTTP/1.0 200 OK +IPD,450:Connection: close ETag: "6004-111-5be409c1" Last-Modified: Thu, 08 Nov 2018 10:02:41 GMT Date: Thu, 15 Nov 2018 20:00:08 GMT Content-Type: text/html Content-Length: 273 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> </head> <body style="background-color: white"> <h3>Hello World!</h3> </body> </html> CLOSED
Если посмотреть запись TCP-сессии в wireshark, то можно увидеть наш GET-запрос:
И 200-й ответ сервера с содержанием html-страницы:
14) Получение лога погоды от сервера на OpenWRT
Теперь подумаем, для чего нужна html страница? HTML страницы открывают в браузерах которые переобразуют их в форматированный текст. В ESP8266 нет ресурсов чтобы парсить интернет. Зато эти ресурсы есть в OpenWRT.
Погодные метеостанции различных типов — это одно из популярных направлений в любительской разработке. Но стоит ли изобретать велосипед? В сети существуют сайты которые публикуют погодные характеристики в режиме реального времени. Нужно только скачать страницу, отпарсить её и передать на ESP8266. Ну вот, например: получение температуры для Самары:
$ elinks --dump http://realmeteo.ru/samara/1/current|sed -n "13p" |awk '{print $1}' -9DEGC
Остается написать задание для cron, что бы он периодически запускал эту команду, еще добавить дату и время для справки, и получим погодный логер из старого роутера. Остается передать лог на ESP8266 чтобы он выводил этот лог на дисплей, т.е. получаем этакий Hi-Tech градусник. У кого обычный градусник летом постоянно нагревается солнцем, те оценят.
Файл с логом погоды разместим в директории сайта: «/site/pub/waether.txt». Чтобы нам получить этот файл от веб-сервера, в GET-запросе нужно будет указать имя файла, который нам нужно получить:
GET /pub/weather.txt HTTP/1.0
В результате получаем наш файл:
AT+CIPSTART="TCP","192.168.1.10",8010 CONNECT OK AT+CIPSEND=33 OK > Recv 33 bytes SEND OK +IPD,17:HTTP/1.0 200 OK +IPD,1460:Connection: close ETag: "6006-545-5bede30f" Last-Modified: Thu, 15 Nov 2018 21:20:15 GMT Date: Thu, 15 Nov 2018 21:41:04 GMT Content-Type: text/plain Content-Length: 1349 [11-15-18 00:00:11] -5.8DEGC [11-15-18 00:30:11] -5.9DEGC [11-15-18 01:30:12] -6.4DEGC [11-15-18 02:00:12] -6.4DEGC [11-15-18 02:30:12] -6.6DEGC [11-15-18 03:00:11] -6.6DEGC [11-15-18 03:30:11] -6.8DEGC [11-15-18 04:00:11] -7.1DEGC [11-15-18 04:30:11] -7.2DEGC [11-15-18 05:00:11] -7.4DEGC [11-15-18 05:30:11] -7.6DEGC [11-15-18 06:00:12] -8.1DEGC [11-15-18 06:30:12] -8.1DEGC [11-15-18 07:00:12] -9DEGC [11-15-18 07:30:12] -9DEGC [11-15-18 08:00:12] -9DEGC [11-15-18 08:30:11] -9DEGC [11-15-18 09:00:11] -9DEGC [11-15-18 09:30:11] -7.9DEGC [11-15-18 10:00:11] -7.9DEGC [11-15-18 10:30:11] -6.7DEGC [11-15-18 11:00:11] -6.1DEGC [11-15-18 11:30:11] -5.4DEGC [11-15-18 12:00:11] -5.2DEGC [11-15-18 12:30:11] -5.2DEGC [11-15-18 13:00:11] -4.3DEGC [11-15-18 13:30:11] -4.2DEGC [11-15-18 14:00:11] -3.8DEGC [11-15-18 14:30:11] -3.4DEGC [11-15-18 15:00:11] -3.4DEGC [11-15-18 15:30:11] -3DEGC [11-15-18 16:00:11] -3DEGC [11-15-18 16:30:11] -2.8DEGC [11-15-18 17:00:11] -2.8DEGC [11-15-18 17:30:11] -2.7DEGC [11-15-18 18:00:11] -2.7DEGC [11-15-18 18:30:11] -2.6DEGC [11-15-18 19:00:11] -2.4DEGC [11-15-18 19:30:11] -2.4DEGC [11-15-18 20:00:12] -2.4DEGC [11-15-18 20:30:12] -2.7DEGC [11-15-18 21:00:12] -2.7DEGC [11-15-18 21:30:12] -2.7DEGC [11-15-18 22:00:12] -2.7DEGC [11-15-18 22:30:11] +IPD,68: -2.7DEGC [11-15-18 23:00:11] -2.7DEGC [11-15-18 23:30:11] -2.5DEGC CLOSED
15) Управление OpenWRT через ESP8266 посредством CGI интерфейса
Раньше, чтобы управлять роутером на OpenWRT, нужно было либо припаивать к нему «гребёнку» на UART интерфейс и тянуть провода к микроконтроллеру, посредством которого передавались бы ваши команды. Либо прикручивать к микроконтроллеру какой либо Ethernet чип и передавать команды через сеть Ethernet, что опять же подразумевает провода. С помощью ESP8266 вы сможете вычеркнуть из этого уравнения провода.
Т.к. сервер uhttpd поддерживает CGI интерфейс, мы можем связать наш ESP8266 с OpenWRT посредством этого интерфейса, который и заменит нам пресловутые провода. Скрипты cgi могут писаться на каких угодно языках, для примера я возьму самый очевидный вариант — язык shell скриптов. Я буду краток, но если вас заинтересует тема написания cgi скриптов на языке shell скриптов, то советую почитать книгу Дэвида Тейнсли: «Linux и UNIX: программирование в shell. Руководство разработчика», глава 29 «Сценарии cgi».
Для проверки работоспособности GCI интерфейса проведем небольшой тест. Для этого в каталоге «/site/cgi-bin/» создадим файл esp8266.cgi следующего содержания:
echo -en "Status: 200 OKrn" echo -en "Content-type: text/htmlrnrn" echo "<h1>test</h1>"
Установим на файл права:
# chmod 755 /site/cgi-bin/esp8266.cgi
Проверяем тут же в OpenWRT:
# curl localhost:8010/cgi-bin/esp8266.cgi <h1>test</h1>
Работает. Теперь, допустим нам нужно получить текущую температуру. Приведем скрипт esp8266.cgi к такому виду:
echo -en "Status: 200 OKrn" echo -en "Content-type: text/htmlrnrn" echo "<h1>ESP8266 Weather</h1>" temp=$(elinks --dump http://realmeteo.ru/samara/1/current|sed -n "13p" |awk '{print $1}'|sed "s/DEGC//") echo "<p>" echo -n "current temp= " echo -n "$temp" echo "°" echo "</p>"
Проверяем из ESP8266:
Здесь после «AT+CIPSEND=37» нужно будет ввести: «GET /cgi-bin/esp8266.cgi HTTP/1.1», после чего два раза ввести Enter. Как можно видеть по вставкам вида: «+IDC:num», ответ от сервера приходит в формате Chunked transfer encoding, когда данные бьются на фрагменты.
16) Отправка данных от ESP8266 на web-сервер OpenWRT через GET запрос
Теперь нам нужно рассмотреть, как можно отправить данные с микроконтроллера, посредством ESP8266, на OpenWRT. В HTTP протоколе имеются два основных способа передачи данных от клиента серверу: а) через GET запрос; б) через POST запрос.
Первый способ несколько попроще, там данные передаются через строку адреса. Отсюда и главное ограничение такого способа: длина передаваемых данные не должна превышать максимальную длину URL. Кроме того, такие данные видны пользователю в строке веб-браузера, что тоже не всегда желательно. Но для того, чтобы передать несколько цифр полученных микроконтроллером от датчиков, GET запрос подходит как нельзя лучше.
GET запрос формируется добавлением к URL знака вопроса, после которого перечисляются данные и их значения:
?var1=value1&var2=value2&var3=value3
Данные разделяются символом амперсанда, пробелы и прочие непечатные символы передаются в шестнадцатеричном виде: %xy. Shell — скрипт получает данные от сервера через CGI интерфейс в виде встроенных переменных.
Приведем содержимое скрипта esp8266.cgi к следующему виду:
echo -en "Status: 200 OKrn" echo -en "Content-type: text/htmlrnrn" echo "<h1>ESP8266 - GET Request Example</h1>" echo "<p>" echo -n "Request method= " echo "$REQUEST_METHOD" echo "<br>" echo -n "Data: " echo "$QUERY_STRING" echo "</p>"
Проверяем:
# curl "localhost:8010/cgi-bin/esp8266.cgi?var1=value1&var2=value2&var3=value3" <h1>ESP8266 - GET Request Example</h1> <p> Request method= GET <br> Data: var1=value1&var2=value2&var3=value3 </p>
Как видно, данные были успешно приняты, нам осталось лишь распарсить переменную QUERY_STRING. У меня это получилось так:
echo -en "Status: 200 OKrn" echo -en "Content-type: text/htmlrnrn" echo "<h1>ESP8266 - GET Request Example</h1>" echo "<p>" echo -n "Request method= " echo "$REQUEST_METHOD" echo "<br>" echo -n "Data: " echo "$QUERY_STRING" echo "</p>" line=$(echo "$QUERY_STRING"|sed "s/&/ /g") for loop in $line do name=$(echo $loop|awk -F = '{print $1}') type=$(echo $loop|awk -F = '{print $2}') var=$(printf "${name}=${type}") eval $(printf $var) done [ -z $var1 ] && exit || echo $var1 [ -z $var2 ] && exit || echo $var2 [ -z $var3 ] && exit || echo $var3 let "var1 += 10" echo $var1
Алгоритм был подсмотрен в книге Дэвида Тейнсли, но я его несколько упростил предположив, что значения переменных не будут содержать пробелы и непечатные символы, которые кодируются шестнадцатеричными числами. После парсинга выводятся значения полученных переменных. Предпологается, что переменная var1 является числом, и с ней производится арифметическая операция. Проверяем:
# curl "localhost:8010/cgi-bin/esp8266.cgi?var1=12&var2=bar&var3=foo" <h1>ESP8266 - GET Request Example</h1> <p> Request method= GET <br> Data: var1=12&var2=bar&var3=foo </p> 12 bar foo 22
17) Отправка данных от ESP8266 на web-сервер OpenWRT через POST запрос
Отправка данных через POST запрос несколько сложнее. У этого метода имеется заголовок, в котором следует указывать формат и длинну данных.
Для обработки POST запросов создадим скрипт: «/site/cgi-bin/post.cgi» следующего содержания:
if [ "$REQUEST_METHOD" = "POST" ]; then QUERY_STRING=$(cat -) fi echo -en "Status: 200 OKrn" echo -en "Content-type: text/htmlrnrn" echo "<h1>ESP8266 - POST Request Example</h1>" echo "<p>" echo -n "Request method= " echo "$REQUEST_METHOD" echo "<br>" echo -n "Data: " echo "$QUERY_STRING" echo "</p>" line=$(echo "$QUERY_STRING"|sed "s/&/ /g") for loop in $line do name=$(echo $loop|awk -F = '{print $1}') type=$(echo $loop|awk -F = '{print $2}') var=$(printf "${name}=${type}") eval $(printf $var) done [ -z $var1 ] && exit || echo $var1 [ -z $var2 ] && exit || echo $var2 [ -z $var3 ] && exit || echo $var3 let "var1 += 10" echo $var1
Установим на него права:
# chmod 755 /site/cgi-bin/post.cgi
Проверяеем командой:
$ curl -d "var1=12&var2=bar&var3=foo" -X POST "192.168.1.10:8010/cgi-bin/post.cgi"
Или:
$ curl -d "var1=12&var2=bar&var3=foo" -H "Content-Type: application/x-www-form-urlencoded" -X POST "192.168.1.10:8010/cgi-bin/post.cgi"
Где «192.168.1.10» — это адрес роутера c OpenWRT.
В Wireshark можно посмотреть формат запроса:
Как можно видеть, заголовок запроса состоит из следующих строк:
POST /cgi-bin/post.cgi HTTP/1.1 Host: 192.168.1.10:8010 User-Agent: curl/7.59.0 Accept: */* Content-Type: application/x-www-form-urlencoded Content-Length: 25
После заголовка следует ДВА enter’а, т.е. последовательность: «rnrn». После этого идут данные.
Полностью вводить вручную весь заголовок может быть утомительно, на скриншоте приведён лог сессии, где используется только первая строка заголовка:
Теперь подробнее, пошаговая инструкция.
Устанавливаем TCP-соединение:
AT+CIPSTART="TCP","192.168.1.10",8010 CONNECT OK
Отправляем http запрос из 60 байт, где заголовок будет состоять из 31 байта, 4 байта будет занимать последовательность окончания заголовка: «rnrn», на остальные 25 байт приходятся сами данные.
AT+CIPSEND=60 OK
После того, как появится символ «>», нужно будет ввести запрос:
POST /cgi-bin/post.cgi HTTP/1.1
После ввода запроса нужно еще раз ввести пустой Enter. После этого, вводим наши данные:
var1=12&var2=bar&var3=foo
После ввода Enter, должен прийти ответ от сервера. На скриншоте показан наш POST запрос в программе Wireshark:
18) Управление Linux/OpenWRT используя режим «UART-WiFi passthrough»
В ESP8266 имеется режим «UART-WiFi passthrough» который в документации также называется прозрачным режимом (transparent). Этот режим можно назвать «UART через WIFI», т.к. он позволяет установить непрерывное соединение по TCP или UDP протоколу. Режим включается командой AT+CIPMODE=1, а выход из этого режима происходит посылкой последовательности трех плюсов подряд: «+++». Примеры с использованием данного режима приведены в следующем руководстве: ESP8266 AT Command Examples
Какие у этого может быть практическое применение? Думаю все знают о такой полезной утилите как nc или netcat, с помощью которой можно устраивать простенькие чаты. Одними чатами ее полезность не ограничена, мы можем также управлять компьютером c linux или Windows с её по помощью через ESP8266. Давайте посмотрим как это делается на примере OpenWRT.
Открываем backdoor на OpenWRT с помощью команды:
# nc -l -p 12345 -e /bin/ash
Запускаем ESP8266 и подключаемся к точке доступа:
AT+CWMODE_CUR=1 OK AT+CWJAP="Alien","password" WIFI CONNECTED WIFI GOT IP OK
Устанавливаем TCP-соединение:
AT+CIPSTART="TCP","192.168.1.10",12345 CONNECT OK
Где 192.168.1.10 — адрес роутера с OpenWRT, на котором мы открыли порт. Далее даём команды:
AT+CIPMODE=1
и:
AT+CIPSEND
После этого появится значок «>». После этого, в терминале, знак окончания строки нужно будет сменить с «NL & CR» на «NL», и можно начинать вводить команды:
Для окончания сеанса, следует в терминале сменить знак окончания строки на: «нет окончания строки». После этого ввести три знака плюс. Затем знак окончания строки сменить на: «NL & CR».
Далее, для разрыва соединения вводится команды:
AT+CIPMODE=0
и:
AT+CIPCLOSE
Думаю, что стоит упомянуть, что: а) использовать такой способ следует только в защищённом участке интрасети, б) не следует предоставлять привилегированный доступ к . При необходимости следует использовать sudo.
19) Прошивка ESP32 в интерпретатор AT-команд
Плата ESP32 NodeMCU несколько более замороченная нежели свой аналог на ESP8266:
Плата немного шире чем ESP8266 NodeMCU, при установке в беспаячную макетку, свободным остается только один ряд. Т.е. пины на другой стороне становятся недоступными.
Для работы с платой в режиме AT-команд понадобится USB-UART преобразователь с логикой на 3.3 Вольт, а для прошивки придется нажимать кнопки. ESP32 имеет два интерфейса UART. Один используется для отладки, другой для работы с AT-интерпретатором. Микро-USB порт который имеется на плате используется для отладки и прошивки.
В терминале нужно будет выставить режим 115200 бод, и признак окончания строки: «NL & CR». При подключении только что купленного модуля, у меня в терминале пошел такой лог:
ets Jun 8 2016 00:22:57 rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0x00 clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0008,len:8 load:0x3fff0010,len:3480 load:0x40078000,len:7804 ho 0 tail 12 room 4 load:0x40080000,len:252 entry 0x40080034 ^[[0;32mI (46) boot: ESP-IDF v2.0-3-gbef9896 2nd stage bootloader^[[0m ^[[0;32mI (46) boot: compile time 05:59:45^[[0m ^[[0;32mI (46) boot: Enabling RNG early entropy source...^[[0m ^[[0;32mI (65) boot: SPI Speed : 40MHz^[[0m ^[[0;32mI (78) boot: SPI Mode : DIO^[[0m ^[[0;32mI (90) boot: SPI Flash Size : 4MB^[[0m ^[[0;32mI (102) boot: Partition Table:^[[0m ^[[0;32mI (114) boot: ## Label Usage Type ST Offset Length^[[0m ^[[0;32mI (136) boot: 0 phy_init RF data 01 01 0000f000 00001000^[[0m ^[[0;32mI (160) boot: 1 otadata OTA data 01 00 00010000 00002000^[[0m ^[[0;32mI (183) boot: 2 nvs WiFi data 01 02 00012000 0000e000^[[0m ^[[0;32mI (206) boot: 3 at_customize unknown 40 00 00020000 000e0000^[[0m ^[[0;32mI (229) boot: 4 ota_0 OTA app 00 10 00100000 00180000^[[0m ^[[0;32mI (253) boot: 5 ota_1 OTA app 00 11 00280000 00180000^[[0m ^[[0;32mI (276) boot: End of partition table^[[0m ^[[0;32mI (289) boot: Disabling RNG early entropy source...^[[0m ^[[0;32mI (306) boot: Loading app partition at offset 00100000^[[0m ^[[0;32mI (1482) boot: segment 0: paddr=0x00100018 vaddr=0x00000000 size=0x0ffe8 ( 65512) ^[[0m ^[[0;32mI (1482) boot: segment 1: paddr=0x00110008 vaddr=0x3f400010 size=0x1c5f0 (116208) map^[[0m ^[[0;32mI (1499) boot: segment 2: paddr=0x0012c600 vaddr=0x3ffb0000 size=0x0215c ( 8540) load^[[0m ^[[0;32mI (1529) boot: segment 3: paddr=0x0012e764 vaddr=0x40080000 size=0x00400 ( 1024) load^[[0m ^[[0;32mI (1552) boot: segment 4: paddr=0x0012eb6c vaddr=0x40080400 size=0x1b028 (110632) load^[[0m ^[[0;32mI (1631) boot: segment 5: paddr=0x00149b9c vaddr=0x400c0000 size=0x00034 ( 52) load^[[0m ^[[0;32mI (1632) boot: segment 6: paddr=0x00149bd8 vaddr=0x00000000 size=0x06430 ( 25648) ^[[0m ^[[0;32mI (1648) boot: segment 7: paddr=0x00150010 vaddr=0x400d0018 size=0x7a56c (501100) map^[[0m ^[[0;32mI (1676) heap_alloc_caps: Initializing. RAM available for dynamic allocation:^[[0m ^[[0;32mI (1698) heap_alloc_caps: At 3FFBA6B8 len 00025948 (150 KiB): DRAM^[[0m ^[[0;32mI (1719) heap_alloc_caps: At 3FFE8000 len 00018000 (96 KiB): D/IRAM^[[0m ^[[0;32mI (1741) heap_alloc_caps: At 4009B428 len 00004BD8 (18 KiB): IRAM^[[0m ^[[0;32mI (1762) cpu_start: Pro cpu up.^[[0m ^[[0;32mI (1773) cpu_start: Single core mode^[[0m ^[[0;32mI (1786) cpu_start: Pro cpu start user code^[[0m ^[[0;32mI (1847) cpu_start: Starting scheduler on PRO CPU.^[[0m ^[[0;32mI (2016) uart: queue free spaces: 10^[[0m Bin version:0.10.0^M I (2017) wifi: wifi firmware version: c604573 I (2017) wifi: config NVS flash: enabled I (2018) wifi: config nano formating: disabled I (2027) wifi: Init dynamic tx buffer num: 32 I (2027) wifi: wifi driver task: 3ffc4eac, prio:23, stack:3584 I (2032) wifi: Init static rx buffer num: 10 I (2036) wifi: Init dynamic rx buffer num: 0 I (2040) wifi: Init rx ampdu len mblock:7 I (2044) wifi: Init lldesc rx ampdu entry mblock:4 I (2049) wifi: wifi power manager task: 0x3ffca254 prio: 21 stack: 2560 I (2055) wifi: wifi timer task: 3ffcb2d4, prio:22, stack:3584 ^[[0;31mE (2060) phy_init: PHY data partition validated^[[0m ^[[0;32mI (2080) phy: phy_version: 329, Feb 22 2017, 15:58:07, 0, 0^[[0m I (2081) wifi: mode : softAP (80:7d:3a:cb:66:b9) I (2084) wifi: mode : sta (80:7d:3a:cb:66:b8) + softAP (80:7d:3a:cb:66:b9) I (2087) wifi: mode : softAP (80:7d:3a:cb:66:b9)^M
Из любопытного. Последовательности: [[0;32mI и [[0m означат цветовую разметку вывода в Linux. Это означает, что мы можем подключиться к порту программной screen:
$ screen /dev/ttyUSB0 115200,cs8
Выглядит это так:
Из полезного, тут можно узнать версию AT-интерпретатора:
Bin version:0.10.0
Т.к. это ужас какая древняя версия, аж прошлого 2017-го года, скорее всего вам захочется ее обновить. Для этого нам снова придется обратится к программе esptool.py
Перед вводом команд esptool.py, необходимо: а) вначале нажать кнопку EN; б) после чего, удерживая кнопку EN, нажать конку BOOT; в) после чего, отпустить кнопку EN и удерживая кнопку BOOT ввести команду esptool.py.
Для начала проверим связь:
$ esptool.py --chip esp32 flash_id esptool.py v2.3.1 Connecting.... Chip is ESP32D0WDQ6 (revision (unknown 0xa)) Features: WiFi, BT, Dual Core, VRef calibration in efuse Uploading stub... Running stub... Stub running... Manufacturer: c8 Device: 4016 Detected flash size: 4MB Hard resetting via RTS pin...
$ esptool.py --chip esp32 chip_id esptool.py v2.3.1 Connecting...... Chip is ESP32D0WDQ6 (revision (unknown 0xa)) Features: WiFi, BT, Dual Core, VRef calibration in efuse Uploading stub... Running stub... Stub running... Chip ID: 0xaa807d3acb66 Hard resetting via RTS pin...
Затем, вам возможно захочется сохранить существующую прошивку:
$ esptool.py --chip esp32 --port /dev/ttyUSB0 read_flash 0x00000 0x400000 ./esp32_firmware2.bin esptool.py v2.3.1 Connecting..... Chip is ESP32D0WDQ6 (revision (unknown 0xa)) Features: WiFi, BT, Dual Core, VRef calibration in efuse Uploading stub... Running stub... Stub running... 4194304 (100 %) 4194304 (100 %) Read 4194304 bytes at 0x0 in 380.7 seconds (88.1 kbit/s)... Hard resetting via RTS pin...
Актуальную версию прошивки можно скачать с официального сайта: ESP32 Resources | Espressif Systems.
После распаковки архива, видим следующую структуру каталогов:
$ tree . . ├── at_customize.bin ├── blank.bin ├── │ └── bootloader.bin ├── │ ├── ble_data.bin │ ├── client_ca.bin │ ├── client_cert.bin │ ├── client_key.bin │ ├── server_ca.bin │ ├── server_cert.bin │ └── server_key.bin ├── download.config ├── esp-at.bin ├── factory.bin ├── partitions_at.bin └── phy_init_data.bin
Здесь нас будет интересовать содержимое файла download.config, к котором хранится опции прошивки для esptool.py:
--flash_mode dio --flash_freq 40m --flash_size detect 0x1000 bootloader/bootloader.bin 0x20000 at_customize.bin 0x21000 customized_partitions/ble_data.bin 0x24000 customized_partitions/server_cert.bin 0x26000 customized_partitions/server_key.bin 0x28000 customized_partitions/server_ca.bin 0x2a000 customized_partitions/client_cert.bin 0x2c000 customized_partitions/client_key.bin 0x2e000 customized_partitions/client_ca.bin 0xf000 phy_init_data.bin 0x100000 esp-at.bin 0x8000 partitions_at.bin
Не мудрствуя лукаво, прошиваем согласно предложенным рекомендациям:
$ esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 bootloader/bootloader.bin 0x20000 at_customize.bin 0x21000 customized_partitions/ble_data.bin 0x24000 customized_partitions/server_cert.bin 0x26000 customized_partitions/server_key.bin 0x28000 customized_partitions/server_ca.bin 0x2a000 customized_partitions/client_cert.bin 0x2c000 customized_partitions/client_key.bin 0x2e000 customized_partitions/client_ca.bin 0xf000 phy_init_data.bin 0x100000 esp-at.bin 0x8000 partitions_at.bin
Процесс прошивки:
esptool.py v2.3.1 Connecting..... Chip is ESP32D0WDQ6 (revision (unknown 0xa)) Features: WiFi, BT, Dual Core, VRef calibration in efuse Uploading stub... Running stub... Stub running... Configuring flash size... Auto-detected Flash size: 4MB Compressed 19424 bytes to 11458... Wrote 19424 bytes (11458 compressed) at 0x00001000 in 1.0 seconds (effective 153.0 kbit/s)... Hash of data verified. Compressed 3072 bytes to 136... Wrote 3072 bytes (136 compressed) at 0x00020000 in 0.0 seconds (effective 1372.2 kbit/s)... Hash of data verified. Compressed 5720 bytes to 347... Wrote 5720 bytes (347 compressed) at 0x00021000 in 0.0 seconds (effective 1239.8 kbit/s)... Hash of data verified. Compressed 1284 bytes to 941... Wrote 1284 bytes (941 compressed) at 0x00024000 in 0.1 seconds (effective 115.7 kbit/s)... Hash of data verified. Compressed 1692 bytes to 1322... Wrote 1692 bytes (1322 compressed) at 0x00026000 in 0.1 seconds (effective 110.9 kbit/s)... Hash of data verified. Compressed 1276 bytes to 882... Wrote 1276 bytes (882 compressed) at 0x00028000 in 0.1 seconds (effective 121.5 kbit/s)... Hash of data verified. Compressed 2536 bytes to 1534... Wrote 2536 bytes (1534 compressed) at 0x0002a000 in 0.1 seconds (effective 142.9 kbit/s)... Hash of data verified. Compressed 3376 bytes to 2537... Wrote 3376 bytes (2537 compressed) at 0x0002c000 in 0.2 seconds (effective 116.9 kbit/s)... Hash of data verified. Compressed 2544 bytes to 1460... Wrote 2544 bytes (1460 compressed) at 0x0002e000 in 0.1 seconds (effective 150.8 kbit/s)... Hash of data verified. Compressed 144 bytes to 69... Wrote 144 bytes (69 compressed) at 0x0000f000 in 0.0 seconds (effective 96.2 kbit/s)... Hash of data verified. Compressed 1119072 bytes to 704097... Wrote 1119072 bytes (704097 compressed) at 0x00100000 in 62.5 seconds (effective 143.2 kbit/s)... Hash of data verified. Compressed 3072 bytes to 129... Wrote 3072 bytes (129 compressed) at 0x00008000 in 0.0 seconds (effective 1446.2 kbit/s)... Hash of data verified. Leaving... Hard resetting via RTS pin...
Если после перепрошивки отладочный лог платы в порядке, то теперь для работы с AT-командами нужно будет подключить USB-UART адаптер с 3.3 вольтовой логикой на второй UART порт ESP32. Подключение USB-UART адаптера и ESP32: GND<—>GND(адаптера), RX2<—>TX(адаптера), TX2<—>RX(адаптера).
Работа с AT интерпретатором ESP32 по сути не отличается от ESP8266:
AT+GMR AT version:1.1.2.0(f045c0c - Aug 30 2018 04:20:47) SDK version:v3.0.3 compile time:Sep 4 2018 08:53:40 Bin version(Wroom32):1.1.2 OK AT+SYSRAM? +SYSRAM:131680 OK AT+PING="ya.ru" +PING:30 OK AT+CIPDNS? +CIPDNS:192.168.1.10 OK
Существенное отличие от ESP8266 — это наличие команд для работы с Bluetooth.
На этом пока всё. К сожалению не удалось осветить тему программирования ESP8266/ESP32 на Си и ассемблере. Для этого потребуется отдельная статья и возможно даже не одна. Так же остался за бортом Bluetooth, о сфере применения которого я пока гадаю. В руководстве ESP32 AT Instruction Set and Examples имеется пример сопряжения двух ESP32, но мне кажется более интересной тема связи с другими Bluetooth устройствами, например со смартфонами.
Есть у меня Arduino Nano и ESP8266. ESP8266 отвечает на AT команды нормально.
Подключаю через 8,9 пины к Arduino Nano.
ESP8266 Работает на 115200 baud, ничего не менял.
Но потом мне стало не хватать AT команд и я решил перепрошиться. Подключил TX->TX RX->RX(пробовал перекрёстно), на Arduino Nano замкнул RST с GND.Дальше выбрал плату: Generic ESP8266
Flash Size: У меня 100% 512KB
Flash Mode: Хз на что он влияет.
Ну вот пытаюсь загрузить это:
void setup(){
}
void loop(){
}
Мне выдаёт:
esptool.FatalError: Failed to connect to ESP8266: Timed out waiting for packet header
Из этого понятно, что комп не может достучаться до ESP8266,
Как мне решить эту проблему, уже 2 года думаю!
спросил
3 мая ’20
(1 балл)
● 2 ● 3 ● 9
1 Ответ
Я правильно понимаю что вы пытаетесь использовать Nano в качестве «ArduinoISP» ? Вообще-то для программирования esp8266 нужен любой USB->Serial, желательно с наличием сигнала DTR. Если сигнал DTR не подключен придется в начале загрузки вручную жать на кнопку.
А вообще для программирования надо:
— подключить землю и питание (3.3В)
— подключить RX, TX
— GPIO15 через 10кОм на землю
— CH_PD через 10кОм на питание
— RESET через 10кОм на питание и кнопка от него на землю
— GPIO0 через 10кОм на питание и — если у USB->Serial есть контакт DTR то на него, если такого контакта нет — кнопка на землю. На эту кнопку надо будет вручную жать когда начинается заливка в микросхему.
ответил
3 мая ’20
Тигрыч
(256 баллов)
● 1 ● 3 ● 14
Ооо пошло дело. Вот это уже интересно:
ets Jan 8 2013,rst cause:2, boot mode:(3,7)
load 0x40100000, len 2408, room 16
tail 8
chksum 0xe5
load 0x3ffe8000, len 776, room 0
tail 8
chksum 0x84
load 0x3ffe8310, len 632, room 0
tail 8
chksum 0xd8
csum 0xd8
2nd boot version : 1.6
SPI Speed : 40MHz
SPI Mode : QIO
SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000
rf cal sector: 251
rf[112] : 00
rf[113] : 00
rf[114] : 01
SDK ver: 2.0.0(656edbf) compiled @ Jul 19 2016 17:58:40
phy ver: 1055, pp ver: 10.2