• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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.

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

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