Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 11.10.2020, 20:44   #1
UFO 007
 
Регистрация: 09.02.2012
Сообщений: 7
Восклицание Связь Delphi <-> ESP8266 через WiFi (нужна помощь с WlanConnect)

Доброго всем времени суток!
Изобрёл железку на базе вышеозвученной микросхемы (пришлось, правда, вгрызаться в СиПиПи) - скетч приводить не буду, так как дело - не в нём (алгоритмы работы во всех режимах отлажены), а дело в том, что на ЕСПхе (как на открытой точке доступа) поднят UDP_Server и надо бы к ней (точке доступа) подключиться и не "ручками"(через "телевизор возле часов"), а из программы поддержки железяки. По ходу немыслимых эксКриментов был набросан простенький клиент
2020-10-11_19-42-48.png

в котором
Код:
uses
..., nduWlanAPI, nduWlanTypes, ...

var
  Form1: TForm1;
  Gwifihandle: THandle;
......

Function TFORM1.WiFiScan(search_ssid: string; var Founded: TStringList): TStringList;
const
WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES =$00000001;
var
//  hClient              : THandle;
  dwVersion            : DWORD;
  ResultInt            : DWORD;
  pInterface           : Pndu_WLAN_INTERFACE_INFO_LIST;
  i                    : Integer;
  j                    : Integer;
  pAvailableNetworkList: Pndu_WLAN_AVAILABLE_NETWORK_LIST;
  pInterfaceGuid       : PGUID;
  SDummy               : string;
begin
  try
    WiFiScan:= TStringList.Create;
    ResultInt:=WlanOpenHandle(1, nil, @dwVersion, @Gwifihandle);
    if  ResultInt<> ERROR_SUCCESS then
    begin
       ShowMessage('Error Open CLient '+IntToStr(ResultInt));
       Exit;
    end;

    ResultInt:=WlanEnumInterfaces(Gwifihandle, nil, @pInterface);
    if  ResultInt<> ERROR_SUCCESS then
    begin
       ShowMessage('Error Enum Interfaces '+IntToStr(ResultInt));
       exit;
    end;

    for i := 0 to pInterface^.dwNumberOfItems - 1 do
    begin
     pInterfaceGuid:= @pInterface^.InterfaceInfo[pInterface^.dwIndex].InterfaceGuid;
        ResultInt:=WlanGetAvailableNetworkList(Gwifihandle,pInterfaceGuid,WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES,nil,pAvailableNetworkList);
        if  ResultInt<> ERROR_SUCCESS then
        begin
           ShowMessage('Error WlanGetAvailableNetworkList '+IntToStr(ResultInt));
           Exit;
        end;

          for j := 0 to pAvailableNetworkList^.dwNumberOfItems - 1 do
          Begin
            SDummy:=PAnsiChar(@pAvailableNetworkList^.Network[j].dot11Ssid.ucSSID);
            if Length(SDummy) = 0 then
            WiFiScan.Add('"InVisible_AP - т.е. скрытая"')
            else
            WiFiScan.Add(SDummy);
            if Pos(search_ssid, SDummy) > 0 then
            Begin        
              Founded.Add(SDummy);
              pIfaceGuid:= @pInterface^.InterfaceInfo[i].InterfaceGuid;
            End;
          End;
    end;
    WlanCloseHandle(Gwifihandle, nil);  // может в ФормДестрой?
  except
    on E:Exception do
      ShowMessage('Ощибка класса: '+E.Classname+' с сообщением: '+E.Message);
  end;
end;

procedure TForm1.btWifiConnectClick(Sender: TObject);
var
  ConPrms : Tndu_WLAN_CONNECTION_PARAMETERS;
  mySSID: Pndu_DOT11_SSID;// Tndu_DOT11_SSID
  tsESP: TStringlist;
  profile, s: string;
  i: integer;
//  uchSSID: array[0..NDU_DOT11_SSID_MAX_LENGTH - 1] of uchar;
begin
  for I := 0 to High(uchSSID) do uchSSID[i]:= 0;  
  tsESP:= TStringlist.Create;
  s:= 'ESP-007';//edSSID.Text;
  memo1.Lines:= WiFiScan(s, tsESP);
  for I := 0 to tsESP.Count - 1 do
  begin
    //поключаемся к каждой:ESP-007.1, ESP-007.2, ...
    for I := 1 to Length(s) +1 do uchSSID[i-1]:= ord(s[i]);
    profile:= Format('<?xml version="1.0"?><WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">' +
  '<name>%s</name><SSIDConfig><SSID><name>%s</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>%s</keyMaterial></sharedKey>' +
  '<keyIndex>0</keyIndex></security></MSM></WLANProfile>', [s, s,'password']);
    mySSID.uSSIDLength:= Length(s);// +1;
    mySSID.ucSSID:= uchSSID;  //<-[dcc64 Error] Client_.pas(215): E2008 Incompatible types 
    ConPrms.wlanConnectionMode := Tndu_WLAN_CONNECTION_MODE.wlan_connection_mode_temporary_profile;//wlan_connection_mode_auto;
    ConPrms.strProfile         := PWChar(profile);
    ConPrms.pDot11Ssid         := nil;// Если установлено значение NULL,все SSID в профиле будут опробованы.
    // Windows XP: pDesiredBssidList member must be NULL.
    ConPrms.pDesiredBssidList  := NIL;
    ConPrms.dot11BssType       := Tndu_DOT11_BSS_TYPE.dot11_BSS_type_any;
    // Windows XP: dwFlags must be set to 0
    ConPrms.dwFlags            := 1;
    if WlanConnect(Gwifihandle, pIfaceGuid, @ConPrms, nil) = ERROR_SUCCESS then
    showmessage('Вродь как подключено') 
      else
    showmessage('Дулю тебе, а не ВайФай');
    end;
end;
В общем: никто не может (у кого есть) поделиться опытом (удачным) в плане использования "нативного" WLanAPI? А в частности: меня "добивает" строка
Код:
  mySSID.ucSSID:= uchSSID;  //<-[dcc64 Error] Client_.pas(215): E2008 Incompatible types
и тут необходимо пояснить: если uchSSID объявляю локально (в последней заREMированной строке)
Код:
var
  ConPrms : Tndu_WLAN_CONNECTION_PARAMETERS;
  mySSID: Pndu_DOT11_SSID;// Tndu_DOT11_SSID
  profile, s: string;
  i: integer;
//  uchSSID: array[0..NDU_DOT11_SSID_MAX_LENGTH - 1] of uchar;
то при наведении на неё курсора выскакивает, что она: array[...] of Byte, а если "глобально" (в модуле nduWlanTypes)
Код:
var
  uchSSID: array[0..NDU_DOT11_SSID_MAX_LENGTH - 1] of uchar;

type
	Pndu_DOT11_BSS_TYPE = ^Tndu_DOT11_BSS_TYPE;
	Tndu_DOT11_BSS_TYPE = (
    dot11_BSS_type_infrastructure = 1,
    dot11_BSS_type_independent = 2,
    dot11_BSS_type_any = 3);

  Pndu_DOT11_SSID = ^Tndu_DOT11_SSID;
  Tndu_DOT11_SSID = record
  	uSSIDLength: ulong;
    ucSSID: array[0..NDU_DOT11_SSID_MAX_LENGTH - 1] of uchar;
  end;
то хинт "кричит", что она uchar, но всё равно имеет место быть "несовместимость" типов ->H-E-E-E-LP!!!
UFO 007 вне форума Ответить с цитированием
Старый 11.10.2020, 22:42   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,209
По умолчанию

Поправьте ваш nduWlanTypes
Код:
Type
  TucSSID=array[0..NDU_DOT11_SSID_MAX_LENGTH - 1] of uchar;

uchSSID:TucSSID;

 Tndu_DOT11_SSID = record
  	uSSIDLength: ulong;
    ucSSID:TucSSID;
  end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 12.10.2020, 22:10   #3
UFO 007
 
Регистрация: 09.02.2012
Сообщений: 7
Вопрос

Цитата:
Сообщение от Pavia Посмотреть сообщение
Поправьте ваш nduWlanTypes
Большое Вам человеческое СПАСИБО (жаль - движок форума не имеет кнопочки "+"), ругань прекратилась, но всёрно Форточка сообщает: "Дулю тебе, а не ВайФай"... Думаю надо разбираться с pDesiredBssidList т. к. NIL усраивал только ХРху, а 10-ку - отнюдь. Результы разбирательства докладу.

З.Ы. Мож кому надо (например заюзать или перекроить под свои нужды WiFiScan ну или просто интереса ради) приаттачиваю немецкоязычный перевод "нативного" (мелкомягковского) WLanAPI.
Вложения
Тип файла: zip 0_nduWlanAPI.zip (11.3 Кб, 0 просмотров)

Последний раз редактировалось UFO 007; 12.10.2020 в 23:09.
UFO 007 вне форума Ответить с цитированием
Старый 18.10.2020, 23:10   #4
UFO 007
 
Регистрация: 09.02.2012
Сообщений: 7
По умолчанию

Вложение 100014
Цитата:
Сообщение от UFO 007 Посмотреть сообщение
Результы разбирательства докладу.
ДоклАДаю: разборки прошли на ухнарь (из рук - вон) плохо: от кода ошибки 0х87 до "Access Violation"... И, находясь в полном ступоре, решил "прогуляться" по своим "винтам" (2Тб+3Тб) ВинКомандёром... И прогулка эта вернула следующее:
WiFiScaner_C#.png
И коню понятно (для жеребят расшифровываю): писано (что-то около года назад) в С# (однако в нём я полный Zero: наЯндексил, компильнул, [эт в Делфях я := хоть и ноль целых, но хотя бы хрен десятых {пардон - сёдня под пивом}] доработал надфилем [никак не рашпилем] и ву-аля...) НО!!! - в Делфях вся прога отточена, а в C# - только подключение к ВиФи-ТочкеДоступа (это же надо в проект на вражеском языке запихать UDP-клиента [опять Яndexить?]) И тут надо заострить внимание: после установки мелкомягковского VisualStudio проекты годовалой давности отказались компилиться и запускаться: говно-вопрос - создаём новый проект, накидываем на форму все "вышеупомянутые" компоненты и ... (тут необходимо пояснить, что подключение проходит не через нативные ф-ции WLanAPI.dll, а через "костыль" - SimpleWifi.dll)... И ....
Код:
using SimpleWifi;
using SimpleWifi.Win32;
using SimpleWifi.Win32.Interop;
SimpleWifi в том же (родном) С# подчёркиваются волнистой красной линией (мол - не знаю я кто такая SimpleWifi.dll). Не, ну как так - год назад знала??? Дальнейшие раскопки показали: (опять-таки : тем же ВинКомандёром [точнее - его "блокнотом"=AkelPadом]) : в новом .csproj ({[.dproj - не напоминает???]}) не хватает строк:
Код:
    <Reference Include="SimpleWifi">
      <HintPath>e:\0_C#\0_PC_Client\SimpleWifi.dll</HintPath>
    </Reference>
и всё - красным подчёркивать перестало... И тут - ВНИМАНИЕ!!! - центральный вопрос поста: коню/ежу/дураку понятно, что тонна строк
Код:
using
по-нашему помещается в клаузу
Код:
uses
но ей нужны либо *.pas, либо *.dcu, а *.dll туда никак не "скормишь"...И вот в .dproj я нашёл нечто похожее:
Код:
        <DCCReference Include="..\TCPClientDemo\uTCPDriver.pas"/>
... Ни у кого подобного опыта нет?: как прикрутить к Delphi dll-ку и не на уровне
Код:
	function ConnectAsync(authRequest: DWORD; overwrite: BOOL; OnConnectedComplete: void): DWORD; stdcall; {!!!}external{!!!}  SimpleWifi	name	'ConnectAsync';
, а чтобы прога (Дэлфийская) "понимала" ("""вызывала""") типы данных, расписанные во вражеской длл? Ведь
Код:
      wifi = new Wifi();
надо понимать как
Код:
var
AnyVar: Wifi;
begin
AnyVar:= Wifi.Create;
а тип-то (как и его конструктор) прописан в той длл...

Последний раз редактировалось UFO 007; 18.10.2020 в 23:16.
UFO 007 вне форума Ответить с цитированием
Старый 19.10.2020, 23:14   #5
UFO 007
 
Регистрация: 09.02.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от UFO 007 Посмотреть сообщение
пардон - сёдня под пивом
отсюда и бред сивой кобылы: С# - он же только внешне похож на классический СиПиПи, а по сути он - скриптовщик для NetFramework'а (он не компилит в машинные коды как СиПиПи и Дельфи)... Не - можно конечно и из Дельфи NetFX заюзать, но для меня - это тот ещё геморрр...

Тут пришла идея: допилить C#повский ap_connector следующим макаром: в методе
Код:
    private void Form1_Load(object sender, EventArgs e){

}
искать рядом с прогой файл ap_list.txt и если его нет - сканируем радиопространство и результаты не в ListView, а .savetofile(ap_list.txt); else (если файл существует) ищем рядом с собой 'ap_ToConnect.txt', читаем из него "фамилию" ар и подключаемся к ней.. - Всё: осталось запихать в тело основной программы как ресурсы: ap_connector.ехе и SimpleWifi.dll и в момент когда надо подключиться извлекаем всё это дело в GetEnvironmentVariable('Temp')+'\'+ имяфайла.ext и сразу же
Код:
WinExec(GetEnvironmentVariable('Temp')+'\ap_connector.ехе', SwHide);
и при первом запуске ap_connector вернёт нам список доступных ТД а перед повторным ложим рядом с ним ap_ToConnect.txt и всё - дело в шляпе: мы подключены...

Последний раз редактировалось UFO 007; 19.10.2020 в 23:19.
UFO 007 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь в расшифровке через AS3 Flash netsecuritate Общие вопросы Web 1 29.06.2014 03:51
Нужна помощь с отправкой почты через Access Uram Microsoft Office Access 1 10.12.2013 14:25
связь через сокеты программ написанных на delphi и C# fobass C# (си шарп) 1 16.11.2012 11:34
Связь между двумя объектами по WiFi. S_Yevgeniy Компьютерное железо 13 27.10.2010 09:19
Связь таблиц в SQL через Delphi Edelweiss Помощь студентам 1 09.11.2009 12:44


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840