2017-08-02 3 views
-1

My research showed(5ページ参照)、Bluetooth 4.2で送信できるデータの最大量は257バイトです。なぜBluetooth 4.2を介して明らかな最大量以上のデータを送信できましたか?

しかし、PythonスクリプトとJavaアプリケーションの間で990バイトを送信できました。なぜ私はそんなに多くのデータを送ることができたのですか?最大データについて見つかった情報が間違っているのですか、それとも何か他のことが起きましたか?

のPythonのBluetoothスクリプト:

 #Parameters config 
     sdr=RtlSdr() 
     sdr.fc=100e6 
     sdr.gain=48 
     sdr.rs=1.024e6 

     #Bluetooth connection 

     server_sock=BluetoothSocket(RFCOMM) 
     server_sock.bind(("",PORT_ANY)) 
     server_sock.listen(1) 

     port=server_sock.getsockname()[1] 
     uuid="94f39d29-7d6d-437d-973b-fba39e49d4ee" 
     client_sock,client_info=server_sock.accept() 
while (1): 
     samples= sdr.read_samples(256*1024) 
     result=psd(samples, NFFT=70, Fc=sdr.fc/1e6, Fs=sdr.rs/1e6) 
     tab_freq=(result[1]) 
     value_freq=str(tab_freq)[1:-1] 
     value_freq2=[format(float(v),".4f")[:6] for v in value_freq.split()] 
     value_freq3="\n".join(value_pxx2) 

     #SAME FOR POWER VALUE 
     #THEN I SEND DATA BY BLUETOOTH 

     client_sock.send(value_freq3) 

のJavaのBluetoothコード:

private class ThreadConnected extends Thread { 
     private final BluetoothSocket connectedBluetoothSocket; 
     private final InputStream connectedInputStream; 
     private final OutputStream connectedOutputStream; 

     boolean running; 

     public ThreadConnected(BluetoothSocket socket) { 
      connectedBluetoothSocket = socket; 
      InputStream in = null; 
      OutputStream out = null; 
      running = true; 
      try { 
       in = socket.getInputStream(); 
       out = socket.getOutputStream(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      connectedInputStream = in; 
      connectedOutputStream = out; 
     } 

     @Override 
     public void run() { 
      byte[] buffer = new byte[1048576]; // 20 bits 
      int bytes; 
      String strRx = ""; 

      while (running) { 
       try { 
        bytes = connectedInputStream.read(buffer); 
        final String strReceived_freq = new String(buffer,0, bytes/2); 
        final String strReceived_pxx = new String(buffer,(bytes/2)+1, bytes); 
        //final int samples_sdr=new Integer(buffer,0,bytes); 
        final String strByteCnt = String.valueOf(bytes) + " bytes received.\n"; 

        runOnUiThread(new Runnable(){ 

         @Override 
         public void run() { 
           Pxx_value.setText(strReceived_pxx+"\n"); // get data PXX 
           freq_value.setText(strReceived_freq+"\n"); // get data freq 

          // plot value 
          /* for (int i=0; i<nb_points; i++) 
          { 
           freq[i]=Double.parseDouble(strReceived_freq); 
           pxx[i]=Double.parseDouble(strReceived_pxx); 
           series.appendData(new DataPoint(freq[i],pxx[i]), true,500); 
          }*/ 

         }}); 

       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        cancel(); 

        final String msgConnectionLost = "Connection lost:\n" + e.getMessage(); 
        runOnUiThread(new Runnable(){ 

         @Override 
         public void run() { 

         }}); 
       } 
      } 
     } 

     public void write(byte[] buffer) { 
      try { 
       connectedOutputStream.write(buffer); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     public void cancel() { 
      running = false; 
      try { 
       connectedBluetoothSocket.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
+0

@CodyGrayを編集していただきありがとうございます。 – azerty12345678

+0

あなたは大歓迎です!フィードバックに応じてあなたの質問を更新して更新していただきありがとうございます。誰もがそれをするならば、物事はとてもスムーズに行くでしょう。素晴らしい答えを得ることを願っています! –

+0

私はBluetoothデバイスが複数の前立てを送信していないと確信していますか? – Emax

答えて

0

あなたがショーにリンクする文書に指定されているLE(低エネルギー)リンクレイヤパケットフォーマット、第6巻、パートB、セクション2.1のBluetoothコア仕様。

Bluetooth Classic(別名BR/EDR)プロファイルであるRFCOMMを使用しています。 BR/EDRのためのリンク層パケットフォーマットは第2巻、パートB、セクション6で規定されており、ペイロードは最大2790バイトであることが示されている。

いずれの場合でも、使用しているAPIはリンクレイヤへのアクセス権を与えません。 RFCOMMチャンネル(これは多かれ少なかれシリアルポートのように動作するように設計されています)で書いており、必要なだけ多くのバイトを書くことができます。あなたのライブラリと基盤となるプラットフォームは、データを適切な数のL2CAPパケットに配置して、リンク層パケットにさらにカプセル化します。実行する主な制限は、実装内のバッファサイズです。この場合、ソケットベースのAPIは、呼び出しで書き込まれたバイト数をsendに返します。後で再送信を試みることができます。

+0

この情報をありがとう!私はバッファサイズを 'byte [] buffer = new byte [1048576]に固定しました。 // 20ビット 'それは正常ですか? – azerty12345678

+0

はい1MB以上で受信バッファが十分です。私は最大L2CAP MTUである65535を使用しますが、私のユースケースではそれに到達しません。 –

+0

これは、およそ990バイトの後に、私の値が新しい値で消去されるので、本当に奇妙です。 – azerty12345678

関連する問題