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;
[...]
다른 Apple 지원 Bluetooth 모듈을 찾았습니까? 필요합니다. – 4ntoine
@ 4ntoine AmpedRF 옵션을 사용해보십시오. 그들은 BLE 및 BT 모듈의 훌륭한 컬렉션을 가지고 있습니다. – SJoshi
내가 필요한 것 같습니다. 그러나 일반 사용자에게도 판매하지 않는 것으로 보입니다. – 4ntoine