تالار گفتمان nCIS.ir

نسخه‌ی کامل: نام تمام اینترفیس های شبکه دستگاه اندروید
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
خیلی خب این کد ظاهرا برای بدست آوردن IP تمام اتصالات شبکه ای اندروید جواب میده:
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 و بلوتوث تفسیر کنم، اما چیزی که نمیدونم و مطمئن نیستم اینه که آیا این اسمها در تمام دستگاه های اندروید یکسانه یا نه. اگر یکسان نباشه که نمیشه با اطمینان ازشون استفاده کرد و باید دنبال راه مطمئن تری گشت.
این آدرسها برای تمام دستگاهها یکیه. حالا ممکنه یه دستگاه دوتا درایور وایرلس داشته باشه که دراینصورت wlan0 و wlan1 رو خواهید داشت (که توی موبایل و تبلت بعیده) ولی در کل پیشوندها یکسانه. این پیشوندها هم مربوط به لینوکس میشه و ارتباطی به اندروید نداره.
آره میدونم ولی توی همون لینوکس هم از توزیع تا توزیع بعضی وقتا تفاوت هایی ممکنه داشته باشن فکر کنم این چیزا رو قبلا دیده باشم. بخاطر همین دنبال یه اطمینان و تضمین از منبع معتبری میگردم. در stackoverflow هم پرسیدم ولی کسی جواب نداد.

مثلا این کتابخانهء بلوتوث (احتمالا BlueZ) هست که اینترفیس رو با نام bnep ایجاد میکنه، ولی این کتابخانه های بلوتوث فقط همین یکی نیست و ظاهرا بعضی توزیع ها از کتابخانهء دیگری استفاده میکنن که معلوم نیست حتما از نامهایی به همین شکل استفاده بکنه. حتی یه توزیع یکسان هم ممکنه کتابخانهء خودش رو بعدا به هر علتی تغییر بده (فکر کنم راجع به این هم قبلا جایی مطلبی خونده بودم که توزیعی قرار بود از یک کتابخانه به کتابخانهء دیگری سویچ کنه یا قبلا این کار رو کرده بود).

توی دنیای کامپیوتر و برنامه نویسی، اصولش اینه که روی ثابت موندن چیزی نمیشه حساب کرد مگر اینکه منبع معتبری رسما این رو اعلام کرده باشه یا طبق استاندارد مشخصی باشه. وگرنه شما بعنوان یه برنامه نویس تضمینی نداری و باید ریسک تغییرات پیشبینی نشده رو بپذیری.

البته خوشبختانه من فعلا با این قضیه زیاد کار ندارم فقط میخوام لیست IP های دستگاه رو به کاربر نشون بدم و کنار هرکدام بنویسم که مال چه اینترفیسی است که بعد کاربر ببینه از کدوم طریق میخواد وصل بشه به برنامه. ضمنا الان به فکرم رسید که خب میام چک میکنم اگر اون اسم مثلا bnep0 بود کنارش مینویسم بلوتوث، ولی اگر یه چیز ناشناخته بود مثلا xmc0 اونوقت عین همین عبارت رو براش مینویسم. بعیده یه نرم افزار دیگه بیاد و از همون نوع اینترفیس نباشه ولی از نام مشابهی استفاده کنه. اینطوری هم یوزرفرندلی مورد نظر رو در حالت های معمول بدست میارم و هم درصورت تغییرات پیشبینی نشده، مشکل جدی پیش نمیاد (فقط یوزرفرندلی برنامه کمتر میشه ولی بازم مشکل جدی نیست).
جالب اینکه الان برنامم رو روی galaxy tab E مدل sm-t561 که نسخهء اندروید 4.4.4 روش نصبه تست کردم، اسم کانکشن بلوتوث رو bt-pan میده. یعنی برخلاف اونی که تاحالا دیده بودم (bnep0).
خوشبختانه چون روی نام اینترفیس ها اتکا نکرده بودم، مشخصات اینترفیس رو نمایش میده (هرچند نوع کانکشن (بلوتوث) رو مشخص نمیکنه برای کاربر).