Доброго всем времени суток!
В среде Ардуино ИДЕ для вышеозвученной железяки был написан скетч:
Код:
#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
Обчем буду благодарен за любую подсказку: в какую сторону копать...