- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试实现一个类来发现网络上的服务。我试过使用 Android's NSD它确实发现服务很好,但它只支持 API 级别 16 及更高级别,而且我似乎无法检索服务信息中的 txtRecord 字段(由于某种原因它返回 null)。结果是it's a known problem...
所以现在我正在尝试使用 jmDNS ,这似乎根本找不到服务。这是我的类(class)(我正在使用 AndroidAnnotations 框架)MDnsHelper:
@EBean
public class MDnsHelper implements ServiceListener {
public static final String SERVICE_TYPE = "_http._tcp.local";
Activity activity;
private JmDNS jmdns;
private MulticastLock multicastLock;
WifiManager wm;
InetAddress bindingAddress;
boolean isDiscovering;
public void init(Activity activity) {
this.activity = activity;
isDiscovering = false;
wm = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);
multicastLock = wm.createMulticastLock(activity.getPackageName());
multicastLock.setReferenceCounted(false);
}
@Background
public void startDiscovery() {
if (isDiscovering)
return;
System.out.println("starting...");
multicastLock.acquire();
try {
System.out.println("creating jmdns");
jmdns = JmDNS.create();
System.out.println("jmdns created");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (jmdns != null) {
jmdns.addServiceListener(SERVICE_TYPE, MDnsHelper.this);
isDiscovering = true;
System.out.println("discovering services of type: " + SERVICE_TYPE);
}
}
}
@Background
public void stopDiscovery() {
if (!isDiscovering || jmdns == null)
return;
System.out.println("stopping...");
multicastLock.release();
jmdns.removeServiceListener(SERVICE_TYPE, MDnsHelper.this);
System.out.println("listener for " + SERVICE_TYPE + " removed");
try {
jmdns.close();
isDiscovering = false;
System.out.println("jmdns closed");
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void serviceAdded(ServiceEvent service) {
System.out.println("found: " + service.getInfo().toString());
}
@Override
public void serviceRemoved(ServiceEvent service) {
System.out.println("lost: " + service.getInfo().toString());
}
@Override
public void serviceResolved(ServiceEvent service) {
System.out.println("resolved: " + service.getInfo().toString());
}
}
在我的应用程序中我调用:
init(getActivity());
然后startDiscovery();
开始扫描,stopDiscovery();
停止扫描。
当然,我在 list 中为应用授予了所需的权限...我在这里想念什么?如果您需要我提供其他代码/信息 - 请询问。谢谢!!
最佳答案
我是 ZeroConf Browser for Android 的作者,我使用开源库 JmDNS 进行所有解析。它工作得很好,但有一些技巧可以让它正常工作。
在您的 Android manifest.xml 中确保您至少拥有这些权限。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
在开始 Activity 之前,您必须通过获取多播锁定来允许多播数据包。
@Override
protected void onStart() {
Log.i(TAG, "Starting ServiceActivity...");
super.onStart();
try {
Log.i(TAG, "Starting Mutlicast Lock...");
WifiManager wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
// get the device ip address
final InetAddress deviceIpAddress = getDeviceIpAddress(wifi);
multicastLock = wifi.createMulticastLock(getClass().getName());
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
Log.i(TAG, "Starting ZeroConf probe....");
jmdns = JmDNS.create(deviceIpAddress, HOSTNAME);
jmdns.addServiceTypeListener(this);
} catch (IOException ex) {
Log.e(TAG, ex.getMessage(), ex);
}
Log.i(TAG, "Started ZeroConf probe....");
}
private InetAddress getDeviceIpAddress(WifiManager wifi) {
InetAddress result = null;
try {
// default to Android localhost
result = InetAddress.getByName("10.0.0.2");
// figure out our wifi address, otherwise bail
WifiInfo wifiinfo = wifi.getConnectionInfo();
int intaddr = wifiinfo.getIpAddress();
byte[] byteaddr = new byte[] { (byte) (intaddr & 0xff), (byte) (intaddr >> 8 & 0xff),
(byte) (intaddr >> 16 & 0xff), (byte) (intaddr >> 24 & 0xff) };
result = InetAddress.getByAddress(byteaddr);
} catch (UnknownHostException ex) {
Log.w(TAG, String.format("getDeviceIpAddress Error: %s", ex.getMessage()));
}
return result;
}
不要忘记停止扫描以解锁多播锁定并关闭 JmDNS。
@Override
protected void onStop() {
Log.i(TAG, "Stopping ServiceActivity...");
super.onStop();
stopScan();
}
private static void stopScan() {
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);
}
}
最重要的是不要使用默认构造函数。您必须使用 IP 地址构造函数。我注意到在您的代码中您只是在执行 JmDNS.create()。我认为出于某种原因,它在 Android 上运行的唯一方法是使用下面的构造函数。
jmdns = JmDNS.create(deviceIpAddress, HOSTNAME);
关于Android - jmdns 没有发现设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23805893/
我正在尝试 jmDNS jar ,但是当我运行我的应用程序时,它会抛出类似 NoClassDefFoundError: javax.jmdns.JmDNS 的错误。 它从这一行抛出错误 jm
希望我的问题不是太愚蠢,但我遇到了以下问题...... 我正在将一个包含库 JmDNS 的 jar 导入到我的项目中。我的项目设置为像这样处理 JmDNS... setUp();
我正在使用 JmDNS 在网络中同一子网下的几台计算机中注册服务。然而,每次第二台机器启动并尝试注册服务时,其名称都会自动更改为“service_name(编号)”之类的名称。我认为发生这种情况是为了
我有一个我认为非常简单的问题。 我正在尝试使用 JmDNS 来广播我已经成功完成的服务,但是当应用程序暂停时,我想取消注册服务,然后在恢复应用程序时重新注册服务。 然而,我在执行此操作时遇到了问题。代
我已经能够获取 JmDNS 附带的示例来编译和运行,但是我无法获取任何类来发现我的服务。 我正在运行一个 Windows 环境,多台 PC 运行 VNC、SSH 和 Apache,我一直在尝试让 Jm
我正在尝试为 Android 应用程序和桌面应用程序之间的通信实现 JmDNS 发现。我遵循了以下教程: http://home.heeere.com/tech-androidjmdns.html A
我正在尝试使用 JmDNS 来检测网络上设备的添加和删除。添加工作正常,一旦设备各自的服务在 JmDNS 中注册,就会找到这些设备,但是,当设备从网络中删除时,它永远不会在 JmDNS 中注册。 我曾
我正在尝试实现一个类来发现网络上的服务。我试过使用 Android's NSD它确实发现服务很好,但它只支持 API 级别 16 及更高级别,而且我似乎无法检索服务信息中的 txtRecord 字段(
使用jmdns 3.4.1,我可以看到局域网中机器发布的服务,我也可以创建一个服务并注册它,这样我就可以在我的机器上看到它。但是,当我在局域网的另一台机器上新建服务时,在我的机器上是看不到的。我在另一
我已经创建了 JmDNS 示例: public class Service { public static void main(String[] args) { try { J
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我已经在我的 linux 电脑上使用 mdnsreponder(applebonjour) 为我的服务注册了子类型 .我正在尝试在我的 Galaxy 手机上使用 jmdns(这里我有 jmdns.ja
您好,我创建了示例 jmdns serviceListner,当我运行它时,它应该继续列出它找到的服务,但是通过这个我的程序,它在运行时列出了一些服务,之后它不列出任何服务。而且我的 google
我正在使用 ( http://jmdns.sourceforge.net/) 将发现添加到我们的应用程序中。它实际上在我的小型家庭网络上正常工作。但它在办公室的大型网络上失败了。我似乎记得读过,如果一
我在 Raspberry Pi 设备上启动并运行 JmDNS 时遇到问题。该应用程序在各种 x86 Linux 上运行良好,但在 Raspberry(运行“Raspbian GNU/Linux 8 (
我正在尝试让 JmDNS 在我的 android 程序中工作。我能够让它发现我想要的设备,但我不完全理解如何从 JmDNS 获取信息到启动 JmDNS 任务的对象。这是我的代码。 protected
我在让 JmDNS 与我的 Android AVD 一起工作时遇到了一些困难。我创建了 3 个应用程序。一个注册 ServiceListener 并记录任何 Activity 的 Android 应用
我正在用 Java(使用 Spark)开发一个 Web 应用程序,我希望它使用 JmDNS 以便能够在我的 Android 应用程序中找到此服务器。我按照 JmDNS page 中的步骤进行服务注册,
我正在通过其他运行 windows-xp 的机器创建 JmDNS 服务 JmDNS dns = JmDNS.create("localhost"); dns.regesterService("_sre
前言:从 SDK 级别 16 开始,Android 有一个内置的 Zeroconf 实现。除非青铜时代的兼容性是一个问题,否则不要再使用 jmDNS,而是使用 NsdManager。 前言 #2:Ns
我是一名优秀的程序员,十分优秀!