0

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を介してarduino unoから「前方」に戻る必要があります。ただし、クリックすると、何らかの理由で別の NSStreamEvent 4 が表示されます。また、ターミナル経由で次のようにデバイスに telnet で接続しました。

telnet 169.254.1.1 2000

その後、「2」を入力します...これにより、目的の「転送」がすぐに返されました。iPad の観点から、私は何を間違っているのでしょうか?

さらに、このコードは数週間前に機能していました。しかし、シミュレーターを更新すると、動作しなくなりました...接続は正常に開いていますが、arduino デバイスは iOS から出力を取得していないようです。

助けていただければ幸いです。

4

2 に答える 2

0

NSStreamEvent 4 は NSStreamEventHasSpaceAvailable です。データを送信する前に、出力ストリームに使用可能なスペースができるまで待つ必要があります。

于 2014-04-20T19:55:40.897 に答える
-1

NSString *response = [NSString stringWithFormat:@"2"]; を置き換えてみてください。この NSString *response = [NSString stringWithFormat:@"%d",2]; moveForward メソッドで。

于 2013-07-23T12:55:40.083 に答える