我打算使用bonjour为iphone建立一个点对点应用程序.将无法使用无线网络因此依赖蓝牙.我知道基于bonjour的服务可以在无线网络中通过蓝牙工作.
我的问题是,当我启动bonjour服务或尝试发现时,手机上的蓝牙会自动启用吗?
如果没有,我如何启用蓝牙 - 我在SDK中找不到任何公共API?
问候,hb
我正在为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) 我需要让我的应用程序播放位于我的网络上的视频文件.我知道该文件的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应用程序中执行的操作.
我打算在使用C#的小型.NET应用程序中使用Apple的Bonjour SDK for Windows.这个小应用程序将使用Bonjour进行网络发现.目前,我正在测试Apple SDK附带的"Simple Chat Bonjour"示例应用程序.在我发布该样本后,我尝试在另一台机器上运行设置,它说Bonjour服务不可用.我检查了我的原始开发机器,它安装了Boujour服务并启动了.如果我停止服务,示例应用程序将无法运行.
问:这是否意味着任何使用Apple的Bonjour应用程序的工作站/客户端计算机都需要安装Apple的Bonjour SDK?如果是这种情况,那还有另一个吗?(无需在客户端计算机上安装Bonjour SDK或服务)
我跟着这个教程对MultiPeerConnectivity(MCF)和列表大部分在线教程,他们把使用的服务的快捷MCAdvertiserAssistant和MCBrowserViewController
我尝试实施相同的教程,但使用MCNearbyServiceAdvertiser和MCNearbyServiceBrowser代替,因为我有兴趣在我的应用程序上自定义可发现性。
就列出附近的设备而言,一切正常。但问题开始于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来显示附近的设备(正常工作)沿增加了定制的浏览器,这里是承诺,做的广告(不工作)
我正在通过相同的wifi两个/更多的iOS设备进行数据共享.我已经使用多重网络成功实现了它并从视频文档中进行了探索.我只是在寻找苹果Dev以了解Bonjour与Multipeer Networking之间的区别.团队中是否有一个人同时参与过两次工作,并且可以分享他的选择经验. 我的要求:在同一个Wifi网络中连接两个/多个iOS设备
自动发现和连接.
数据大小可以是1 KB到1 GB(使用MC进行处理).
断开连接时连接数据共享(用MC查找).
哪个更可靠?
你会选择什么?我也在看GCDAsyncSocket(不知道我在正确的方向).
所以请分享您的经验.谢谢.
我正在使用NSNetService和NSNetServiceBrowser在网络上发布和扫描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:仅在我尝试两次注册相同服务时才被调用.这对我来说非常直观; 也许服务已发布到适配器,但不是网络,因此这些回调非常容易引起误解.此时,我无法知道该服务是否在网络上可见.
当我使用XCode开发我的iOS产品时,它偶尔会在我的iOS设备中崩溃.它总是发生在程序从后台到前面,而XCode显示为崩溃原因时:
[错误]启动Bonjour分辨率失败.
我找不到如何解决它,这让我非常沮丧.有人帮我吗?
我想获取整个本地网络中的所有设备名称。我刚刚搜索了 2 天,还没有找到解决方案。
我可以使用 NSNetServiceBrowser 获得 Bonjour 服务。我正在尝试做的与 Fing 应用程序(在应用程序商店中)所做的相同。
如下图所示,我想通过 iOS 获取“我的 iPhone”iPhone 名称。
问候
安德
我在 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 中实现了这个解决方案,它有点工作,但我并不满意,因为:
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)