> 文档中心 > Android Studio开发安卓UDP网络读写器APP

Android Studio开发安卓UDP网络读写器APP

 网络读卡器介绍:WIFI无线网络RFID云读卡器远程网络开关物流网NB-IoT4G刷卡阅读器-淘宝网 (taobao.com)icon-default.png?t=M4ADhttps://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-17663462243.14.69e26baarP5ddP&id=22173284717

1、安卓需开启WIFI无线网络通讯权限

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.udpcardreaderandroid">

   
   
   
   
   
   

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
       
            android:screenOrientation="portrait">
           
               

               
           
       
   

2、Android Studio源码
package com.example.udpcardreaderandroid;

import androidx.appcompat.app.AppCompatActivity;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import java.net.*;
import java.util.*;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class MainActivity extends AppCompatActivity {
    private String Myip;
    private TextView tv;
    public TextView Recv;
    private EditText RemotIpV;
    private EditText InputstrV;
    private RadioGroup MyradioGroup;
    private RadioButton MyradioB1;
    private RadioButton MyradioB2;
    private RadioButton MyradioB3;

    private static int BROADCAST_PORT = 39169;
    public DatagramSocket Recsock ;
    public boolean RecsockIsRuning;
    public  Handler MyHandler;
    public  Handler MyHandler2;

   // public String RemoteHostIP;
   // public int RemotePort;
   // public byte GetBuf[]=new byte [1024];
   // public String CardNoStr;

    public byte LastBuf[]=new byte [1024];
    public byte readcardbuf[];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  //禁止屏幕旋转,强制竖屏运行

        tv = findViewById(R.id.textView);
        Recv= findViewById(R.id.textView2);
        Recv.setTextIsSelectable(true);
        RemotIpV=findViewById(R.id.editT) ;
        InputstrV=findViewById(R.id.editT2) ;
        MyradioGroup=findViewById(R.id.groupradiobut) ;
        MyradioB1=findViewById(R.id.radioButton1) ;
        MyradioB2=findViewById(R.id.radioButton2) ;
        MyradioB3=findViewById(R.id.radioButton3) ;

        Myip = getIP();
        tv.append(Myip+":"+Integer.toString(BROADCAST_PORT));

        if(!RecsockIsRuning){ InitRecSock(); } //初始化Sock,开启接收线程

        MyHandler = new Handler()
        {
            @Override
            public void handleMessage(Message msg) {    //线程内更新显示
                String text = (String) msg.obj;
                Recv.append(text);
            }
        };

        MyHandler2 = new Handler()
        {
            @Override
            public void handleMessage(Message msg)
            {    //线程内更新显示
                String text = (String) msg.obj;
                InputstrV.setText(text);
            }
        };
    }

    public void InitRecSock(){
        try{
            if (RecsockIsRuning){Recsock.close(); }
            Recsock = new DatagramSocket(BROADCAST_PORT);
            new udpReceiveAndSend().start();
            RecsockIsRuning=true;
        } catch  (Exception e){
            Recv.append("Port err!\n\n");
            RecsockIsRuning=false;
        }
    }

    public void updatetrack(String s)  //线程内更新显示
    {
           if (Recv.getLineCount() > 20) {
               Recv.setText("");
           }
           Message msg = new Message();
           String textTochange = s;
           msg.obj = textTochange;
           MyHandler.sendMessage(msg);
    }

    public void updatetrack2(String s)  //线程内更新显示
    {
        Message msg = new Message();
        String textTochange = s;
        msg.obj = textTochange;
        MyHandler2.sendMessage(msg);
    }

    public void SearchDiv(View vies){
        new SearchDivThread().start();
    }

    private class SearchDivThread extends  Thread {   //搜索在线设备线程
        @Override
        public void run() {
            String SendInfStr="a6";
            byte[] SendBuf = new byte[1];                              /** 提供发送数据,封装打包 a6 为搜索在线设备的指令 */
            SendBuf[0]=(byte)0xa6;
            try{
                if (!RecsockIsRuning){InitRecSock();}
                DatagramPacket dp1=new DatagramPacket(SendBuf,SendBuf.length,InetAddress.getByName("255.255.255.255"),BROADCAST_PORT);
                Recsock.send(dp1);
                updatetrack("SendTo:255.255.255.255 Data:a6\n\n");
            }catch  (Exception e){
                updatetrack("搜索设备出错:\n");
                updatetrack(e.getMessage()+"\n\n");
                RecsockIsRuning=false;
                Recsock.close();
                InitRecSock();
            }
        }
    }

    private class udpReceiveAndSend extends  Thread {  //Udp端口接收线程
        @Override
        public void run() {
            while (RecsockIsRuning) {
                try {
                    int p = 0;
                    int j = 0;
                    int m = 0;
                    String ReceiveDataStr = "";
                    String bytestr = "";
                    String CardNo16 = "";
                    String SerialNum = "";
                    String CardInfStr = "";
                    String CardNoStr= "";
                    long cardno10=0;
                    long cardnum=0;
                    int length=0;
                    String RemoteHostIP;
                    int RemotePort;
                    byte[] data = new byte[1024];

                    DatagramPacket rdp = new DatagramPacket(data, data.length);   /**预先创建接收数据存放的位置,封装*/
                    Recsock.receive(rdp);                                         /**使用receive阻塞式接收*/
                    RemoteHostIP = rdp.getAddress().getHostAddress();             /*数据来源IP */
                    RemotePort = rdp.getPort();                                   /*数据来源端口*/
                    length = rdp.getLength();
                    data = rdp.getData();

                    for (p = 0; p < length; p++) {
                            bytestr = "00" + Integer.toHexString(data[p] & 0xff);
                            ReceiveDataStr = ReceiveDataStr + bytestr.substring(bytestr.length() - 2, bytestr.length()) + " ";
                    }
                    updatetrack("FromIP:" + rdp.getAddress().getHostAddress() + " Data:" + ReceiveDataStr + "\n");

                    if (length >= 8 && length<200) {                                             //判断是否是重复上传的数据包
                        if (data[0] == LastBuf[0] && data[1] == LastBuf[1] && data[2] == LastBuf[2] && data[3] == LastBuf[3] && data[4] == LastBuf[4] && data[5] == LastBuf[5] && data[6] == LastBuf[6] && data[7] == LastBuf[7] && data[8] == LastBuf[8]) {
                            DisableSendAge(data,RemoteHostIP,RemotePort);                        //向读卡器发确认信息,否则读卡器会连续发三次
                            updatetrack("\n\n");                                              // 重复的上传的数据不分析处理,直接丢弃
                        } else {
                            for (p = 0; p < 9; p++) {
                                LastBuf[p] = data[p];                                            /*将当前接收到的数据保存,用于再次接收到数据时比对*/
                            }

                            switch (data[0]) {
                                case (byte) 0xf2:
                                    updatetrack("在线读卡器响应搜索指令\n");
                                    updatetrack("指令码      :"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                    updatetrack("设备IP      :"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                    updatetrack("掩  码      :"+Integer.toString(data[5] & 0xff)+"."+Integer.toString(data[6] & 0xff)+"."+Integer.toString(data[7] & 0xff)+"."+Integer.toString(data[8] & 0xff)+ "\n");
                                    updatetrack("端口号      :"+Integer.toString((data[9] & 0xff)+((data[10] & 0xff) *256))+ "\n");
                                    updatetrack("机  号      :"+Integer.toString((data[11] & 0xff)+((data[12] & 0xff) *256))+ "\n");
                                    updatetrack("网  关      :"+Integer.toString(data[13] & 0xff)+"."+Integer.toString(data[14] & 0xff)+"."+Integer.toString(data[15] & 0xff)+"."+Integer.toString(data[16] & 0xff)+ "\n");
                                    for(p=17;p<23;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        if(p<22){SerialNum=SerialNum+"-";}
                                    }
                                    updatetrack("网关MAC     :"+SerialNum+ "\n");
                                    String ServerIp=Integer.toString(data[23] & 0xff)+"."+Integer.toString(data[24] & 0xff)+"."+Integer.toString(data[25] & 0xff)+"."+Integer.toString(data[26] & 0xff);
                                    updatetrack("远程服务器IP:"+ServerIp+ "\n");
                                    SerialNum="";
                                    for(p=27;p<33;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        if(p<32){SerialNum=SerialNum+"-";}
                                    }
                                    updatetrack("服务器MAC   :"+SerialNum+ "\n");
                                    updatetrack("网络标识    :"+Integer.toHexString(data[33] & 0xff)+ "\n");
                                    updatetrack("响声标识    :"+Integer.toHexString(data[34] & 0xff)+ "\n");
                                    SerialNum="";
                                    String DeviceMAC="16-88-";
                                    for(p=35;p<39;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        DeviceMAC=DeviceMAC+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        SerialNum=SerialNum +Integer.toString(data[p] & 0xff);
                                        if(p<38){
                                            SerialNum=SerialNum+"-";
                                            DeviceMAC=DeviceMAC+"-";
                                        }
                                    }
                                    updatetrack("通讯模块序号:"+SerialNum+ "\n");
                                    updatetrack("设备MAC地址 :"+DeviceMAC+ "\n");

                                    if(length>39){
                                        SerialNum="";
                                        for(p=39;p<length;p++){
                                            bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                            SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        }
                                        updatetrack("设备唯一序号:"+SerialNum+ "\n");
                                    }
                                    if(ServerIp.compareTo("255.255.255.255")!=0 && ServerIp.compareTo(Myip)!=0 ){
                                        updatetrack("读卡器的远程服务器IP未指向本设备,需将读卡器的远程服务器IP设为:"+Myip+"\n");
                                        //SetNetworkPara(data,length,RemoteHostIP,RemotePort);                                      //如果需要修改读卡器的IP 掩码 网关 远程服务器IP 通讯端口,取消注释,按网络环境设定正确的值
                                    }
                                    SetNetworkPara(data); //解析并生成修改本设备网络参数的指令码,可拷贝生成的指令码并广播发送修改
                                    updatetrack("\n");
                                    break;
                                case (byte)0xf3:
                                    updatetrack("接收到的信息为心跳数据包\n");
                                    updatetrack("指令码:"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                    updatetrack("设备IP:"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                    updatetrack("机器号:"+Integer.toString((data[5] & 0xff)+((data[6] & 0xff) *256))+ "\n");
                                    updatetrack("包序号:"+Integer.toString((data[7] & 0xff)+((data[8] & 0xff) *256))+ "\n");
                                    updatetrack("心跳码:"+Integer.toHexString(data[9] & 0xff)+ "\n");
                                    updatetrack("长  度:"+Integer.toHexString(data[10] & 0xff)+ "\n");
                                    updatetrack("继电器:"+Integer.toHexString(data[11] & 0xff)+ "\n");
                                    updatetrack("按键值:"+Integer.toHexString(data[12] & 0xff)+ "\n");
                                    for(p=13;p<17;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("随机码:"+SerialNum+ "\n");
                                    SerialNum="";
                                    for(p=17;p<length;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("设备序列号:"+SerialNum+"\n\n");
                                    break;
                                case (byte)0xf8:
                                    break;
                                case (byte)0xc1:         /*接收到的信息为IC只读上传的IC卡号*/
                                    updatetrack("接收到的信息为IC只读上传的IC卡号\n");
                                    updatetrack("指令码:"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                    updatetrack("设备IP:"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                    updatetrack("机器号:"+Integer.toString((data[5] & 0xff)+((data[6] & 0xff) *256))+ "\n");
                                    updatetrack("包序号:"+Integer.toString((data[7] & 0xff)+((data[8] & 0xff) *256))+ "\n");
                                    for(p=10;p<14;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("16进制卡号:"+CardNo16+ "\n");

                                    cardnum=data[10] & 0xff;
                                    cardnum=cardnum+(data[11] & 0xff) *256;
                                    cardnum=cardnum+(data[12] & 0xff) *65536;
                                    cardnum=cardnum+(data[13] & 0xff) *16777216;
                                    cardno10 = 0;
                                    for (j=28; j>=0; j-=4) {
                                        cardno10 = cardno10<>>j & 0xF);
                                    }
                                    CardNoStr = String.format("%010d", cardno10);
                                    updatetrack("10进制卡号:"+CardNoStr+ "\n");

                                    for(p=14;p<length;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("设备序列号:"+SerialNum+"\n\n");

                                    DisableSendAge(data,RemoteHostIP,RemotePort);                        //向读卡器发确认信息,否则读卡器会连续发三次
                                    if(MyradioB1.isChecked()) {
                                        SendDispBeep(CardNoStr, RemoteHostIP, RemotePort);               //发送显示 + 蜂鸣声
                                    }else {
                                        if(MyradioB2.isChecked()){
                                            SendDispSpk(CardNoStr, RemoteHostIP, RemotePort);            //发送显示 + 固定组合语音
                                        }else{
                                            SendDispTTS(CardNoStr, RemoteHostIP, RemotePort);            //发送显示 + TTS语音
                                        }
                                    }

                                    //Thread.sleep(10);
                                    //ReadCardInf(data,length,RemoteHostIP,RemotePort);                  //如果是网络读写器,可用此方法读取指定扇区内数据
                                    break;
                                case (byte)0xc3:         /*全扇区读写器收到读卡扇区内的数据*/
                                    j=data[10] *48;
                                    m=data[11] *48;

                                    for(p=0;p<m;p++){
                                        readcardbuf[j+p]=data[16+p];
                                    }
                                    if(data[11]+data[10]>=data[9]){        /*已完全收到所有包数据,一个数据包最多传4个扇区的数据,如果读写器设备读写扇区数大于4,数据要分2个包上传,扇区数大于8要分3个包,大与12要分4个包上传*/
                                        updatetrack("接收到的信息为IC卡扇区内数据\n");
                                        updatetrack("指令码:"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                        updatetrack("设备IP:"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                        updatetrack("机器号:"+Integer.toString((data[5] & 0xff)+((data[6] & 0xff) *256))+ "\n");
                                        updatetrack("包序号:"+Integer.toString((data[7] & 0xff)+((data[8] & 0xff) *256))+ "\n");
                                        for(p=12;p<16;p++){
                                            bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                            CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        }
                                        updatetrack("16进制卡号:"+CardNo16+ "\n");

                                        m=data[9] *48;
                                        CardInfStr="";
                                        for(p=0;p<m;p++){
                                            bytestr="00"+Integer.toHexString(readcardbuf[p] & 0xff);
                                            CardInfStr=CardInfStr+ bytestr.substring(bytestr.length() -2,bytestr.length())+" ";
                                        }
                                        updatetrack("卡片内数据:"+CardInfStr+ "\n");
                                    }
                                    updatetrack("\n");
                                    break;
                                case (byte)0xc5:          /*指定区号、密码读卡返回信息*/
                                    updatetrack("接收到的信息为IC卡扇区内数据\n");
                                    updatetrack("指令码:"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                    updatetrack("设备IP:"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                    updatetrack("机器号:"+Integer.toString((data[5] & 0xff)+((data[6] & 0xff) *256))+ "\n");
                                    for(p=8;p<12;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("16进制卡号:"+CardNo16+ "\n");
                                    updatetrack("扇区数:"+Integer.toHexString(data[7] & 0xff)+ "\n");
                                    updatetrack("扇区号:"+Integer.toHexString(data[12] & 0xff)+ "\n");
                                    if(data[13]==0){
                                        CardInfStr="";
                                        for(p=0;p<48;p++){
                                            bytestr="00"+Integer.toHexString(data[14+p] & 0xff);
                                            CardInfStr=CardInfStr+ bytestr.substring(bytestr.length() -2,bytestr.length())+" ";
                                        }
                                        updatetrack("扇区内数据:"+CardInfStr+ "\n\n");
                                        //WriteCard(data,length,RemoteHostIP,RemotePort);   //写卡操作
                                    } else{
                                        if(data[13]==12){
                                            updatetrack("卡密码认证失败!\n\n");
                                        }else {
                                            updatetrack("读卡失败,错误代码:"+Integer.toString(data[13])+"\n\n");
                                        }
                                    }
                                    break;

                                case (byte)0xcD :         /*响应写卡、更改卡密码*/
                                    updatetrack("设备IP:"+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+"."+Integer.toString(data[5] & 0xff)+ "\n");
                                    updatetrack("机器号:"+Integer.toString((data[6] & 0xff)+((data[7] & 0xff) *256))+ "\n");
                                    for(p=9;p<13;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("16进制卡号:"+CardNo16+ "\n");
                                    updatetrack("扇区号:"+Integer.toHexString(data[13] & 0xff)+ "\n");
                                    if(data[1]==0x3A){
                                        if(data[14]==0x00){
                                            updatetrack("更改卡密码成功\n");
                                        }else{
                                            updatetrack("更改卡密码失败,错误代码:"+Integer.toString(data[14])+ "\n");
                                        }
                                    }else{
                                        if(data[1]==0x3D){
                                            if(data[14]==0x00){
                                                updatetrack("写卡成功\n");
                                            }else{
                                                updatetrack("写卡失败,错误代码:"+Integer.toString(data[14])+ "\n");
                                            }
                                        }
                                    }
                                    updatetrack("\n");
                                    break;
                                case (byte)0xcf :         /*接收到IC卡离开读卡器的信息*/
                                case (byte)0xdf :         /*接收到ID卡离开读卡器的信息*/
                                    updatetrack("接收到卡离开读卡器的信息\n");
                                    updatetrack("指令码:"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                    updatetrack("设备IP:"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                    updatetrack("机器号:"+Integer.toString((data[5] & 0xff)+((data[6] & 0xff) *256))+ "\n");
                                    updatetrack("包序号:"+Integer.toString((data[7] & 0xff)+((data[8] & 0xff) *256))+ "\n");
                                    if(data[0]==(byte)0xcf){
                                        for(p=11;p<15;p++){
                                            bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                            CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        }
                                    }else{
                                        for(p=10;p<15;p++){
                                            bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                            CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        }
                                    }
                                    updatetrack("16进制卡号:"+CardNo16+"\n\n");

                                    DisableSendAge(data,RemoteHostIP,RemotePort);         //向读卡器发确认信息,否则读卡器会连续发三次
                                    break;
                                case (byte)0xd1:         /*接收到的信息为ID读卡器上传的卡号*/
                                    updatetrack("接收到的信息为ID读卡器上传的卡号\n");
                                    updatetrack("指令码:"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                    updatetrack("设备IP:"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                    updatetrack("机器号:"+Integer.toString((data[5] & 0xff)+((data[6] & 0xff) *256))+ "\n");
                                    updatetrack("包序号:"+Integer.toString((data[7] & 0xff)+((data[8] & 0xff) *256))+ "\n");
                                    for(p=9;p<13;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("16进制卡号:"+CardNo16+ "\n");

                                    cardnum=data[9] & 0xff;
                                    cardnum=cardnum+(data[10] & 0xff) *256;
                                    cardnum=cardnum+(data[11] & 0xff) *65536;
                                    cardnum=cardnum+(data[12] & 0xff) *16777216;
                                    cardno10 = 0;
                                    for (j=28; j>=0; j-=4) {
                                        cardno10 = cardno10<>>j & 0xF);
                                    }
                                    CardNoStr = String.format("%010d", cardno10);
                                    updatetrack("10进制卡号:"+CardNoStr+ "\n");

                                    for(p=14;p<length;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("设备序列号:"+SerialNum+ "\n");

                                    updatetrack("\n\n");
                                    DisableSendAge(data,RemoteHostIP,RemotePort);             //向读卡器发确认信息,否则读卡器会连续发三次
                                    if(MyradioB1.isChecked()) {
                                        SendDispBeep(CardNoStr, RemoteHostIP, RemotePort);               //发送显示 + 蜂鸣声
                                    }else {
                                        if(MyradioB2.isChecked()){
                                            SendDispSpk(CardNoStr, RemoteHostIP, RemotePort);            //发送显示 + 固定组合语音
                                        }else{
                                            SendDispTTS(CardNoStr, RemoteHostIP, RemotePort);            //发送显示 + TTS语音
                                        }
                                    }
                                    break;
                                default:
                            }
                        }
                    }else{ updatetrack("\n");}

                }catch  (Exception e){
                    RecsockIsRuning=false;
                    updatetrack("监听线程出错:\n");
                    updatetrack(e.getMessage()+"\n\n");
                    Recsock.close();
                    InitRecSock();
                }
            }
        }
    }