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

Posted 我有一壶酒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>

 








以上是关于Android接收wifi路由器发送过来的一组字节数据的主要内容,如果未能解决你的问题,请参考以下文章

android 手机和树莓派之间通过 WiFi 进行通信,无需外部调制解调器/路由器?

如何在 iOS 应用程序上接收连接的 WiFi 模块/路由器发送的数据?

android-Android udp接收不到组播,请问如何解决

Android手机只开启Wifi,但是不连接任何一个路由器,能不能收到路由器转发的UDP广播数据包,如何现实?

如何通过 Android 设备创建的 WiFi 直接网络在 iOS 中使用 ZeroMQ 发送/接收消息

如何查看连接到我的路由器的设备列表并选择其中一个,然后从中发送和接收数据