Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.10.2020, 01:09
UFO 007 UFO 007 вне форума
Новичок
 
Регистрация: 28.11.2010
Сообщения: 54
Репутация: 10
Восклицание Связь Delphi <-> ESP8266 через WiFi (помогите с Connect!!!)

Доброго всем времени суток!
В среде Ардуино ИДЕ для вышеозвученной железяки был написан скетч:
Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char *ssid = "ESP-007.1";
unsigned int localPort = 8086;      // local port to listen on
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1]; //buffer to hold incoming packet,
WiFiUDP Udp;

void setup() {
  WiFi.persistent(false);// store WiFi config in SDK flash area(no)
  WiFi.mode(WIFI_AP);//_STA
  WiFi.softAP(ssid);//IP = 192.168.4.1
  Udp.begin(localPort);
}

void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
Serial.printf("Received packet of size %d from %s:%d\n    (to %s:%d, free heap = %d B)\n",
              packetSize,
              Udp.remoteIP().toString().c_str(), Udp.remotePort(),
              Udp.destinationIP().toString().c_str(), Udp.localPort(),
              ESP.getFreeHeap());

    // read the packet into packetBufffer
    int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    packetBuffer[n] = 0;
    String s = (packetBuffer);
Serial.println("Client transmit: "+ s); 
    if (s == "Buzzer1") Sound(wc_buz, 1); else
    if (s == "Buzzer2") Sound(br_buz, 1); else
    if (s == "Get_Status") {
  //    s = "Status:= O'K!!!";
      s = "";
      int q = digitalRead(wc_sens);
      if (q) s += "1"; else
      s += "0";
      q = digitalRead(br_sens);
      if (q) s += "1"; else
      s += "0";
      q = wc_light;
      if (q) s += "1"; else
      s += "0";
      q = br_light;
      if (q) s += "1"; else
      s += "0";
      q = VentTimer.Enable;
      if (q) s += "1"; else
      s += "0";
    }
    else 
    if (s == "Discovery_007"){
		....
    } else {
      SendMsg("Сервер чё-то принял..."+s);
    }
  }

void SendMsg(String Messg){//& ссылка на Мессг
        char sendchars[Messg.length()+1];// буфер для строки
        Messg.toCharArray(sendchars, Messg.length()+1);//преобразовываем в буфер
  Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
  Udp.write(sendchars);
  Udp.endPacket();
/* Ввиду того, что в UDP доставка пакета НЕ гарантирована клиент отправляет
 * только что принятое сообщение и отправитель сравнивает переданное с 
 * возвращённым   */
/*  String tmp;
  do tmp = RecvMsg();
  while (Messg != tmp);// коню понятно - чревато переполнением стека 
*/}

String RecvMsg(){
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1]; //buffer to hold incoming packet,
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
Serial.printf("Received packet of size %d from %s:%d\n    (to %s:%d, free heap = %d B)\n",
              packetSize,
              Udp.remoteIP().toString().c_str(), Udp.remotePort(),
              Udp.destinationIP().toString().c_str(), Udp.localPort(),
              ESP.getFreeHeap());

    // read the packet into packetBufffer
    int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    packetBuffer[n] = 0;
    SendMsg(String(packetBuffer));//подтверждаем приём
    return String(packetBuffer);
  }
}
который выдаёт превосходные результаты (4 mS):https://yadi.sk/i/8G90218OTQPgSg == (я е...у файловую систему этого форума...). И всё это дело очень даже успешно
работает (обменивается сообщениями и т. д.) за исключением того, что к Точке Доступа (ESP-007.1) приходится подключаться вручную (силами Винды)
и тут: ВНИМАНИЕ - центральный вопрос темы: как законнектиться с нею (ТД or AP) силами Delphi????
Имею на вооружении такое: (опять е...у - господа админы/модеры, это - Ваш "минус": почему нельзя вместо ссылки показать скриншот того о чём идёт речь?):
https://yadi.sk/i/m155vx3L1NEHgQ - как в ВиФиСканере заюзать WlanConnect (точнее:_) как правильно заполнить структуру WLAN_CONNECTION_PARAMETERS?
В частности её мембера ucSSID?) А то получаю Acces violation...
Код:
procedure TForm1.btWifiConnectClick(Sender: TObject);
var
  ConPrms : Tndu_WLAN_CONNECTION_PARAMETERS;
  profile, s: string;
  mySSID: Pndu_DOT11_SSID;
  uchSSID: array[0..NDU_DOT11_SSID_MAX_LENGTH - 1] of uchar;
  i: integer;
  u: ulong;
begin
  s:= edSSID.Text;{"ESP-007.1}
  for I := 0 to High(uchSSID) do   
  uchSSID[i]:= 0;
  for I := 1 to Length(s) +1 do
  uchSSID[i-1]:= ord(s[i]);
  profile:= '<?xml version="1.0"?><WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">' +
  '<name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType>' +
  '<connectionMode>manual</connectionMode><autoSwitch>false</autoSwitch><MSM><security><authEncryption>' +
  '<authentication>WPA2PSK</authentication><encryption>AES</encryption><useOneX>false</useOneX></authEncryption>' +
  '<sharedKey><keyType>passPhrase</keyType><protected>false</protected><keyMaterial>{1}</keyMaterial></sharedKey>' +
  '<keyIndex>0</keyIndex></security></MSM></WLANProfile>';
  u:= Length(s);
  mySSID.uSSIDLength:= u;

  mySSID.ucSSID:= uchSSID;// Вот тут: НЕСООТВЕТСТВИЕ!!! типов

  ConPrms.strProfile         := PWChar(profile);
  ConPrms.pDot11Ssid         := mySSID;
  // Windows XP: pDesiredBssidList member must be NULL.
  ConPrms.pDesiredBssidList  := NIL;
  ConPrms.dot11BssType       := dot11_BSS_type_any;
  // Windows XP: dwFlags must be set to 0
  ConPrms.dwFlags            := 0;
  if WlanConnect(Gwifihandle, pIfaceGuid, @ConPrms, nil) = ERROR_SUCCESS then//Gwifihandle = Глобальный хэндл сессии, что возвращает ф-ция Скан, 
//pIfaceGuid = опять же Скан указывает на: Беспроводной сетевой USB-адаптер N 150 D-Link DWA-125 (версия B) - эти парам-тры: оба О,К
  showmessage('Вродь как подключено') else;
  showmessage('Дулю тебе, а не ВайФай');
end;
гуглил (точнее - Яndexил), но по существу вопроса - тишина (про WlanOpenHandle и инфы, и примеров - море (откуда и взялся ВиФиСканер)),
а по насущной проблеме := nil
Обчем буду благодарен за любую подсказку: в какую сторону копать...
__________________
...И был сначала ZX-Spectrum, а потом его T(urbo)ASS(e)M(bler)... И только на 7-й день (когда Интел купила Пентковского [из КБ Бабаяна]) - появился Pentium-I... А в Союзе P-II был ещё в 1978 году (точнее: Эльбрус [мультискалярный проц] только не рапространялся спекулянтами, а управлял ракетами и спутниками)... А лет с пяток назад Эльбрус-II ПЁР (но никак не ГНАЛСЯ как Селероны) на F(recuency):= 400 GHz... А самое парадоксальное - презентация состоялась в Минске...

Последний раз редактировалось UFO 007, 10.10.2020 в 16:06.
Ответить с цитированием
  #2  
Старый 16.01.2021, 23:19
UFO 007 UFO 007 вне форума
Новичок
 
Регистрация: 28.11.2010
Сообщения: 54
Репутация: 10
По умолчанию

Не мытьём, так - катаньем:
Код:
Procedure WinExec007(const ACmdLine: String; const ACmdShow: UINT = SW_SHOWNORMAL);
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  CmdLine: String;
Begin
  Assert(ACmdLine <> '');

  CmdLine := ACmdLine;
  UniqueString(CmdLine);

  FillChar(SI, SizeOf(SI), 0);
  FillChar(PI, SizeOf(PI), 0);
  SI.cb := SizeOf(SI);
  SI.dwFlags := STARTF_USESHOWWINDOW;
  SI.wShowWindow := ACmdShow;

  SetLastError(ERROR_INVALID_PARAMETER);
  {$WARN SYMBOL_PLATFORM OFF}
  Win32Check(CreateProcess(nil, PChar(CmdLine), nil, nil, False, CREATE_DEFAULT_ERROR_MODE {$IFDEF UNICODE}or CREATE_UNICODE_ENVIRONMENT{$ENDIF}, nil, nil, SI, PI));
  {$WARN SYMBOL_PLATFORM ON}
  CloseHandle(PI.hThread);
  CloseHandle(PI.hProcess);
End;

Function CSharpWiFiConnect(AP_Name: string): boolean;
var // если AP_Name = '0', то ap_connector отключает ТД подключенную предыдущим вызовом
  tsName: TStringlist;             // ; NeedConnect: boolean
begin
  tsName:= TStringlist.Create;
  tsName.Add(AP_Name);
  tsName.SaveToFile(temp + '\ap_ToConnect.txt');
  tsName.Clear;
  WinExec007(temp + '\ap_connector.exe', SW_HIDE);//подключились к AP_Name
  while FileExists(temp + '\ap_ToConnect.txt') do Sleep(1);// ждём завершения ap_connector.exe
  Result:= not FileExists(temp + '\ap_ToConnect.txt');
  tsName.Free;
end;

procedure TForm1.btWifiConnectClick(Sender: TObject);
var
  Res : TResourceStream;

begin
  temp:=  GetEnvironmentVariable('TEMP');
  if not FileExists(temp + '\ap_connector.exe') then
  begin
    Res := TResourceStream.Create(hInstance, 'ap_connector', RT_RCDATA);
    Res.SavetoFile(temp + '\ap_connector.exe');
    Res.Free;
  end;
  if not FileExists(temp + '\SimpleWifi.dll') then
  begin
    Res := TResourceStream.Create(hInstance, 'SimpleWifi', RT_RCDATA);
    Res.SavetoFile(temp + '\SimpleWifi.dll');
    Res.Free;
  end;
  CSharpWiFiConnect('ESP-007.3');
end;
и... ву-аля : подключено(юзайте - кому надо), но .... через C#-вский костыль, а хотелось бы по науке - через нативный WLanAPI (точнее - немецкий клон: nduWLanAPI)
Вложения
Тип файла: zip ap_connector.zip (13.4 Кбайт, 18 просмотров)
Тип файла: zip SimpleWifi.zip (18.9 Кбайт, 17 просмотров)
Тип файла: zip nduWLanAPI.zip (33.0 Кбайт, 16 просмотров)
__________________
...И был сначала ZX-Spectrum, а потом его T(urbo)ASS(e)M(bler)... И только на 7-й день (когда Интел купила Пентковского [из КБ Бабаяна]) - появился Pentium-I... А в Союзе P-II был ещё в 1978 году (точнее: Эльбрус [мультискалярный проц] только не рапространялся спекулянтами, а управлял ракетами и спутниками)... А лет с пяток назад Эльбрус-II ПЁР (но никак не ГНАЛСЯ как Селероны) на F(recuency):= 400 GHz... А самое парадоксальное - презентация состоялась в Минске...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:47.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter