2016-10-07 5 views
0

Androidタブレットからオーディオを録音して、Pythonサーバーに送信しようとしています。バイトパケットの開始時に、私はAndroidアプリケーションの状態に関するいくつかの関連情報を含んでいます( "actives"と呼ばれるバイト配列ですが、Javaサーバによってうまく受信されたと考えれば、これは関係ありません)。アンドロイドコードは次のとおりです。UDPパケットはJavaで正常に受信されましたが、Pythonで破損しました

    int read = recorder.read(buffer, 0, buffer.length); 

        for (int a = 0; a < actives.length; a++) { 
         outBuffer[a+1] = (byte)actives[a]; 
         logger = logger + Byte.toString(actives[a]) + ","; 
        } 
        int furthest=0; 
        for(int a =0; a < buffer.length; a++){ 
         outBuffer[actives.length+1+a]=buffer[a]; 
         if(buffer[a]!=0)furthest=a; 
        } 
        packet = new DatagramPacket(outBuffer, read, 
          serverAddress, PORT); 
        Log.d("writing", logger+Byte.toString(outBuffer[7])+".length"+Integer.toString(1+furthest+actives.length+1)); 
        Log.d("streamer","Packet length "+outBuffer.length); 
        try { 
         socket.send(packet); 
        }catch (IOException e){ 
         Log.e("streamer", "Exception: " + e); 
        } 
        Log.d("streamer","packetSent"); 

Javaサーバーを使用して、相手側にきれいな信号を受信します。受け取ったJava出力の 画像:!(http://i.imgur.com/31UWzya.png) は、これは私のJavaサーバである:ここで

DatagramSocket serverSocket = new DatagramSocket(3001); 
int byteSize=970; 
byte[] receiveData = new byte[byteSize]; 
DatagramPacket receivePacket = new DatagramPacket(receiveData, 
     receiveData.length); 
while(true){  // recieve data until timeout 
         try { 
          serverSocket.receive(receivePacket); 
          String rcvd = "rcvd from " + receivePacket.getAddress(); 
          System.out.println("receiver"+"Received a packet!" +rcvd); 

          break; 
         } 
         catch (Exception e) { 
          // timeout exception. 
          System.out.println("Timeout reached without packet!!! " + e); 
      timeoutReached=true; 
          break; 

         } 
       } 
if(timeoutReached)continue; 
    currTime = System.currentTimeMillis(); 

    data = receivePacket.getData(); 

は私のPythonサーバーの出力です: (http://i.imgur.com/RYkcCCE.png) そして、ここではコードです:!

import socket 
ip="192.ip.address" 
port=3001; 
sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); 
sock.bind(('',port)); 
while(True): 
    data,addr=sock.recvfrom(970); 
    print("address",addr); 
    print("received a data!"); 
    print(data); 

pythonスクリプトの最後の行で、「print(data)」を「print(data.decode())」に変更しようとしましたが、その場合はこのエラーが表示されます:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128) 

私は同時にこれらのサーバーを実行していません 私は、unsigned intsとpythonを使ってJavaで何かをしなければならないと思います。 data.decode()が機能していないので、このデータをPythonで変換できる方法はありますか?別の方法として、Javaでデータを何とか変換できるはずですか?私が試したstackoverflowの答えのどれも働いていません。

答えて

0

これは正面から攻撃するのにかなり残酷でした。私は別のSOのポストのように、Javaで(送信する前に)エンコーディングを指定しようとしましたが、それは助けになりませんでした。だから私は、Androidのバイト配列をコンマ区切りの文字列に変換し、文字列をUTF-8バイトに変換することで問題を解決しました。

sendString=""; 
for(int a =0; a < buffer.length; a++){ 
      sendString=sendString+Byte.toString(buffer[a])+","; 
} 
byte[] outBuffer = sendString.getBytes("UTF-8"); 

whileループを実行するたびに文字列をnull( "")にリセットするか、ishが非常に遅くなることを確認してください。

はその後、Pythonで、右受け取った後:私は980個の文字を文字列化しておりますが

data=data.decode("utf8"); 

を、私が、私は生を送ることができることを望むんが...処理時間に多くを追加するためには表示されません。バイトは、速度は私にとってここで非常に重要です。誰かがより良い解決策を考え出すことができるように、質問を開いたままにしておきます。

1

デコードは正しいアプローチです。あなたのアンドロイドアプリでは、文字エンコーディングを明示してください。 UTF-8は、使用される標準の文字セットです。

あなたのログはかなり明確です。データパケットをASCII(デフォルトのエンコーディングはdecode() function)としてデコードしようとしていますが、ISO_8859_1またはUTF-8(おそらく)を推測しています。

次は、アンドロイドアプリでdata.decode('utf8', 'ignore')を試してみてください。注:'ignore'はオプションの引数であり、不正な(破損した)データを無視して個々の文字を変換しようとするため、デバッグの場合にのみ使用されます。プロダクションでdecode()を使用する場合は、「strict'」を使用するか、2番目の引数を使用しないでください('strict'がデフォルトです)。

'utf8'の代わりに、Python Encodingsから他のオプションを試してみてください。

+0

ありがとうございました。あなたが言及したエンコーディングと他のさまざまなエンコーディングを試しましたが、私はまだPythonでスクランブルされた出力に終わります。 私は分かりません。これは非常にシンプルなビットストリームです(オプションは-256から256までです)。私はバイト配列として挿入しています。このようなシンプルなデータ型を送信することについては心配する必要はありません – Kevin

+0

バイナリデータを扱う場合は、Base64エンコーディングを使用することをお勧めします。 Javaプログラムのバイナリデータを[エンコード]する(https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html#encodeBase64String(byte [])) withと[decode](https://docs.python.org/2/library/base64.html#base64.b64decode)をPythonサーバーに戻します。なぜこれが良い習慣であるかに関する詳細:http://stackoverflow.com/questions/201479/what-is-base-64-encoding-used-for –

関連する問題