區域網內獲取周圍裝置的ip和埠
歡迎大家訪問我的部落格http://blog.csdn.net/mikejaps,專注於android ios app 開發
現在智慧家居,物聯網非常火,推進了WiFi模組的使用,出貨量大為增加。據瞭解,現在大部分WiFi模組在第一次配置的時候是採用udp廣播的方式來通訊的,手機端將路由的名稱和密碼通過udp 廣播的方式傳送給WiFi模組,這樣的方式適合遠端控制,在和WiFi模組近距離通訊的時候如果WiFi模組已經連上了路由,我們如何獲取WiFi模組的ip,和 埠呢?下面介紹mdns協議--發現周圍裝置的ip和埠。
關鍵程式碼:
<pre name="code" class="java">public class DnsService extends Service implements ServiceListener,
ServiceTypeListener {
/**
* 日誌標籤
*/
private static final String TAG = "DnsService";
/**
* Instance of Bonjour/Rendezvous/ZeroConf handler
*/
public JmDNS jmdns = null;
/**
* Allows an application to receive Wifi Multicast packets.
*/
private MulticastLock multicastLock = null;
private SocketBinder mBinder = new SocketBinder();
private Handler handler;
private List<Map<String, String>> ipList = new ArrayList<Map<String, String>>();
public class SocketBinder extends Binder {
public DnsService getService() {
return DnsService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
startScan();
return mBinder;
}
public void setMessageHandler(Handler h) {
handler = h;
}
@Override
public void onDestroy() {
stopScan();
super.onDestroy();
}
/**
* 新增完service後
*/
@Override
public void serviceAdded(ServiceEvent event) {
jmdns.getServiceInfo(event.getType(), event.getName());
// jmdns.removeServiceTypeListener(DnsService.this);
// JmdnsHandler.removeMessages(2000);
// JmdnsHandler.sendEmptyMessageDelayed(2000, 5000);
}
/**
* Delegate method from mDNS when a service is removed.
*/
@Override
public void serviceRemoved(ServiceEvent event) {
}
@SuppressLint("HandlerLeak")
private Handler JmdnsHandler = new Handler() {
public void handleMessage(Message msg) {
Log.d(TAG, "serviceRemoved");
if (jmdns == null)
return;
stopScan();
startScan();
// jmdns.unregisterAllServices();
// // jmdns.removeServiceTypeListener(DnsService.this);
// try {
// jmdns.addServiceTypeListener(DnsService.this);
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
};
};
/**
* Delegate method from mDNS when a service is resolved.
*/
@Override
public void serviceResolved(ServiceEvent event) {
ServiceInfo info = event.getInfo();
// Log.d(TAG, event.getInfo().getPropertyString("vendor"));
Log.d(TAG, event.getInfo().getNiceTextString());
boolean isChanged = false;
for (int i = 0; i < info.getInet4Addresses().length; i++) {
if (!ipList.contains(info.getInet4Addresses()[i].toString()
.substring(1))) {
Map<String, String> map = new HashMap<String, String>();
map.put(info.getInet4Addresses()[i].toString().substring(1),
event.getInfo().getName());
ipList.add(map);
isChanged = true;
map = null;
}
}
if (isChanged) {
Message msg = handler.obtainMessage();
msg.obj = ipList;
msg.arg1 = event.getInfo().getPort();
handler.sendMessage(msg);
}
}
/**
* 發現服務並新增
*/
@Override
public void serviceTypeAdded(ServiceEvent event) {
if (event.getType().contains("Light"))
jmdns.addServiceListener(event.getType(), this);
}
/**
* Delegate method from mDNS when a subtype is discovered.
*/
@Override
public void subTypeForServiceTypeAdded(ServiceEvent event) {
}
private Thread thread;
public void startScan() {
thread = null;
thread = new Thread() {
@Override
public void run() {
try {
Log.i(TAG, "開始搜尋...");
try {
sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
jmdns = JmDNS.create();
jmdns.addServiceTypeListener(DnsService.this);
} catch (IOException ex) {
Log.e(TAG, "開始搜尋...fail");
}
}
};
thread.start();
JmdnsHandler.removeMessages(2000);
JmdnsHandler.sendEmptyMessageDelayed(2000, 10000);
}
/**
* 停止搜尋
*/
public void stopScan() {
JmdnsHandler.removeMessages(2000);
new Thread(new Runnable() {
@Override
public void run() {
try {
if (jmdns != null) {
Log.i(TAG, "Stopping ZeroConf probe....");
jmdns.unregisterAllServices();
jmdns.close();
jmdns = null;
}
if (multicastLock != null) {
Log.i(TAG, "Releasing Mutlicast Lock...");
multicastLock.release();
multicastLock = null;
}
} catch (Exception ex) {
Log.e(TAG, ex.getMessage(), ex);
}
}
}).start();
}
}
jar包下載地址 點選開啟連結 http://download.csdn.net/detail/mikejaps/9225799
相關文章
- 【iOS開發】獲取區域網IPiOS
- 外網連線內部區域網的方法--ip 埠對映
- android 獲取裝置IP和Mac地址AndroidMac
- C#獲取本地串列埠裝置C#串列埠
- 獲取本地的IP地址(內網)內網
- iOS 獲取裝置uuid,公網ip,手機ip等資訊iOSUI
- Java實現從IP和埠列表List獲取分離的IP和埠值Java
- iOS 獲取手機外網和內網IP地址iOS內網
- reactnative獲取裝置真實ip地址和ip對映的地理位置React
- 如何獲取外網IP和IP的資訊
- 百度地圖獲取多行政區域圍欄地圖
- 如何高效實現掃描區域網IP、主機名、MAC和埠Mac
- 教你如何搶掉區域網內所有IP
- 遍歷區域網IP和Hostname的方法
- BCSphere入門教程03:掃描周圍裝置
- Linux下如何實現區域網內網路裝置相互通訊Linux內網
- 獲取網路卡 IP
- 如何查詢內網系統內新增加的裝置的ip地址內網
- 前端Js獲取本網IP和外網IP方法總彙前端JS
- jQuery獲取元素內部元素和獲取內容的區別、獲得輸入框value的方法jQuery
- 獲取 iOS 裝置的型別iOS型別
- Vagrant 中配置區域網埠
- 藉助sIoT可以通過手機app實現區域網內的裝置操控。APP
- 獲取外網出口ip
- curl 獲取外網IP
- iOS獲取當前裝置的資訊-網路相關iOS
- Python獲取IP的地理位置:經緯度,國家,區域,城市Python
- PHP 獲取裝置型別PHP型別
- 解決區域網內其它裝置ping不通的問題,win10為例Win10
- 樹莓派上使用KickThemOut對區域網內的裝置進行ARP欺騙樹莓派
- 如何獲取iOS裝置的UDIDiOS
- iOS獲取裝置資訊的常用方法iOS
- 獲取手機外網IP
- 海外代理伺服器IP及埠怎麼獲取?伺服器
- IOS 特定於裝置的開發:獲取額外的裝置資訊iOS
- iphone獲取手機裝置號iPhone
- 區域網內命令大全
- Flutter 如何獲取裝置的唯一碼Flutter