7

Android アプリとデスクトップ アプリケーション間の通信に JmDNS 検出を実装しようとしています。次のチュートリアルに従いました: http://home.heeere.com/tech-androidjmdns.html

Android アプリはサービスを登録し、デスクトップ アプリケーションはサービスのリスナーを追加します。4 台中 3 台のデバイスで問題なく動作しましたが、4 台目のデバイス (Android 3.2 を実行している Samsung Galaxy Tab 10.1 PT7500) ではサービスを解決できません。私のハンドラーはイベントを受け取りますが、serviceAddedイベントは受け取りませんserviceResolvedjmdns.requestServiceInfoandも呼び出してみjmdns.getServiceInfoましたが、前者は何もせず、後者はタイムアウトして null を返します。

ただし、jmdns-browser はサービスを問題なく解決できるため、デバイスではありません。どちらのデバイスにもファイアウォールはありません。サービスは常に IPv4 アドレスを使用します。

この問題の原因が何か考えられる人はいますか?

サービスを開始するためのコード:

jmdns = JmDNS.create(wifiAddress);

ServiceInfo serviceInfo = ServiceInfo.create(Constants.SERVICE_TYPE, 
    Constants.SERVICE_NAME, Constants.ZEROCONF_PORT, "my service");

HashMap<String, String> deviceInfoMap = new HashMap<String, String>();
deviceInfoMap.put(Constants.KEY_DEVICE_NAME, getDeviceName());
deviceInfoMap.put(Constants.KEY_DEVICE_ID, getDeviceId());
// ...
serviceInfo.setText(deviceInfoMap);

jmdns.registerService(serviceInfo);

クライアント/リスナーのコード:

jmdns = JmDNS.create();
jmdns.addServiceListener(Constants.SERVICE_TYPE, serviceListener = new ServiceListener() {
    @Override
    public void serviceResolved(ServiceEvent event) {
        System.out.println("Service resolved: " + event.getName() + 
            " of type " +    event.getType());
    }

    @Override
    public void serviceRemoved(ServiceEvent event) {
        System.out.println("Service removed: " + event.getName() + 
            " of type " + event.getType());
    }

    @Override
    public void serviceAdded(ServiceEvent event) {
        System.out.println("Service added: " + event.getName() + 
            " of type " + event.getType());
        ServiceInfo info = jmdns.getServiceInfo(event.getType(), event.getName());
        System.out.println("Service info: " + info); // --> null
    }
});

出力:

Service added: my service @ GT-P7500 of type _mytype._tcp.local.
Service info: null
Service added: my service @ Galaxy Nexus of type _mytype._tcp.local.
Service info: [ServiceInfoImpl@183779345 
    name: 'my service @ Galaxy Nexus ._mytype._tcp.local.' 
    address: '/192.168.1.154:4242 ' status: 'DNS: myhost.local. 
    state: probing 1 task: null', has data
    deviceName: Galaxy Nexus
    deviceId: <id>
    displayDensity: XHDPI
] 
4

2 に答える 2

8

github リポジトリから最新のソース コード バージョンをチェックアウトするとうまくいきました。サービスの検出は、すべてのデバイスで問題なく機能するようになりました。(注: 以前にsourceforgeからダウンロードした JmDNS バージョン 3.4.1 を使用していました)

SVN の歴史をざっと見てみると、3.4.1 リリース以降、サービスの解決に関する問題に関連するコミットがいくつかあるようです。

編集:jmdnsがそこに移動したため、svnをgithubリポジトリに置き換えました。

于 2013-01-18T15:49:51.863 に答える
1

JmDNS.create(InetAddress addr, String name)の代わりに使用してくださいJmDNS.create()。Androidの最近のバージョンでは、JmDNSはローカルデバイスとそれがリッスンしているネットワークインターフェイスについて詳しく知る必要があります。

JmDNS jmdns; // somewhere global

// In a background thread 
public void buildJmDNS() {
    InetAddress addr = InetAddress.getLocalHost();
    String hostname = InetAddress.getByName(addr.getHostName()).toString();
    try {
        jmdns = JmDNS.create(addr, hostname); // throws IOException
    } catch (IOException e) {
       e.printStackTrace(); // handle this if you want
    }
}

私はあなたが経験しているのと同じ問題を抱えていました、そしてこれは私のためにそれを解決しました。なぜこれが必要なのかを示す例を見つけようとしましたが、できません。

于 2013-01-18T15:27:16.587 に答える