Android手機JmDNS的使用以及解決某些品牌手機Multicast無法接收組播消息的問題

前段時間要用到JmDNS就去找了些資料,講的也算詳細,但有些問題不是很清晰,這裏附上一份比較詳細的使用說明:

首先,需要Jmdns的library,然後引入

import javax.jmdns.JmDNS;
import javax.jmdns.ServiceEvent;
import javax.jmdns.ServiceListener;
import javax.jmdns.ServiceTypeListener;

private JmDNS mJmdns;
private static final String JMDNS_SERVER_TYPE = "_http._tcp.local."; // 服務類型
private WifiManager.MulticastLock lock; // 組播鎖

需要特別注意,對網絡的操作需要開子線程

private class JmdnsAsyncTask extends AsyncTask<String, Integer, Boolean> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        lock = mWifiManager.createMulticastLock("multicast.test");
        lock.setReferenceCounted(false);
        lock.acquire();

    }

    @Override
    protected Boolean doInBackground(String... params) {
        try {
            mJmdns = JmDNS.create();
            Log.i("JMDNS", "create jmdns");
        } catch (IOException e) {
            e.printStackTrace();
            Log.i("JMDNS", "create error");
            return false;
        }
        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        if (result) {
            //監聽服務
            Log.i("JMDNS", "add servicelistener");
            mJmdns.addServiceListener(JMDNS_SERVER_TYPE, mlistener);
        }
    }
}

監聽服務

ServiceListener mlistener = new ServiceListener() {

    public void serviceResolved(ServiceEvent ev) {

        Log.i("JMDNS", "Service resolved:"

                + " name:" + ev.getInfo().getName()

                + " port:" + ev.getInfo().getPort()
                + " IP: " + ev.getInfo().getInetAddresses()[0].getHostAddress());
        addDevices(ev.getInfo().getName(), ev.getInfo().getInetAddresses()[0].getHostAddress());
    }

    public void serviceRemoved(ServiceEvent ev) {

        Log.i("JMDNS", "Service removed:" + ev.getName());

    }

    public void serviceAdded(ServiceEvent event) {
        Log.i("JMDNS", "request ");
        mJmdns.requestServiceInfo(event.getType(), event.getName(), 1);

    }

};


最後,使用結束後要釋放資源,註銷服務

private void releaseJmdns() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            mJmdns.removeServiceListener(JMDNS_SERVER_TYPE, mlistener);
            try {
                mJmdns.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (lock != null) {
                lock.release();
                lock = null;
            }
        }
    });

}

以上就是整個JmDNS的使用過程,同時我嘗試自己用Multicast組播做一個接收消息的客戶端,實際調試過程中,像華爲,OPPO這些品牌的手機一直接收不到組播消息,

起初認爲是定製OS關閉了組播功能,最終卻發現跟組播地址有關係,查詢並使用JmDNS的組播地址224.0.0.251後就可以收到組播消息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章