4

RN-42 を使用して Bluetooth 2.1 経由でデバイスからデータを読み取ろうとしています。デバイスは iPhone または iPad Mini にペアリングされ、データは短時間ストリーミングされますが、iOS & BT モジュールは数秒 (10 未満) 以内に切断 (ペアリング解除) されます。デバイスは 5 ~ 10kB/s のデータを出力しており、Bluetooth の仕様に十分収まっています。また、関数 NSInputStream [NSInputStream read: maxLength:] を実行すると、返されるバイト数が常に 158 以下になることにも気付きました。アプリとハードウェアはクラッシュしませんが、Bluetooth のペアリングが解除されるだけです。

デバイスは切断後も RN42 にデータを送信し続けているため、電子機器側の問題の可能性が低くなります。このセットアップは、Android デバイスでも問題なく機能します。切断やクラッシュなしでデータをストリーミングできます。

私が試したこと...

  • Apple が提供する外部アクセサリの例、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;
    [...]
4

1 に答える 1

5

私は Microchip (RN42 の最初のメーカーであった Roving Networks を買収した会社) の担当者とこの種の問題について話しました。 RN42 マニュアル。

RN42 を iOS デバイスとの通信に使用する場合、2.5 ~ 3kB/s より速く通信することはできません... Android やコンピューターなどとの通信に使用する場合、35kB/s (SPP 経由) で転送できます。 .

この理由は、RN42 のチップがパワー不足であり、BT スタックと、iOS デバイスが必要とするフォーマット (iAP プロトコル) でのバイトの再パッケージ化の両方を処理できないためです。

次のオプションをお勧めします。

  1. WiFi モジュールの使用に切り替えます。
  2. マイクロコントローラーに iAP プロトコルを実装し、通常の RN42 を使用してデータを転送します (理論的には 35kB/s に戻るはずです)。
  3. デバイスでデータをバッファリングし、遅い速度で送り返します。
  4. 通常の RN42 と、iAP スタックを実装する PIC デバイスの 1 つを使用します。

丁寧な 5 番目の提案があります... Apple がサポートする新しい Bluetooth モジュールを見つけてください。

さらに、4 線式の UART 通信を使用すると、クラッシュに役立つはずです。

于 2013-11-17T05:05:17.990 に答える