• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Smartconfig

aloika

Active member
Пробую smartconfig, че-то не получается ничего.
Начать с самого простого - пишу в коде

smartconfig_start(SC_TYPE_ESPTOUCH, smartconfig_done);

- компилятор выдает ошибку " undefined reference to `smartconfig_start' ".

В начале, конечно, прописал #include "smartconfig.h" . Все равно не работает. Кто-нибудь знает, в чем может быть дело?

Скачал отсюда программу для Андроида: https://github.com/youngBuger/esp8266-smartconfig . Скомпилировал, залил на телефон. Просмотрел код, в очень общих чертах идея понятна - берем название сети, пароль, соединяем их особым образом, шифруем это дело и шлем с телефона широковещательным UDP-пакетом. Модуль ESP8266 этот пакет принимает, расшифровывает и подключается к данной сети с этим паролем. Потом как обычно - получает по DHCP адрес, запускает, например, TCP-сервер и т.д.
Это как бы понятно.

Непонятно другое - как потом телефон-то узнает, с кем ему соединяться? Как он узнает IP, который модуль получил по DHCP?

Update: https://drive.google.com/file/d/0B3Fei_yltwT1QmpEek9lWkZuX0U/view?usp=sharing
Это доковырянный рабочий smartconfig под SDK 0.9.5 . В архиве прошивка модуля и программа для Андроида (исходники под Unnoficial Development Kit и под Android Studio соответственно). Автор не я, я только там изменил кое-что. Автор по ссылке выше в этом же сообщении.
Это НЕ ШТАТНЫЙ smartconfig из SDK, штатный непонятно как работает.
 
Последнее редактирование:

aloika

Active member
ага:
надо в Makefile добавить библиотеку smartconfig:

# libraries used in this project, mainly provided by the SDK
LIBS = c gcc hal phy pp net80211 lwip wpa main smartconfig
 

pvvx

Активный участник сообщества
Непонятно другое - как потом телефон-то узнает, с кем ему соединяться? Как он узнает IP, который модуль получил по DHCP?
В указанном примере вроде никак и там это не требуется (там ESP8266 подключается к серверу Iot).
На ESP8266 ставите UDP сервер на какой-то порт с ответом, а в программе смартфона шлете пакеты опроса в данный порт (хоть широковещательные). При соединении ESP8266 к AP, получите ответ, в котором и будет указан IP ESP8266.
 

aloika

Active member
В общем, так и непонятно со Smartconfig'ом.

Для штатного непонятно какие пакеты нужно посылать, чтобы он заработал. Вообще ничего нет - ни примера приложения, ни хотя бы просто описания, как он работает вообще.

Пример по ссылке в первом посте темы работает с SDK 0.9.3, c тех пор espressif изменили формат буфера, который возвращает callback функция, задаваемая wifi_set_promiscuous_rx_cb(...); поэтому с SDK 0.9.5 оно не работает. Хотя там можно до ума довести, принцип и путь ясен,
тем более вот тут https://github.com/ly0/esp8266-smartlink есть нужный очень файл заголовка, там расписан формат нового буфера. Комментарии можно с китайского перевести Гуглом.

Но хочется же штатный Smartconfig использовать! Но как - пока непонятно.
 

pvvx

Активный участник сообщества
В общем, так и непонятно со Smartconfig'ом.
Для штатного непонятно какие пакеты нужно посылать, чтобы он заработал. Вообще ничего нет - ни примера приложения, ни хотя бы просто описания, как он работает вообще.
Оно так и есть. Никто с ним не разбирался - не нужно. В новых SDK много ограничений по приему - очень маленький буфер для приемного пакета (сообщения). Пока не никто не нашел как это исправить, а Espressif не желает его увеличивать.
В UDK есть пример приема и он работает.
 

aloika

Active member
Пример я этот видел, что-то он делает, в консоль пишет, что каналы перебирает. А что ему слать - непонятно. И на каком он принципе работает - тоже непонятно.

Зато я доковырял Smartconfig по первой ссылке. Теперь он работает на SDK 0.9.5. Реально определяет имя сети и пароль. Вернее, любые два слова, какие ему с телефона зашлешь :)
Если у кого-нить есть интерес, могу выложить куда-нить, мне не жалко.

Насчет "никому не нужно" - не знаю, мне кажется, очень удобная функция для бытового девайса, если им будет пользоваться, к примеру, не очень технически продвинутая домохозяйка.
 

pvvx

Активный участник сообщества
Насчет "никому не нужно" - не знаю, мне кажется, очень удобная функция для бытового девайса, если им будет пользоваться, к примеру, не очень технически продвинутая домохозяйка.
Домохозяйка не сможет загрузить специальную программу на свой телефон и т.д.
Всё что требует дополнительного ПО - в топку. Надо рассчитывать на стандартные интерфейсы имеющиеся в любой бытовой железке с экраном.
Для этого вписываете в поиск соединений имя AP станции с хитрым именем... Но и это есть не на всех устройствах. Ещё необходимо в ESP8266 делать кнопку, чтобы он входил в режим сканирования.
Смысла в этом всём нет никакого, т.к. модуль запросто держит собственный WEB сервер + AP и на его страницах проще задать любую конфигурацию на любом языке и с картинками, даже загрузить с него программу в стороннее устройство, если требуется что-то очень специфичное. Так-же можно сделать кнопку, чтобы он включался с установками по умолчанию для конфигурации. Типа AP с именем "ESP8266" и без паролей в открытом режиме для соединения и конфигурации любым телефоном с броузером и WiFi. Тем более всё что для этого требуется из ПО на модуль уже отлажено и даны примеры.
Зачем городить убожество без обратной связи, созданное для тупых WiFi модулей ?
 
Последнее редактирование:

aloika

Active member
Домохозяйка не сможет загрузить специальную программу на свой телефон и т.д.
Всё что требует дополнительного ПО - в топку. Надо рассчитывать на стандартные интерфейсы имеющиеся в любой бытовой железке с экраном.
Экрана в железке, допустим, нет. Программу можно поставить из Google Play, ну или домохозяин ей поставит.

Это проще, чем подключаться, к примеру к точке доступа, что-то там конфигурировать, переподключаться и т.д.
И еще - в программе можно сделать, например, уведомления, программа может висеть в фоне и быть на связи, можно использовать вибромоторчик, звук, свет и пр.
Типа суп убежал - на телефоне сирена завыла :)

Для этого вписываете в поиск соединений имя AP станции с хитрым именем... Но и это есть не на всех устройствах.
Есть такое. Недостатки - при этом телефон отключается от сети. И еще - при длинном SSID/пароле превышается длина пакета ESP и все, строчка лишь частично передается.
 

pvvx

Активный участник сообщества
Экрана в железке, допустим, нет. Программу можно поставить из Google Play, ну или домохозяин ей поставит.
Что-то не вижу никаких Google Play и ещё для ESP8266 :) Это на МАК :) ?
Это проще, чем подключаться, к примеру к точке доступа, что-то там конфигурировать, переподключаться и т.д.
И еще - в программе можно сделать, например, уведомления, программа может висеть в фоне и быть на связи, можно использовать вибромоторчик, звук, свет и пр.
Типа суп убежал - на телефоне сирена завыла :)
А это как? На телефоне у вас AP :confused:?
Т.е. вы нажмыкали кнопок на устройствах для переходу к скану, к примеру на столбе (ну залезли там на него...) и задали куда ему инфу скидывать? :)
Есть такое. Недостатки - при этом телефон отключается от сети. И еще - при длинном SSID/пароле превышается длина пакета ESP и все, строчка лишь частично передается.
Дык у всех с ESP8266 проблема - он сниферит только заголовок и пару байт пакета/сообщения...

PS: Короче бесперктивняк с этим smart-config и нужен только для тупых устройств, а значит и смысла туда ставить ESP8266 нет. Туда что-то проще надо - медиатек...
Но поиграться - сколько хотите, я - за. :)
 

aloika

Active member
Ну да, поиграться. Но все равно играться хочется пусть с призрачной, но все же перспективой сделать из ESP какое-то полезное устройство, которое можно потом в том числе и продать.

Лично мне надо сделать - да, тупое устройство, которое будет всего лишь управляться с телефона, как с пульта. Устройство по командам с пульта (телефона) будет делать определенные действия и периодически скидывать информацию о своем состоянии. И все.

В случае критических состояний устройства телефон, на котором в фоне будет запущена программа, может звонить, вибрировать, выть сиреной и пр.

Устройство бытовое. Обычно квартире есть вай-фай. И телефон к нему обычно подключен. С помощью смартконфига я смогу с этого же телефона подключить устройство к этому же квартирному вай-фаю. Таким образом, телефон будет выполнять обычные функции - просматривать инет и пр., а также сможет управлять устройством.

Программу-пульт можно разместить в Google Play - стандартный андроидный магазин приложений. Пользователь устройства обычным для себя образом поставит программу на телефон, также как он ставит игры и проч.

Вот такая идея. И смартконфиг здесь очень даже уместен.
 

pvvx

Активный участник сообщества
Программу-пульт можно разместить в Google Play - стандартный андроидный магазин приложений. Пользователь устройства обычным для себя образом поставит программу на телефон, также как он ставит игры и проч.
Google Play не пашет на многих устройствах :) Т.е. в придачу надо ещё докупить телефон с андроидом :) На ноуте это дело не пройдет, ну если это не "Samsung Note 4" - и такое дерьмецо для тестов у меня есть :)
Разбейте подачу запроса на N кусков и собирайте кусками - таким образом влезет сколько угодно длинные имена AP и пароли.
 

CHERTS

Moderator
Команда форума
Это доковырянный рабочий smartconfig под SDK 0.9.5 . В архиве прошивка модуля и программа для Андроида (исходники под Unnoficial Development Kit и под Android Studio соответственно). Автор не я, я только там изменил кое-что. Автор по ссылке выше в этом же сообщении.
А что именно подправлено? В прошивке под ESP или в приложении под Android?
 

aloika

Active member
И там и там подправлено.
В прошивке ESP: в связи с изменением результатов, который возвращает функция wifi_promiscuous_rx(uint8 *buf, uint16 len) пришлось изменить кое-что. Во-первых, формат буфера другой, во-вторых, len - это уже не длина пакета,
а не пойми что. А длина пакета в самом буфере содержится. Так что пришлось добавить

sniffer = (struct sniffer_buf*)buf;
len=sniffer->rx_ctrl.legacy_length;
buf +=sizeof(struct RxControl);

А в приложении под андроид просто поставил задержки, чтобы помедленнее пакеты телефон слал. А то было сильно быстро, модуль пропускал много пакетов. Можно попробовать вывод в консоль отключить, может тогда будет успевать и эти задержки можно будет убрать. Эти задержки там и были, но закомментированы, т.е. автор тоже с ними экспериментировал.
 

aloika

Active member
Секунды через 2-3 вылазит.
Может, у вас wi-fi пакеты c признаком "n" ? С ними мне самому интересно, что будет. А длина пакетов определяется вообще? Сбросьте куда-нить, что вообще в консоль выводится?
 

CHERTS

Moderator
Команда форума
Может, у вас wi-fi пакеты c признаком "n" ? С ними мне самому интересно, что будет. А длина пакетов определяется вообще? Сбросьте куда-нить, что вообще в консоль выводится?
только что вроде отработало, жал кнопки STOP START SMARTLINK и ребутил модуль и вуаля...Get the smartconfig result
как так получилось, непонятно и что запускать раньше, модуль или приложение на андроиде, тоже не понятно, работает через 10 раз
после пароля еще какой то спец-символ торчит, ну не беда, а пробовали полученные данные в smartconfig_end через wifi_station_set_config установить?
 

pvvx

Активный участник сообщества
только что вроде отработало, жал кнопки STOP START SMARTLINK и ребутил модуль и вуаля...Get the smartconfig result
как так получилось, непонятно и что запускать раньше, модуль или приложение на андроиде, тоже не понятно, работает через 10 раз
после пароля еще какой то спец-символ торчит, ну не беда, а пробовали полученные данные в smartconfig_end через wifi_station_set_config установить?
Там, по началу, идет сканирование имеющихся вокруг модуля станций AP и если они молчаливые, то никакого smart-config не будет.
Длина пакета в исходниках тоже наобум выбирается - отрабатывает не все условия.
 

CHERTS

Moderator
Команда форума
Там, по началу, идет сканирование имеющихся вокруг модуля станций AP и если они молчаливые, то никакого smart-config не будет.
Это я заметил, у меня на AP поначалу была отключена вещание SSID, smart-config при этом вообще не работал, как только включил вещание, то хоть через 10 раз, да стал отрабатывать.

Длина пакета в исходниках тоже наобум выбирается - отрабатывает не все условия.
А как бы это подправить, вернее кто бы это подправил? А то хочу добавить этот пример в UDK, вдруг кому пригодиться.
 
Сверху Снизу