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

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>
时间: 2024-10-11 03:56:33

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

Android Wi-Fi Peer-to-Peer(Android的Wi-Fi P2P对等网络)

Wi-Fi peer-to-peer(P2P,对等网络),它同意具备对应硬件的Android 4.0(API level 14)或者更高版本号的设备能够直接通过wifi而不须要其他中间中转节点就能直接通信(Android的Wi-Fi P2P框架符合Wi-Fi联盟的Wi-Fi Direct?直连认证标志).使用这些API.你能够搜索并连接其他相同支持Wi-Fi P2P的设备,然后再通过一个快速的连接进行互相通信,而且这个连接的有效距离要比蓝牙连接的有效距离要长的多. 这对于须要在用户之间共享数据的

转自邓凡平 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第七章 深入理解Wi-Fi P2P部分节选

本章主要内容: 介绍Wi-Fi P2P相关知识: 介绍Android中WifiP2pService.wpa_supplicant的相关代码. 7.1  概述 承接第6章介绍的WSC,本章将继续介绍Wi-Fi Alliance(Wi-Fi联盟)推出的另外一项重要技术规范Wi-Fi P2P.该规范的商品名为Wi-Fi Direct,它支持多个Wi-Fi设备在没有AP的情况下相互连接. 在Android平台的Wi-Fi相关模块中,P2P的功能点主要集中在: Android Framework中的Wif

Handler消息传递机制(四)子线程接收主线程发送的消息

package com.example.looper; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widg

Android软件开发之发送短信与系统短信库解析

今天我和同学们讨论一下Android平台下如何调用系统方法发送短信.接收短信.系统的短信库相关的问题.进入正题,我们先使用Eclipse工具模拟给自己的模拟器发送一条短信.在Eclipse下打开DDMS Incoming number: 这里须要填写的是发件人的手机号码,这里只能输入数字否则会无法发送. Message: 这里为发送的内容send: 上面两项都填写完毕点击发送键可以给模拟器发送短信. <ignore_js_op> 点击发送后,模拟器中就可以看到自己收到了一条消息 发件人的号码为

Android 统计Wifi/2G/3G/4G流量

需求: 统计Wifi/2G/3G/4G流量各多少 Issue: 一. 怎么判断2G/3G/4G 系统源码TelephonyManager类里提供了方法,只是隐藏了,所以可以参源码 二.怎么统计 Android 2.2后提供TrafficStats类,用来进行流量统计,具体使用参考手册 这里我用到了 static long  getTotalRxBytes()  //获取总的接受字节数,包含Mobile和WiFi等 static long  getTotalTxBytes()  //总的发送字节数

android 中调用接口发送短信

android中可以通过两种方式发送短信 第一:调用系统短信接口直接发送短信:主要代码如下: Java代码   //直接调用短信接口发短信 SmsManager smsManager = SmsManager.getDefault(); List<String> divideContents = smsManager.divideMessage(content); for (String text : divideContents) { smsManager.sendTextMessage(&

Android开发——WiFi信号检测

1.首先在AndroidManifest.xml文件中添加如下代码以开启权限: <!-- 获取WiFi状态的权限 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- 改变网络状态的权限 --> <uses-permission android:name="android.permission.CHANGE_NETWORK_STA

TCP连接建立系列 — 客户端接收SYNACK和发送ACK

主要内容:客户端接收SYNACK.发送ACK,完成连接的建立. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 接收入口 tcp_v4_rcv |--> tcp_v4_do_rcv |-> tcp_rcv_state_process |-> tcp_rcv_synsent_state_process 1. 状态为ESTABLISHED时,用tcp_rcv_established()接收处理. 2. 状态为LISTEN时,说明这个sock处于监

Android面向HTTP协议发送get请求

/** * 採用get请求的方式 * * @param username * @param password * @return null表示求得的路径有问题,text返回请求得到的数据 */ public static String getRequest(String username, String password) { try { String path = "http://172.22.64.156:8080/0001AndroidWebService/LoginServlet?use