• 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;

 

 

 

 

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: om.pranayama
      Здравствуйте форумчане и профессионалы разработчики.
      Компилирую проект через C++Builder 10.2  под Android
      Появилась следующая проблема при использовании компонента TBitmapListAnimation
      Если приложение свернуть, а затем развернуть - то появляются жуткие глитчи в ввиде чёрных фонов вокруг компонентов, типа TImage, TButton.
      В Windows такая проблема - не наблюдается.
      Попытки вызвать Repaint или даже Invalidate для всей формы - положительного результата не дают.
      Пожалуйста, помогите решить эту проблему.
      //--------------------------------------------------------------------------------------------------------------------------------------------
      ТЕМУ МОЖНО УДАЛЯТЬ
      Причина не в TBitmapListAnimation а в TAniIndicator, который работал совместно с TBitmapListAnimation.
      Приношу извинения за беспокойство. Проблема была в TAniIndicator. Буду разбираться почему он так себя безобразно ведёт.
      Тему можно удалять.
    • Автор: Aptyp
      В приложении:
          procedure TForm7.Button1Click(Sender: TObject);     var AIntent: JIntent;         AServiceName: string;     begin       AIntent := TJIntent.Create;       AServiceName := 'com.embarcadero.services.Service';       AIntent.setClassName( TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString( AServiceName ) );       AIntent.putExtra( TAndroidHelper.StringToJString( 'Code' ), 0 );       AIntent.putExtra( TAndroidHelper.StringToJString( 'Data' ), TAndroidHelper.StringToJString( 'DataString' ) );       TAndroidHelper.Activity.startService( AIntent );     end;
      В сервисе:
          procedure TDM.AndroidIntentServiceCreate(Sender: TObject);     begin       Toast( 'Create' );     end;          procedure TDM.AndroidIntentServiceHandleIntent(const Sender: TObject;       const AnIntent: JIntent);     begin       Toast( 'HandleIntent' );     end; Сообщение 'Create' показывается, а 'HandleIntent' нет. OnCreate срабатывает, но onHandleIntent не вызывается что бы я не делал. Может я что-то не так делаю?
    • Автор: dim
      Есть код который работает при смещении карты и получив координаты центра пытаюсь получить адрес по ним.
      procedure TMasterDetailForm.MapView3CameraChanged(Sender: TObject); var myCoordinat: TLocationCoord2D; begin inherited; myCoordinat.Create(MapView3.Location.Latitude,MapView3.Location.longitude); if (int(myCoordinat.Latitude)<>0) then begin //проверяю, что координаты определены if not Assigned(fGeocoder) then begin if Assigned(fGeocoder.Current) then fGeocoder := TGeocoder.Current.Create; if Assigned(fGeocoder) then fGeocoder.OnGeocodeReverse := OnGeocodeReverseEventStart; end; if Assigned(fGeocoder) and not fGeocoder.Geocoding then fGeocoder.GeocodeReverse(myCoordinat); end end; все работало до очередного обновления, а сейчас ругается "java.io.IOException: Service not Available" на fGeocoder.GeocodeReverse(myCoordinat);
      подскажите куда копать
    • Автор: striker
      Всем привет!
      Нужен совет.
      Есть Grid, в нем расписание дня.
      В БД каждая строка это отдельная запись.
      Нужно как-то визуально сделать подобие объединения ячеек в Excel.
      Т.е. нужно занять расписание на 2 часа.
      При этом функционал по событиям для строки "второго часа" должен быть недоступен.
      Может хотя бы границу стирать, т.е. оставлять значение в верхней ячейки, а нижнюю просто не отображать.
      Как это лучше сделать?
      FMX, Windows, Delphi XE6, MySQL
       

    • Автор: Roman V
      Всем привет. Учусь работать с ini-файлами на Android. И сразу же возникла проблема, которую никак не могу решить. Хотел написать подобие приложение-тест с хранением данных в ini файле. В итоге все отлично работает на windows,а под Андроид при запуске висит только значок firemonkey секунд 10 и приложение вырубается так и не запустившись. В чем может быть проблема? Использую отладку по USB. 
      TIniFile *Ini = new TIniFile(System::Ioutils::TPath::GetDocumentsPath() + PathDelim + "options.ini"); Юзаю эти библиотеки 
      #include <System.IOUtils.hpp> #include <System.IniFiles.hpp>  
    • Автор: gonzales
      Доброго времени суток!
      Решаю следующую задачу, в приложении динамически формируются разные объекты, наследники от одного класса. При формировании объектов заполняется динамический массив этих элементов. Далее я хочу в отдельном потоке для каждого из элементов массива получить его состояние, то есть делаю запрос к серверу. Все это повешено на таймер, каждую секунду должен отрабатываться запрос. Все более менее работает в Windows, а на Андроиде со временем приложение валится. Вот код таймера, для читаемости я удалил куски с различными вариантами E. RootElements - это массив TEssense от которого есть наследники. Функции GetBoardCurrentValue, GetBoardMaxValue - по сути запросы к серверу. 
      Подскажите, правильно ли я оформляю работу с потоками для работы на Андроиде?
      procedure TForm1.MasterTimerTimer(Sender: TObject); begin TTask.Run( procedure var l, d, a: byte; i,j:integer; E: TEssence; p: Pointer; VirtualNode: IXMLNode; VirtualElementNode: IXMLNode; id: byte; begin l := Length(Form1.RoomElements); for j := 0 to l - 1 do begin E := Form1.RoomElements[j]; // Реле if E is TRele then begin d := (E as TRele).Device_ID; a := (E as TRele).Device_Adress; if Form1.GetBoardCurrentValue(d, a) = true then begin TThread.Synchronize(nil, procedure begin (E as TRele).ReleSwitch.IsChecked := Form1.device[d].Board[a].CurrentValue.ToBoolean; end); end; // (E as TRele).ReleOnTimer(E) end // Диммер else if E is TDimmer then begin d := (E as TDimmer).Device_ID; a := (E as TDimmer).Device_Adress; if Form1.GetBoardMaxValue(d, a) = true then begin TThread.Synchronize(nil, procedure begin if (Form1.device[d].Board[a].Type_ID = TType.Светодиод) or (Form1.device[d].Board[a].Type_ID = TType.Диммер220) then begin (E as TDimmer).DimmerValue.Text := (Form1.device[d].Board[a].MaxValue).ToString; end; end); end; // (E as TDimmer).DimmerOnTimer(E) end // Таймер else if E is TSTimer then begin id := (E as TSTimer).STimerIndex; Form1.FillHTTPRequest(0, 0, HTTP_GET_TIMER_INFO, id); if Form1.AnswerIsComming = HTTP_GET_TIMER_INFO then begin TThread.Synchronize(nil, procedure begin if Form1.HTTPAnswer.Data1 = 0 then (E as TSTimer).Interval.Text := 'OFF' else (E as TSTimer).Interval.Text := 'ON' end); end; // (E as TSTimer).STimerOnTimer(E); end; end; end); end;   
    • Автор: andahay
      Доброго времени суток. Есть android приложение, в нем есть диалоговое окно, которое предлагает перейти в google play и скачать другое приложение (pro версию), с 2 кнопками (да/нет). Как реализовать этот переход в Google play, чтобы в нем сразу было загружено нужное приложение. Использую Delphi XE7
    • Автор: zekelive
      Добрый день, друзья. Начал заниматься вопросом описанным в шапке и столкнулся со множеством непонятных для меня проблем. Как примерно должно выглядеть на Рис. ниже. Знаю, что сам список барабан выполнен в TlistBox. Есть хорошая ссылка на блог Ярослава тут. Пошерстил файлы в FMX, и не нашел ключа для своего дела. Может кто занимался этим? Я изначально брал TScrollBox, кидал на него Tlayout и в него TLabel. Но думаю, видимо не то совсем.

    • Автор: zekelive
      Добрый день. Кто знает, подскажите, можно ли средствами firemonkey менять иконку приложения в рантайм либо после закрытия и повторного открытия приложения? На win вроде бы можно, статьи на форуме находил, а для Андроида найти не удалось.
    • Автор: bossalex
      Недавно компилил приложение на Delphi  FMX Android  при обращении  к серверу https при выполнении Get запроса от компонента TIdHttp запросил библиотеку "Could not load SSL library" используется протокол sslvTLSv1_2 в windows все пашет в андроид нет , накопал что можно подключить библиотеки  libssl.so и  libcrypto.so через  deployment .assets\internal , А вот как в коде дальше их использовать никто примерчик не выложил, хоть и обсуждали на интернет просторах 100 раз, те как прикрутить  к IdSSLIOHandlerSocketOpenSSL1.SSLOptions.CertFile. Если есть у кого код выложите пожалуйста? или скинте по email bossalex@ya.ru
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method.sslvTLSv1_2;
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode.sslmUnassigned;
       
  • Сейчас на странице   0 пользователей

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