私たちは、Wi-Fi対応の患者監視システムを導入しています。ここでは、ソケット接続と通信を利用したアンドロイドアプリケーションと患者監視システム(PMS)デバイス間の通信を確立するための要件は、packets
の形式で行われる必要があります。要求を開始すると、データは継続的にSocket
以上のデータを送信しますが、パケットの形式でデータを形成することはできません。誰でもデータパケットの形でデータを送信する方法を教えてください。どのようにソケット接続を使用してパケットの形で患者監視システム(PMS)にアンドロイドアプリケーションから通信するには?
ヘッダフィールドは、実行される操作の種類を示します。
データペイロードフィールドには、長さと実際のデータの2つのフィールドが含まれます。
データの長さは、 が従うデータのバイト数を示します。
データペイロードフィールドはオプションです。
1ビット転送の方向です。 0 - 読み取り、1 - 書き込み。
コマンドフィールド(7ビット)は、実行するコマンドを指定します。
オプション1フィールドは、考慮中のパラメータ に関する情報を提供します。
オプション2(下位4ビット)とオプション3(上位4ビット)フィールド はオプションです。特定のコマンドの場合、それらは特定の の意味を持つデータを運びます。他のコマンドでは、無視されます。下記の
コードは
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
からデータを読み取るために複数の方法を試してみましたか?
ありがとうございます。
は、任意のペアリングプロトコルは、そのようなデバイスやsomehtingを認証するために、おそらくそこにはありますか?また、ヘッダーはクリアですが、コード内の5バイトに追加される他の2バイトの詳細を提供できますか? – Juan
返信ありがとうございます、認証するペアリングプロトコルはありません。あなたは私を導くことができます、そのヘッダーを形成する方法? – sandeepmaaram
私は16進表記法を使ってヘッダの各バイトを設定する方法と一緒にaswerを掲示しています。この他にも、パケットの種類に関する仕様はありますか? – Juan