Kitty Опубликовано 5 февраля, 2015 Поделиться Опубликовано 5 февраля, 2015 Здравсвуйте. Как получить 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 Модераторы Andrey Efimov Опубликовано 5 февраля, 2015 Модераторы Поделиться Опубликовано 5 февраля, 2015 Используйте Андроид АПИ, например для WiFi, можно вот так "Android API: package "android.net.wifi" или обёртка для работы с Wi-Fi", в комментах есть код для перевода ip адреса из числа. По такому же принципу можно и 3G ip определить. Возможно в АПИ (надо смотреть в справке) есть вообще готовый класс, который выводит общую информацию о соединении, т.е. не зависимо от типа подключения. Kitty 1 Цитата Ссылка на комментарий
0 xenon54 Опубликовано 5 февраля, 2015 Поделиться Опубликовано 5 февраля, 2015 (изменено) 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 и т.д. Изменено 5 февраля, 2015 пользователем xenon54 Pax Beach, Kitty и Brovin Yaroslav 3 Цитата Ссылка на комментарий
0 Kitty Опубликовано 5 февраля, 2015 Автор Поделиться Опубликовано 5 февраля, 2015 Не понятно зачем в палитре компонентов для проекта андроид доступен копонет IdIPWatch, если он абсолютно не рабочий и бесполезный. Цитата Ссылка на комментарий
0 ruslan Опубликовано 5 февраля, 2015 Поделиться Опубликовано 5 февраля, 2015 можно куда проще ip:= IdHttp.get('http://icanhazip.com/'); AngryOwl, Kitty и aleksandrguru 3 Цитата Ссылка на комментарий
0 xenon54 Опубликовано 6 февраля, 2015 Поделиться Опубликовано 6 февраля, 2015 можно куда проще ip:= IdHttp.get('http://icanhazip.com/'); Данный метод зависит от стороннего ресурса - это очень плохо. Цитата Ссылка на комментарий
0 Kitty Опубликовано 6 февраля, 2015 Автор Поделиться Опубликовано 6 февраля, 2015 Нет ни одного примера в справке RAD на С++. Не доходит до меня как должна выглядит строка TIdStack.IncUsage; на С++. Цитата Ссылка на комментарий
0 xenon54 Опубликовано 6 февраля, 2015 Поделиться Опубликовано 6 февраля, 2015 Так попробуй TIdStack::IncUsage(); Цитата Ссылка на комментарий
0 xenon54 Опубликовано 6 февраля, 2015 Поделиться Опубликовано 6 февраля, 2015 Вот кстати, нашел: https://forums.embarcadero.com/thread.jspa?threadID=109341 Kitty 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 6 февраля, 2015 Автор Поделиться Опубликовано 6 февраля, 2015 Спасибо. Попробовала. Видимо для Андроида можно решить только через андроид API т.к. при использовании GStack для андроида возвращает 127.0.0.1 хотя устройство имеет выход в интернет... Цитата Ссылка на комментарий
0 xenon54 Опубликовано 6 февраля, 2015 Поделиться Опубликовано 6 февраля, 2015 Там же список возвращается? в нем только 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 } Так пробовали? Kitty 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 6 февраля, 2015 Автор Поделиться Опубликовано 6 февраля, 2015 Так пробовали? Спасибо. Попробую разобраться. ам же список возвращается? в нем только 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 xenon54 Опубликовано 6 февраля, 2015 Поделиться Опубликовано 6 февраля, 2015 Значит беда, а метод анонсирован как кроссплатформенный. На IOS и Windows работает. Цитата Ссылка на комментарий
0 Kitty Опубликовано 6 февраля, 2015 Автор Поделиться Опубликовано 6 февраля, 2015 Значит беда, а метод анонсирован как кроссплатформенный. На IOS и Windows работает. А может надо что то в андроид устройстве подкрутить? У меня PIPO M7. Цитата Ссылка на комментарий
0 ruslan Опубликовано 6 февраля, 2015 Поделиться Опубликовано 6 февраля, 2015 можно куда проще ip:= IdHttp.get('http://icanhazip.com/'); Данный метод зависит от стороннего ресурса - это очень плохо. ну храните url стороннего ресурса где-нить на серваке у себя.... или сами напишите php-скрипт который вам вернет ip. я думаю лучше не привязыватся к fmx-функциям ) Цитата Ссылка на комментарий
0 ruslan Опубликовано 6 февраля, 2015 Поделиться Опубликовано 6 февраля, 2015 тем более что вероятность того, что сервис упадет в промежутке между обновлениями ПО очень мала ) Цитата Ссылка на комментарий
0 Модераторы Andrey Efimov Опубликовано 6 февраля, 2015 Модераторы Поделиться Опубликовано 6 февраля, 2015 Посмотрите вот эту страничку http://stackoverflow.com/questions/6064510/how-to-get-ip-address-of-the-device Pax Beach и Kitty 2 Цитата Ссылка на комментарий
0 aleksandrguru Опубликовано 6 февраля, 2015 Поделиться Опубликовано 6 февраля, 2015 да и зачем вам этот айпи?? он может быть серым Цитата Ссылка на комментарий
0 Kitty Опубликовано 7 февраля, 2015 Автор Поделиться Опубликовано 7 февраля, 2015 IP нужен для организации корпоративного комплекса. Программа на андроид устройстве присылает IP этого устройства на корпоративный сервер со статическим IP. Сервер зная IP шлёт команду устройству. Устройство с программой в ответ присылает на сервер нужные данные. Для взаимодействия планируют использовать Indy. Может для ОС Андроид надо делать как то иначе? Мне надо с сервера взаимодействовать с андроид устройствами компании. Цитата Ссылка на комментарий
0 xenon54 Опубликовано 7 февраля, 2015 Поделиться Опубликовано 7 февраля, 2015 Это плохое взаимодействие. 1. Если приложение выгружено, связи не будет. 2. Оператор сотовой связи может вам 100 раз IP поменять пока вы будете слать что-то друг другу. В своем проекте под IOS я использую Apple push notification, для андроида тоже есть Notification. Суть в том, что ваше приложение на девайсе загружается и тутже отправляет запрос на notification сервер на регистрацию. Тот выдает обратно в ответ Device Token (некий уникальный идентификатор устройства). Вы этот Device Token посылаете на сервер и запоминаете его, чтобы потом знать кому отправлять сообщение. Все. С этого момента ваше обращение к устройству происходит через Notification server. Вы посылаете запрос с сервера на Notification server с Device Token устройства. А сервер доставляет это сообщение на устройство. Это сообщение может иметь текст, может не иметь, может быть со звуком и без, может быть вообще невидимым для пользователя, но при получении такого сообщение, устройство запускает в фоновом режиме приложение и выполняет то что вы там пропишете в обработчике. А если запущено приложение, то тут же выполняет то что вам нужно. Возможно под андроид есть свои нюансы, но принцип думаю такойже. Kitty 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 7 февраля, 2015 Автор Поделиться Опубликовано 7 февраля, 2015 А можно чуть подробнее что такое notification сервер? Спасибо. Цитата Ссылка на комментарий
0 xenon54 Опубликовано 7 февраля, 2015 Поделиться Опубликовано 7 февраля, 2015 (изменено) Notification server это "прокладка" между вашим сервером и устройством. Этот сервер сам знает как послать сообщение на устройство, вам не нужно заботиться об IP и всем вытекающем отсюда. Вы наверняка видели как всякие Viber и Whatsup присылают сообщения когда приложение свернуто. Появляются всплывающие сообщения. Так вот эти сообщения приходят с Notification Server'a. Почитайте тут и тут. Ну и вообще просто погуглите "Remote Push Notification Android Delphi". Изменено 7 февраля, 2015 пользователем xenon54 Kitty 1 Цитата Ссылка на комментарий
0 aleksandrguru Опубликовано 7 февраля, 2015 Поделиться Опубликовано 7 февраля, 2015 IP нужен для организации корпоративного комплекса. Программа на андроид устройстве присылает IP этого устройства на корпоративный сервер со статическим IP. Сервер зная IP шлёт команду устройству. Устройство с программой в ответ присылает на сервер нужные данные. Для взаимодействия планируют использовать Indy. Может для ОС Андроид надо делать как то иначе? Мне надо с сервера взаимодействовать с андроид устройствами компании. Так сделайте, чтобы устройство с начало делало запрос на статический ip сервера, сервер назад устройству пусть и отправляет этот ip с которого пришел запрос, таким образом не используя сторонний сервер проверки ip ,вы будете получать ip Цитата Ссылка на комментарий
0 ruslan Опубликовано 7 февраля, 2015 Поделиться Опубликовано 7 февраля, 2015 http://lfgonzalez.visiblogs.com/2014/11/radstudio-xe6xe7-remote-push-notifications-gcm-y-apns/ xenon54 и Kitty 2 Цитата Ссылка на комментарий
0 IVGSoft Опубликовано 17 января, 2017 Поделиться Опубликовано 17 января, 2017 Вот тут описывают что к чему. http://www.indyproject.org/Sockets/Blogs/ChangeLog/20140314A.EN.aspx Цитата Ссылка на комментарий
Вопрос
Kitty
Здравсвуйте.
Как получить IP адрес присвоенное устройству при выходе в интернет?
Пробую такой код и получаю всегда сообщение: Android device is not online
В опциях проекта разрешение на интернет - галочка установлена.
Ссылка на комментарий
24 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.