ورود

View Full Version : گرفتن IP گوشی موقع tether بودن



SZsXsZS
جمعه 13 فروردین 1395, 10:30 صبح
توی برنامهء اندروید چطور میشه IP گوشی رو که یک طرف tether با دستگاه دیگر مثل PC هست بدست آورد؟
منظورم tether کردن از طریق USB یا Bluetooth است.

البته من یه کد پیدا کردم ولی کار نمیکنه و موقع گرفتن اطلاعات اتصال برنامه کرش میکنه.

SZsXsZS
شنبه 14 فروردین 1395, 08:29 صبح
خیلی خب این کد ظاهرا جواب میده:

public static void listAllIfaces() {

try{

Enumeration<NetworkInterface> theIntfList = NetworkInterface.getNetworkInterfaces();
List<InterfaceAddress> theAddrList = null;
NetworkInterface theIntf = null;
InetAddress theAddr = null;

while(theIntfList.hasMoreElements()) {
theIntf = theIntfList.nextElement();

if(!theIntf.isUp()) continue;

Logger.d("--------------------");
Logger.d(" " + theIntf.getDisplayName());
Logger.d(" name: " + theIntf.getName());
Logger.d(" loopback?: " + theIntf.isLoopback());
Logger.d(" ptp?: " + theIntf.isPointToPoint());
Logger.d(" virtual?: " + theIntf.isVirtual());
Logger.d(" up?: " + theIntf.isUp());

theAddrList = theIntf.getInterfaceAddresses();
Logger.d(" int addrs: " + theAddrList.size() + " total.");

int addrindex = 0;
for(InterfaceAddress intAddr : theAddrList)
{
addrindex++;
theAddr = intAddr.getAddress();
if(theAddr.getClass().getSimpleName().equals("Inet6Address")) continue;
Logger.d(" " + addrindex + ").");
//Logger.d(" host: " + theAddr.getHostName());
//Logger.d(" class: " + theAddr.getClass().getSimpleName());
//Logger.d(" ip: " + theAddr.getHostAddress() + "/" + intAddr.getNetworkPrefixLength());
//InetAddress inetAddr=theAddr.getAddress();
Logger.d(" ip: " + theAddr.toString());
//Logger.d(" bcast: " + intAddr.getBroadcast().getHostAddress());
//int maskInt = Integer.MIN_VALUE >> (intAddr.getNetworkPrefixLength()-1);
//Logger.d(" mask: " + toIPAddrString(maskInt));
//Logger.d(" chost: " + theAddr.getCanonicalHostName());
//Logger.d(" sitelocal?: " + theAddr.isSiteLocalAddress());
//Logger.d("");
}
}
}
catch (SocketException e) { e.printStackTrace(); }

}
ولی موضوع اینه که متد getDisplayName برای اینترفیس مثلا wifi اسم wlan0 رو چاپ میکنه، برای اتصال USB اسم rndis0، برای اتصال بلوتوث bnep0.
حالا من میتونم این اسمها رو بخونم و به USB و بلوتوث تفسیر کنم، اما چیزی که نمیدونم و مطمئن نیستم اینه که آیا این اسمها در تمام دستگاه های اندروید یکسانه یا نه. اگر یکسان نباشه که نمیشه با اطمینان ازشون استفاده کرد و باید دنبال راه مطمئن تری گشت.

Nevercom
یک شنبه 15 فروردین 1395, 10:08 صبح
بله، این اسم ها ثابت هستن، درواقع این شیوه ی نام گذاری از لینوکس میاد. مثلاً اگر دستگاهی دو ماژول WiFi داشته باشه، در این لیست wlan0 و wlan1 رو خواهید دید.

برای تست روی گوشیتون یک Terminal Emulator نصب کنید و دستور ifconfig رو اجرا کنید. خروجی این دستور لیستی از اینترفیس ها هست به همراه سایر مشخصات هر اینترفیس

خروجی ifconfig روی گوشی من اینترفیس wlan0 رو نشون میده، اما در دسکتاپ این دستور wlan0 رو نشون نمیده و wlan1 رو نشون میده. بهتر هست که به قسمت اندیسش توجه نکنید و صرفاً wlan رو درنظر بگیرید.