package com.listong.mobile;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
public class MobileGprsServer {
public static HashMap<String, MapObject> clientMap=new HashMap<String, MapObject>();
public static void main(String[] args) {
MobileGprsServer rl=new MobileGprsServer();
rl.doChecktimeOut();
rl.doListen();
}
public MobileGprsServer(){
}
public void doChecktimeOut() {
new Thread(new CheckTimeOut()).start();
}
public void doListen() {
ServerSocket server;
try {
int port=8040;
server = new ServerSocket(port);
System.out.println("start liston at "+port);
while (true) {
Socket client = server.accept();
System.out.println("begin accept ...");
new Thread(new GprsProcess(client)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.listong.mobile;
import java.net.Socket;
import java.sql.Timestamp;
public class MapObject {
Socket client;
Timestamp time;
public Socket getClient() {
return client;
}
public void setClient(Socket client) {
this.client = client;
}
public Timestamp getTime() {
return time;
}
public void setTime(Timestamp time) {
this.time = time;
}
}
package com.listong.mobile;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.Date;
public class CheckTimeOut implements Runnable {
public void run() {
for (String key : MobileGprsServer.clientMap.keySet()) {
MapObject ob=MobileGprsServer.clientMap.get(key);
Timestamp time=new Timestamp(new Date().getTime());
if (time.getTime()-ob.time.getTime()>1800000){
System.out.println("time out!!"+key);
try {
ob.client.close();
} catch (IOException e) {
e.printStackTrace();
}
MobileGprsServer.clientMap.remove(key);
}
}
}
}
package com.listong.mobile;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.sql.Timestamp;
import java.util.Date;
import com.listong.util.TimeUtil;
public class GprsProcess implements Runnable {
Socket client;
int i=0;
public GprsProcess(Socket client) {
this.client = client;
}
@Override
public void run() {
MapObject mapObj = null;
String buf = "";
BufferedReader brIn = null;
PrintWriter pwOut = null;
String IMSI = null; //对应一个手机的
try {
brIn = new BufferedReader(new InputStreamReader(client.getInputStream())); //获取手机客户端传过来的信息
pwOut = new PrintWriter(client.getOutputStream());
while(true){
buf = brIn.readLine();
if(buf == null){
break;
}
System.out.println(client.getPort() + " 传来的信息: " + buf);
String[] strs=buf.split(",");
Timestamp time=new Timestamp(new Date().getTime());
String timeStr=TimeUtil.toFmtTime(time,"yyyyMMddHHmmss");
if(buf.startsWith("!") && buf.endsWith("#")){
System.out.println("下行协议:监控中心下发至手机终端的协议");
if(buf.startsWith("!Qpos")){
System.out.println("一次跟踪");
return;
}else if(buf.startsWith("!timer")){
System.out.println("连续跟踪");
return;
}else if(buf.startsWith("!Stimer")){
System.out.println("停止连续跟踪");
return;
}else if(buf.startsWith("!alarm")){
System.out.println("报警分配");
return;
}else if(buf.startsWith("!Salarm")){
System.out.println("取消报警");
return;
}else if(buf.startsWith("!IP")){
System.out.println("设置IP与端口");
return;
}else if(buf.startsWith("!SMS")){
System.out.println("设置短信中心号码");
return;
}else if(buf.startsWith("!LOOP")){
System.out.println("设置轮询时间间隔");
return;
}else if(buf.startsWith("!TEL")){
System.out.println("设置报警电话号码");
return;
}
}else if(buf.startsWith("&") && buf.endsWith("$")){
System.out.println("上行协议: 手机终端上报监控中心平台的协议");
if(buf.startsWith("&CMCR")){
System.out.println("手机开机了");
mapObj = new MapObject();
mapObj.setClient(client);
mapObj.setTime(time);
IMSI = strs[1];
MobileGprsServer.clientMap.put(IMSI, mapObj);
System.out.println(IMSI+" 放入map中 . 端口:"+ client.getPort());
continue;
}else if(buf.startsWith("&CMCV")){
System.out.println("关机上报");
IMSI = strs[1];
MobileGprsServer.clientMap.remove(IMSI);
return;
}else {
if (IMSI==null) {
System.out.println(client+" 还没开机");
return;
}
}
if(buf.startsWith("&CMCN")){
System.out.println("终端轮询");
pwOut.print(buf+"\r\n");
pwOut.flush();
}else if(buf.startsWith("&CMCO")){
System.out.println("一次跟踪");
pwOut.print(buf+"\r\n");
pwOut.flush();
}else if(buf.startsWith("&CMCC")){
System.out.println("连续跟踪");
pwOut.print(buf+"\r\n");
pwOut.flush();
}else if(buf.startsWith("&CMCZ")){
System.out.println("终端按键报警");
pwOut.print(buf+"\r\n");
pwOut.flush();
}else if(buf.startsWith("&CMCA")){
System.out.println("终端正常报警");
pwOut.print(buf+"\r\n");
pwOut.flush();
}else if(buf.startsWith("&CMCH")){
System.out.println("设置回复");
pwOut.print(buf+"\r\n");
pwOut.flush();
}
}else {
System.out.println("格式不对");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
System.out.println("关闭:"+client);
brIn.close();
pwOut.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.listong.mobile;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Test {
int port = 8040;
Socket socket = null;
BufferedWriter bw;
PrintWriter pw;
public Test(){
try {
socket = new Socket("127.0.0.1",port);
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
pw = new PrintWriter(socket.getOutputStream());
pw.println("!Qpos#");
pw.println("!timer,900,3#");
pw.println("!Stimer#");
pw.println("!alarm,900,3#");
pw.println("!Salarm#");
pw.println("!IP,192.168.1.200:8080#");
pw.println("!SMS,1065900000#");
pw.flush();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new Test();
}
}