Перейти к содержанию
Fire Monkey от А до Я
  • 0

[Android] Как узнать мой IP адрес?


Kitty

Вопрос

Здравсвуйте.

Как получить IP адрес присвоенное устройству при выходе в интернет?

Пробую такой код и получаю всегда сообщение: Android device is not online

В опциях проекта разрешение на интернет - галочка установлена.

void __fastcall TForm1::Button1Click(TObject *Sender)
{

	 IdIPWatch1->Active = true; //Indy
	 IdIPWatch1->ForceCheck();
	 if(IdIPWatch1->IsOnline)
		Label1->Text = IdIPWatch1->CurrentIP;
	 else
		Label1->Text = L"Android device is not online";

	 IdIPWatch1->Active = false;


}
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

Используйте Андроид АПИ, например для WiFi, можно вот так "Android API: package "android.net.wifi" или обёртка для работы с Wi-Fi", в комментах есть код для перевода ip адреса из числа. По такому же принципу можно и 3G ip определить. Возможно в АПИ (надо смотреть в справке) есть вообще готовый класс, который выводит общую информацию о соединении, т.е. не зависимо от типа подключения.

Ссылка на комментарий
  • 0
uses
IdCustomTransparentProxy,
  IdSocks, IdIPWatch, IdStack, IdTCPConnection, IdTCPClient, IdHTTP;

function TForm1.localip : string;
var
  AAddresses: TStrings;
begin
  AAddresses := TStringList.Create;
  try
    TIdStack.IncUsage;
    try
      GStack.AddLocalAddressesToList(AAddresses);
    finally
      TIdStack.DecUsage;
    end;
    if AAddresses.Count > 0 then
    begin
      if TOSVersion.Platform = pfiOS  then Result := AAddresses.Strings[AAddresses.Count-1];        //AAddresses
      if TOSVersion.Platform = pfWindows then Result := AAddresses.Strings[0];


    end;
  finally
    AAddresses.Free;
  end;
end;

​В "AAddresses" вы получите все локальные IP. Это будет и IP от wifi и ip от LTE\GPRS и т.д.

Изменено пользователем xenon54
Ссылка на комментарий
  • 0

Спасибо.

Попробовала. Видимо для Андроида можно решить только через андроид API т.к. при использовании GStack для андроида возвращает 127.0.0.1 хотя устройство имеет выход в интернет...

Ссылка на комментарий
  • 0

Там же список возвращается? в нем только 127.0.0.1? Других значений нет?

#include <linux/if.h>
#include <linux/if_arp.h>
#include <arpa/inet.h>
#include <sys/socket.h>

String strGetSocketAddressProperty(String strInterface, int iProperty)
{
int fd(0);
int rv;
struct ifreq ifr;
char buffer[128];
String strProperty = "" , IPAddr ;
try
{
fd = socket(AF_INET, SOCK_DGRAM, 0);
}
catch (...)
{
ShowMessage("Error here");
}

ifr.ifr_addr.sa_family = AF_INET;

memset(ifr.ifr_name,0,IFNAMSIZ);
memcpy(ifr.ifr_name,AnsiString(strInterface).c_str(),AnsiString(strInterface).Length());

rv = ioctl(fd, iProperty, &ifr);
if (rv == 0)
{
/* display result */
IPAddr = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr) ;
strProperty = IPAddr ;//buffer;
strProperty = Trim(strProperty);

}
else
{
strProperty = (IntToStr(rv));
//DEBUG_MESSAGE(std::string("rv: ") + itoa(rv) );
}
close(fd);

return strProperty;
}

void __fastcall TForm1::btn1Click(TObject *Sender)
{
mmo1->Lines->Clear();
mmo1->Lines->Add( strGetSocketAddressProperty(L"wlan0",SIOCGIFADDR) );//ip address
mmo1->Lines->Add( strGetSocketAddressProperty(L"wlan0",SIOCGIFNETMASK) );//net mask
mmo1->Lines->Add( strGetSocketAddressProperty(L"wlan0",SIOCGIFBRDADDR) );//broadcast address
}

Так пробовали?

Ссылка на комментарий
  • 0

 

Так пробовали?

Спасибо. Попробую разобраться.

 

 

ам же список возвращается? в нем только 127.0.0.1? Других значений нет?

Я в Memo вижу только одну строку 127.0.0.1

Пробовала и через WIFI и через 3G выходить в интернет. Всегда получаю 127.0.0.1 :(

void __fastcall TForm1::Button1Click(TObject *Sender)
{

	std::unique_ptr<TIdStackLocalAddressList> list(new TIdStackLocalAddressList());
	TIdStack::IncUsage();
	GStack->GetLocalAddressList(list.get());
	TIdStack::DecUsage();

	for (int i = 0; i < list->Count; ++i)
	{
	 TIdStackLocalAddress *Addr = list->Addresses[i];
	 Memo1->Lines->Add(Addr->IPAddress);


	}


}
Ссылка на комментарий
  • 0

 

 

можно куда проще 

ip:= IdHttp.get('http://icanhazip.com/');

Данный метод зависит от стороннего ресурса - это очень плохо.

 

 

ну храните url стороннего ресурса где-нить на серваке у себя.... или сами напишите php-скрипт который вам вернет ip. я думаю лучше не привязыватся к fmx-функциям )

Ссылка на комментарий
  • 0

IP нужен для организации корпоративного комплекса. Программа на андроид устройстве присылает IP этого устройства на корпоративный сервер со статическим IP. Сервер зная IP шлёт команду устройству. Устройство с программой в ответ присылает на сервер нужные данные. Для взаимодействия планируют использовать Indy. Может для ОС Андроид надо делать как то иначе? Мне надо с сервера взаимодействовать с андроид устройствами компании.

Ссылка на комментарий
  • 0

Это плохое взаимодействие.

1. Если приложение выгружено, связи не будет.

2. Оператор сотовой связи может вам 100 раз IP поменять пока вы будете слать что-то друг другу.

 

В своем проекте под IOS я использую Apple push notification, для андроида тоже есть Notification. Суть в том, что ваше приложение на девайсе загружается и тутже отправляет запрос на notification сервер на регистрацию. Тот выдает обратно в ответ Device Token (некий уникальный идентификатор устройства). Вы этот  Device Token посылаете на сервер и запоминаете его, чтобы потом знать кому отправлять сообщение. Все. С этого момента ваше обращение к устройству происходит через Notification server. Вы посылаете запрос с сервера на Notification server с  Device Token устройства. А сервер доставляет это сообщение на устройство. Это сообщение может иметь текст, может не иметь, может быть со звуком и без, может быть вообще невидимым для пользователя, но при получении такого сообщение, устройство запускает в фоновом режиме приложение и выполняет то что вы там пропишете в обработчике. А если запущено приложение, то тут же выполняет то что вам нужно. Возможно под андроид есть свои нюансы, но принцип думаю такойже.

Ссылка на комментарий
  • 0

Notification server это "прокладка" между вашим сервером и устройством. Этот сервер сам знает как послать сообщение на устройство, вам не нужно заботиться об IP и всем вытекающем отсюда. Вы наверняка видели как всякие Viber и Whatsup присылают сообщения когда приложение свернуто. Появляются всплывающие сообщения. Так вот эти сообщения приходят с Notification Server'a.

 

Почитайте тут и тут. Ну и вообще просто погуглите "Remote Push Notification Android Delphi".

Изменено пользователем xenon54
Ссылка на комментарий
  • 0

IP нужен для организации корпоративного комплекса. Программа на андроид устройстве присылает IP этого устройства на корпоративный сервер со статическим IP. Сервер зная IP шлёт команду устройству. Устройство с программой в ответ присылает на сервер нужные данные. Для взаимодействия планируют использовать Indy. Может для ОС Андроид надо делать как то иначе? Мне надо с сервера взаимодействовать с андроид устройствами компании.

 Так сделайте, чтобы устройство с начало делало запрос на статический ip сервера, сервер назад устройству пусть и отправляет этот ip с которого пришел запрос, таким образом не используя сторонний сервер проверки ip ,вы будете получать ip

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...