2017-06-04 12 views
0

私たちは、Wi-Fi対応の患者監視システムを導入しています。ここでは、ソケット接続と通信を利用したアンドロイドアプリケーションと患者監視システム(PMS)デバイス間の通信を確立するための要件は、packetsの形式で行われる必要があります。要求を開始すると、データは継続的にSocket以上のデータを送信しますが、パケットの形式でデータを形成することはできません。誰でもデータパケットの形でデータを送信する方法を教えてください。どのようにソケット接続を使用してパケットの形で患者監視システム(PMS)にアンドロイドアプリケーションから通信するには?

リクエストの形式は次のとおりです。 enter image description here

ヘッダフィールドは、実行される操作の種類を示します。

データペイロードフィールドには、長さと実際のデータの2つのフィールドが含まれます。

データの長さは、 が従うデータのバイト数を示します。

データペイロードフィールドはオプションです。

ヘッダフィールドを以下に示す: - enter image description here

1ビット転送の方向です。 0 - 読み取り1 - 書き込み

コマンドフィールド(7ビット)は、実行するコマンドを指定します。

オプション1フィールドは、考慮中のパラメータ に関する情報を提供します。

オプション2(下位4ビット)とオプション3(上位4ビット)フィールド はオプションです。特定のコマンドの場合、それらは特定の の意味を持つデータを運びます。他のコマンドでは、無視されます。下記の

コマンド規格: - enter image description here

コードは

activity_mainの下に与えられたスニペット。XML

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#2D3238" 
android:padding="10dp"> 

    <Button 
     android:id="@+id/connectBtn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:layout_marginTop="10dp" 
     android:onClick="onClick" 
     android:text="Connect" /> 
</RelativeLayout> 

MainActivity.java

package com.test.pms.app; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 

import com.test.pms.app.R; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class MainActivity extends Activity implements View.OnClickListener { 
    private Button connectBtn; 
    private Socket socket = null; 
    private boolean isRunning = false; 
    private String ipAddress = "192.168.1.55"; 
    private int portNumber = 4561; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    connectBtn = (Button) findViewById(R.id.connectBtn); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    isRunning = true; 
} 

@Override 
protected void onPause() { 
    isRunning = false; 
    super.onPause(); 
} 

@Override 
public void onClick(View v) { 
    int id = v.getId(); 
    switch (id) { 
     case R.id.connectBtn: 
      new CommunicateTask().execute(); 
      break; 
    } 
} 

private class CommunicateTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     sendData(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
    } 
} 


private void sendData() { 
    DataOutputStream dataOutputStream = null; 
    DataInputStream dataInputStream = null; 
    try { 
     socket = new Socket(ipAddress, portNumber); 
     dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
     MainActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       connectBtn.setText(getString(R.string.connected)); 
      } 
     }); 
     /* byte[] byteArray = new byte[5]; 
     byteArray[0] = (byte) 1; //direction 0-write and 1- read 
     byteArray[1] = (byte) 3; // Command Type 3 - CMD_TIMESTAMP 
     byteArray[2] = (byte) 1; //Option1- SPO2 
     byteArray[3] = (byte) 0; //Option2: Nothing 
     byteArray[4] = (byte) 1; //Option3 : RED*/ 
     String command = "CMD_TIMESTAMP"; 
     // byte arr[] = {1, 0, 0, 0, 0, 1, 0, 0}; 
     dataOutputStream.writeUTF(command); 
     dataInputStream = new DataInputStream(socket.getInputStream()); 
     //dataOutputStream.write(byteArray); 
     //dataOutputStream.writeUTF(command); 
     // dataInputStream.write(arr); 
     // dataOutputStream.writeUTF("Hello Server"); 
     while (isRunning) { 
      if (socket.isConnected()) { 
       String b = dataInputStream.readLine(); 
      } 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (socket != null) { 
      try { 
       socket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     if (dataOutputStream != null) { 
      try { 
       dataOutputStream.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     if (dataInputStream != null) { 
      try { 
       dataInputStream.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (socket != null) { 
     try { 
      socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    } 
} 

ここでソケット接続が正常に確立が、私は読み取ることができませんでしたInputStreamからデータを読み取るしようとしています。実行はdataInputStream.readLine();で停止しました。

私は誰も私にはパケットの形で要求フォーマットを形成し、パケット内のデータを読み取るために助けることができるしてください

dataInputStream.readLine(); 
dataInputStream.readByte(); 
dataInputStream.read(); 

ようInputStreamからデータを読み取るために複数の方法を試してみましたか?

ありがとうございます。

+0

は、任意のペアリングプロトコルは、そのようなデバイスやsomehtingを認証するために、おそらくそこにはありますか?また、ヘッダーはクリアですが、コード内の5バイトに追加される他の2バイトの詳細を提供できますか? – Juan

+0

返信ありがとうございます、認証するペアリングプロトコルはありません。あなたは私を導くことができます、そのヘッダーを形成する方法? – sandeepmaaram

+0

私は16進表記法を使ってヘッダの各バイトを設定する方法と一緒にaswerを掲示しています。この他にも、パケットの種類に関する仕様はありますか? – Juan

答えて

0

これは、ヘッダーの各バイトを設定する方法の例です。

ヘッダーを構成するには、各バイトを16進数で設定します。例えば

byte b = 0xA8; 

A == 10 == 0011 
8 == 8 == 1000 

then b = A8 = 00111000; 

例:

監督:1 コマンド:1010101(ちょうどコマンドを発明)

最初のバイトは我々は二組に分ける11010101

あります4ビットの:1101 0101 Thseバイナリは13進数で5 5と16進数でD5を返します

このコマンドの最初のバイトの値がに0xD5

+0

ありがとうございました。 inputStreamから連続したデータを読み取る方法。あなたがこれを手伝ってくれれば、それは私たちに役立つだろう。 – sandeepmaaram

+0

これを行うには、read値が-1である間にinputStreamを読み込むだけです()。継続的な場合は、バックグラウンドスレッドまたはサービスで行う必要があります。 – Juan

関連する問題