IPアドレス:169.254.1.1、ポート2000のWiFlyというデバイスを使用しています。iOSアプリケーションを介してこのデバイスに接続しようとしています。次のコードを使用して接続します。
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
UInt32 port = 2000;
CFStringRef host = CFSTR("169.254.1.1");
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &readStream, &writeStream);
inputStream = (__bridge NSInputStream *)readStream;
outputStream = (__bridge NSOutputStream *)writeStream;
// set the delegates to this view controller
[inputStream setDelegate:self];
[outputStream setDelegate:self];
// Set run loops to continuous receive information
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
// Finally, open the connection
[inputStream open];
[outputStream open];
次に、以下を使用してストリームイベントを処理します。
- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
NSLog(@"stream event %i", streamEvent);
switch (streamEvent) {
case NSStreamEventOpenCompleted:
NSLog(@"Stream opened");
break;
case NSStreamEventHasBytesAvailable:
if (theStream == inputStream) {
uint8_t buffer[1024];
int len;
while ([inputStream hasBytesAvailable]) {
len = [inputStream read:buffer maxLength:sizeof(buffer)];
if (len > 0) {
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
if (nil != output) {
NSLog(@"server said: %@", output);
[self messageReceived:output];
}
}
}
}
break;
case NSStreamEventErrorOccurred:
NSLog(@"Can't connect to server");
break;
case NSStreamEventEndEncountered:
[theStream close];
[theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
break;
default:
NSLog(@"Unknown event");
}
したがって、最初の2つのストリームが正しく開かれていることがわかります。次に、ストリームイベント4がすぐに続きます。これは、私の理解では予想されることです。ただし、次に関数を呼び出そうとします。
- (IBAction)moveForward
{
NSLog(@"move forward called");
NSString *response = [NSString stringWithFormat:@"2"];
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
[outputStream write:[data bytes] maxLength:[data length]];
}
これは、wiflyを介してarduinounoから「転送」を返す必要があります。ただし、クリックすると、何らかの理由で別のNSStreamEvent4が表示されます。また、次の端末を介してデバイスに電話をかけました。
telnet 169.254.1.1 2000
その後、「2」と入力します...これにより、目的の「転送」がすぐに返されます。iPadの観点から私は何が間違っているのですか?
ヘルプは大歓迎です!
編集何らかの理由で、ハンドラーにアクセスするたびに、渡されるストリームは出力ストリームですが、これは完全に間違っています...入力ストリームが渡されないのはなぜですか?
そしてここにarduinoコードがあります:
void loop()
{ while (Serial.available() > 0) {
int next = Serial.parseInt();if(Serial.available() > 0)
{
if(next == 20) {
Serial.println("leftMove");
}}}}