java 短信猫发送短信的方法

http://zghbwjl.blog.163.com/blog/static/12033667220129175158806/

http://www.smscom.cn/sms_javasoft/

用java实现短信收发的功能,目前一般项目中短信群发功能的实现方法大致有下面三种:

·                 1、 向运行商申请短信网关,不需要额外的设备,利用运行商提供的API调用程序发送短信,适用于大型的通信公司。

·                 2、 借助像GSM MODEM之类的设备(支持AT指令的手机也行),通过数据线连接电脑来发送短信,这种方法比较适用于小公司及个人。要实现这种方式必须理解串口通信、AT指令、短信编码、解码。

·                 3、 借助第三方运行的网站实现,由网站代发短信数据,这种方法对网站依赖性太高,对网络的要求也比较高。


       鉴于项目的情况和多方考虑,同时又找到了一个开源的SMSLib项目的支持,比较倾向于第二种方法,SMSLib的出现就不需要我们自己去写底层的AT指令,这样就可以直接通过调用SMSLib的API来实现通过GSM modem来收发送短信了。

SMSLib官方网站:http://smslib.org/,使用SMSLib的一些基本要点:

·                 SUN JDK 1.6 or newer. (Java环境)

·                 Java CommunicationsLibrary. (Java串口通信)

·                 Apache ANT for building thesources. (编译源码时需要的)

·                 Apache log4j. (日志工具)

·                 Apache Jakarta Commons -NET. (网络操作相关的)

·                 JSMPP Library (SMPP协议时需要的)


有关Java串口通信需要补充说明:

·                 window系统可以用SUN Java Comm v2. (该版本好像也支持solaris)

其下载地址:http://smslib.googlecode.com/files/javacomm20-win32.zip

·                 其他操作系统(比如:Linux, Unix, BSD,等等),你可以选择 Java Comm v3 或者是RxTx。

Java Comm v3下载地址:http://java.sun.com/products/javacomm/(需要注册); 
         RxTx官网:http://users.frii.com/jarvi/rxtx/index.html or http://rxtx.qbang.org/wiki/index.php/Main_Page


附件提供相关下载:

·                 java串口通信v2:javacomm20-win32.zip

·                 smslib-3.5.1.jar

·                 短信modem驱动:PL2303_Prolific_DriverInstaller_v130.zip


本次测试的环境是window,GSM modem是wavecom,所以这次主要描述window环境下简单的实现过程: 
【一】、配置相应的环境 
     首先解压下载的Java Comm v2文件javacomm20-win32.zip,具体配置步骤如下:

·                 把文件:comm.jarcopy 到目录:JDKDIR/jre/lib/ext/,当然这一步也可以不要这样做,你只需把comm.jar copy到所要运行的项目对应的lib/下既可

·                 把文件:javax.comm.propertiescopy 到目录:JDKDIR/jre/lib/

·                 把DLL文件:win32com.dll(windows) copy 到目录:JDKDIR/jre/bin/

如果存在JRE目录, 最好安装上面步骤把文件copy到JREDIR相应的目录下

测试串口端口程序: 
Test .java

Java代码  

package test;


import java.util.Enumeration;


import javax.comm.CommDriver;

import javax.comm.CommPortIdentifier;

import javax.comm.SerialPort;


public class Test {


   public static void main(String[] args) throws Exception {  

        // 人工加载驱动  

        // MainTest.driverInit();  

   Test.getCommPortList();  

        // 人工加载驱动获取端口列表  

        // TestGetPortList.getPortByDriver();  

  

    }  

  

    /** 

     * 手工加载驱动<br> 

     * 正常情况下程序会自动加载驱动,故通常不需要人工加载<br> 

     * 每重复加载一次,会把端口重复注册,CommPortIdentifier.getPortIdentifiers()获取的端口就会重复 

     */  

    public static void driverManualInit() {  

        String driverName = "com.sun.comm.Win32Driver";  

        String libname = "win32com";  

        CommDriver commDriver = null;  

        try {  

            System.loadLibrary("win32com");  

            System.out.println(libname + " Library Loaded");  

  

            commDriver = (javax.comm.CommDriver) Class.forName(driverName)  

                    .newInstance();  

            commDriver.initialize();  

            System.out.println("comm Driver Initialized");  

  

        } catch (Exception e) {  

            System.err.println(e);  

        }  

    }  

  

    /** 

     * 获取端口列表 

     */  

    public static void getCommPortList() {  

        CommPortIdentifier portId;  

        Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();  

        while (portEnum.hasMoreElements()) {  

            portId = (CommPortIdentifier) portEnum.nextElement();  

  

            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {  

                System.out.println("串口: name-" + portId.getName()  

                        + " 是否占用-" + portId.isCurrentlyOwned());  

            } else {  

                System.out.println("并口: name-" + portId.getName()  

                        + " 是否占用-" + portId.isCurrentlyOwned());  

            }  

        }  

        System.out.println("-------------------------------------");  

    }  

  

    /** 

     *  

     */  

    public static void getPortByDriver() {  

  

        String driverName = "com.sun.comm.Win32Driver";  

        String libname = "win32com";  

        CommDriver commDriver = null;  

        try {  

            System.loadLibrary("win32com");  

            System.out.println(libname + " Library Loaded");  

  

            commDriver = (CommDriver) Class.forName(driverName).newInstance();  

            commDriver.initialize();  

            System.out.println("comm Driver Initialized");  

  

        } catch (Exception e) {  

            System.err.println(e);  

        }  

        SerialPort sPort = null;  

        try {  

  

            sPort = (SerialPort) commDriver.getCommPort("COM24",  

                    CommPortIdentifier.PORT_SERIAL);  

            System.out.println("find CommPort:" + sPort.toString());  

        } catch (Exception e) {  

            System.out.println(e.getMessage());  

        }  

  

    }  

  

}



本机运行结果:

引用


串口: name-COM10 是否占用-false 
串口: name-COM21 是否占用-false 
串口: name-COM23 是否占用-false 
串口: name-COM20 是否占用-false 
串口: name-COM22 是否占用-false 
串口: name-COM24 是否占用-false 
串口: name-COM9 是否占用-false 
串口: name-COM19 是否占用-false 
串口: name-COM3 是否占用-false 
串口: name-COM8 是否占用-false 
串口: name-COM98 是否占用-false 
串口: name-COM99 是否占用-false 
串口: name-COM4 是否占用-false 
串口: name-COM5 是否占用-false 
串口: name-COM6 是否占用-false 
并口: name-LPT1 是否占用-false 
并口: name-LPT2 是否占用-false 
-------------------------------------


【三】、检查串口设备信息: 
TestCommPort .java

Java代码  

package test;


import java.io.InputStream;

import java.io.OutputStream;

import java.util.Enumeration;


import javax.comm.CommPortIdentifier;

import javax.comm.SerialPort;


public class TestCommPort {

  

    static CommPortIdentifier portId;  

    static Enumeration portList;  

    static int bauds[] = { 9600, 19200, 57600, 115200 };  

  

    /** 

     * @param args 

     */  

    public static void main(String[] args) {  

        portList = CommPortIdentifier.getPortIdentifiers();  

        System.out.println("GSM Modem 串行端口连接测试开始...");  

        String portName = "COM4";  

        while (portList.hasMoreElements()) {  

            portId = (CommPortIdentifier) portList.nextElement();  

            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL  

                    && portName.equals(portId.getName())) {  

                System.out.println("找到串口: " + portId.getName());  

                for (int i = 0; i < bauds.length; i++) {  

                    System.out.print("  Trying at " + bauds[i] + "...");  

                    try {  

                        SerialPort serialPort;  

                        InputStream inStream;  

                        OutputStream outStream;  

                        int c;  

                        StringBuffer response = new StringBuffer();  

                        serialPort = (SerialPort) portId.open(  

                                "SMSLibCommTester", 1971);  

                        serialPort  

                                .setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);  

                        serialPort.setSerialPortParams(bauds[i],  

                                SerialPort.DATABITS_8, SerialPort.STOPBITS_1,  

                                SerialPort.PARITY_NONE);  

                        inStream = serialPort.getInputStream();  

                        outStream = serialPort.getOutputStream();  

                        serialPort.enableReceiveTimeout(1000);  

                        c = inStream.read();  

                        while (c != -1) {  

                            c = inStream.read();  

                        }  

                        outStream.write('A');  

                        outStream.write('T');  

                        outStream.write('\r');  

                        try {  

                            Thread.sleep(1000);  

                        } catch (Exception e) {  

                        }  

                        c = inStream.read();  

                        while (c != -1) {  

                            response.append((char) c);  

                            c = inStream.read();  

                        }  

                        if (response.indexOf("OK") >= 0) {  

                            System.out.print("  正在检测设备:");  

                            try {  

                                outStream.write('A');  

                                outStream.write('T');  

                                outStream.write('+');  

                                outStream.write('C');  

                                outStream.write('G');  

                                outStream.write('M');  

                                outStream.write('M');  

                                outStream.write('\r');  

                                response = new StringBuffer();  

                                c = inStream.read();  

                                while (c != -1) {  

                                    response.append((char) c);  

                                    c = inStream.read();  

                                }  

                                System.out.println("  发现设备: "  

                                        + response.toString().replaceAll(  

                                                "(\\s+OK\\s+)|[\n\r]", ""));  

                            } catch (Exception e) {  

                                System.out.println("  检测设备失败,获取设备信息异常:"  

                                        + e.getMessage());  

                            }  

                        } else {  

                            System.out.println("  检测设备失败,沒有接收到响应结果!");  

                        }  

                        serialPort.close();  

                    } catch (Exception e) {  

                        System.out.println("  检测设备失败,发生异常:" + e.getMessage());  

                    }  

                }  

            }  

        }  

    }  

}  



运行结果如下:

引用


GSM Modem 串行端口连接测试开始... 
找到串口: COM24 
  Trying at 9600...  正在检测设备: 发现设备: AT+CGMM MULTIBAND  900E 1800 
  Trying at 19200...  发现设备失败,沒有接收到响应结果! 
  Trying at 57600...  发现设备失败,沒有接收到响应结果! 
  Trying at 115200...  发现设备失败,沒有接收到响应结果!


【四】、测试收发短信:

Java代码  

package test;


import java.util.ArrayList;

import java.util.LinkedList;

import java.util.List;


import org.apache.log4j.Level;

import org.apache.log4j.Logger;

import org.smslib.AGateway;

import org.smslib.AGateway.Protocols;

import org.smslib.GatewayException;

import org.smslib.InboundMessage;

import org.smslib.Message.MessageEncodings;

import org.smslib.OutboundMessage;

import org.smslib.Service;

import org.smslib.modem.SerialModemGateway;


public class SendSmsHandler {  

    private static final Logger logger = Logger.getLogger(SendSmsHandler.class);  

  

    private Service smsService;  

  

    /** 

     * 发送短信的类

     */  

    public SendSmsHandler() {  

        smsService = Service.getInstance();  //获得服务实例  单例模式的

        List<AGateway> agatewayList = new ArrayList<AGateway>();  

  

        String portName = "COM4";//"/dev/ttyUSB0";// COM24  //使用的端口号

        SerialModemGateway gateway = new SerialModemGateway(  

                "modem." + portName, portName, 9600, "wavecom", "PL2303");  //通过端口号频率名称等内容获得设备实例

        gateway.setInbound(true);  

        gateway.setOutbound(true);  

        gateway.setProtocol(Protocols.PDU);  //发送凡是PDU

        gateway.setSimPin("0000");  

        agatewayList.add(gateway);  //放到队列中,群发可以放多条就可以了

        try {  

            for (AGateway gatewayTmp : agatewayList) {  

                smsService.addGateway(gatewayTmp);  

            }  

        } catch (GatewayException ex) {  

            logger.error(ex.getMessage());  

        }  

    }  

  

    /** 

     *  启动发送短信的服务

     */  

    public void start() {  

        logger.info("SMS service start.....");  

        try {  

            smsService.startService();  

        } catch (Exception ex) {  

            logger.error("SMS service start error:", ex);  

        }  

    }  

  

    /** 

     *  停止发送短信服务

     */  

    public void destroy() {  

        try {  

            smsService.stopService();  //停止服务

        } catch (Exception ex) {  

            logger.error("SMS service stop error:", ex);  

        }  

        logger.info("SMS service stop");  

    }  

  

    /** 

     * send SMS 

     * 发送短信的方法

     * @param msg 发送的内容

     * @return Boolean 返回是否发送成功

     */  

    public Boolean sendSMS(OutboundMessage msg) {  

        try {  

            msg.setEncoding(MessageEncodings.ENCUCS2);  //设置编码

            return smsService.sendMessage(msg);  //发送短信并返回结果

        } catch (Exception e) {  

            logger.error("send error:", e);  

        }  

        return false;  

    }  

  

//服务是否已经启动

    private boolean isStarted() {  

        if (smsService.getServiceStatus() == Service.ServiceStatus.STARTED) {  //服务的状态是否是启动

            for (AGateway gateway : smsService.getGateways()) {  

                if (gateway.getStatus() == AGateway.GatewayStatuses.STARTED) {  

                    return true;  

                }  

            }  

        }  

        return false;  

    }  

  

    /** 

     * read SMS 去读接收到的短信信息

     * @return List 

     */  

    public List<InboundMessage> readSMS() {  

        List<InboundMessage> msgList = new LinkedList<InboundMessage>();  

        if (!isStarted()) {  

            return msgList;  

        }  

        try {  

            this.smsService.readMessages(msgList,  

                    InboundMessage.MessageClasses.ALL);  

            logger.info("read SMS size: " + msgList.size());  

        } catch (Exception e) {  

            logger.error("read error:", e);  

        }  

        return msgList;  

    }  

  

    /** 

     * @param args 测试类

     */  

    public static void main(String[] args) {  

        Logger.getRootLogger().setLevel(Level.INFO);  

        OutboundMessage outMsg = new OutboundMessage("189*****", "信息测试");  //绑定接收电话号码和发送的消息

        SendSmsHandler smsHandler = new SendSmsHandler();  

        smsHandler.start();  //启动

        //发送短信  

        smsHandler.sendSMS(outMsg);  

        //读取短信  

        List<InboundMessage> readList = smsHandler.readSMS();  

        for (InboundMessage in : readList) {  

            System.out.println("发信人:" + in.getOriginator() + " 短信内容:"  

                    + in.getText());  

        }  

        smsHandler.destroy();  //停止服务

        System.out.println("-----------");  

    }  

  

}




发送短信亲测,手机能正常接收显示。读取设备的短信程序运行结果结果如下:

引用


INFO - Service.listSystemInformation(113) | SMSLib: A Java API library forsending and receiving SMS via a GSM modem or other supported gateways. 
This software is distributed under the terms of the Apache v2.0 License. 
Web Site: http://smslib.org 
INFO - Service.listSystemInformation(114) | Version: 3.5.1 
INFO - Service.listSystemInformation(115) | JRE Version: 1.6.0_18 
INFO - Service.listSystemInformation(116) | JRE Impl Version: 16.0-b13 
INFO - Service.listSystemInformation(117) | O/S: Windows Vista / x86 /6.0 
INFO - SmsHandler.start(55) | SMS service start..... 
INFO - DefaultQueueManager.init(92) | Queue directory not defined. Queuedmessages will not be saved to filesystem. 
INFO - ModemGateway.startGateway(188) | GTW: modem.COM24: Starting gateway,using Generic AT Handler. 
INFO - SerialModemDriver.connectPort(68) | GTW: modem.COM24: Opening: COM24@9600 
INFO - AModemDriver.waitForNetworkRegistration(459) | GTW: modem.COM24: GSM:Registered to foreign network (roaming). 
INFO - AModemDriver.connect(175) | GTW: modem.COM24: MEM: Storage LocationsFound: SMBM 
INFO - CNMIDetector.getBestMatch(142) | CNMI: No best match, returning: 1 
INFO - ModemGateway.startGateway(191) | GTW: modem.COM24: Gatewaystarted. 
INFO - SmsHandler.readSMS(113) | read SMS size: 1 
发信人:8618918001030 短信内容:hello 回复测试 
INFO - ModemGateway.stopGateway(197) | GTW: modem.COM24: Stoppinggateway... 
INFO - SerialModemDriver.disconnectPort(120) | GTW: modem.COM24: Closing: COM24@9600 
INFO - ModemGateway.stopGateway(201) | GTW: modem.COM24: Gateway stopped. 
INFO - SmsHandler.destroy(72) | SMS service stop 
-----------


短信内容的存储类 /*** * CommonSms 短信用于全局变量 */ public class CommonSms{ /** id */ private int id; /**短信内容*/ private String smstext; /**短信发送方*/ private String sender;//短信发送方 /**短信接收发*/ private String recver;//短信接收发 /**时间*/ private Date date; public String getSmstext() { return smstext; } public void setSmstext(String smstext) { this.smstext = smstext; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public int getId() { return id; } public void setId(Integer id) { this.id = id; } public String getSender() { return sender; } public void setSender(String sender) { this.sender = sender; } public String getRecver() { return recver; } public void setRecver(String recver) { this.recver = recver; } } 串口操纵实现类 /*** * 串口操纵实现类 */ public class Port { private CommPortIdentifier portId; private SerialPort serialPort; private OutputStreamWriter out; private InputStreamReader in; private String COMname; private static char symbol1 = 13; public String getCOMname() { return COMname; } public void setCOMname(String mname) { COMname = mname; } public CommPortIdentifier getPortId() { return portId; } public void setPortId(CommPortIdentifier portId) { this.portId = portId; } public SerialPort getSerialPort() { return serialPort; } public void setSerialPort(SerialPort serialPort) { this.serialPort = serialPort; } public OutputStreamWriter getOut() { return out; } public void setOut(OutputStreamWriter out) { this.out = out; } public InputStreamReader getIn() { return in; } public void setIn(InputStreamReader in) { this.in = in; } public boolean isused =true; public boolean isIsused() { return isused; } public void setIsused(boolean isused) { this.isused = isused; } /** * 打开com口 * @param portName * @return */ public Port(String portName) { try { portId = CommPortIdentifier.getPortIdentifier(portName); if (portId == null) { System.out.println("port is null"); } try { serialPort = (SerialPort) portId.open(portName,100000); } catch (PortInUseException e) { System.gc(); e.printStackTrace(); } // 下面是得到用于和COM口通讯的输进、输出流。 try { in = new InputStreamReader(serialPort.getInputStream()); out = new OutputStreamWriter(serialPort.getOutputStream()); } catch (IOException e) { System.gc(); System.out.println("IOException"); } // 下面是初始化COM口的传输参数,如传输速率:9600等。 try { serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); setCOMname(portId.getName()); setIsused(true); } catch (UnsupportedCommOperationException e) { e.printStackTrace(); System.gc(); } } catch (NoSuchPortException e) { e.printStackTrace(); System.gc(); } } /** * 检查SIM是否存在 * @return */ public boolean chakanPort() { try { String atCommand = "AT+ccid"; String strReturn = sendAT(atCommand); if (strReturn.indexOf("OK", 0) != -1) { return true; } return false; } catch (Exception ex) { System.gc(); ex.printStackTrace(); return false; } } /** * 封闭COM口 * @return boolean */ public void close() { try { in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } serialPort.close(); System.gc(); setIsused(false); } /** * 向串口中写进字符串命令 * @param s 字符串命令 * @throws Exception 异常 */ public void writeln(String s) throws Exception { out.write(s); out.write('\r'); out.flush(); } /** * 读取COM命令的返回字符串 * @return 结果字符串 * @throws Exception */ public String read() throws Exception { int n, i; char c; String answer = ""; for (i = 0; i < 100; i++) { while (in.ready()) { n = in.read(); if (n != -1) { c = (char) n; answer = answer + c; Thread.sleep(1); } else break; } if (answer.indexOf("OK") != -1) { break; } Thread.sleep(100); } return answer; } /** * 向串口发送AT指令 * @param atcommand 指令内容 * @return 指令返回结果 * @throws java.rmi.RemoteException */ public String sendAT(String atcommand) throws java.rmi.RemoteException { String s = ""; try { Thread.sleep(100); writeln(atcommand); Thread.sleep(80); s = read(); Thread.sleep(100); } catch (Exception e) { System.gc(); System.out.println("ERROR: send AT command failed; " + "Command: " + atcommand + "; Answer: " + s + " " + e); } return s; } } 短信操纵类 /*** * 短信操纵类 */ public class Sms{ private CommonSms commonsms; private static char symbol1 = 13; private static String strReturn = "", atCommand = ""; public boolean SendSms(Port myport) { if(!myport.isIsused()) { System.out.println("COM通讯端口未正常打开!"); return false; } setMessageMode(myport,1); // 空格 char symbol2 = 34; // ctrl~z 发送指令 char symbol3 = 26; try { atCommand = "AT+CSMP=17,169,0,08" + String.valueOf(symbol1); strReturn = myport.sendAT(atCommand); System.out.println(strReturn); if (strReturn.indexOf("OK", 0) != -1) { atCommand = "AT+CMGS=" + commonsms.getRecver() + String.valueOf(symbol1); strReturn = myport.sendAT(atCommand); atCommand = StringUtil.encodeHex(commonsms.getSmstext().trim()) + String.valueOf(symbol3) + String.valueOf(symbol1); strReturn = myport.sendAT(atCommand); if (strReturn.indexOf("OK") != -1 && strReturn.indexOf("+CMGS") != -1) { System.out.println("短信发送成功..."); return true; } } } catch (Exception ex) { ex.printStackTrace(); System.out.println("短信发送失败..."); return false; } System.out.println("短信发送失败..."); return false; } /** * 设置消息模式 * @param op * 0-pdu 1-text(默认1 文本方式 ) * @return */ public boolean setMessageMode(Port myport,int op) { try { String atCommand = "AT+CMGF=" + String.valueOf(op) + String.valueOf(symbol1); String strReturn = myport.sendAT(atCommand); if (strReturn.indexOf("OK", 0) != -1) { System.out.println("*************文本方式设置成功************"); return true; } return false; } catch (Exception ex) { ex.printStackTrace(); return false; } } /** * 读取所有短信 * @return CommonSms集合 */ public List RecvSmsList(Port myport) { if(!myport.isIsused()) { System.out.println("System Message: COM通讯端口未正常打开!"); return null; } List listMes = new ArrayList(); try { atCommand = "AT+CMGL=\"ALL\""; strReturn = myport.sendAT(atCommand); listMes = StringUtil.analyseArraySMS(strReturn); } catch (Exception ex) { ex.printStackTrace(); } return listMes; } /** * 删除短信 * @param index 短信存储的位置 * @return boolean */ public boolean DeleteSMS(int index,Port myport) { if(!myport.isIsused()){ System.out.println("System Message: COM通讯端口未正常打开!"); return false; } try { atCommand = "AT+CMGD=" + index; strReturn = myport.sendAT(atCommand); if (strReturn.indexOf("OK") != -1) { System.out.println("System Message: 成功删除存储位置为" + index + "的短信......"); } } catch (Exception ex) { ex.printStackTrace(); } return true; } /** * 删除短信中所有短信 * @return boolean */ public boolean DeleteAllSMS(Port myport) { List list=RecvSmsList(myport); boolean ret=true; if(list!=null&&!list.equals("")&&list;.size()>0) { for(int i=0;i<list.size();i++) { CommonSms tempcomsms=(CommonSms)list.get(i); if(!DeleteSMS(tempcomsms.getId(),myport)) { ret=false; } } } return ret; } public CommonSms getCommonsms() { return commonsms; } public void setCommonsms(CommonSms commonsms) { this.commonsms = commonsms; } /** * 号码,内容,发送短信息 * @param phone * @param countstring * @throws Exception */ public static void sendmsn(String phone,String countstring){ Sms s = new Sms(); // 发送测试 CommonSms cs=new CommonSms(); cs.setRecver(phone); cs.setSmstext(countstring); s.setCommonsms(cs); Port myort=new Port("COM7"); s.SendSms(myort); myort.close(); } public static void main(String[] args) throws Exception { sendmsn("13265551149","我有一筐的愿看,却等不到一颗流星,闭上眼睛,我看到了我的前途"); } 指令字符串操纵类 /*** * 指令字符串操纵类 */ public class StringUtil { /** * 使用Sms 的RecvSms(int index)的方法时,使用该方法解析MODEM返回的字符串 * 根据MODEM返回的字符串,解析成一个CommonSms对象 * @param str 串口返回的读取短信结果字符串 * @param index 短信索引 * @return */ public static CommonSms analyseSMS(String str, int index) { CommonSms commonSms = new CommonSms(); String mesContent; String[] s = str.split("\""); int len = s.length; commonSms.setId(index); mesContent = s[len - 1]; if (mesContent.indexOf("OK") != -1) { mesContent = mesContent.substring(0, mesContent.indexOf("OK")); } mesContent = mesContent.trim(); commonSms.setSmstext(analyseStr(mesContent)); // 短信有中文时使用 // mes.setMessage(Unicode2GBK(analyseStr(mesContent))); SimpleDateFormat df = new SimpleDateFormat("yy/MM/dd hh:mm:ss"); String datestring = s[len - 2].substring(0, s[len - 2].length() - 3) .replace(',', ' ');// 短信时间格式09/09/09 20:18:01+32 Date date = null; try { date = df.parse(datestring); System.out.println(date.toLocaleString()); } catch (Exception ex) { System.out.println(ex.getMessage()); } commonSms.setDate(date); if (s[1].equals("REC READ")) { commonSms.setState("已读"); } else { commonSms.setState("未读"); } commonSms.setSender(s[3]); return commonSms; } /** * 使用Sms 的RecvSmsList()方法时,通过该方法解析MODEM返回来的字符串 * 根据MODEM返回的字符串,解析成一个CommonSms的集合对象 * @param str MODEM返回的字符串 * @return */ public static List analyseArraySMS(String str) { List mesList = new ArrayList(); CommonSms cs; String[] messages; String temp; String[] t; if (str.indexOf("CMGL: ") == -1) return null; str = str.substring(0, str.indexOf("OK")).trim(); messages = str.split("\n"); if (messages.length < 2) return null; for (int i = 1; i 5) { cs.setId(Integer.parseInt(t[0].trim())); temp = t[1].substring(t[1].indexOf('"') + 1, t[1].lastIndexOf('"')).trim(); if (temp.equals("REC READ")) { cs.setState("已读"); } else { cs.setState("未读"); } cs.setSender((t[2].substring(t[2].indexOf('"') + 1, t[2] .lastIndexOf('"')).trim())); SimpleDateFormat df = new SimpleDateFormat("yy/MM/dd hh:mm:ss"); String datestring = t[4].substring(t[4].indexOf('"') + 1) + " " + t[5].substring(0, t[5].indexOf('"'));// 短信时间格式09/09/09 // 20:18:01+32 Date date = null; try { date = df.parse(datestring); } catch (Exception ex) { System.out.println(ex.getMessage()); } cs.setDate(date); i++; cs.setSmstext(analyseStr(messages[i].trim())); mesList.add(cs); } } return mesList; } /** * 将PDU编码的十六进制字符串 如“4F60597DFF01” 转换成unicode "\u4F60\u597D\uFF01" * @param str 要转化的字符串 * @return 转换后的十六进制字符串 */ public static String analyseStr(String str) { StringBuffer sb = new StringBuffer(); if (!(str.length() % 4 == 0)) return str; for (int i = 0; i < str.length(); i++) { if (i == 0 || i % 4 == 0) { sb.append("\\u"); } sb.append(str.charAt(i)); } return Unicode2GBK(sb.toString()); } /** * 将unicode编码 "\u4F60\u597D\uFF01" 转换成中文 "你好!" * @param dataStr 要转化的字符串 * @return 转换后的中文字符串 */ public static String Unicode2GBK(String dataStr) { int index = 0; StringBuffer buffer = new StringBuffer(); while (index < dataStr.length()) { if (!"\\u".equals(dataStr.substring(index, index + 2))) { buffer.append(dataStr.charAt(index)); index++; continue; } String charStr = ""; charStr = dataStr.substring(index + 2, index + 6); char letter = 0; try{letter = (char) Integer.parseInt(charStr, 16);}catch (Exception e) {} buffer.append(letter); index += 6; } return buffer.toString(); } /** * 将中文字符串转换成Unicode * @param str 要转换的中文字符串 * @return 转换后的Unicode */ public static String GBK2Unicode(String str) { StringBuffer result = new StringBuffer(); for (int i = 0; i < str.length(); i++) { char chr1 = (char) str.charAt(i); if (!isNeedConvert(chr1)) { result.append(chr1); continue; } try{result.append("\\u" + Integer.toHexString((int) chr1));}catch (Exception e) {} } return result.toString(); } /** * 在中文字符串转换成Unicode方法中判定是否需要转换 * @param para 要转化的字符 * @return boolean */ public static boolean isNeedConvert(char para) { return ((para & (0x00FF)) != para); } /** * 使用Sms 的 SendSms()方法发送短信时,调用此方法将其短信内容转换成十六进制 * @param msg 短信内容 * @return 转换后的十六进制短信 */ public static final String encodeHex(String msg) { byte[] bytes = null; try { bytes = msg.getBytes("GBK"); } catch (java.io.UnsupportedEncodingException e) { e.printStackTrace(); } StringBuffer buff = new StringBuffer(bytes.length * 4); String b = ""; char a; int n = 0; int m = 0; for (int i = 0; i 0) { buff.append("00"); buff.append(b); n = n + 1; } else { a = msg.charAt((i - n) / 2 + n); m = a; try{b = Integer.toHexString(m);}catch (Exception e) {} buff.append(b.substring(0, 4)); i = i + 1; } } return buff.toString(); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值