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

 



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.01.2021, 21:28
UFO 007 UFO 007 вне форума
Новичок
 
Регистрация: 28.11.2010
Сообщения: 54
Репутация: 10
Восклицание Андроид: непонятки с FMX.DialogService и JWifiManager

Желаю всем здравия, други мои.
Скультивировал (изгандобил) тут намедни одну железяку на базе ЕСП8266 и вы можете не поверить, но на написание компьютерной ипостаси программы поддержки (в перемешку с допиливанием прошивки как Точки Доступа) ушло день-два (максимум три, правда остался один недозакрытый вопрос, но об этом позже или в совсем другой теме: WLanConnect через немецкий перевод нативной WLanAPI на дельфийскую nduWLanAPI), но ПиСи - штука не совсем портабельная/мобильная а вот с Андрюхиной ипостасью бьюсь уже больше недели, но как у Крылова: Однажды-лебедь-раком-щуку-но-воз-и-ныне---там... вАащпе - пипец... Ну, значит - вот:
Код:
var
  Form1: TForm1;
  WifiManager: JWifiManager;
  WifiManagerObj: JObject;
  mtError, mtInformation, mtConfirmation: System.UITypes.TMsgDlgType;
  mbYes, mbNo, mbOK: System.UITypes.TMsgDlgBtn;

implementation

{$R *.fmx}

function myMsgDlg(const AMessage: string; const ADialogType: TMsgDlgType;
  const AButtons: TMsgDlgButtons; const ADefaultButton: TMsgDlgBtn): Integer;
var
  mr: TModalResult;
begin
  mr:=mrNone;
  // standart call with callback anonimous method
  TDialogService.MessageDialog(AMessage, ADialogType, AButtons,
    ADefaultButton, 0,
    procedure (const AResult: TModalResult)
    begin
      mr:=AResult
    end);
//  while mr = mrNone do // wait for modal result
//    Application.ProcessMessages;
  Result:=mr;
end;

Function TForm1.WiFiScan(search_ssid: string; var Founded: TStringList): TStringList;
var
{$IFDEF ANDROID}
  ScanResult: JScanResult;
{$ENDIF}
  ssid: string;
  I: Integer;
begin
  Result:= TStringList.Create;
TJWifiManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.WIFI_SERVICE));
  WifiManagerObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.WIFI_SERVICE);
  WifiManager:= TJWifiManager.Wrap((WifiManagerObj as ILocalObject).GetObjectID);
  if not WifiManager.isWifiEnabled then
  if myMsgDlg('Модуль WiFi в устройстве отключен.' + //#10 + #13 +
                'Попытаться включить?', mtError, mbYesNo, mbYes) =  mrYes
                then WifiManager.setWifiEnabled(true) else exit;
  Sleep(2000);
  for I := 0 to WifiManager.getScanResults.size - 1 do
  begin
    ScanResult := TJScanResult.Wrap((WifiManager.getScanResults.get(I) as ILocalObject).GetObjectID);
    ssid:= JStringToString(ScanResult.SSID);
    Result.Add(ssid);
  end;
  for I := 0 to Result.Count - 1 do
  if Pos(search_ssid, Result.Strings[i]) > 0 then Founded.Add(Result.Strings[i]);
end;

Function TForm1.WiFiConnect(SSIDtoConnect: string): boolean;
var
{$IFDEF ANDROID}
  conf: JWifiConfiguration;
//  WifiConfigObj: JObject;
  list: JList;
  iter: JIterator;
{$ENDIF}
begin
  Result:= false;
  SSIDtoConnect:= '"'+SSIDtoConnect+'"';
  try
//TJWifiManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.WIFI_SERVICE));
    WifiManagerObj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.WIFI_SERVICE);
    WifiManager := TJWifiManager.Wrap((WifiManagerObj as ILocalObject).GetObjectID);
    conf:= TJWifiConfiguration.JavaClass.init;
    conf.SSID:= StringToJString(SSIDtoConnect);//'"ESP-007.1"');
    conf.allowedKeyManagement.&set(TJWifiConfiguration_KeyMgmt.JavaClass.NONE);
    list:= wifiManager.getConfiguredNetworks;
    WifiManager.addNetwork(conf);// добавляем внаглую - не мешало бы проверить может она уже есть в ConfiguredNetworks?
    iter := list.iterator;
    while iter.hasNext do
    Begin
      conf := TJWifiConfiguration.Wrap((iter.next as ILocalObject).GetObjectID);
//Memo1.lines.add('networkId: '+conf.networkId.ToString + ' --> SSID: ' + JStringToString(conf.SSID));
      if JStringToString(Conf.SSID)  = SSIDtoConnect then// '"ESP-007.1"'
      Begin
        wifiManager.disconnect;
        wifiManager.enableNetwork(Conf.networkId, true);
//memo1.lines.add('enableNetwork = networkId: ' + Conf.networkId.ToString(Conf.networkId));
        Result:= wifiManager.reconnect;
      End;
    End;
  except
    on E: Exception do
    ShowMessage('Произошла ошибка класса: ' +#13 +#10 + E.ClassName +#13 +#10 +
    'c сообщением: ' +#13 +#10 + E.Message);
  end;
  if Result then
  ShowMessage('Подключение: связь с устройством' + #10 + #13 + SSIDtoConnect
              + #10 + #13 + ' установлена.');
end;

Function TForm1.SendMsg(Msg: string): string;
begin
    IdUDPClient1.Send(Msg, IndyTextEncoding(encIndyDefault)); //отправка сообщени¤ в сеть
    Result:= IdUdpClient1.ReceiveString(10, IndyTextEncoding(encUTF8));
end;
это чтобы было понятно когда и что выполняется, а вызывается отсюда:
Код:
procedure TForm1.btWifiConnectClick(Sender: TObject);
label l;
var
  tsESP, tsl: TStringlist;
  TPath: System.IOUtils.TPath;
  I: Integer;
  Start: TTime; // FMX.Objects , Stop
  PreStatus, apname: string;
begin
//  FMX.Dialogs.MessageDlg('Для того чтобы программа смогла ' + #10 + #13 +
  FMX.Dialogs.ShowMessage('Для того чтобы программа смогла ' + #10 + #13 +
                         'связаться с железякой нажмите' + #10 + #13 +
                         'на её корпусе кнопку "WiFi" после' + #10 + #13 + #10 + #13 +
                         '---для расширения окна мессага - ' + #10 + #13 +
                         'чтобы его было видно из-под окна' + #10 + #13 +
                         '2-го мессага--------------------' + #10 + #13 + #10 + #13 +
                         'чего щёлкните "ОК"');// #10 + #13 +  mbYes, mbNo{ }
//                         'чего щёлкните "ОК"', mtError, [mbOK], 0);// #10 + #13 +  mbYes, mbNo{ }
  Sleep(3000);
  tsESP:= TStringlist.Create;
  if not FileExists(TPath.Combine(TPath.GetDocumentsPath, 'AP_Name.txt')) then
  begin // AP_Name.txt = NOT Exists
    FMX.Dialogs.ShowMessage('Программа не нашла файл' + #10 + #13 +
                           '"AP_Name.txt" - вычисляем ' + #10 + #13 +
                           'наш агрегат по алгоритму...');
//                           'наш агрегат по алгоритму...', mtError, [mbOk], 0);
    Sleep(2000);
    tsl:= TStringlist.Create;
l:  tsl:= WiFiScan('ESP-007', tsESP);
    ListBox1.Items.Add('tsESP.Count ='+IntToStr(tsESP.Count));
    if tsESP.Count = 0 then // в эфире - тишина
    begin
    if myMsgDlg('Если кнопка "WiFi" была' + #10 + #13 +
                'нажата, то агрегат или' + #10 + #13 +
                'не запитан или ему хана' + #10 + #13 +
                'но прога его не видит' + #10 + #13 +
                'Повторить попытку?', mtConfirmation, mbYesNo, mbYes) =  mrYes then GoTo l else exit;

    end;
    if tsESP.Count < 2 then
    begin//ESP-ха в эфире одна
      FMX.Dialogs.ShowMessage('В эфире - одна ESP-ха');//, mtInformation, [mbOk], 0);

    	tsESP.SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'AP_Name.txt'));
    end
    else
    begin // ESP-х в эфире - куча   007.1, 007.2, ... ,007.9...9
      FMX.Dialogs.ShowMessage('В эфире - тонна ESP-х: откройте дверцу');//, mtInformation, [mbOk], 0);
      for I := 0 to tsESP.Count - 1 do
      begin
        WiFiConnect(tsESP.Strings[i]);
        PreStatus:= SendMSG('Get_Status');
        Start:= Now;
        while SecondsBetween(Now, Start) < 120 do // ждём открытия дверцы
        begin
          if PreStatus <> SendMSG('Get_Status') then // если 2-й или 4-й бит поменялся
          begin
            apname:= tsESP.Strings[i];
            tsESP.Clear;
            tsESP.Add(apname);
            tsESP.SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'AP_Name.txt'));
            FMX.Dialogs.ShowMessage('Спасибо. Агрегат детектирован, сетевое имя сохранено.');//, mtInformation, [mbOk], 0);
            break;
          end;
          sleep(500);
        end;// while
      end;
    end;
  end
  else
  begin // AP_Name.txt = Exists
    tsESP.Clear;
    tsESP.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'AP_Name.txt'));
    if WiFiConnect(tsESP.Strings[0]) then
    FMX.Dialogs.ShowMessage('Подключено к агрегату по фамилии' + #10 + #13 +
                           tsESP.Strings[0]);//, mtInformation, [mbOk], 0);
  end;
  tsESP.Free;
end;
а теперь по порядку: изначально ХЕ5 с Андрюхой не справилась - пересел на ХЕ8, но намучившись из-за отсутствия в её составе FMX.DialogService и TAndroidHelper пересел на Сиэтл(10.4) - мож тож глючная?: мало того, что порядка в Мессагах (по 3 шт. друг над другом) и Диалогах (необязательно жать "Yes" или "No" - достаточно промахнуться мимо окна диалога и окно закрывается) порядка не навела, но и перестали работать ф-ции Скан и Коннект (ни с устаревшей SharedActivityContext, ни с TAndroidHelper на который рекомендует заменить Сиэтл). Что делать и как быть - подскажить, плз.
__________________
...И был сначала ZX-Spectrum, а потом его T(urbo)ASS(e)M(bler)... И только на 7-й день (когда Интел купила Пентковского [из КБ Бабаяна]) - появился Pentium-I... А в Союзе P-II был ещё в 1978 году (точнее: Эльбрус [мультискалярный проц] только не рапространялся спекулянтами, а управлял ракетами и спутниками)... А лет с пяток назад Эльбрус-II ПЁР (но никак не ГНАЛСЯ как Селероны) на F(recuency):= 400 GHz... А самое парадоксальное - презентация состоялась в Минске...
Ответить с цитированием
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter