區域網內獲取周圍裝置的ip和埠

mikejaps發表於2015-10-30

 歡迎大家訪問我的部落格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


相關文章