如何通过 android 设备创建的 WiFi 直接网络在 iOS 中使用 ZeroMQ send/receive 消息

How to send/receive messages using ZeroMQ in iOS through WiFi direct network created by an android device

我想开发一个 iOS 应用程序,它应该能够向其他支持 WiFi Direct 的设备发送消息(无论它是 iOS 设备还是 Android 设备)并接收来自他们的消息。

我找到了一个可以用来完成任务的 suitable 库 ZeroMQ。我已经成功地为 iOS 编译了库。

我引用了 szehnder's sample 代码,但该应用程序没有执行任何操作。 它仅显示空白 table 视图。我查看了代码,发现那里有接收消息的代码,但是发送消息的方法是空的。

我们如何检测其他 WiFi Direct 设备?向他们发送和接收消息?任何指针都非常感谢。

根据 Jason 的建议,我将添加我到目前为止所取得的成就: 我有一个 android 应用程序,它使用 WiFi direct 连接到其他 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 的新手,所以可能遗漏了一些非常小的东西。希望这能澄清问题 enough.Please 指导我解决这个问题。

所以你说 tcp://192.168.49.1:26666 是你的 Android 主机的地址,但据我所知你正在尝试发布 and 从您的 ios 设备订阅,至少在这个例子中是这样。所以,让我们明确一点:对于这个例子,忽略你的 Android 设备,只是尝试让你的 ios 应用程序与自己对话。

第 1 步:将 ip:port 用于您的 ios 设备

ZMQ 对每个连接都有两侧,一侧是 "binds"(并且可以被认为是 服务器 ),另一侧是 "connects"(并且可以被认为是 客户端 )。您的选择是灵活的,但为了举例,最好由您的发布者进行绑定,而您的订阅者进行连接。现在,你有双方连接。这可能是您看到的错误的原因。

第 2 步:更改您的 pub socket 以绑定其地址而不是连接

使用PUB/SUB时,您必须订阅您想要的"topics"。在您的示例代码中,您订阅了 "NASDAQ"。要接收消息,消息文本必须以您的订阅者主题开头,例如 "NASDAQ:hi" 将通过您的订阅过滤器。

第 3 步:更改您的 zmq_subscribe 选项以订阅空字符串 "" 以获取通过[=33= 的每条 消息]

进行这三项更改应该会让您走上正轨。我强烈建议您 read the guide,它涵盖了这些基本的使用指南,并且有大量 ios 示例代码可供启动。