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

Smartconfig

pvvx

Активный участник сообщества
А как бы это подправить, вернее кто бы это подправил? А то хочу добавить этот пример в UDK, вдруг кому пригодиться.
UDK будет поддерживать трансляцию приложений под андроид? :)
Ничего особенного в данном примере нет.
Сканируются только определенные пакеты с длиной данных до 16 байт и с каждого пакета собирается по байту выходной буфер с итоговым сообщением куда подключаться модулю.
Слишком сложно и чрезмерно. Требует от телефона постоянную последовательную передачу сотен пакетов с закодированным одним (следующим в сообщении) байтом и от модуля сборки эти пакетов. Сборка написана ка-то криво и при пропуске пакета происходит рассинхронизация последовательности приема.
На старом примере напишите сборку с проверкой некого ID и контрольной суммы пакета.
Т.е., если сообщение содержит ID, то фиксируете канал и время на прием требуемого кол-ва пакетов и берите из буфера несколько байт и индекс, проверив примитивную контрольку, складывайте по индексу в выходной итоговый буфер. Если время сканировния вышло и не приняты все куски - то выходите из этого режима и смотрите другие каналы. А как только получите фиксированную (или указанную в передаче) длину сообщения - проверяете его контрольку и всё.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Нет, а зачем ей это? Я хотел добавить работающий пример со smart_config.
Он же без кода под андорид не работает. Т.е. это только для телефонов с андроидом.
Расскажите как его использовать на простом ноуте с windows или на телефоне с windows и т.д.?
Тут дан правильный ответ http://www.esp8266.com/viewtopic.php?p=11509#p11509 :)
Более простой альтернативой является кнопка на модуле, запускающая на 20 сек до приема новой конфигурации модуль в режим APс фиксированным именем и открытым TCPсокетом. Телефон или любое другое устройство подключается к APмодля и передает конфигурацию без всяких кривых протоколов.
 
Последнее редактирование:

aloika

Active member
1. В примере действительно есть некоторые недоработки. Сейчас довожу до ума. Из существенного:
в функции

int ICACHE_FLASH_ATTR
smart_config_decode(uint8* pOneByte)

нужно закомментировать строчки:

// else{ <--------------------------------------------тут

smart_recvbuf[pos] = val;
#ifdef PLATFORM_DEBUG
ets_uart_printf("[%02x]=%02x\n",pos,val);
#endif
if( pos > smart_recvbuf_len ){
smart_recvbuf_len = pos;
}
return SMART_CH_LOCKED;
// } <--------------------------------------------тут

// return 99; <--------------------------------------------тут

Тогда будет работать стабильно.

2. Телефон шлет UDP-пакеты, когда нажимаем кнопку когда на ней надпись "Smartconfig". Пакеты шлются циклически в течение наперед заданного времени. Программу нужно переделать в косметическом плане.

3. Принцип работы такой - во всех принятых модулем UDP-пакетах существенным свойством является его длина. Сам пакет может быть (и скорее всего) зашифрован. Но последовательность пакетов даст нам последовательность длин, которыми и закодированы передаваемые байты.

4. Последний символ (байт) в результате работы кода - контрольная сумма.

5. Скрытые SSID-ы. Че-то я не подумал об этом. Действительно, сначала сканируются все SSID-ы и потом просматриваются только те каналы, на которых вещают точки доступа. Если на данном канале точки доступа нет (хм), то этот канал и не прослушивается. Изменить это вряд ли получится, потому, как надо знать тип шифрования, с которым работает точка доступа. От этого зависит вычисление длины пакета. Если мы получим не пойми какой пакет, то, не зная его тип шифрования, мы не сможем вычислить длину.

6. Проблем написать код под Windows никаких нет. Нужно просто уметь слать широковещательные UDP-пакеты.

Я сейчас хочу написать нормальную программу, чтобы нажал на кнопку - запустился смартконфиг, все определил, модуль подключился к сети, выслал телефону UDP-пакеты со своим IP (??), телефон их принял, модуль запустил TCP-сервер и начал слушать порт. При повторном нажатии на кнопку все повторилось. На модуле должна быть индикация (один светодиод) - если не горит, то модуль не подключен к сети, если мигает - то смартконфиг и всякие переходные состояния, если горит - модуль в сети и слушает порт. Как-то так.
 

pvvx

Активный участник сообщества
Я сейчас хочу написать нормальную программу, чтобы нажал на кнопку - запустился смартконфиг, все определил, модуль подключился к сети
....
Пример с прошивкой TCP2UART:
1) Включаем модуль с чистой прошивкой.
2) Соединяемся любым устройством с AP“ESP8266”
3) Открываем на внешнем устройстве TCPклиента на 192.168.4.1:80 и шлем строку:
“GET /web.cgi?wifi_rdcfg=0xfff&wifi_mode=1&wifi_st_ssid=HOME_AP&wifi_st_psw=1234567890&wifi_st_aucn=1&wifi_newcfg=0x10501\r\n\r\n”
Всё – модуль подключен к указанному AP(к ‘HOME_AP’, пароль: 1234567890)

В отладочном UART на модуле при этом имеем:
Код:
// подключились к APмодуля “ESP8266”
add 1
aid 1
station: 00:0f:54:10:6a:b5 join, AID = 1
// передали сообщение
srv[80] 192.168.4.2:3007 [1] listen
srv[80] 192.168.4.2:3007 [1] read: 128 of253[/web.cgi] GET f[/web.cgi] #2208 (195) 200 send: cf253 dis
srv[80] 192.168.4.2:3007 [1] disconnect
// модуль принимает новые установки
WiFi_set(0x10501)=0x401
WiFi mode:1 chl:1 phy:3 dhcp:1/1
AP:ESP8266[7] hiden(0) psw:0123456789 au:0 chl:1 maxcon:4 beacon:100
ip:192.168.4.1 gw:192.168.4.1 msk:255.255.255.0 mac:1a:fe:34:99:ad:0e
DHCP ip:192.168.4.2..192.168.4.102
ST: HOME_AP psw:1234567890 b:0 ff:ff:ff:ff:ff:ff ac:1
ip:0.0.0.0 gw:0.0.0.0 msk:0.0.0.0 mac:00:00:00:00:00:00
sleep:0
// модуль отключает AP
station: 00:0f:54:10:6a:b5 leave, AID = 1
rm match
bcn 0
del if1
mode : sta(18:fe:34:99:ad:0e)
scandone
add 0
aid 2
pm open phy_2,type:2 0 0
cnt
// модуль соединяется с AP
connected with HOME_AP, channel 1
// модулю выдали адрес IP
ip:192.168.1.243,mask:255.255.255.0,gw:192.168.1.1
// модуль получил запрос по UDP (4-байта) с компа на 192.168.1.2:12345
udp 192.168.1.2:12345 [4]
samrtcfg_tcp.gif :)
Посылаем опрос всем на порт 1025 (255.255.255.255:1025):
samrtcfg_tcp_1.gif
Получаем ответ от 192.168.1.243:1025 :)

Но так мне кажется проще:
IMG_5554sm.jpg
 
Последнее редактирование:

CHERTS

Moderator
Команда форума
нужно закомментировать строчки:
Рекомендую научиться пользоваться утилитой diff, а то так ничего не понятно и не работоспособно.

Код:
diff -burN smartconfig.c.orig smartconfig.c > smartconfig.diff
Пример с прошивкой TCP2UART:
1) Включаем модуль с чистой прошивкой.
2) Соединяемся любым устройством с AP“ESP8266”
....
Хороший и более универсальный вариант, не нужно мудреных программ под Android,iOS,Windows и Linux, вот реализовать бы это в виде законченной библиотеки, типа smarthttpconfig ;)
Но за неимением таковой, будем копать smartconfig...
 

aloika

Active member
Рекомендую научиться пользоваться утилитой diff, а то так ничего не понятно и не работоспособно.
ну да, надо бы...

Пример с прошивкой TCP2UART:
1) Включаем модуль с чистой прошивкой.
Да, действительно это очень хороший вариант. Лучше, чем smartconfig. Тут можно и программу на Андроид (и под другие ОС тоже) написать, которая все эти действия будет сама выполнять.
Но пока непонятно, как это можно реально использовать в своем проекте. Откуда взялся этот запрос, например. Ну и вообще, исходников-то нет, даже теоретически попытаться разобраться не получится.

Вчера пришел домой, дома smartconfig не работает. На работе работает как часы, а дома - нет. Непонятно почему. На работе всего несколько сетей, а дома огромное количество, на каждом канале по несколько штук. Может, с этим связано.

В общем, я огорчился.
 

aloika

Active member
Продолжаю эксперименты.
На работе в одной сети работает, в другой - нет. Пока не понял, почему.

Уважаемый pvvx, горячо поддерживаю пожелание CHERTS о реализации Вашего варианта в виде более-менее оформленной библиотеки, пригодной для использования в собственных проектах.
 

CHERTS

Moderator
Команда форума
Подрихтованный smartconfig,

добавил опцию отладки, см. smartconfig.h
#define SMART_DEBUG true
добавил парсинг результатов, для этого пришлось добавить доп. параметр длинны в smartconfig_end(uint8* buf, unsigned short len)
добавил установку распарсеных данных в параметры подключения к AP: wifi_set_opmode(STATION_MODE) wifi_station_set_config(&stconfig) и т.п.

Работает так же через ж...у, то есть раз на раз не приходиться. Практика показала, что жать кнопку SMARTLINK на телефоне нужно сразу после перезагрузки модуля ESP, тогда отрабатывает.
 

Вложения

aloika

Active member
Целый день на это дело убил, вывод такой - надо признать идею со smartconfig-ом несостоятельной.

Выяснилось, что в ненагруженной сети из одного роутера смартконфиг работает идеально. А в реальной сети UDP-пакеты теряются. Вплоть до того, что из 16 пакетов доходят 3-4. Я посылал из андроидской программы пакеты последовательно длиной 0,1,2,3,4 и т.д. до 16, а принимал 0,3,6,8,12,14,0,... Пробовал слать пакеты медленнее - тогда уже лучше, больше пакетов доходит. Иногда и результат смартконфига получить удается. Почему при более медленной отправке пакетов результат лучше - объясните, кто знает.

Но тут возникла еще одна проблема - на 9 канале, где работает точка доступа, периодически включается какой-то источник флуда и начинают быстро валиться пакеты длиной 12. Сеть тут большая, а на 9 канале еще несколько сетей. И всё этими пакетами забивается и вообще все колом встает, хоть быстро шли пакеты, хоть медленно.

В общем, для реальной жизни не годится это все.
Надо разбираться с решением от pvvx. Или свой смартконфиг городить. В модуле от Mediatek как-то работает же.
 

aloika

Active member
На старом примере напишите сборку с проверкой некого ID и контрольной суммы пакета.
Т.е., если сообщение содержит ID, то фиксируете канал и время на прием требуемого кол-ва пакетов и берите из буфера несколько байт и индекс, проверив примитивную контрольку, складывайте по индексу в выходной итоговый буфер. Если время сканировния вышло и не приняты все куски - то выходите из этого режима и смотрите другие каналы. А как только получите фиксированную (или указанную в передаче) длину сообщения - проверяете его контрольку и всё.
Насколько я понимаю, содержание пакета-то зашифровано. Как ID-то прочитать? Это длина в открытом виде передается. Да и то она вычисляется в зависимости от шифрования.
 

pvvx

Активный участник сообщества
Но тут возникла еще одна проблема - на 9 канале, где работает точка доступа, периодически включается какой-то источник флуда и начинают быстро валиться пакеты длиной 12. Сеть тут большая, а на 9 канале еще несколько сетей. И всё этими пакетами забивается и вообще все колом встает, хоть быстро шли пакеты, хоть медленно.
У меня дома, в городе, обстановка в эфире WiFi ещё хуже - сотни устройств и баз :) Тут у каждой семьи от 2-х авто, не то что WiFi устройств и закрытая территория с малоэтажками :) Несколько открытых выходов в инет и т.д. По тому я свои пароли к своим AP особо не берегу... :)
В модуле от Mediatek как-то работает же.
Там явно не смотрится, есть или нет AP и перебираются всё каналы. Исходники Mediatek есть (украдены или предварительные) - найдите и посмотрите.
 
Последнее редактирование:

JustACat

Moderator
Команда форума
aloika, я рискую получить в лицо помидором, так как не особо в теме (тем более что там за смартконфиг реализован в SDK).
Но у меня вопрос по смартконфигу через точку доступа на мобильнике:
1) входим в режим смартконфиг на ESP (как - это отдельная история, например, по кнопке, либо, если не смогли подключиться к ранее сохраненной точке доступа)
2) начинаем тупо сканировать все точки доступа вокруг
3) берем телефон и на нем создаем некую точку доступа с определенными параметрами (например, открытую) с хитрым SSID, например:
%mySSID#mySSIDpass!
4) ESP, находя такую точку (а именно - открытую, и чтобы у нее в названии были символы: % в начале, # в середине где-то и ! в конце), разбирает ее на куски
5) и уже пытается подключиться к точке с SSID = mySSID и паролем = mySSIDpass (конечно если такая точка есть, если подключиться не выходит. или такой точки нет - идем на пункт 1)
Почему бы такой вот смартконфиг не сделать?
Из минусов я вижу лишь один: ограничение на длинну SSID и пароля. Т.к. длинна имени точки вроде как не должна превышать 32 символа, если выечсть оттуда еще 2-3 управляющих символа (%#!), то на имя точки+пароль остается около 28-30 символов. Не то, чтобы много, но для большинства ситуаций, я считаю, достаточно...
Ну и может еще минус в том, что таким образом мы в свободный доступ выдаем на некоторое время SSID/пароль от нашей точки доступа...
Из плюсов: не нужно никаких специальных утилит. Точку доступа с произвольным именем сейчас создать можно практически на любом андроид (и, думаю, не только) смартфоне...

Если я чего не понимаю или где не прав - не кидайтесь сильно. лучше объясните толком, почему вы пытаетесь сделать что-то более хитрое? Спасибо за понимание!
 

aloika

Active member
aloika, я рискую получить в лицо помидором, так как не особо в теме (тем более что там за смартконфиг реализован в SDK).
Но у меня вопрос по смартконфигу через точку доступа на мобильнике:
Вы совершенно правильно все говорите, более того, есть пример реализации этого алгоритма https://github.com/ly0/esp8266-smartlink
И да, из недостатков - ограничение на длину и то, что пароль от точки доступа передаем в открытом виде.
Еще один недостаток - то, что при посылке такого запроса телефон отключается от текущего wifi-соединения. Не знаю, можно ли в Андроид-программе это сделать как-нибудь по-другому.

Сейчас я, честно, говоря, вообще в замешательстве, не знаю, как лучше сделать. Изначально я хотел сделать устройство, которое может управляться "домохозяйкой" со смартфона, как с пульта управления. Сейчас у устройства есть пульт, просто заменить этот пульт телефоном. И все. А после того, как я попробовал веб-сервер от pvvx, я думаю - а может управление и через HTTP продублировать? Или не по-домохозяйковски это, слишком сложно будет? Или написать на Андроиде программу, которая будет подключаться сначала к AP модуля, настраивать его, потом модуль будет переходить в режим только станции, а программа подключаться к домашней сети и там уже общаться с модулем...

Так что "не ходите за мной, я сам заблудился" :)
 

JustACat

Moderator
Команда форума
И да, из недостатков - ограничение на длину и то, что пароль от точки доступа передаем в открытом виде.
Я что сейчас еще подумал, эти недостатки тоже можно нивелировать.
Недостаток открытого вида - путем некоего кодирования, пусть даже простого, замены одних символов на другие, и подстановки в название SSID в телефоне строки в закодированном виде, который ESP будет знать, как раскодировать. Конечно если злоумышленник захочет, то тоже достаточно просто сможет такую простую кодировку раскодировать, если только не применять какие-либо хитрые алгоритмы.
Недостаток длинны (а заодно и кодировку) можно компенсировать, если делать не вручную, а написать некое приложение под андроид, которое будет делать это само.
Не уверен, что в андроидном API доступен функционал создания точки доступа из приложений, но если доступен - то это вполне возможно.

Просто передавать информацию не за 1 заход, а за несколько, то есть создаем 1 точку доступа с неким кодом и частью посылки, потом вторую, потом третью, если нужно конечно.
А ESP их так же последовательно отлавливает и собирает, пока не соберет все.
Ведь если подумать, то путем задания точки доступа мы по сути можем передать 32 символа/байта данных, а если таких передач сделать несколько подряд, то кол-во данных можно увеличить.

Но лично для себя (для домашних поделок) я счел все это усложнением и решил, что мне хватит того самого простого варианта - когда задается вручную имя точки, и пусть короткое, и пусть пароль открытый, шанс, что кому-то тут в этот момент понадобится его отловить - пока что ничтожно мал :)

Еще один недостаток - то, что при посылке такого запроса телефон отключается от текущего wifi-соединения.
А чего в этом такого страшного? Это ж надо-то буквально на несколько секунд... Или имеется ввиду, что нельзя при этом проконтролировать - подключилась ли ESP к нашему задаваемому роутеру? Это да... Но в принципе и фиг с ним...

Так что "не ходите за мной, я сам заблудился"
Ну, мы все тут блуждаем частенько, особенно с постоянными приветами от Espressif :) Так что ничего страшного. Главное, чтобы в итоге истина нашлась (ну или что-то около нее).

Если рассуждать с точки зрения простоты, то, думаю, вариант с настройкой по простому веб-интерфейсу - самый простой и верный. В конце концов все роутеры так и настраиваются.
Свое приложение под андроид для настройки - тоже вариант, но он будет понуждать пользователя качать приложение.... А если у пользователя какой-нить выньмобайл или еще чего похлещще? - опять же довод в пользу веб-сервера...
С веб-сервером можно будет настроить ваше устройство с гораздо большего числа железок, даже с телека со смарт-тв и вайфаем скорее всего выйдет (неудобно, но выйдет).

Один минус у веб-сервера - накладные расходы на код и все, что с ним, в самом ESP... И если оно нужно однократно лишь для подключения ESP к домашней сети, то фиг знает, расточительно вроде выходит...
А вот если оно и в дальнейшем тоже нужно, например, для управления этой самой ESP - тогда однозначно веб-сервер...
 

pvvx

Активный участник сообщества
Или имеется ввиду, что нельзя при этом проконтролировать - подключилась ли ESP к нашему задаваемому роутеру? Это да... Но в принципе и фиг с ним...
Всё наоборот. ESP подключается к роутеру и вы это видите на его Web странице. А далее уже отключаете AP ESP и телефон автоаматом(!) переключается на базу.
Всё проверено на именно на телефоне и без всяких подгрузок вирусов для андроида с облаков.
Один минус у веб-сервера - накладные расходы на код и все, что с ним, в самом ESP... И если оно нужно однократно лишь для подключения ESP к домашней сети, то фиг знает, расточительно вроде выходит...
А вот если оно и в дальнейшем тоже нужно, например, для управления этой самой ESP - тогда однозначно веб-сервер...
Накладные расходы только в flash. При выключенном web-сервере в динамической памяти (heap) он потребляет 0 байт, но в константной (rodata) до 1 килобайта на текстовые переменные, которые можно запихнуть в flash (но от этого падает скорость и мобильность и в текущей версии, до освоения оверлеев это пока красиво не сделано). Остается потребление файловой структурой, которая держится для управления открытыми файлами. Но и она закрывается, оставляя в памяти занятыми до нескольких указателей (по 4 байта).
Т.е. при специализации Web сервера для данной задачи потребление им памяти в закрытом виде сводится к 8 байтам. :) (два флага указателя по 4 байта, т.к. проц 32-х разрядный, указывающие (равные NULL), что диск и web закрыты)
 
Последнее редактирование:

JustACat

Moderator
Команда форума
Т.е. при специализации Web сервера для данной задачи потребление им памяти в закрытом виде сводится к 8 байтам.
Ну и замечательно!
pvvx, вы не думайте, мы ни в коем разе не преуменьшаем важности и пользы именно вашей реализации.
Мы лишь обсуждаем все возможные варианты, ведь задачи все же разные бывают. Ну и заодно их плюсы и минусы, даже самые незначительные.
 

pvvx

Активный участник сообщества
Ну и замечательно!
pvvx, вы не думайте, мы ни в коем разе не преуменьшаем важности и пользы именно вашей реализации.
Мы лишь обсуждаем все возможные варианты, ведь задачи все же разные бывают. Ну и заодно их плюсы и минусы, даже самые незначительные.
А я её высказываю как альтернативу. И не претендую на использование своего web-сервера - он является одним из сотни примеров возможной реализации.
Основная проблема у smart-config, это момент когда он должен быть активирован. Это требует дополнительных аппаратных кнопок...
Вы её тоже описали как п.п.1:
> 1) входим в режим смартконфиг на ESP (как - это отдельная история, например, по кнопке, либо, если не смогли подключиться к ранее сохраненной точке доступа)
Второстепенное - это наличие специализированного ПО.
Остальное - это уже метод реализации.
По первому пункту сделать ничего нельзя для упрощения. А во втором пункте всегда выигрывает Web реализация, т.к. решает обе ветки - может предоставлять это специализированное ПО для других устройств, а может просто давать всё в виде стандартных страниц. И полностью решает задачу шифрования, если изначальный доступ на сервер выставлен с ним.
Всё остальное зависит от ресурсов системы, на которой желают сделать упрощенное подключение. ESP8266 обладает достаточными ресурсами, чтобы не использовать smart-config, т.к. он применяется и разработан для очень примитивных устройств не имеющих возможностей обеспечения нормальных интерфейсов и не требующих никакой конфигурации.
 
Последнее редактирование:
Сверху Снизу