大家好,谢谢你们,
环境说明
我正在开发一个应用程序,它与正在侦听端口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)发送到套接字/流的示例。如果我这样做完全错了,或者有更简单的方法将字节发送到服务器,我也有兴趣学习它!
如果需要任何其他信息,请询问,我会尽力提供。
感谢您花时间阅读本文,我期待着任何回复!
- 约翰
答案 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,具体取决于发生的情况。