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