package com.myandroid.socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.IBinder;
import android.telephony.TelephonyManager;
public class DownloadParaService extends Service{
int count_rem=0; //用于计数发送远程号码
int count_cen=0; //用于计数发送中心号码
DatagramSocket socket; //用于socket通信的全局socket,即用于发,又用于收
String netName="ckg707.okis.com";
byte[] repacs; //用来获取原始的数据包
byte[] repac; //用来获取有效数据的数据包
private final static int SEND_TIMES=2;
int new_packid;
byte[] send_reqRem; //用来装载远程号码的请求
byte[] send_reqCen; //用来装载中心号码的请求
byte[] send_imsi;
String remoteNum=null; //用来获取远程号码
String centerNum=null; //用来获取中心号码
int sendtime=0;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
reqParameters(0,(byte)0x03);//生成发送配置信息请求的信息
reqParameters(0,(byte)0x04);
send_imsi=reqParameters(1,(byte)0x00);//生成IMSI包
sendPhoneReq(send_reqRem);
sendPhoneReq(send_reqCen);
sendPhoneReq(send_imsi);
updateData();
updateId();
stopSelf();
return super.onStartCommand(intent, flags, startId);
}
public void sendPhoneReq(byte[] phone)
{
sendtime++;
System.out.println("di "+sendtime+" ci send!");
InetAddress address = null; //定义ip地址对象
DatagramPacket packet; //定义发送的数据包
try {
socket=new DatagramSocket(22222); //服务器的端口
address = InetAddress.getByName("59.40.77.4"); //测试地址
packet=new DatagramPacket(phone,phone.length,address,22222); //组装udp报文
socket.send(packet); //发送UDP报文
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte buff[]=new byte[1024];
DatagramPacket packet01=new DatagramPacket(buff,buff.length);
try {
socket.setSoTimeout(3000); //让接收时间为3s有效,否则接收会一直开启到死循环
System.out.println("di "+sendtime +"ci receiver!");
socket.receive(packet01); //接UDP报文
repacs=packet01.getData(); //得到接收报文里的数据
int effLength=packet01.getLength(); //获得数据的有效长度
repac=new byte[effLength];
for(int j=0;j<effLength;j++)
repac[j]=repacs[j];
Boolean sumRight=true;
//
// //计算接收包的校验和,并和后台计算的相比较
// if(repac!=null && effLength>4)
// {
//
// byte[] efficData = new byte[effLength-4];
// for(int e=0;e<effLength-4;e++)
// efficData[e]=repac[e];
// byte[] locsum=checkSum(efficData);
// for(int g=0;g<2;g++)
// {
// if((new Byte(locsum[g]).compareTo(new Byte(repac[repac.length-6+g])))!=0)
// {
// sumRight=false;
// break;
// }
// }
// }
byte popImsi=(byte)0x79;
byte popNum=(byte)0x81;
Byte oldByte=new Byte(repac[13]); //正确的协议字节
Byte newByte=new Byte(popNum); //获得接收包里的协议字节
if(sendtime<SEND_TIMES) //判断是否发了10次
{
if((packet01.getLength()==0) || !sumRight)//如果接收的数据为空,或者校验和不对,则重发
{
socket.close();
sendPhoneReq(phone);
}
else if(oldByte.compareTo(newByte)==0) //假如是下发电话号码短信
{
System.out.println("is the back of PhoneNum!");
byte sendType=phone[15]; //发送时的电话类型
byte receiverType=repac[15]; //接收到的电话类型
//协议号不一样,并且发送的并非所需要的电话号码类型,则重发,否则再比较信息序列号
if((new Byte(sendType).compareTo(new Byte(receiverType)))!=0)
{
socket.close();
sendPhoneReq(phone);
}
else
{
byte[] b=new byte[11];
for(int i=0;i<11;i++)
{
b[i]=repac[i+18];
}
String number=HexByte2ToStr(b);
Byte reRemote=new Byte(repac[15]); //电话号码类型
Byte popRemote=new Byte((byte)0x03);
Byte popCenter=new Byte((byte)0x04);
if(number==null)
{
socket.close();
sendPhoneReq(phone);
}
else if(popRemote.compareTo(reRemote)==0)
{
remoteNum=number;
System.out.println("the remote num is: "+remoteNum );
final byte[] sendfixSuc=confixPac(repac, (byte)0x01);
DatagramPacket confixpacket=new DatagramPacket(sendfixSuc,sendfixSuc.length,address,22222);
socket.send(confixpacket);
sendtime=0;
socket.close();
}
else if(popCenter.compareTo(reRemote)==0)
{
centerNum=number;
System.out.println("the center num is: "+centerNum );
byte[] sendfixSuc=confixPac(repac, (byte)0x01);
DatagramPacket confixpacket=new DatagramPacket(sendfixSuc,sendfixSuc.length,address,22222);
socket.send(confixpacket);
sendtime=0;
socket.close();
}
}
}
else if(new Byte(popImsi).compareTo(oldByte)==0)//假如是上发IMSI号的回复确认短信
{
if(new Byte(phone[13]).compareTo(repac[24])==0)
{
System.out.println("is the back of IMSI!");
//本地的序列号和协议号
byte[] locOrder=new byte[5];
for(int i=0;i<5;i++)
locOrder[i]=send_imsi[i+9];
System.out.println(byte2HexStr(locOrder));
//后台回复的序列号和协议号
byte[] backOrder=new byte[5];
for(int i=0;i<5;i++)
backOrder[i]=repac[i+20];
System.out.println(byte2HexStr(backOrder));
Boolean right=true;
for(int i=0;i<5;i++)
{
if(new Byte(locOrder[i]).compareTo(new Byte(backOrder[i]))!=0)
{
right=false;
break;
}
}
if(!right)
{
System.out.println("NO!");
socket.close();
sendPhoneReq(phone);
}
else
{
System.out.println("right!");
byte[] sendfixSuc={(byte)0x00,(byte)0x00,};
DatagramPacket confixpacket=new DatagramPacket(sendfixSuc,sendfixSuc.length,address,22222);
socket.send(confixpacket);
sendtime=0;
socket.close();
}
}
else
{
socket.close();
sendPhoneReq(phone);
}
}
}
else //发送次数大于10次了
{
sendtime=0;
socket.close();
}
} catch (IOException e)
- 1
- 2
- 3
- 4
- 5
- 6
前往页