2013-10-31 7 views
4

RN-42를 사용하여 블루투스 2.1을 통해 기기에서 데이터를 읽으려고했습니다. 이 장치는 iPhone 또는 iPad Mini와 쌍을 이루어 데이터가 일시적으로 스트리밍되지만 iOS & BT 모듈은 단 몇 초 만에 (불일치) 10 개 미만으로 연결이 끊어집니다. 이 장치는 5-10kB/s의 데이터를 출력하므로 블루투스 사양 내에서 잘 작동합니다. 내가 알아챈 점은 NSInputStream 함수 [NSInputStream read : maxLength :]를 실행할 때 반환되는 바이트 수가 항상 158 이하라는 점입니다. 앱과 하드웨어는 충돌하지 않지만 블루투스는 페어링되지 않습니다.RN42 블루투스가 iOS에서 스트리밍 데이터를 몇 초 안에 끊습니다.

전자 장치에서 문제가 발생할 가능성을 줄이기 위해 장치가 연결을 끊은 후에도 RN42로 데이터를 보내고 있습니다. 이 설정은 Android 기기에서도 완벽하게 작동합니다. 연결 해제 또는 충돌없이 데이터를 스트리밍 할 수 있습니다. 내가 해봤

것들 ...

  • 애플에서 제공하는 외부 액세서리 예를 들어, EADemo을 따랐다.
  • 순전히 폴링 대신 실행 루프를 사용합니다.
  • 이 게시물에 제안 된대로 백그라운드 스레드에 스트림을 넣습니다.
  • 성능을 높이기 위해 모든 NSLog를 제거하십시오.
  • 은 디버그 및 릴리스 모드로 컴파일됩니다.

어떤 종류의 작품이 iOS 및 BT 모듈이 연결 상태를 유지하고 연결 해제하기 전에 데이터를 더 오래 전송할 수 있으므로 데이터 전송 속도가 느려집니다 (즉, 5kB/s 미만).

#define EAD_INPUT_BUFFER_SIZE 1024 

/** 
* Stream delegate 
*/ 
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode 
{ 
    switch (eventCode) { 
[... other cases ...] 

     case NSStreamEventHasBytesAvailable: 
     {    
      uint8_t buf[EAD_INPUT_BUFFER_SIZE]; 
      unsigned int len = 0; 
      len = [(NSInputStream *)aStream read:buf maxLength:EAD_INPUT_BUFFER_SIZE]; 

      if(len) { 
       // Read successful, process data 
      } else { 
       // Fail 
      }  
      break; 
     } 
     default: 
      break; 
    } 
} 

/** 
* Stream delegate with polling (for better or worse) 
*/ 
    [...] 
     case NSStreamEventHasBytesAvailable: 
     {    
      while ([[_session inputStream] hasBytesAvailable]) 
      { 
       // Read the data 
       NSInteger bytesRead = [[_session inputStream] read:_buf maxLength:EAD_INPUT_BUFFER_SIZE]; 

       if (bytesRead > 0) { 
        // Read successful, process data 

       } else if (bytesRead == 0) { 
        // End of buffer reached 
        return; 

       } else if (bytesRead == -1) { 
        // Failed to read 
        return; 
       } 
      } 
      break; 
    [...] 

답변

5

나는 이러한 유형의 문제에 대한합니다 (RN42의 원래 제조 업체했다 로빙 네트웍스를 구입 한 회사) 마이크로 칩에서 사람들과 함께 이야기를 나눴습니다, 불행한 약간의 "기능"이 보인다 이는 RN42 매뉴얼의 어디에도 기록되어 있지 않습니다.

RN42를 사용하여 iOS 장치와 통신 할 때 2.5-3kB/s보다 빨리 통신 할 수 없습니다 ... Android 또는 컴퓨터 또는 다른 장치와 통신하는 데 사용되는 경우 35kB/s로 전송할 수 있습니다 (SPP를 통해).

이유는 BT 스택과 iOS 장치가 필요로하는 형식 (iAP 프로토콜)으로 바이트를 다시 패키징 할 수없는 RN42의 저전력 칩입니다. 와이파이 모듈을 사용하는

  1. 스위치 :

    그들은 다음과 같은 옵션을 권장합니다.

  2. 마이크로 컨트롤러에서 iAP 프로토콜을 구현하고 바닐라 RN42를 사용하여 데이터를 전송합니다 (이론적으로는 35kB/s로 되돌려 야합니다).
  3. 기기의 데이터를 버퍼링하여 느린 속도로 다시 전송합니다.
  4. 바닐라 RN42와 iAP 스택을 구현하는 PIC 장치 중 하나를 사용하십시오.

나는 5 번째 제안을 제안합니다 ... 새로운 Apple 지원 Bluetooth 모듈을 찾으십시오.

또한 4 선 UART 통신을 사용하면 충돌에 도움이됩니다.

+0

다른 Apple 지원 Bluetooth 모듈을 찾았습니까? 필요합니다. – 4ntoine

+0

@ 4ntoine AmpedRF 옵션을 사용해보십시오. 그들은 BLE 및 BT 모듈의 훌륭한 컬렉션을 가지고 있습니다. – SJoshi

+0

내가 필요한 것 같습니다. 그러나 일반 사용자에게도 판매하지 않는 것으로 보입니다. – 4ntoine

관련 문제