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

Связь: Delphi <-> Nano3 через ESP8266 по WiFi через АТ-команды

UFO 007

New member
Доброго всем времени суток, други мои!
Одно устройство работает у меня уже лет с пяток: начиналось всё с релюх 220в, потом 24, потом появилась Нана 3.0 и уже с пол-года как собрана на АТ168Р разработанная в СпринтЛайауте и изготовленная в поднебесной плата, но (как говорится) - совершенству предела нет... Вот и ... Стало быть приспичило мне "прикрутить" к этому делу ещё и ВайВай.
Дабы долго не растолковывать: где-что-почём - вот:scrrenshot.png

По-моему и так ясно, что общение происходит через АТ-команды... Но есть пара вопросов к "не хило рубящим":
1 - почему иной раз btSend приходится нажимать дважды (ибо с первого раза ответ не приходит) как в случае (например) с Get_Data? Ведь 13:07:15-13:07:09=6 секунд: "таймаут" - будь здрав какой и, кстати, тем же таймаутом ранее отправлен "Buzzer2" на что ТСРдрайвер за те же 6 секунд выдал адекватное ОнМессаге. Первая мысля была: а не крякозябры ли (что в мониторе СОМ7) виноваты? Однако её отвергает тот же (параллельно слушающий весь диалог через микроUSB (NodeMCU 0.9)) ESPlorer:
Код:
+IPD,0,9:Buzzer1
AT+CIPSEND=0,15


OK
> Buzzer1 - OK!!!

busy s...

Recv 15 bytes
AT+CIPCLOSE=0

busy s...

SEND OK

+IPD,0,9:Buzzer2
AT+CIPSEND=0,24


OK
> Buzzer2 - принято

busy s...

Recv 24 bytes
AT+CIPCLOSE=0

busy s...

SEND OK

+IPD,0,10:Get_Data

+IPD,0,10:Get_Data
AT+CIPSEND=0,25


OK
> Get_Data - принято

busy s...

Recv 25 bytes
AT+CIPCLOSE=0

busy s...

SEND OK
0,CLOSED
некорректно отображается только кириллица, а СОМ7 - только для отладки: можно забить и в релизе можно высвободтить пару килобайт Нановской флэшки, убрав Сериал.бегин и всё остальное... Может где-то увеличить тайминги? Сделать не
C++:
  delay(10);
а
C++:
  delay(15);// или
  delay(20);
Или же организовать такое:
C++:
String sendToClient(String str){
//Description: Function used to send string to tcp client using CIPSEND
  String len = "";
  len += String(str.length());
  while(!readWifiSerialMessage() == "принято") do{
    sendToWifi("AT+CIPSEND=0,"+len,responseTime,DEBUG);
    delay(10);
    len = sendToWifi(str,responseTime,DEBUG);
    Serial.println(len);
    delay(10);
    sendToWifi("AT+CIPCLOSE=0",responseTime,DEBUG);
  }
  len = readWifiSerialMessage();
  return len;
}
И 2-ой вопрос аппаратный: отпал сам собой: не было GNDы между Наной и НодеМЦУ.

З.Ы. Для особливо: страждущих - прикрепляю дельфийский исходник FTCPdriverа (TCPClientDemo.zip - правда там он в Андрюхиной рубашке); интересующихся (типа: код - в студию) - скетч (ESP_WiFi_connect.zip).
 

Вложения

UFO 007

New member
нормально дружит с ардуино.
О! Ес, сэр... В манагере плат приаттачивается даже конкретно моя НодеМЦУ0.9: пиши, шей - не хочу... Однако есть одно "но": если в том скетче, что уже давно работает в 168-й ВиФи конструировать так:
C++:
  WiFi.begin("...", "...");
то всё работает тип-топ только при включенном роутере, а как только его выкл. - сенсоры "теряют нюх", релюхи с буззерами молчат "как рыба об лёд", а если так:
C++:
  WiFi.softAP("ESP_007", "");
то хоть включай роутер, хоть выключай - всё равно: "лёд". Хотя там было заюзано УДП - может с ТЦП картинка поменяется... Прошьюсь - результ докладу.
 

CodeNameHawk

Moderator
Команда форума
О! Ес, сэр... В манагере плат приаттачивается даже конкретно моя НодеМЦУ0.9: пиши, шей - не хочу... Однако есть одно "но": если в том скетче, что уже давно работает в 168-й ВиФи конструировать так:
C++:
  WiFi.begin("...", "...");
то всё работает тип-топ только при включенном роутере, а как только его выкл. - сенсоры "теряют нюх", релюхи с буззерами молчат "как рыба об лёд", а если так:
C++:
  WiFi.softAP("ESP_007", "");
то хоть включай роутер, хоть выключай - всё равно: "лёд". Хотя там было заюзано УДП - может с ТЦП картинка поменяется... Прошьюсь - результ докладу.
Если я правильно догадался, что у вас за топология, то делая без роутера, на одной есп запустите точку доступа а вторая и последующие есп подключаются к ней. Раз есть комп с прогой, то точку доступа можете создать на нем.
Если правильно напишите скетч, то будет работать и с роутером, если включён и без него, но простой команды подключись туда то, для этого не хватит.

У меня проще, если роутер отключен, атмега управляет реле автономно. Но роутер и не отключаю, через него увеличивается площадь покрытия, есп стоят далеко друг от друга.
И что бы не писать программки для каждого устройства(комп, андроид ) использую вебсервер.
 
Последнее редактирование:

UFO 007

New member
Если я правильно догадался, что у вас за топология, то делая без ...
А вот отсюда, плз, поподробней: Вы упредили мой вопрос "А как избавиться от роутера?" - Яndexил SSIDtoIP (по аналогии со StrToInt или DateTimeToStr - и тишина): т.е. есть какие нить инструменты чтобы из (например) ESP-007WiFiScanner.PNG
(ТД на которой поднят ВиФиСервер) выкопать 192.168.1.4? Мои прикидки на эту тему (скорее вопрос - как): запустить на ЕСПхе броадкастовый УДП и рассылать getSoftAPIP а в проге УДПСервером слушать - как поймал: ответ "Принято" и
Код:
IdTCPClient.Host:= 'то, что принято';
.
А по поводу АТ-неАТ:scrrenshot.png
Во-первых: сообщения теперь не теряются, но добивает разница между "Отправлено в" и "ClientReciveStr on" - 5 а иногда и 6 секунд: может у ВиФиСервера какой-нить таймаут можно изменить? И не смог бы кто-нить мне помочь: качнуть моего клиента (на https://yadi.sk/d/wFhBaRViKLXinw "Get_Client_Server" ибо местный файлообменник и порезанный на 1,44-дискеты архив принимать отказался: Загруженный файл слишком большой. - это 1 457 664 великоват?) и пообщаться со своей ЕСПхой - задержка будет такая же? Ведь в случае с АТ ответ приходил если не в ту же, то на следующую секунду.
Во-вторых: почему-то "Get_Status" не хочет детектиться (тут надо признать, что в С++ я пока 0 целых и хрен десятых).
 

Вложения

Последнее редактирование модератором:

CodeNameHawk

Moderator
Команда форума
Если на есп запущена AP, то по умолчанию IP адрес у нее и будет постоянно 192.168.1.4
Про то, что вы спрашивали ищите по DNS.
Я рекомендую задать каждой есп постоянный IP адрес и по нему обращаться.

А вообще начните с примеров в ардуиноиде и doc и вы найдете ответы даже на еще не заданные вами вопросы.
 

UFO 007

New member
За doc - отдельное человеческое СПАСИБО, но как всегда "НО": пара вопросов всё-таки осталась...
и будет постоянно 192.168.1.4
и чё: никак нельзя изменить? эт чё - Эспрессифский фьюз? Ведь две АП на одном ИП - это же чревато... Допустим (это - из области фантастики) сосед (этажом выше или ниже) купил на Юноне (или на Савёловском - не важно) самогонный аппарат с управлением по ВайВай (на такой же ЕСПхе) и я, послав своим релюхам команды "подогрей мне то" и "подсвети мне это", теоретически могу устроить на соседской кухне взрыв или он (в отместку) своим пультом потушит мне всё. Попробовал "на дурачка"
C++:
  WiFi.softAPIP() = WiFi.localIP();
но "авось" не прокатил.
И про 5-6-тисекундную задержку - вопрос остался открытым: где-то надыбал ТЦПИП Буильдер, но он только "Сервер чё-то принял..." отображает крякозябрами и так же 5 сек висит пока ЕСПха ждёт у моря погоды - как изврачевать?
З.Ы. Ежели кому интересно поэкскриментировать с Клиент/Сервером что на скриншоте выше (под заголовком "А по поводу АТ-неАТ: " - https://yadi.sk/d/wFhBaRViKLXinw
 

UFO 007

New member
За docи отдельное спасибо - раскопал softAPConfig, а то:
- голова крУгом идёт: пол-дня копаюсь и даже в наглую:
C++:
WiFiServer server(WiFi.softAPIP(), port);
- ни с роутеровским 1.101, ни особенно с АПшным 4.1 клиент коннектиться не хочет - почему? Чего не хватает? Сдаюсь - ну если не кусок кода, то хоть список нужных функций покажите, пожалуйста... Как "вычеркнуть" роутер?
 

CodeNameHawk

Moderator
Команда форума
C++:
WiFiServer server(WiFi.softAPIP(), port);
- ни с роутеровским 1.101, ни особенно с АПшным 4.1 клиент коннектиться не хочет - почему? Чего не хватает?
Не хватает всего остального, что вы делаете неясно.
Давайте просто, скетч, лог заливки, лог загрузки.
Для начала разберитесь с HelloSever.
 

UFO 007

New member
да мигал я бортовым светодиодом из браузера, но это же - через роутер... А скетч :
C++:
#include <ESP8266WiFi.h>

int port = 8086;  //Port number
WiFiServer server(port);

//Server connect to WiFi Network
const char *ssid = "TP-LINK_UFO_007";  //Enter your wifi SSID
const char *password = "k....007";  //Enter your wifi Password

int count=0;
IPAddress local_IP(192,168,4,5);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.printf("Connecting to %s ", ssid);
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password); //Connect to wifi
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");
  Serial.print("Setting soft-AP configuration ... ");
  Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");

  Serial.print("Setting soft-AP ... ");
  Serial.println(WiFi.softAP("ESP-007") ? "Ready" : "Failed!");

  Serial.print("STA_IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("AP_IP address: ");
  Serial.println(WiFi.softAPIP());
WiFiServer server(WiFi.softAPIP(), port);
  server.begin();
}

void loop()
{
  WiFiClient client = server.available();
  String s;
  if (client) {
    if(client.connected())
    {
      Serial.println("Client Connected");
      Serial.println();
    }
    while(client.connected()){    
      while(client.available()>0){
        //читаем данные из подключенного клиента
        s = client.readStringUntil(0x0D+0x0A);
        Serial.println("Client transmit: "+ s);
        s.trim();
        if (s == "Get_Status"){
          client.println("Принято..." + s);
        } else
        client.println("Сервер чё-то принял..."+s);
      }
      //посылаем данные подключенному клиенту
      while(Serial.available()>0)
      {//"123" у клиента выглядят как "49 50 51 13 10" - ASCII + CR + LF
        client.println(Serial.read());
      }
    }
    client.stop();
    Serial.println("Client disconnected");  
  }
}
если убрать предпоследнюю строку сетапа, то всё работает, но через X.Y.1.101 - что выдаёт роутер.
А логи (чем друг от друга отличаются и) где их выкопать? В дунькином окне под редактором оранжевые буквы?
 

CodeNameHawk

Moderator
Команда форума
В дунькином окне под редактором оранжевые буквы?
Пишите нормальным языком, на нормальном языке.
IPAddress local_IP(192,168,4,5); IPAddress gateway(192,168,1,1);
Эти цифры взаимосвязанны , непонимате не меняйте.
Пробуйте так
IPAddress local_IP(192,168,4,1); IPAddress gateway(192,168,4,1]
WiFi.mode(WIFI_AP);

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

UFO 007

New member
Чего не хватает?
- когда STA через ssid и pass коннектится к роутеру - получает 192.168.1.101 и через этот адрес - всё ОК, но я же роутер ВЫКЛ!!! (равносильно WIFI_AP)... И тут мой взгляд тупо упёрся в "свисток" (что торчит в usb-хабе Sven) - так ВО-О-О-Т чего не хватает... И при чём если коннектиться к "рогам" ТПЛинка, то клиент так же упорно НЕ коннектится, а вот напрямую к ЕСП-007, то - пожалуйста... Так что первый вопрос закрыт, а по второму - вскрытие покажет...
 

UFO 007

New member
внизу ардуиноиде
а разве буквы там не оранжевые? А "Дунька" - это сленг от "Arduino" (пардон).
А вскрытие показало, что смерть наступила в результате вскрытия... Так что логи не нужны потому, что это:
C++:
#include <ESP8266WiFi.h>

int port = 8086;  //Port number
WiFiServer server(port);

void setup()
{
  WiFi.mode(WIFI_AP);
  WiFi.softAP("ESP-007");//AP_IP = 192.168.4.1
  WiFi.persistent(false);// store WiFi config in SDK flash area(no)
  server.begin();

void loop()
{
  WiFiClient client = server.available();
  String s;
  if (client) {
    if(client.connected())
    {
      Serial.println("Client Connected");
      Serial.println();
    }
    while(client.connected()){  
      while(client.available()>0){
        //читаем данные из подключенного клиента
        s = client.readStringUntil(0x0D+0x0A);
        Serial.println("Client transmit: "+ s);
        s.trim();
        if (s == "Get_Status"){
          client.println("Принято: " + s);
        } else
        client.println("Сервер чё-то принял..."+s);
      }
      //посылаем данные подключенному клиенту
      while(Serial.available()>0)
      {//"123" у клиента выглядят как "49 50 51 13 10" - ASCII + CR + LF
//        client.println(Serial.read());
        client.write(Serial.read());
      }
    }
    client.flush(1);//mSec
    client.stop();
    Serial.println("Client disconnected");
  }
}
очень даже работает и без роутера:

клиент.PNG
но вопрос остаётся открытым: как убрать задержку между "Отправлено в" и "ClientReciveStr on" - целых 6 секунд? А если у меня в программе таймер ежесекундно запрашивает состояние сенсоров (которое железяка вернула правильно: 2 - вкл. и 3 - выкл.)? А псевдографика: это или client.println заменить на .write или избавляться от
C++:
  char ch[5];//сенсоры
//считываем - заполняем массив
  client.println(String(ch));
про те же 6 сек.:
ТЦПИП Буильдер, но он только "Сервер чё-то принял..." отображает крякозябрами и так же 5 сек висит пока ЕСПха ждёт у моря погоды - как изврачевать?
 

nikolz

Well-known member
а разве буквы там не оранжевые? А "Дунька" - это сленг от "Arduino" (пардон).
А вскрытие показало, что смерть наступила в результате вскрытия... Так что логи не нужны потому, что это:
C++:
  char ch[5];//сенсоры
//считываем - заполняем массив
  client.println(String(ch));
про те же 6 сек.:
посмотрите это, кратко изложил причины медленной реакции ESP по Wifi
и как уменьшить 6 секунд до 0.2 секунд.
 

CodeNameHawk

Moderator
Команда форума
А "Дунька" - это сленг от "Arduino" (пардон).
Возможно вы не в курсе, что такое duino.

Так что логи не нужны потому, что это:
Возможно вы не умеете их использовать, а как вы отлаживаете программу, в том числе на делпфи.

Замените номер порта на доступный ( стандартный) для браузера, в нем откройте панель разработчика и покажите сколько времени занимает обращение к вашей есп с браузера.
Зачем она здесь или так, откуда пустые символы, если вы их не посылаете, ведь не посылаете?
 
Сверху Снизу