Поведение потоков Socket iPhone - отправка байтов на сервер. NSStream / CFStream - PullRequest
4 голосов
/ 12 декабря 2011

Привет всем и спасибо за внимание,

Объяснение окружающей среды

Я работаю над приложением, которое связывается с arduino (сервером, для всех практических целей), которое прослушивает порт 2000. Подключение к arduino осуществляется через специальную сеть, поэтому IP-адрес " Сервер "169.254.1.1. После подключения клиент получит IP-адрес в подсети 169.254.0.0.

Мой текущий код

После небольшой переделки (это мой первый опыт в Objective 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, и увидел, что светодиоды моего индикатора (на arduino) загорелись, как рождественская елка. Единственный способ включения этих светодиодов - это когда ардуино получает определенные байты через порт 2000. Это странно, потому что я думал, что посылаю только один конкретный байт 0x00F0. В вышеприведенном коде есть ли причина, по которой будут отправляться байты, отличные от 0x00F0? т. е. отправляет ли байты открытие сокета и потоков чтения / записи?

Кроме того, пример отправки двоичных данных (то есть 0001 или 10000000) или шестнадцатеричных данных (то есть 0F) в сокет / поток был бы очень полезен. Если я делаю это совершенно неправильно, или если есть более простой способ отправки байтов на сервер, мне было бы интересно узнать об этом!

Если требуется какая-либо дополнительная информация, пожалуйста, спросите, и я сделаю все возможное, чтобы предоставить.

Спасибо, что нашли время, чтобы прочитать это, я с нетерпением жду каких-либо ответов!

- Джон

1 Ответ

1 голос
/ 14 мая 2012

Проблема здесь в том, что вы создаете NSMutableData длиной 1 (который первоначально будет содержать байт 0x00), а затем добавляете 0xf0 к нему.То есть, ваш NSMutableData на самом деле имеет длину 2 и содержит 0x00 0xf0.

Кроме того, NSMutableData, по-видимому, здесь не служит никакой полезной цели, кроме как усложняет ваш код.Вы, вероятно, хотите что-то более похожее на:

- (void)sendByteF0:(NSTimer *)timer
{
    uint8_t byte = 0xf0;
    [outputStream write:&byte maxLength:1];
}

Вы можете также рассмотреть возможность обратить внимание на результат метода -write:maxLength, так как он может потерпеть неудачу - и в этом случае он может вернуть либо 0, либо -1,в зависимости от того, что именно произошло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...