如何通过 Android 设备创建的 WiFi 直接网络在 iOS 中使用 ZeroMQ 发送/接收消息
Posted
技术标签:
【中文标题】如何通过 Android 设备创建的 WiFi 直接网络在 iOS 中使用 ZeroMQ 发送/接收消息【英文标题】:How to send/receive messages using ZeroMQ in iOS through WiFi direct network created by an android device 【发布时间】:2016-03-04 13:26:00 【问题描述】:我想开发一个 ios 应用程序,它应该能够向其他支持 WiFi 直连的设备(无论是 iOS 设备还是 android 设备)发送消息并从它们接收消息。
我找到了一个合适的库ZeroMQ 可以用来完成任务。我已经成功编译了 iOS 的库。
我引用了szehnder's sample 代码,但该应用程序没有执行任何操作。 它仅显示空白表格视图。我检查了代码,发现那里有接收消息的代码,但是发送消息的方法是空的。
我们如何检测其他 WiFi 直连设备?向他们发送和接收消息?任何指针都受到高度赞赏。
正如 Jason 所建议的,我将添加到目前为止我所取得的成就: 我有一个 android 应用程序,它使用 WiFi 直接连接到其他 android 设备并从它们发送和接收消息,并使用 ZeroMQ。我需要通过我的 iOS 应用与该应用通信。
以下是我接收消息的代码:
-(void) setupSockets:(ZMQContext*)myContext
ZMQSocket *subscriber = [myContext socketWithType:ZMQ_SUB];
[subscriber setData:nil forOption:ZMQ_SUBSCRIBE];
[subscriber connectToEndpoint: [NSString stringWithFormat:@"tcp://%@:%@", @"192.168.49.1", @"26665"]];
while (1)
NSData *m = [subscriber receiveDataWithFlags:0];
if (m!=NULL)
NSString *s = [NSString stringWithUTF8String:[m bytes]];
NSLog(@"Message: %@", s);
[self performSelectorOnMainThread:@selector(postMessageNotification:) withObject:s waitUntilDone:NO];
sleep(3);
这里192.168.49.1是主机android设备的ip地址,26665是用来接收消息的端口号。控件达到调用 receiveDataWithFlags: 成功但之后什么也不做。
现在发送数据:
-(IBAction) sendMessageClicked:(id)sender
NSString *pubEndPoint = [NSString stringWithFormat:@"tcp://%@:%@", @"192.168.49.1", @"26666"];
ZMQSocket *pubSocket = [objMeeps.context socketWithType:ZMQ_PUB];
[pubSocket connectToEndpoint:pubEndPoint];
NSData *msg = [@"hi" dataUsingEncoding:NSUTF8StringEncoding];
[pubSocket sendData:msg withFlags:ZMQ_NOBLOCK];
该方法给出错误消息ZMQLogError: *** <ZMQSocket: 0x17405fdd0 (ctx=0x174029480, type=ZMQ_PUB, endpoint=tcp://192.168.49.1:26666, closed=0)>: zmq_send: Resource temporarily unavailable
。当我搜索此错误时,我发现该错误是由于没有任何接收器而发生的,但我的 iPhone 已连接到 android 主机使用 WiFi Direct 创建的 WiFi 网络。
我是 ZeroMQ 的新手,所以可能会遗漏一些非常小的东西。希望这足以澄清问题。请指导我。
【问题讨论】:
***.com/questions/28906948/… @Rilwan:感谢您的回复。但是引用的问题并没有说明有关 ZeroMQ 的任何信息。我有一个使用 ZeroMQ 传递消息的 android 应用程序,我想使用 iOS 应用程序与它通信,所以我认为我只需要实现 ZeroMQ。你对此有什么看法吗? 好的。抱歉,我不了解 ZeroMQ。我以为您正在尝试在第一段中提到的 ios 和 android 之间实现对等连接。 尝试在您的问题中更明确一点,也许添加一些您希望运行但不会产生您期望的输出的代码 - 我知道 ZMQ 但对 iOS 知之甚少,所以与其学习如果您将代码直接添加到问题中并解释了您对其工作原理的理解,那么如何浏览您链接到它的示例代码将会很有帮助。 @Jason:感谢您的回复。我已经在我的应用程序中添加了到目前为止我所做的代码。请立即查看。 【参考方案1】:所以您说 tcp://192.168.49.1:26666 是您的 Android 主机的地址,但据我所知,您正在尝试从您的 ios 设备发布和订阅,至少对于这个例子。所以,让我们明确一点:对于这个例子,忽略你的 Android 设备,只是尝试让你的 ios 应用程序与自己对话。
第 1 步:为您的 ios 设备使用 ip:port
ZMQ 对每个连接都有两侧,一侧“绑定”(可以被视为 服务器),另一侧“连接”(并且可以被视为 客户端)。您的选择是灵活的,但为了举例,最好让您的发布者绑定并让您的订阅者连接。现在,你有双方连接。这可能是您看到的错误的原因。
第 2 步:更改您的 pub 套接字以绑定其地址而不是连接
使用 PUB/SUB 时,您必须订阅您想要的“主题”。在您的示例代码中,您订阅了“纳斯达克”。为了让您接收消息,消息的文本必须以您的订阅者主题开头,例如“NASDAQ:hi”将通过您的订阅过滤器。
第 3 步:更改您的 zmq_subscribe 选项以订阅一个空字符串 "" 以获取 每条 通过的消息
进行这三项更改应该会让您走上正轨。我强烈建议你read the guide,它涵盖了这些基本的使用指南,并且有相当多的 ios 示例代码可供引导。
【讨论】:
嗨,Jason,我尝试了您上面提到的步骤。我还将浏览其中的指南和 iOS 示例。现在我可以连接到我的 android 主机了。每当我从主机发送一些数据时,最初我都会得到<ZMQSocket: 0x17404d3e0 (ctx=0x1700286e0, type=ZMQ_SUB, endpoint=tcp://192.168.49.1:26665, closed=0)>: zmq_recv: Resource temporarily unavailable
。根据我最初的读数,套接字尚未准备好,因此可能会出现此错误,但之后它会一次又一次地出现错误zmq_recv: Operation timed out
。我已经使用更新的代码编辑了我的答案以接收数据。请看一下
你为什么要连接到你的安卓主机?您的发布者和订阅者都在您的 ios 设备上,对吗?还是我错过了什么?确保您的最新 PUB 代码 和 最新 SUB 代码都在您的问题中,即使一个在 android 上,另一个在 ios 上,因为在您的问题中它仍然没有'不显示任何一方为绑定。另外,我怀疑订阅nil
与订阅空字符串""
相同,但在这里我对目标C 不太熟悉
嗨,Jason,我的发布者在 Android 设备上。我已经从我的-(void) setupSockets:(ZMQContext*)myContext
方法中删除了 PUB 套接字的代码。我需要连接到 android 主机,所以我已经包含了该设备的 IP 地址。问题是我在 zmq_recv 中收到错误,因为“操作超时”。如果我遗漏了什么,请纠正我,我已成功连接到主机,因为在 android 端连接日志已正确生成。-(IBAction) sendMessageClicked:(id)sender
在我接收数据时未使用
假设您的 android 设备上的发布者代码设置正确,我建议您将订阅从 nil
更改为 [subscriber setData:[NSData dataWithBytes:"" length:strlen("")] forOption:ZMQ_SUBSCRIBE];
(我基于示例 here 的那一行)。我从未在代码示例anywhere 中看到null
或nil
订阅,我建议您使用空字符串。正确的订阅是PUB/SUB
模型中非常重要的一部分。
嗨,杰森,我尝试了你的建议。它仍然给出超时错误。由于其他android设备能够连接并发送消息到android主机,我可以说发布者的代码是合适的以上是关于如何通过 Android 设备创建的 WiFi 直接网络在 iOS 中使用 ZeroMQ 发送/接收消息的主要内容,如果未能解决你的问题,请参考以下文章