【问题标题】:iPhone Socket Stream Behavior - Sending bytes to a Server.. NSStream/CFStreamiPhone 套接字流行为 - 向服务器发送字节.. NSStream/CFStream
【发布时间】:2012-01-18 16:16:06
【问题描述】:

大家好,感谢收看,

环境说明

我正在开发一个与正在侦听端口 2000 的 arduino(服务器,出于所有实际目的)通信的应用程序。连接到 arduino 是通过 ad-hoc 网络完成的,因此“服务器”是 169.254.1.1。连接后,客户端将收到 169.254.0.0 子网中的 IP。

我当前的代码

经过一番修改(这是我第一次使用 Objective C),我设法打开一个套接字并使用以下代码在 iPhone 和 Arduino 之间建立读/写流...

(void)viewDidLoad 我打电话 [self initNetworkCommunication];

并定义如下...

-(void) initNetworkCommunication 
{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;

    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"169.254.1.1", 2000, &readStream, &writeStream);


    inputStream = (__bridge NSInputStream *)readStream;
    outputStream = (__bridge NSOutputStream *)writeStream;
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];
}

我已经创建了这个函数来发送定义的字节,但是我不确定我是否正确地这样做了。以十六进制/二进制格式发送字节的解释将非常有帮助,因为我在研究中没有找到好的教程/代码 sn-p。这适用于工作正常的计时器(用于按住按钮)。我特别想知道我是否正确发送了字节。

- (void)sendByte:(NSTimer *)timer
{
    Byte allDown = 0x00F0;
    NSMutableData *sendData = [NSMutableData dataWithLength:sizeof(allDown)];
    [sendData appendBytes:&allDown length:sizeof(allDown)];
    [outputStream write:[sendData bytes] maxLength:[sendData length]];
}

我的问题/疑问

在我的 iPhone 上构建/测试这个应用程序后,我连接到 Arduino 并按下连接到 sendByte 函数的按钮,看到我的 LED 指示灯(在 arduino 上)像圣诞树一样亮起。这些 LED 打开的唯一方法是 arduino 在端口 2000 上接收某些字节。这很奇怪,因为我认为我只发送了一个特定的字节 0x00F0。在上面的代码中,是否有任何理由发送 0x00F0 以外的字节?即打开套接字和读/写流是否发送任何字节?

此外,将非常感谢将二进制数据(即 0001 或 10000000)或十六进制数据(即 0F)发送到套接字/流的示例。如果我这样做完全错误,或者如果有更简单的方法将字节发送到服务器,我也有兴趣学习!

如果需要任何其他信息,请询问,我会尽力提供。

感谢您抽出宝贵时间阅读本文,期待您的回复!

--约翰

【问题讨论】:

  • 你找到解决办法了吗?

标签: iphone objective-c ios sockets stream


【解决方案1】:

这里的问题是,您要创建一个长度为 1 的 NSMutableData(最初将包含字节 0x00),然后将 0xf0 附加到它上面。也就是说,您的 NSMutableData 实际上长度为 2 并且包含 0x00 0xf0

此外,NSMutableData 在这里似乎没有任何用处,除了使您的代码复杂化。你可能想要更多类似的东西:

- (void)sendByteF0:(NSTimer *)timer
{
    uint8_t byte = 0xf0;
    [outputStream write:&byte maxLength:1];
}

您也可以考虑关注-write:maxLength 方法的结果,因为它可能会失败——在这种情况下,它可能会返回 0 或 -1,具体取决于所发生的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    相关资源
    最近更新 更多