iPhone套接字流行为 - 将字节发送到服务器.. NSStream / CFStream

时间:2011-12-12 17:23:54

标签: iphone objective-c ios sockets stream

大家好,谢谢你们,

环境说明

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

我当前的代码

经过一些修补(这是我第一次去目标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];
}

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

- (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)发送到套接字/流的示例。如果我这样做完全错了,或者有更简单的方法将字节发送到服务器,我也有兴趣学习它!

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

感谢您花时间阅读本文,我期待着任何回复!

- 约翰

1 个答案:

答案 0 :(得分: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,具体取决于发生的情况。