1

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");
 }}}}
4

0 に答える 0