标签: bonjour

在iphone上使用bonjour会自动启用蓝牙吗?

我打算使用bonjour为iphone建立一个点对点应用程序.将无法使用无线网络因此依赖蓝牙.我知道基于bonjour的服务可以在无线网络中通过蓝牙工作.

我的问题是,当我启动bonjour服务或尝试发现时,手机上的蓝牙会自动启用吗?

如果没有,我如何启用蓝牙 - 我在SDK中找不到任何公共API?

问候,hb

iphone bonjour bluetooth wifi

5
推荐指数
1
解决办法
1633
查看次数

Avahi dns_sd兼容层无法运行浏览回调

背景

我正在为Haskell开发一个跨平台的Zeroconf/Bonjour/DNS-SD库,并且认为我最好的选择是定位dns_sd.hAPI.在Linux下,此接口的实现由Avahi提供,Avahi声称支持Bonjour API的一个子集.

问题

作为我的库的健全性检查,我在C中编写了一个小型测试程序,它只使用了API的基础.它浏览网络上的任何类型的服务_http._tcp,一看到它就打印一条消息,然后死掉:

#include <dns_sd.h>
#include <stdio.h>
#include <stdlib.h>

void cb(DNSServiceRef sdRef,
        DNSServiceFlags flags,
        uint32_t interfaceIndex,
        DNSServiceErrorType errorCode,
        const char *serviceName,
        const char *regtype,
        const char *replyDomain,
        void *context) {
  printf("called!\n");
}

int main() {
  DNSServiceRef sd = malloc(sizeof(DNSServiceRef));
  const char *regtype = "_http._tcp";
  DNSServiceErrorType err1 = DNSServiceBrowse(&sd, 0, 0, regtype, NULL, &cb, NULL);
  printf("err1=%d\n", err1);
  DNSServiceErrorType err2 = DNSServiceProcessResult(sd);
  printf("err2=%d\n", err2);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的Mac上,这个测试程序在C和等效的Haskell中都运行良好(它找到了我的打印机;令人兴奋!):

$ gcc test.c -o …
Run Code Online (Sandbox Code Playgroud)

c bonjour zeroconf avahi dns-sd

5
推荐指数
1
解决办法
1789
查看次数

如何在Android上解析Bonjour域名?

我需要让我的应用程序播放位于我的网络上的视频文件.我知道该文件的URL是:

http://something.local/abc.mp4
Run Code Online (Sandbox Code Playgroud)

现在,当我用其真实的ip地址手动替换"something.local"时,MediaPlayer播放它没有问题.尽管如此,当我有上述地址时,MediaPlayer出错了error (1, -1007).

所以我假设这是因为Android不理解"something.local"是正确的.

我的问题是:如何将something.local"翻译"成自己的ip,以便我可以将其传递给MediaPlayer

一个小警告:我认为这MediaPlayer与IPv6地址无关,所以请记住这一点......


只是旁注,以防它使我的情况更清楚:当我ping something.local -4在Windows命令提示符下运行时,它返回:

Pinging something.local [192.168.1.126] with 32 bytes of data:
Reply from 192.168.1.126: bytes=32 time=145ms TTL=64
Reply from 192.168.1.126: bytes=32 time=112ms TTL=64
Reply from 192.168.1.126: bytes=32 time=32ms TTL=64
Reply from 192.168.1.126: bytes=32 time=169ms TTL=64
Run Code Online (Sandbox Code Playgroud)

Windows的转换something.local -> 192.168.1.126是我想在Android应用程序中执行的操作.

android bonjour

5
推荐指数
1
解决办法
2453
查看次数

Apple的Bonjour SDK for Windows

我打算在使用C#的小型.NET应用程序中使用Apple的Bonjour SDK for Windows.这个小应用程序将使用Bonjour进行网络发现.目前,我正在测试Apple SDK附带的"Simple Chat Bonjour"示例应用程序.在我发布该样本后,我尝试在另一台机器上运行设置,它说Bonjour服务不可用.我检查了我的原始开发机器,它安装了Boujour服务并启动了.如果我停止服务,示例应用程序将无法运行.

问:这是否意味着任何使用Apple的Bonjour应用程序的工作站/客户端计算机都需要安装Apple的Bonjour SDK?如果是这种情况,那还有另一个吗?(无需在客户端计算机上安装Bonjour SDK或服务)

.net c# network-programming bonjour

5
推荐指数
1
解决办法
8012
查看次数

为什么多点连接仅适用于 MCAdvertiserAssistant 而不是 MCNearbyServiceAdvertiser

我跟着这个教程MultiPeerConnectivity(MCF)和列表大部分在线教程,他们把使用的服务的快捷MCAdvertiserAssistantMCBrowserViewController

我尝试实施相同的教程,但使用MCNearbyServiceAdvertiserMCNearbyServiceBrowser代替,因为我有兴趣在我的应用程序上自定义可发现性。

就列出附近的设备而言,一切正常。但问题开始于MCNearbyServiceAdvertiserDelegate我调用此方法的地方:

- (void)           advertiser:(MCNearbyServiceAdvertiser *)advertiser
 didReceiveInvitationFromPeer:(MCPeerID *)peerID
                  withContext:(NSData *)context
            invitationHandler:(void (^)(BOOL, MCSession *))invitationHandler {

    // Allow the peer to join this Vibereel
    MCSession *peerSession = [[MCSession alloc] initWithPeer:_peerID];
    peerSession.delegate = self;
    invitationHandler(YES, peerSession);
    NSLog(@"Accepted entry request for peer %@", [peerID displayName]);
}
Run Code Online (Sandbox Code Playgroud)

这并不会触发的确发生了变化状态的方法:

-(void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
Run Code Online (Sandbox Code Playgroud)

虽然它与原始版本。

我知道我显然需要添加更多代码来演示问题..所以我创建了一个以原始代码开头的github 存储库。这是提交与定制的UITableViewController来显示附近的设备(正常工作)沿增加了定制的浏览器,这里是承诺,做的广告(不工作

cocoa bonjour objective-c ios multipeer-connectivity

5
推荐指数
1
解决办法
1895
查看次数

在同一个wifi网络中为数据共享选择什么:Multipeer,Bonjour,Socket连接

我正在通过相同的wifi两个/更多的iOS设备进行数据共享.我已经使用多重网络成功实现了它并从视频文档中进行了探索.我只是在寻找苹果Dev以了解Bonjour与Multipeer Networking之间的区别.团队中是否有一个人同时参与过两次工作,并且可以分享他的选择经验. 我的要求:在同一个Wifi网络中连接两个/多个iOS设备

自动发现和连接.

数据大小可以是1 KB到1 GB(使用MC进行处理).

断开连接时连接数据共享(用MC查找).

哪个更可靠?

你会选择什么?我也在看GCDAsyncSocket(不知道我在正确的方向).

所以请分享您的经验.谢谢.

iphone bonjour ios gcdasyncsocket multipeer-connectivity

5
推荐指数
1
解决办法
387
查看次数

了解bonjour服务的状态

我正在使用NSNetServiceNSNetServiceBrowser在网络上发布和扫描Bonjour服务.实施工作正常,服务在网络上找到,他们能够进行通信.我目前正在尝试理解框架的生命周期,这是我到目前为止所得到的:

// Scanning
netServiceBrowserWillSearch:
netServiceBrowser:didFindService:moreComing: // The device finds itself

// Advertising
netServiceWillPublish:
netServiceDidPublish:
Run Code Online (Sandbox Code Playgroud)

如果我在启用适配器的服务时会发生这种情况.现在,我需要随时了解该服务是否在网络上进行广告宣传; 也就是说,如果其他设备能够找到它.所以我关闭了Wi-Fi适配器进行测试:

netServiceBrowser:didRemoveService:moreComing:
netServiceBrowser:didFindService:moreComing: // The device finds itself again, even after the adapter is turned off
Run Code Online (Sandbox Code Playgroud)

然后我重新打开适配器:

netServiceBrowser:didRemoveService:moreComing:
netServiceBrowser:didFindService:moreComing: // Yet again
Run Code Online (Sandbox Code Playgroud)

问题是打开或关闭适配器绝对没有区别,所以我找不到模式.有没有其他方法可以捕捉到这些事件?

编辑:它变得最糟糕.即使我启动两个适配器关闭的服务(飞行模式)netServiceDidPublish:仍然被调用.到目前为止,似乎netServiceDidNotPublish:仅在我尝试两次注册相同服务时才被调用.这对我来说非常直观; 也许服务已发布到适配器,但不是网络,因此这些回调非常容易引起误解.此时,我无法知道该服务是否在网络上可见.

bonjour nsnetservice ios nsnetservicebrowser

5
推荐指数
1
解决办法
258
查看次数

启动bonjour解决方案时出错错误

当我使用XCode开发我的iOS产品时,它偶尔会在我的iOS设备中崩溃.它总是发生在程序从后台到前面,而XCode显示为崩溃原因时:

[错误]启动Bonjour分辨率失败.

我找不到如何解决它,这让我非常沮丧.有人帮我吗?

截图在这里

crash xcode bonjour ios

5
推荐指数
0
解决办法
281
查看次数

在 iOS 中获取本地网络主机名

我想获取整个本地网络中的所有设备名称。我刚刚搜索了 2 天,还没有找到解决方案。

我可以使用 NSNetServiceBrowser 获得 Bonjour 服务。我正在尝试做的与 Fing 应用程序(在应用程序商店中)所做的相同。

如下图所示,我想通过 iOS 获取“我的 iPhone”iPhone 名称。

Fing可以成功获取整个本地网络的所有设备名称

问候

安德

bonjour nsnetservice ios

5
推荐指数
1
解决办法
1011
查看次数

NSdManager ResolveListener 错误代码 3:失败已经激活

我在 Android 应用程序中使用 NsdManager 来发现由我开发的另一台设备发布的 NSD 服务。我只在 Android App 上做服务发现(这边不需要服务注册)。网络上同时发布了多个相同类型服务的实例。

我开始使用 Google 提供的示例代码(https://developer.android.com/training/connect-devices-wireless/nsd),但由于同时重复使用同一个解析器对象不止一个,我遇到了致命错误服务解决。然后我发现有几个人建议每次都创建一个新的解析器对象(例如在Listener already in use (Service Discovery) 中)。

我这样做了,致命错误被解决失败错误代码 3 取代,这意味着解决过程处于活动状态。比以前好多了,但只有第一个服务得到解决,其余的都因为这个失败而被忽略了。

然后我发现有人建议对错误代码 3 进行特殊处理,方法是递归地重新发送解析请求,直到它最终被解析(NSNetworkManager.ResolveListener 消息 Android)。

我在 Kotlin 中实现了这个解决方案,它有点工作,但我并不满意,因为:

  1. 我相信我正在创建很多额外的 Resolver 对象,我不确定它们以后是否会被垃圾收集。
  2. 我正在循环重试几次,可能会给设备和网络造成额外和不必要的负担。不确定我是否应该在再次调用服务解析之前添加一个短暂的睡眠。
  3. 如果出现网络问题,程序可能会尝试数千次来解析同一个服务,而不是仅仅放弃解析并等待再次发现该服务。

RxBonjour2 的人提供了一个更复杂和更强大的解决方案,但它太复杂了,我无法遵循它:https : //github.com/mannodermaus/RxBonjour/blob/2.x/rxbonjour-drivers/rxbonjour-driver-nsdmanager /src/main/kotlin/de/mannodermaus/rxbonjour/drivers/nsdmanager/NsdManagerDiscoveryEngine.kt

我对 Google 的官方示例没有正确处理这些问题感到沮丧。nsd_chat 示例使用单个解析器对象,并且在网络上以相同类型发布多个相同类型的服务时失败。

你能提出更好的解决方案吗?或者对我下面的代码有什么改进?

import android.app.Application
import android.content.Context
import android.net.nsd.NsdManager
import android.net.nsd.NsdServiceInfo
import androidx.lifecycle.AndroidViewModel
import timber.log.Timber


class ViewModel(application: Application) : AndroidViewModel(application) {

    // Get application context
    private val myAppContext: Context = getApplication<Application>().applicationContext …
Run Code Online (Sandbox Code Playgroud)

android bonjour zeroconf nsd nsdmanager

5
推荐指数
2
解决办法
1421
查看次数