• 0
msp888

точка доступа wi-fi Персональная точка доступа Wi-Fi

Вопрос

Если Wi-Fi на телефоне работает в режиме клиента (подключается к внешней точке доступа), то как с ним работать понятно.

Если же Wi-Fi на телефоне (ОС Android) работает в режиме персональной точки доступа, то как из программы получить свой ip-адрес и другие параметры сети.

Кто знает, помогите, желательно исходный код на Delphi.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

3 ответа на этот вопрос

  • 0

брр, IP либо есть либо нет. при чем тут где точка доступа?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
3 часа назад, krapotkin сказал:

брр, IP либо есть либо нет. при чем тут где точка доступа?

есть то оно есть, но получать нужно по другому.

можете потестить сами, скачайте Deviceinfo и запустите точку доступа. айпи адреса не будет

а вот как на java это делается

http://stackoverflow.com/questions/9573196/how-to-get-the-ip-of-the-wifi-hotspot-in-android

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

вообщем я попробовал, но так и не смог получить ip адрес с точки доступа. может где накосячил

Скрытый текст

 

uses


  AndroidApi.JNI.GraphicsContentViewText, AndroidApi.JNI.OS, AndroidApi.Helpers, AndroidApi.JNI.Net,
  AndroidApi.JNI.JavaTypes, AndroidApi.JNIBridge, AndroidApi.JNI.Provider, AndroidApi.JNI.Telephony,
  AndroidApi.JNI.Java.Net, AndroidApi.Log,

procedure Log(const aSource: string);
var
  M: TMarshaller;
begin
  LOGI(M.AsUtf8(aSource).ToPointer);
end;

function HasPermission(const Permission: string): Boolean;
var
  aPerm: string;
begin
  if Permission.StartsWith('android.permission.') then
    aPerm := Permission
  else
    aPerm := 'android.permission.' + Permission;
  Result := TAndroidHelper.Context.checkSelfPermission(StringToJString(aPerm))
    = TJPackageManager.JavaClass.PERMISSION_GRANTED
end;

function convertor(ip: integer): string;
begin
  Result := Format('%d.%d.%d.%d', [ip and $FF, ip shr 8 and $FF, ip shr 16 and $FF, ip shr 24 and $FF])
end;

function GetWifiManager: JWifiManager;
var
  WifiManagerObj: JObject;
begin
  Result := nil;
  if HasPermission('ACCESS_WIFI_STATE') then
  begin
    WifiManagerObj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.WIFI_SERVICE);
    if not Assigned(WifiManagerObj) then
      raise Exception.Create('Could not locate Wifi Service');
    Result := TJWifiManager.Wrap((WifiManagerObj as ILocalObject).GetObjectID);
    if not Assigned(Result) then
      raise Exception.Create('Could not access Wifi Manager');
  end
  else
    Log(':: ZDeviceInfo :: permission ACCESS_WIFI_STATE denied');
end;

 


procedure GetAddress(out aMac, aWifiIP: string);
var
  WifiManager: JWifiManager;
  WifiInfo: JWifiInfo;
  ip: integer;

  Intf: JNetworkInterface;
  Adrs: JInetAddress;
  IntfEnum, AdrsEnum: JEnumeration;
  IParr: TJavaArray<Byte>;
  ipserver: string;
begin
  aMac := '';
  aWifiIP := 'unknown';
  WifiManager := GetWifiManager;
  if Assigned(WifiManager) then
  begin
    WifiInfo := WifiManager.getConnectionInfo;
    aMac := JStringToString(WifiInfo.getMacAddress);
    ip := WifiInfo.GetIPAddress;
    aWifiIP := convertor(ip);
  end; // получаем данные по Wifi

  // Hot Spot #1
  if aWifiIP.Equals('0.0.0.0') then
  begin
    if Assigned(WifiManager) then
    begin
      ip := WifiManager.getDhcpInfo.serverAddress;

      ipserver := convertor(ip);

      Log('---------- ' + ipserver);
      IParr := TJavaArray<Byte>.Create(ipserver.Length);
      IParr := StringToJString(ipserver).getBytes;

      Adrs := TJInetAddress.JavaClass.getByAddress(IParr);
      if Adrs = nil then
        Adrs := TJInetAddress.JavaClass.getByName(StringToJString(ipserver));
      if Adrs <> nil then
    	begin
        Log('---------- ' + ipserver + ' :: ' + JStringToString(Adrs.getHostName) + ' :: ' +
          JStringToString(Adrs.getHostAddress));
      	aWifiIP := JStringToString(Adrs.getHostAddress);
    	end;
    end;
  end;
  exit; // !!!!!!!!!

  // Hot Spot #2  
  if aWifiIP.Equals('0.0.0.0') then
  begin
	IntfEnum := TJNetworkInterface.JavaClass.getNetworkInterfaces;
    if IntfEnum.hasMoreElements then
    begin
      Intf := TJNetworkInterface.Wrap((IntfEnum.nextElement as ILocalObject).GetObjectID);
      Log('---------- first interface :: ' + JStringToString(Intf.getDisplayName) + ' :: ' +
        JStringToString(Intf.getName));

      while Intf <> nil do
      begin
        AdrsEnum := Intf.getInetAddresses;
        if AdrsEnum.hasMoreElements then
        begin
          Adrs := TJInetAddress.Wrap((AdrsEnum.nextElement as ILocalObject).GetObjectID);
          Log('---------- first address :: ' + JStringToString(Intf.getDisplayName) + ' :: ' +
            JStringToString(Adrs.getHostName) + ' :: ' + JStringToString(Adrs.getHostAddress));

          while Adrs <> nil do
          begin
            // if (not Adrs.isLoopbackAddress) then
            // begin
            // Log('---------- Adrs.isLoopbackAddress');
            // aWifiIP := JStringToString(Adrs.getHostAddress);
            // break;
            // end;

            Adrs := TJInetAddress.Wrap((AdrsEnum.nextElement as ILocalObject).GetObjectID);
            if not Adrs.isLoopbackAddress then
              Log('---------- address :: ' + JStringToString(Intf.getDisplayName) + ' :: ' +
                JStringToString(Adrs.getHostName) + ' :: ' + JStringToString(Adrs.getHostAddress));
          end;
        end;

        Intf := TJNetworkInterface.Wrap((IntfEnum.nextElement as ILocalObject).GetObjectID);
        if Intf <> nil then
          Log('---------- interface :: ' + JStringToString(Intf.getDisplayName) + ' :: ' +
            JStringToString(Intf.getName));
      end;
    end;
  end;
end;

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Роман Фил
      ПРивет, есть ли возможность узнать как то номер сроки в memo на delphi FMX в memo при нажатии на текст в поле memo?

      для windows на vlc можно memo.CaretPos.Y либо через WinAPi заголовки. Как такое делать в FireMonkey FMX для андроид ума не приложу. Может кто делал, поделится опытом?
    • Автор: Роман Фил
      Привет ребята! Вобщем есть текст в Memo с которого нужно брать строки с конца файла т.е. memo.lines.count-1 в цикле, 
      после этого создавая отельно динамически компоненты,  заносить текстовые  строки с memo в эти созданные динамически компоненты, ниже пример:
      procedure TVKBaseForm.Button2Click(Sender: TObject); var rec: TRectangle; txt: Ttext; i: word; // - можно и integer сути не поменяет begin for i := Memo1.Lines.Count - 1 downto 0 do begin rec := TRectangle.Create(Self); rec.Parent := MainLayout1; rec.Height := 15; rec.Align := TAlignLayout.Top; txt := Ttext.Create(Self); txt.Parent := rec; txt.Align := TAlignLayout.Client; txt.Text := Memo1.Lines.Strings[i]; end; end; Работает, но не правильно. Почему выдает не правильный порядок при выводе? почему создает сначала первый файл? Почему создает не все? Может есть какая-то синхронизация? 
      Пробовал так же
      A: integer; begin A := 1; // Присваеваем единицу While A <> Memo1.Lines.Count - 1 do begin A := A + 1; s := Memo1.Lines.Strings[A]; Application.ProcessMessages; rec := TRectangle.Create(Self); rec.Parent := MainLayout1; rec.Height := 15; rec.Align := TAlignLayout.Top; txt := Ttext.Create(Self); txt.Parent := rec; txt.Align := TAlignLayout.Client; txt.Text := s; Помогите разобраться
    • Автор: Роман Фил
      Доброе время суток .
      Я только начал знакомится с потоками , не судите меня строго .
      Вот код . Смысл которого через отдельный поток загружать текст с сервера и отображать в memo. Что я делаю? На сервере из вне имеется файлкоторый по api запросам пополняется. Его нужно в потоке постоянно выводить в memo. подгружать каждый раз. При использовании на win вес работает, на андроид не качает и не сздает файл в чем может быть проблема?
      type ThreadHTTP = class(TThread) private public Stream: TMemoryStream; i: integer; procedure Execute; override; procedure ShowResult; end; {$R *.fmx} procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := true; end; procedure TForm1.Timer1Timer(Sender: TObject); var MyHTTP: ThreadHTTP; begin ProgressBar1.Value := 0; MyHTTP := ThreadHTTP.Create(False); end; { ThreadHTTP } procedure ThreadHTTP.Execute; var j: integer; begin inherited; i := 0; j := 0; Stream := TMemoryStream.Create; Form1.IdHTTP1.Get('http://сайт/base.txt', Stream); Form1.ProgressBar1.Max := Stream.Size; while j <= Stream.Size do begin inc(i); Synchronize(ShowResult); inc(j); Form1.ProgressBar1.Value := Form1.ProgressBar1.Value + 1; end; Stream.SaveToFile(tpath.getdownloadspath + '/base.txt'); Form1.Memo1.Lines.LoadFromFile(tpath.getdownloadspath + '/base.txt'); Stream.Free; end; procedure ThreadHTTP.ShowResult; begin Form1.Label1.Text := IntToStr(i) + ' kbs'; end;  
    • Автор: Евгений Корепов
      Наткнулся тут на изящную штуку для приложения с PUSH уведомлениями на Android и Ios. Один объект, все сам делает.
      Внедрил в одно боевое приложение с 100+ тысячами установок, полет нормальный.
      Описание тут https://delphiworlds.com/2017/04/firebase-cloud-messaging-android-ios/
      Исходный код с примером на гитхабе https://github.com/DelphiWorlds/PushClient
      Использование максимально простое:
      uses DW.PushClient; .... private FPushClient: TPushClient; procedure PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges); procedure PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification); .... procedure TFormMain.InitPushService; begin FPushClient := TPushClient.Create; FPushClient.GCMAppID := ConstGCMAppID; FPushClient.ServerKey := ''; FPushClient.BundleID := ''; FPushClient.UseSandbox := Debug; // Change this to False for production use! FPushClient.OnChange := PushClientChangeHandler; FPushClient.OnReceiveNotification := PushClientReceiveNotificationHandler; try FPushClient.Active := True; except SendError('FPushClient.Active Exception'); end; end; procedure TFormMain.PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges); begin if TPushService.TChange.DeviceToken in AChange then begin HDevicePushParams.DeviceID:=FPushClient.DeviceID; HDevicePushParams.DeviceToken:=FPushClient.DeviceToken; GetHTTP(CommandRegisterFCM); // Memo1.Lines.Add('DeviceID = ' + FPushClient.DeviceID); // Memo1.Lines.Add('DeviceToken = ' + FPushClient.DeviceToken); end; end; procedure TFormMain.PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification); begin // ShowMessage(ANotification.DataObject.ToString... end; Правда руки не дошли разобраться для чего ему 
        FPushClient.ServerKey := '';
        FPushClient.BundleID := '';
      Но и без этого работает.
       
    • Автор: Golovanyuk
      Здравствуйте!
      У меня проблемы при создании Android программ.
      Когда компилирую проект и запускаю его из среды Delphi сразу на мобильник, то первый раз программа еще работает, а во второй-третий раз на мобильнике показывается только заставка с огнем, а потом черный экран, а в самой среде в самом низу (где Event log и где обычно показываются процессы) - ничего нет, пусто.
      Потом приходится перезапускать Delphi.
      У меня есть подозрения, что я неправильно настроил Delphi.
      Не могли бы гуру взглянуть на мои настройки и указать на мои ошибки?
      Скриншоты приложил, спасибо.
      P,S, Delphi 10.1



    • Автор: delphiex
      Всем доброго дня. Прошу помочь, любая малейшая подсказка прояснит ситуацию. Сделал русскоязычное Андроид приложение на Delphi XE8.  Использовал SQlite в своем проекте. Работает отлично, оттестировал на Android 6.0 и  Android 4.5 на двух разных аппаратах. Прежде чем делать мультиязычное приложение, решил проверить как оно будет работать, если язык системы будет отличным от русского. Поставил английский-United Kingdom и приложение не запустилось, вернее пошла заставка, после нее  приложение просто закрылось без ошибок. То же самое при французском, испанском системных языках. А вот при немецком и украинском языке системы - работает. В чем здесь дело никак не могу понять и куда копать. Приложение не могу предоставить - слишком большое.
    • Автор: Mars M
      Как можно узнать размер видеопамяти под WIN?
      В инете находятся решения через реестр, с помощью DX и другие, но все сообщения старые.
      Может есть какой способ узнать средствами FMX?
       
    • Автор: Алмаз Амангельды
      Multi device application 
      Работаю  с WebBrowser и появляется такая проблема что компонент дублируется появляется тоненькая полоска (пикселей 10 или 5 ) которая работает отдельно (т.е можно скролить страницу в разные направления ,  поэтому складывается впечатление что данный компонент Дублируется )
      Вверху tabcontrol к нему добавлен Эффект shadow внизу
      twebBrowser  Align =Client 
      И все эти компоненты лежат на panel 
      Align =client 
       
      Тестирую на экране 5.5
      Естественно вопрос что произошло и как это исправить 
    • Автор: ENERGY
      Как залить с Delphi Android в базу MySql строки, я примерно понял - составляем GET запрос и вставляем строки в параметры, затем считываем их в PHP скрипте и в базу.
      А вот как быть с картинкой. Как добавить картинку через PHP скрипт из программы на Android?
      POST запрос? Кто нибудь делал такое уже?
      Спасибо 
       
      P.s. На данный момент FireDAC не поддерживает работу с MySQL из под Android. Пока только SQLite и  InterBase ToGo. Даже если в будущем будет поддерживать, многие на этом форуме рекомендуют не использовать прямое подключение к базам из под мобильных систем, а использовать прямые GET запросы к примеру к PHP скриптам. Это связано с нестабильностью интернета т.к. так интернет может часто переключаться (от вышки к вышке) и менять параметры подключения. 
    • Автор: Макс Войтенко
      я знаю что можно добавить внешний файл в программу по пути (assets\internal)(скриншот) (раньше получали к нему доступ через)
      loadfromfille(GetDocumentsPath()+"test.txt")
      Сейчас GetDocumentsPath убрали из RadStudio и походу заменили чем то.
      я использовал в свой программе директорию 
      loadfromfille(GetHomePath()+"test.txt"), но я не знаю куда мне добавить программу через deploymant (скриншот)
      Тоесть
      1)GetDocumentsPath = (assets\internal) 
      2)GetHomePath= ??????
      3)GetDocumentsPath убрали из radstudio.
      Какую мне прописать директорию чтоб я имел к ней доступ через GetHomePath()??

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу