|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Связь 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); } } работает (обменивается сообщениями и т. д.) за исключением того, что к Точке Доступа (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; а по насущной проблеме := 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
|
|||
|
|||
Не мытьём, так - катаньем:
Код:
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; ...И был сначала ZX-Spectrum, а потом его T(urbo)ASS(e)M(bler)... И только на 7-й день (когда Интел купила Пентковского [из КБ Бабаяна]) - появился Pentium-I... А в Союзе P-II был ещё в 1978 году (точнее: Эльбрус [мультискалярный проц] только не рапространялся спекулянтами, а управлял ракетами и спутниками)... А лет с пяток назад Эльбрус-II ПЁР (но никак не ГНАЛСЯ как Селероны) на F(recuency):= 400 GHz... А самое парадоксальное - презентация состоялась в Минске... |