您的位置:首页 > 移动开发 > Android开发

Android接收wifi路由器发送过来的一组字节数据

2016-10-21 09:16 423 查看
1、字节数组转换为字符串

byte[] byBuffer = new byte[20];
... ...
String strRead = new String(byBuffer);
strRead = String.copyValueOf(strRead.toCharArray(), 0, byBuffer.length]);

2、字符串转换成字节数组

byte[] byBuffer = new byte[200];
String strInput="abcdefg";
byBuffer= strInput.getBytes();

注意:如果字符串里面含有中文,要特别注意,在Android系统下,默认是UTF8编码,一个中文字符相当于3个字节,只有gb2312下一个中文相当于2字节。这种情况下可采取以下办法:

byte[] byBuffer = new byte[200];
String strInput="我是字符串";
byBuffer= strInput.getBytes("gb2312");

主界面代码

package my.work.Library;

import java.util.Timer;
import java.util.TimerTask;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

public class WsnActivty extends Activity {
/** Called when the activity is first created. */
private Button btnNetwork;
private String strIpAddr = null;
static TextView textTips,seat;
private ClientThread clientThread = null;
private Message MainMsg;
public static Handler mainHandler;
static final int TIPS_UPDATE_UI = 3;   //tips_update_ui
static final int SEAT_UPDATE_UI = 6;   //seat_update_ui

static final int MAX_NODE = 4;
static byte NodeData[][] = new byte[MAX_NODE][5];; // [5] 0=温度 1=湿度 2=气体 3=灯
static final int RX_DATA_UPDATE_UI = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initControl();
initMainHandler();

}
private void initControl() {
// TODO Auto-generated method stub
btnNetwork = (Button) findViewById(R.id.btn_network);
btnNetwork.setOnClickListener(new ButtonClick());

textTips = (TextView) findViewById(R.id.Tips);
textTips.setText(R.string.init_tips);

seat = (TextView) findViewById(R.id.statc001);
seat.setText(R.string.people1);

}
class ButtonClick implements OnClickListener {
@Override
public void onClick(View v) {

switch (v.getId()) {
case R.id.btn_network: // 连接网络
showDialog(WsnActivty.this);
break;
}
}
}

// 显示连接对话框
private void showDialog(Context context) {
final EditText editIP = new EditText(context);
editIP.setText("192.168.0.10");

AlertDialog.Builder builder = new AlertDialog.Builder(context);
// builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("请输入服务器IP地址");
builder.setView(editIP);
builder.setPositiveButton("连接", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
strIpAddr = editIP.getText().toString();
boolean ret = isIPAddress(strIpAddr);

if (ret) {
textTips.setText("服务器IP地址:" + strIpAddr);
} else {
strIpAddr = null;
textTips.setText("IP地址不合法,请重新设置");
return;
}

clientThread = new ClientThread(strIpAddr);// 建立客户端线程
clientThread.start();

//mainTimer = new Timer();// 定时查询所有终端信息
//setTimerTask();
}
});
builder.setNeutralButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
if (clientThread != null) {
MainMsg = ClientThread.childHandler
.obtainMessage(ClientThread.RX_EXIT);
ClientThread.childHandler.sendMessage(MainMsg);
textTips.setText("与服务器断开连接");
}
}
});

builder.show();
}

// 判断输入IP是否合法
private boolean isIPAddress(String ipaddr) {
boolean flag = false;
Pattern pattern = Pattern
.compile("\\b((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\b");
Matcher m = pattern.matcher(ipaddr);
flag = m.matches();
return flag;
}

void initMainHandler() {
mainHandler = new Handler() {

// 主线程消息处理中心
public void handleMessage(Message msg) {
switch (msg.what) {
case TIPS_UPDATE_UI:
String str = (String) msg.obj;  //连接成功
textTips.setText(str);
break;
case SEAT_UPDATE_UI:
String strseat = (String) msg.obj;  //连接成功
seat.setText(strseat);
break;
}
super.handleMessage(msg);
}
};
}

}


子线程代码

package my.work.Library;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.widget.Toast;

public class ClientThread extends Thread {

private OutputStream outputStream = null;
private InputStream inputStream = null;
private Socket socket;
private SocketAddress socketAddress;
public static Handler childHandler;
private boolean RxFlag = true;
final int TEXT_INFO = 12;
static final int RX_EXIT = 11;
static final int TX_DATA = 10;
Context mainContext;
Message msg;
private String strIP;
final int SERVER_PORT = 33333;
byte cNodeData[][] = new byte[4][5]; // [5] 0=温度 1=湿度 2=气体 3=灯
int RxCount = 0, nRecvLen, index = 0;
byte CheckSum;
// byte strRxBuf[] = new byte[256];
int ucRecvLen = 7;

private RxThread rxThread;

//获取WsnActivty.java 开辟子线程clientThread对象线程传递过来的ip地址
public ClientThread(String ip) {
strIP = ip;
}

// 连接网络
void connect() {
RxFlag = true;
socketAddress = new InetSocketAddress(strIP, SERVER_PORT);
socket = new Socket();

try {
socket.connect(socketAddress, SERVER_PORT);
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();

msg = WsnActivty.mainHandler.obtainMessage(
WsnActivty.TIPS_UPDATE_UI, "连接成功");
WsnActivty.mainHandler.sendMessage(msg);

rxThread = new RxThread();
rxThread.start();

} catch (IOException e) {
try {
sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
msg = WsnActivty.mainHandler.obtainMessage(
WsnActivty.TIPS_UPDATE_UI, "无法连接到服务器");
WsnActivty.mainHandler.sendMessage(msg);
e.printStackTrace();
} catch (NumberFormatException e) {

}
}

void initChildHandler() {

Looper.prepare(); // 在子线程中创建Handler必须初始化Looper

childHandler = new Handler() {
// 子线程消息处理中心
public void handleMessage(Message msg) {

// 接收主线程及其他线程的消息并处理...
/**
* MainMsg = ClientThread.childHandler.obtainMessage(ClientThread.TX_DATA,
* len, 0, (Object) buffer);
* SendData(SendBuf, 7);
*/
switch (msg.what) {

case RX_EXIT:
RxFlag = false;
try {
if (socket.isConnected()) {
inputStream.close();
outputStream.close();
socket.close();
}

} catch (IOException e1) {
e1.printStackTrace();
}

childHandler.getLooper().quit();// 结束消息队列

break;

default:
break;
}

}
};

// 启动该线程的消息队列
Looper.loop();

}

public void run() {
connect();
initChildHandler();
msg = WsnActivty.mainHandler.obtainMessage(WsnActivty.TIPS_UPDATE_UI,
"与服务器断开连接");
WsnActivty.mainHandler.sendMessage(msg);
}

// socket 接收线程
public class RxThread extends Thread {
public void run() {
try {
while (socket.isConnected() && RxFlag) {
byte strRxBuf[] = new byte[30];
byte i;
int RxIndex, len, readBytes = 0;
//                    msg = WsnActivty.mainHandler.obtainMessage(
//                            WsnActivty.SEAT_UPDATE_UI, "有人");
//                    WsnActivty.mainHandler.sendMessage(msg);
//
len = inputStream.read(strRxBuf, readBytes, ucRecvLen
- readBytes);

String strRead = new String(strRxBuf);
strRead = String.copyValueOf(strRead.toCharArray(), 0, strRxBuf.length);

msg = WsnActivty.mainHandler.obtainMessage(
WsnActivty.SEAT_UPDATE_UI, strRead);
WsnActivty.mainHandler.sendMessage(msg);

}
if (socket.isConnected())
socket.close();

} catch (IOException e) {
e.printStackTrace();
}
}
}

byte GetDataLen(byte fc) {
byte len = 0;

switch (fc) {
case 0x01:
len = 22;
break;
case 0x07:
case 0x08:
case 0x0A:
case 0x0B:
case 0x0C:
case 0x0D:
len = 7;
break;
}

return len;
}

}


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
android:id="@+id/Tips"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/init_tips"
android:textSize="40px"
android:textColor="#00ff00"
/>
<Button
android:id="@+id/btn_network"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/login"
android:textSize="40px"
android:textColor="#00ff00"
/>

<TextView
android:id="@+id/statc001"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:textSize="40px"
android:textColor="#00ff00"
/>
<TextView
android:id="@+id/statc002"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:textSize="40px"
android:textColor="#00ff00"
/>
<TextView
android:id="@+id/statc003"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:textSize="40px"
android:textColor="#00ff00"
/>
<TextView
android:id="@+id/statc004"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:textSize="40px"
android:textColor="#00ff00"
/>
<TextView
android:id="@+id/statc005"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:textSize="40px"
android:textColor="#00ff00"
/>

</LinearLayout>


string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="login">连接服务器</string>
<string name="app_name">梧州学院图书馆刷卡入座系统</string>
<string name="move">获取视频流</string>
<string name="init_tips">提示:请先打开WiFi或GPRS再连接网络</string>
<string name="people1">空座</string>
<string name="people2">有人</string>

</resources>


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.work.Library"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="15" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".WsnActivty"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: