短信設(shè)備java二次開(kāi)發(fā)包源代碼smslib-3.5.4.jar

分享

SMSLib開(kāi)發(fā)指南



一、SMSLib簡(jiǎn)介

SMSLib是一個(gè)開(kāi)放源代碼的短信貓二次開(kāi)發(fā)包,有JAVA和.Net兩個(gè)版本,目前最新版為v3.5.4。

                                                                                                                                                                       圖1-1


二、Window平臺(tái)


1、在smslib官網(wǎng)下載“SMSLib for Java v3.5.2”開(kāi)發(fā)包,并解壓,目錄結(jié)構(gòu)如下圖所示:


                                                                        圖2-1


                                                                        圖2-2

lib:存放二次開(kāi)發(fā)包(smslib-3.5.2.jar)和運(yùn)行時(shí)的依賴包(slf4j、log4j、commons-net、jsmpp等)(重要)

dist:存放短信貓服務(wù)開(kāi)發(fā)包(smsserver-3.5.2.jar),該包包括了smslib-3.5.2.jar中的所有核心類(lèi)。如果是將短信貓作為服務(wù)的方式部署,不需要額外寫(xiě)代碼開(kāi)發(fā)短信發(fā)送和接收的接口,直接部署短信服務(wù)即可,詳細(xì)的步聚,可以參考《短信貓服務(wù)安裝與配置指南》。(重要)

doc:smslib介紹、使用指南、smsserver安裝與配置等文檔(重要)

javadoc:二次開(kāi)發(fā)包API

src:存放二次開(kāi)發(fā)包源碼和示例源碼

misc:smslib日志(log4j)配置配置模板、smsserver數(shù)據(jù)庫(kù)建庫(kù)腳本及服務(wù)接口等文件

build:項(xiàng)目管理相關(guān)文件(不重要)


2、下載SUN JavaComm v2 (Win32)動(dòng)態(tài)庫(kù),并解壓,目錄結(jié)構(gòu)如下圖所示:


                                                                        圖3-1

3、運(yùn)行環(huán)境配置

  • 復(fù)制“圖3-1”中javax.comm.properties文件到%JAVA_HOME%\jre\lib目錄下,win32com.dll文件到%JAVA_HOME%\jre\bin目錄下

  • 復(fù)制“圖3-1”中comm.jar和圖2-2中所有jar文件到CLASSPATH目錄下(如果是用eclipse等IDE工具,將這些jar包導(dǎo)入到工程中)

       注意: win32com.dll只支持32位jdk,64位JDK的用RXTX

4、運(yùn)行示例程序并測(cè)試

      修改圖2-1中src\java\examples\modem目錄下的SendMessage.java和ReadMessages.java程序發(fā)送短信的參數(shù)配置,編譯并運(yùn)行。

如下圖所示:


// SendMessage.java - Sample application.  
// 短信發(fā)送測(cè)試程序  
// This application shows you the basic procedure for sending messages.  
// You will find how to send synchronous and asynchronous messages.  
//  
// For asynchronous dispatch, the example application sets a callback  
// notification, to see what's happened with messages.  
  
package examples.modem;  
  
import org.smslib.AGateway;  
import org.smslib.IOutboundMessageNotification;  
import org.smslib.Library;  
import org.smslib.OutboundMessage;  
import org.smslib.Service;  
import org.smslib.modem.SerialModemGateway;  
  
public class SendMessage  
{  
    public void doIt() throws Exception  
    {  
        OutboundNotification outboundNotification = new OutboundNotification();  
        System.out.println("Example: Send message from a serial gsm modem.");  
        System.out.println(Library.getLibraryDescription());  
        System.out.println("Version: " + Library.getLibraryVersion());  
        /*
        modem.com1:網(wǎng)關(guān)ID(即短信貓端口編號(hào))
        COM4:串口名稱(在window中以COMXX表示端口名稱,在linux,unix平臺(tái)下以ttyS0-N或ttyUSB0-N表示端口名稱),通過(guò)端口檢測(cè)程序得到可用的端口
        115200:串口每秒發(fā)送數(shù)據(jù)的bit位數(shù),必須設(shè)置正確才可以正常發(fā)送短信,可通過(guò)程序進(jìn)行檢測(cè)。常用的有115200、9600
        Huawei:短信貓生產(chǎn)廠商,不同的短信貓生產(chǎn)廠商smslib所封裝的AT指令接口會(huì)不一致,必須設(shè)置正確.常見(jiàn)的有Huawei、wavecom等廠商
        最后一個(gè)參數(shù)表示設(shè)備的型號(hào),可選
        */  
        SerialModemGateway gateway = new SerialModemGateway("modem.com1", "COM4", 115200, "Wavecom", "");  
        gateway.setInbound(true);   //設(shè)置true,表示該網(wǎng)關(guān)可以接收短信,根據(jù)需求修改  
        gateway.setOutbound(true);//設(shè)置true,表示該網(wǎng)關(guān)可以發(fā)送短信,根據(jù)需求修改  
        gateway.setSimPin("0000");//sim卡鎖,一般默認(rèn)為0000或1234  
        // Explicit SMSC address set is required for some modems.  
        // Below is for VODAFONE GREECE - be sure to set your own!  
        gateway.setSmscNumber("+306942190000");//短信服務(wù)中心號(hào)碼  
        Service.getInstance().setOutboundMessageNotification(outboundNotification); //發(fā)送短信成功后的回調(diào)函方法  
        Service.getInstance().addGateway(gateway);  //將網(wǎng)關(guān)添加到短信貓服務(wù)中  
        Service.getInstance().startService();   //啟動(dòng)服務(wù),進(jìn)入短信發(fā)送就緒狀態(tài)  
        System.out.println();  
        //打印設(shè)備信息  
        System.out.println("Modem Information:");  
        System.out.println("  Manufacturer: " + gateway.getManufacturer());  
        System.out.println("  Model: " + gateway.getModel());  
        System.out.println("  Serial No: " + gateway.getSerialNo());  
        System.out.println("  SIM IMSI: " + gateway.getImsi());  
        System.out.println("  Signal Level: " + gateway.getSignalLevel() + " dBm");  
        System.out.println("  Battery Level: " + gateway.getBatteryLevel() + "%");  
        System.out.println();  
        // Send a message synchronously.  
        OutboundMessage msg = new OutboundMessage("306974000000", "Hello from SMSLib!");    //參數(shù)1:手機(jī)號(hào)碼 參數(shù)2:短信內(nèi)容  
        Service.getInstance().sendMessage(msg); //執(zhí)行發(fā)送短信  
        System.out.println(msg);  
        // Or, send out a WAP SI message.  
        //OutboundWapSIMessage wapMsg = new OutboundWapSIMessage("306974000000",   
//new URL("http://www.smslib.org/"), "Visit SMSLib now!");  
        //Service.getInstance().sendMessage(wapMsg);  
        //System.out.println(wapMsg);  
        // You can also queue some asynchronous messages to see how the callbacks  
        // are called...  
        //msg = new OutboundMessage("309999999999", "Wrong number!");  
        //srv.queueMessage(msg, gateway.getGatewayId());  
        //msg = new OutboundMessage("308888888888", "Wrong number!");  
        //srv.queueMessage(msg, gateway.getGatewayId());  
        System.out.println("Now Sleeping - Hit <enter> to terminate.");  
        System.in.read();  
        Service.getInstance().stopService();  
    }  
  
    /*
     短信發(fā)送成功后,調(diào)用該接口。并將發(fā)送短信的網(wǎng)關(guān)和短信內(nèi)容對(duì)象傳給process接口
    */  
    public class OutboundNotification implements IOutboundMessageNotification  
    {  
        public void process(AGateway gateway, OutboundMessage msg)  
        {  
            System.out.println("Outbound handler called from Gateway: " + gateway.getGatewayId());  
            System.out.println(msg);  
        }  
    }  
  
    public static void main(String args[])  
    {  
        SendMessage app = new SendMessage();  
        try  
        {  
            app.doIt();  
        }  
        catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
    }  
}


// ReadMessages.java - Sample application.  
// 短信讀取程序  
// This application shows you the basic procedure needed for reading  
// SMS messages from your GSM modem, in synchronous mode.  
//  
// Operation description:  
// The application setup the necessary objects and connects to the phone.  
// As a first step, it reads all messages found in the phone.  
// Then, it goes to sleep, allowing the asynchronous callback handlers to  
// be called. Furthermore, for callback demonstration purposes, it responds  
// to each received message with a "Got It!" reply.  
//  
// Tasks:  
// 1) Setup Service object.  
// 2) Setup one or more Gateway objects.  
// 3) Attach Gateway objects to Service object.  
// 4) Setup callback notifications.  
// 5) Run  
  
package examples.modem;  
  
import java.util.ArrayList;  
import java.util.List;  
import javax.crypto.spec.SecretKeySpec;  
import org.smslib.AGateway;  
import org.smslib.AGateway.GatewayStatuses;  
import org.smslib.AGateway.Protocols;  
import org.smslib.ICallNotification;  
import org.smslib.IGatewayStatusNotification;  
import org.smslib.IInboundMessageNotification;  
import org.smslib.IOrphanedMessageNotification;  
import org.smslib.InboundMessage;  
import org.smslib.InboundMessage.MessageClasses;  
import org.smslib.Library;  
import org.smslib.Message.MessageTypes;  
import org.smslib.Service;  
import org.smslib.crypto.AESKey;  
import org.smslib.modem.SerialModemGateway;  
  
public class ReadMessages  
{  
    public void doIt() throws Exception  
    {  
        // Define a list which will hold the read messages.  
        List<InboundMessage> msgList;  
        // Create the notification callback method for inbound & status report  
        // messages.  
        InboundNotification inboundNotification = new InboundNotification();  
        // Create the notification callback method for inbound voice calls.  
        CallNotification callNotification = new CallNotification();  
        //Create the notification callback method for gateway statuses.  
        GatewayStatusNotification statusNotification = new GatewayStatusNotification();  
        OrphanedMessageNotification orphanedMessageNotification = new OrphanedMessageNotification();  
        try  
        {  
            System.out.println("Example: Read messages from a serial gsm modem.");  
            System.out.println(Library.getLibraryDescription());  
            System.out.println("Version: " + Library.getLibraryVersion());  
            // Create the Gateway representing the serial GSM modem.  
            SerialModemGateway gateway = new SerialModemGateway("modem.com4", "COM4", 115200, "Wavecom", null);  
            // Set the modem protocol to PDU (alternative is TEXT). PDU is the default, anyway...  
            gateway.setProtocol(Protocols.PDU);  
            // Do we want the Gateway to be used for Inbound messages?  
            gateway.setInbound(true);  
            // Do we want the Gateway to be used for Outbound messages?  
            gateway.setOutbound(true);  
            // Let SMSLib know which is the SIM PIN.  
            gateway.setSimPin("0000");  
            // Set up the notification methods.  
            Service.getInstance().setInboundMessageNotification(inboundNotification);  
            Service.getInstance().setCallNotification(callNotification);  
            Service.getInstance().setGatewayStatusNotification(statusNotification);  
            Service.getInstance().setOrphanedMessageNotification(orphanedMessageNotification);  
            // Add the Gateway to the Service object.  
            Service.getInstance().addGateway(gateway);  
            // Similarly, you may define as many Gateway objects, representing  
            // various GSM modems, add them in the Service object and control all of them.  
            // Start! (i.e. connect to all defined Gateways)  
            Service.getInstance().startService();  
            // Printout some general information about the modem.  
            System.out.println();  
            System.out.println("Modem Information:");  
            System.out.println("  Manufacturer: " + gateway.getManufacturer());  
            System.out.println("  Model: " + gateway.getModel());  
            System.out.println("  Serial No: " + gateway.getSerialNo());  
            System.out.println("  SIM IMSI: " + gateway.getImsi());  
            System.out.println("  Signal Level: " + gateway.getSignalLevel() + " dBm");  
            System.out.println("  Battery Level: " + gateway.getBatteryLevel() + "%");  
            System.out.println();  
            // In case you work with encrypted messages, its a good time to declare your keys.  
            // Create a new AES Key with a known key value.   
            // Register it in KeyManager in order to keep it active. SMSLib will then automatically  
            // encrypt / decrypt all messages send to / received from this number.  
            Service.getInstance().getKeyManager().registerKey("+306948494037",   
new AESKey(new SecretKeySpec("0011223344556677".getBytes(), "AES")));  
            // Read Messages. The reading is done via the Service object and  
            // affects all Gateway objects defined. This can also be more directed to a specific  
            // Gateway - look the JavaDocs for information on the Service method calls.  
            msgList = new ArrayList<InboundMessage>();  
            Service.getInstance().readMessages(msgList, MessageClasses.ALL);  
            for (InboundMessage msg : msgList)  
                System.out.println(msg);  
            // Sleep now. Emulate real world situation and give a chance to the notifications  
            // methods to be called in the event of message or voice call reception.  
            System.out.println("Now Sleeping - Hit <enter> to stop service.");  
            System.in.read();  
            System.in.read();  
        }  
        catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
        finally  
        {  
            Service.getInstance().stopService();  
        }  
    }  
  
    public class InboundNotification implements IInboundMessageNotification  
    {  
        public void process(AGateway gateway, MessageTypes msgType, InboundMessage msg)  
        {  
            if (msgType == MessageTypes.INBOUND) System.out.println(">>> New Inbound message detected from Gateway: "   
+ gateway.getGatewayId());  
            else if (msgType == MessageTypes.STATUSREPORT) System.out.println(">>> New Inbound Status " +   
"Report message detected from Gateway: " + gateway.getGatewayId());  
            System.out.println(msg);  
        }  
    }  
  
    public class CallNotification implements ICallNotification  
    {  
        public void process(AGateway gateway, String callerId)  
        {  
            System.out.println(">>> New call detected from Gateway: " + gateway.getGatewayId() + " : " + callerId);  
        }  
    }  
  
    public class GatewayStatusNotification implements IGatewayStatusNotification  
    {  
        public void process(AGateway gateway, GatewayStatuses oldStatus, GatewayStatuses newStatus)  
        {  
            System.out.println(">>> Gateway Status change for " + gateway.getGatewayId() + ", OLD: " + oldStatus + " -> NEW: " + newStatus);  
        }  
    }  
  
    public class OrphanedMessageNotification implements IOrphanedMessageNotification  
    {  
        public boolean process(AGateway gateway, InboundMessage msg)  
        {  
            System.out.println(">>> Orphaned message part detected from " + gateway.getGatewayId());  
            System.out.println(msg);  
            // Since we are just testing, return FALSE and keep the orphaned message part.  
            return false;  
        }  
    }  
  
    public static void main(String args[])  
    {  
        ReadMessages app = new ReadMessages();  
        try  
        {  
            app.doIt();  
        }  
        catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
    }  
}


三、Linux、Unix、Solaris平臺(tái)
與window平臺(tái)不同的地方就在于動(dòng)態(tài)庫(kù)和二次開(kāi)發(fā)包不一致,其它基本類(lèi)似
rxtx與comm的編碼方式是不一樣的。

1、下載RxTx v2.1.7 R2
2、解壓,目錄結(jié)構(gòu)如下圖所示:


                                                                        圖4-1

3、運(yùn)行環(huán)境配置

  • 復(fù)制圖4-1中Linux目錄下的librxtxSerial.so文件至$JAVA_HOME/jre/lib/$(ARCH)/目錄下,復(fù)制RXTXcomm.jar到應(yīng)用程序的CLASSPATH或$JAVA_HOME/jre/lib/ext目錄下

  • 復(fù)制圖3-1中的javax.comm.properties文件至$JAVA_HOME/jre/lib目錄下,并將文件中的Driver=com.sun.comm.Win32Driver改成Driver=gnu.io.CommDriver。文件內(nèi)容如下圖所示:


4、修改示例程序,編譯并運(yùn)行



四、短信貓?jiān)O(shè)備可用端口檢測(cè)程序


import gnu.io.*;  
import java.util.*;  
import java.io.*;  
  
public class CommTest  
{  
    static CommPortIdentifier portId;  
    static Enumeration portList;  
    static int bauds[] = { 9600, 19200, 57600, 115200 };    //檢測(cè)端口所支持的波特率  
  
    public static void main(String[] args)  
    {  
        portList = CommPortIdentifier.getPortIdentifiers();  
        System.out.println("短信設(shè)備端口連接測(cè)試...");  
        while (portList.hasMoreElements())  
        {  
            portId = (CommPortIdentifier) portList.nextElement();  
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)  
            {  
                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;  
                        String response;  
                        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)  
                        {  
                        }  
                        response = "";  
                        c = inStream.read();  
                        while (c != -1)  
                        {  
                            response += (char) c;  
                            c = inStream.read();  
                        }  
                        if (response.indexOf("OK") >= 0)  
                        {  
                            try  
                            {  
                                System.out.print("  獲取設(shè)備信息...");  
                                outStream.write('A');  
                                outStream.write('T');  
                                outStream.write('+');  
                                outStream.write('C');  
                                outStream.write('G');  
                                outStream.write('M');  
                                outStream.write('M');  
                                outStream.write('\r');  
                                response = "";  
                                c = inStream.read();  
                                while (c != -1)  
                                {  
                                    response += (char) c;  
                                    c = inStream.read();  
                                }  
                                System.out.println("  發(fā)現(xiàn)設(shè)備: " + response.replaceAll("\\s+OK\\s+", "").replaceAll("\n", "").replaceAll("\r", ""));  
                            }  
                            catch (Exception e)  
                            {  
                                System.out.println("  沒(méi)有發(fā)現(xiàn)設(shè)備!");  
                            }  
                        }  
                        else System.out.println("  沒(méi)有發(fā)現(xiàn)設(shè)備!");  
                        serialPort.close();  
                    }  
                    catch (Exception e)  
                    {  
                        System.out.println("  沒(méi)有發(fā)現(xiàn)設(shè)備!");  
                    }  
                }  
            }  
        }  
    }  
}

五、短信貓?jiān)O(shè)備使用minicom檢測(cè)

1、linux下端口配置

軟件安裝完畢后,采用minicom進(jìn)行配置

執(zhí)行sudo minicom -s,進(jìn)入配置界面,


在第三項(xiàng)『串口配置』,設(shè)置端口為全面查詢到的端口,速率是9600(根據(jù)短信貓?jiān)O(shè)備來(lái)定,不同的廠家可能會(huì)不一樣)



Serial Device :/dev/ttyS1(此為串口端口,可以在ttyS0~~ttyS4中挨個(gè)試)
Serial Device :/dev/ttyUSB0(此為USB轉(zhuǎn)串口端口,可以在ttyUSB0~~ttyUSB4中挨個(gè)試)

然后在主菜單Save setup as dfl

可選擇Exit推出配置進(jìn)入minicom,就可以使用at命令測(cè)試配置是否成功;也可選擇Exit from Minicom推出minicom。

接下在再次執(zhí)行minicom,進(jìn)入主界面,這時(shí)候應(yīng)該就可以輸入AT指令了。要注意的是,我是重新插拔了一下短信貓才成功連上的

六、minicom使用方法

1、啟動(dòng)minicom命令

   sudo miniscom

2、輸入命令

   同時(shí)按Ctrl+a 后按e鍵,不按e鍵不能輸入命令。

   輸入at回車(chē),會(huì)輸出OK。證明短信貓連接成功。如果沒(méi)有返回可以修改端口再試

  at發(fā)短信命令 at+cmgs=手機(jī)號(hào)碼

  ctrl+z發(fā)送短信

3、退出命令

   同時(shí)按Ctrl+a 后按x鍵

七、linux虛擬機(jī)需要注意是否共享串口

    
配置成功后會(huì)在“vm”菜單中看到共享的端口

八、java環(huán)境變量

注意事項(xiàng):

1、使用smslib庫(kù)之前,如果你的設(shè)備是usb數(shù)據(jù)線,先檢查系統(tǒng)中該設(shè)備驅(qū)動(dòng)程序是否已安裝,在window環(huán)境下,廠商一般會(huì)提供設(shè)備的驅(qū)動(dòng)程序,在linux環(huán)境下,內(nèi)核2.6.32或以上版本,預(yù)裝了常用設(shè)備的USB轉(zhuǎn)串口驅(qū)動(dòng),如果系統(tǒng)未自動(dòng)識(shí)別該設(shè)備,就需要自行安裝該設(shè)備的驅(qū)動(dòng)程序了。

2、在開(kāi)發(fā)過(guò)程中,org.smslib.TimeoutException: No response from device是最常遇到的一個(gè)異常,解決方案請(qǐng)參考:短信貓JAVA二次開(kāi)發(fā)包SMSLib,org.smslib.TimeoutException: No response from device解決方案

3、開(kāi)發(fā)過(guò)程中遇到只能發(fā)送一條短信的解決辦法:JAVA二次開(kāi)發(fā)包smslib只能發(fā)送一條信息,第二條失敗問(wèn)題, 短信貓smsLib for java二次開(kāi)發(fā)系列問(wèn)題解決探討

4、判斷是否設(shè)備出問(wèn)題可按照下面文章進(jìn)行測(cè)試:短信貓通過(guò)超級(jí)終端進(jìn)行配置和調(diào)試

5、如上面問(wèn)題解決不了你的問(wèn)題可以跟貼子看看有沒(méi)正在開(kāi)發(fā)的網(wǎng)友一起交流下



相關(guān)附件下載(論壇注冊(cè)后可下載)

smslib-3.5.4.jar(必須JDK1.7以上版本 smslib-3.5.4.rar

(原版封包)


給懶人重新封裝好的(必須JDK1.7以上版本: smslib3.5.5.rar去重啟) smslib3.5.6.rar去COPS)有時(shí)間的自己用工程源碼自己合理修改重新封裝一個(gè)自己用

smslib-3.3.0b2.jar(可以支持所有jdk版本,舊版本): smslib-3.3.0b2.jar.rar


smslib-3.3.0b2及win32com串口庫(kù): smslib-3.3.0b2.rar


整個(gè)工程所有文件源代碼(smslib-3.5.4版本的): smslib_java全開(kāi)源碼包zip


RXTX依賴包必要的

rxtx與win32com是相同的一個(gè)串口包,項(xiàng)目是必須要引用其中一個(gè)版本串口包的不可少,放到j(luò)re里面具體使用按照官方Install說(shuō)明,win系統(tǒng)32位使用win32com更穩(wěn)定

RxTx v2.1.7 R2(主要針對(duì)32位):上面工程源碼壓縮包里都有win和linux個(gè)位數(shù)系統(tǒng)的串口庫(kù) mfz-rxtx2.2 win-x86(官網(wǎng)32位).rar


RxTx V2.2才是支持64位的:mfz-rxtx2.2 win-x64(官網(wǎng)64位).rar  rxtx-2.2含linux版.zip


注:建議在使用RXTX時(shí),如果jdk和功能里有javacomm動(dòng)態(tài)庫(kù)相關(guān)文件時(shí)先把這些文件刪除,在導(dǎo)入RXTX,不然是找不到端口的,開(kāi)發(fā)包默認(rèn)先檢測(cè)javacomm后在RXTX的(可以并用但您還不熟悉容易混淆所以只能這么說(shuō))

這個(gè)java包如果是用單例方法sendMessage(msg)做群發(fā)短信用的時(shí)候,建議你把程序修改每條短信間隔的時(shí)間相隔5秒時(shí)間,如果5秒感覺(jué)慢了,自己進(jìn)行實(shí)際檢測(cè)縮小時(shí)間,最低不要低于3秒的間隔時(shí)間,3秒鐘是短信貓硬件比較合理的一個(gè)緩沖間隔時(shí)間,太快了smslib包超時(shí)無(wú)反應(yīng)錯(cuò)誤,貓也可能會(huì)死機(jī)的要理解。(或者把短信提交到smslib自帶的短信隊(duì)列里面讓程序幫你處理發(fā)出去

實(shí)在自己跑不通smslib的朋友可以聯(lián)系我們客服購(gòu)買(mǎi)我們硬件(含技術(shù))后,找技術(shù)教您吧!

短信設(shè)備二次開(kāi)發(fā) 2022-08-29 8 0

admin

  • 注冊(cè)時(shí)間 : 2022-03-30 04:08:47
  • 郵箱地址 : admin@tenghengkeji.com
  • 此頁(yè)面用于展示用戶的基本上資料信息

回帖 ( 8 )

  1. #1樓 admin
    2022-04-10 07:16:34
    0 0
    回復(fù)
    2017-01-12 14:30:50 [日志信息] Version: 3.5.2
    2017-01-12 14:30:50 [日志信息] JRE Version: 1.7.0_09
    2017-01-12 14:30:50 [日志信息] JRE Impl Version: 23.5-b02
    2017-01-12 14:30:50 [日志信息] O/S: Windows 7 / x86 / 6.1
    2017-01-12 14:30:50 [日志信息] Initialized.
    2017-01-12 14:30:50 [日志信息] Running...
    2017-01-12 14:30:50 [日志信息] NotifyQueueManager running...
    2017-01-12 14:30:52 [日志信息] Queue directory not defined. Queued messages will not be saved to filesystem.
    2017-01-12 14:30:52 [日志信息] Initialized.
    2017-01-12 14:30:52 [日志信息] Running...
    2017-01-12 14:30:52 [日志信息] DelayQueueManager running...
    2017-01-12 14:30:52 [日志信息] Initialized.
    2017-01-12 14:30:52 [日志信息] Running...
    2017-01-12 14:30:52 [日志信息] GTW: modem.com3: Starting gateway, using Wavecom (Generic) AT Handler.
    2017-01-12 14:30:52 [日志信息] GTW: modem.com3: Opening: COM3 @9600
    2017-01-12 14:30:52 [日志信息] Initialized.
    2017-01-12 14:30:52 [日志信息] Running...
    2017-01-12 14:30:52 [日志信息] Initialized.
    2017-01-12 14:30:52 [日志信息] ** disabled **
    2017-01-12 14:30:52 [日志信息] GTW: modem.com3: ModemReader thread started.
    2017-01-12 14:30:52 [日志信息] GTW: modem.com3: AsyncNotifier thread started.
    2017-01-12 14:30:52 [日志信息] GTW: modem.com3: AsyncMessageProcessor thread started.
    2017-01-12 14:30:52 [日志信息] GTW: modem.com3: clearBuffer() called.
    2017-01-12 14:30:53 [日志信息] GTW: modem.com3: SEND 27)
    2017-01-12 14:30:53 [日志信息] GTW: modem.com3: SEND :+++
    2017-01-12 14:30:53 [日志信息] GTW: modem.com3: SEND :ATZ(cr)
    2017-01-12 14:30:54 [日志信息] GTW: modem.com3: clearBuffer() called.
    2017-01-12 14:30:55 [日志信息] GTW: modem.com3: SEND :AT+CFUN=1(cr)
    2017-01-12 14:31:05 [日志信息] GTW: modem.com3: clearBuffer() called.
    2017-01-12 14:31:06 [日志信息] GTW: modem.com3: SEND :ATZ(cr)
    2017-01-12 14:31:06 [日志信息] GTW: modem.com3: SEND :ATE0(cr)
    2017-01-12 14:31:06 [日志信息] GTW: modem.com3: clearBuffer() called.
    2017-01-12 14:31:07 [日志信息] Running...
    2017-01-12 14:31:07 [日志信息] GTW: modem.com3: SEND :AT+CPIN?(cr)
    2017-01-12 14:31:22 [日志信息] Running...
    2017-01-12 14:31:22 [日志信息] ** disabled **
    2017-01-12 14:31:22 [日志信息] GTW: modem.com3: Buffer contents on timeout: ???
    2017-01-12 14:31:22 [日志信息] Stopped.
    2017-01-12 14:31:22 [日志信息] Stopped.
    2017-01-12 14:31:22 [日志信息] GTW: modem.com3: AsyncNotifier thread ended.
    2017-01-12 14:31:22 [日志信息] GTW: modem.com3: AsyncMessageProcessor thread ended.
    2017-01-12 14:31:22 [日志信息] GTW: modem.com3: ModemReader thread ended.
    2017-01-12 14:31:22 [日志信息] GTW: modem.com3: Closing: COM3 @9600
    2017-01-12 14:31:23 [日志信息] NotifyQueueManager end...
    2017-01-12 14:31:23 [日志信息] DelayQueueManager end...
    2017-01-12 14:31:23 [日志信息] Running...
    2017-01-12 14:31:23 [日志信息] NotifyQueueManager running...
    2017-01-12 14:31:23 [日志信息] Stopped.
    2017-01-12 14:31:23 [日志信息] GTW: modem.com3: Stopping gateway...
    2017-01-12 14:31:23 [日志信息] GTW: modem.com3: SEND :AT+WATH=31(cr)
    java.io.IOException: write error

            at com.sun.comm.Win32SerialPort.write(Win32SerialPort.java:677)
            at com.sun.comm.Win32SerialOutputStream.write(Win32SerialOutputStream.java:38)
            at org.smslib.modem.SerialModemDriver.write(SerialModemDriver.java:166)
            at org.smslib.modem.AModemDriver.write(AModemDriver.java:302)
            at org.smslib.modem.athandler.ATHandler_Wavecom.done(ATHandler_Wavecom.java:52)
            at org.smslib.modem.ModemGateway.stopGateway(ModemGateway.java:198)
            at org.smslib.Service.stopService(Service.java:354)
            at org.smslib.Service.startService(Service.java:233)
            at org.smslib.Service.startService(Service.java:196)
            at com.controller.SendMessage.doIt(SendMessage.java:27)
            at com.controller.FMSGCallBack.invoke(FMSGCallBack.java:95)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:601)
            at com.sun.jna.CallbackReference$DefaultCallbackProxy.invokeCallback(CallbackReference.java:444)
            at com.sun.jna.CallbackReference$DefaultCallbackProxy.callback(CallbackReference.java:474)
    請(qǐng)問(wèn)這是什么問(wèn)題:
    我的代碼:
    package com.controller;

    import org.smslib.AGateway;
    import org.smslib.IOutboundMessageNotification;
    import org.smslib.Library;
    import org.smslib.OutboundMessage;
    import org.smslib.Service;
    import org.smslib.modem.SerialModemGateway;

    public class SendMessage
    {
            public void doIt() throws Exception
            {
                    OutboundNotification outboundNotification = new OutboundNotification();
                    System.out.println("Example: Send message from a serial gsm modem.");
                    System.out.println(Library.getLibraryDescription());
                    System.out.println("Version: " + Library.getLibraryVersion());
                    SerialModemGateway gateway = new SerialModemGateway("modem.com3", "COM3", 9600, "Wavecom", "");
                    gateway.setInbound(true);
                    gateway.setOutbound(true);
                    gateway.setSimPin("0000");
                    // Explicit SMSC address set is required for some modems.
                    // Below is for VODAFONE GREECE - be sure to set your own!
                    gateway.setSmscNumber("+8613008197212");
                    Service.getInstance().setOutboundMessageNotification(outboundNotification);
                    Service.getInstance().addGateway(gateway);
                    Service.getInstance().startService();
                    System.out.println();
                    System.out.println("Modem Information:");
                    System.out.println("  Manufacturer: " + gateway.getManufacturer());
                    System.out.println("  Model: " + gateway.getModel());
                    System.out.println("  Serial No: " + gateway.getSerialNo());
                    System.out.println("  SIM IMSI: " + gateway.getImsi());
                    System.out.println("  Signal Level: " + gateway.getSignalLevel() + " dBm");
                    System.out.println("  Battery Level: " + gateway.getBatteryLevel() + "%");
                    System.out.println();
                    OutboundMessage msg = new OutboundMessage("136888041107", "Hello from SMSLib!");
                    Service.getInstance().sendMessage(msg);
                    System.out.println(msg);
                    System.out.println("Now Sleeping - Hit <enter> to terminate.");
                    System.in.read();
                    Service.getInstance().stopService();
            }

            public class OutboundNotification implements IOutboundMessageNotification
            {
                    public void process(AGateway gateway, OutboundMessage msg)
                    {
                            System.out.println("Outbound handler called from Gateway: " + gateway.getGatewayId());
                            System.out.println(msg);
                    }
            }

            public static void main(String args[])
            {
                    SendMessage app = new SendMessage();
                    try
                    {
                            app.doIt();
                    }
                    catch (Exception e)
                    {
                            e.printStackTrace();
                    }
            }
    }
    • 2022-04-10 07:19:09
      0 0
      回復(fù)

      回復(fù)@admin

      2017-01-12 14:31:06 [日志信息] GTW: modem.com3: clearBuffer() called.
      2017-01-12 14:31:07 [日志信息] Running...
      2017-01-12 14:31:07 [日志信息] GTW: modem.com3: SEND :AT+CPIN?(cr)
      2017-01-12 14:31:22 [日志信息] Running...
      2017-01-12 14:31:22 [日志信息] ** disabled **
      2017-01-12 14:31:22 [日志信息] GTW: modem.com3: Buffer contents on timeout: ???


      at+cpin是查詢卡的狀態(tài),這個(gè)指令過(guò)不了,應(yīng)該就是你的卡沒(méi)反回狀態(tài),也可以說(shuō)沒(méi)串口數(shù)據(jù)導(dǎo)致smslib報(bào)錯(cuò)??纯词遣皇菦](méi)插卡?卡沒(méi)開(kāi)通?卡欠費(fèi)?信號(hào)不好?設(shè)備沒(méi)上天線?等問(wèn)題

      正常返回ready,準(zhǔn)備好的意思。

  2. #2樓 admin
    2022-04-10 07:13:22
    0 0
    回復(fù)
    你好,問(wèn)個(gè)問(wèn)題:短信貓?jiān)趺幢O(jiān)聽(tīng)有新短信?
    • 2022-04-10 07:14:21
      0 0
      回復(fù)
      這是設(shè)備直接串口的監(jiān)聽(tīng)實(shí)現(xiàn)過(guò)程,看圖
      cnmi為2,1時(shí)
      如果串口反饋到+CMTI: "SM",1    //CMTI: "儲(chǔ)存的位置",短信所在序列號(hào),儲(chǔ)存位置可以用cpms改變SM,ME,MT,SR等,根據(jù)你的貓支持的進(jìn)行設(shè)置,一般是SM
      cnmi為2,2時(shí)
      串口反饋+CMT: "+86手機(jī)號(hào)碼",,“接收時(shí)間”

      有短信是串口自動(dòng)反饋信息的。
      有對(duì)應(yīng)的返回時(shí)你自己去執(zhí)行cmgr或者cmgl指令進(jìn)行獲取你的短信即可

      如果你只是想用smslib來(lái)實(shí)現(xiàn),自己去把源碼工程下載下來(lái),看看InboundMessage.java了。
    • 2022-04-10 07:13:42
      0 0
      回復(fù)

      回復(fù)@admin

      你好,可以看看這帖子的回答http://bbs.csdn.net/topics/360001595

      采用新版本的smslib

      this.srv.readMessages(msgList, MessageClasses.ALL);
      你這句代碼讀的是全部的短信,MessageClasses.READ 已讀短信, MessageClasses.UNREAD 未讀短信。

      問(wèn)題1:我也發(fā)了帖子問(wèn)了這個(gè),沒(méi)人回答。
      問(wèn)題2: 我用3.5.0版本的自帶有監(jiān)聽(tīng)器,應(yīng)該是實(shí)時(shí)監(jiān)聽(tīng)的。
      我們需要實(shí)現(xiàn)一個(gè)接口來(lái)實(shí)現(xiàn)回調(diào)方法:
      先實(shí)現(xiàn)接口:IInboundMessageNotification,
      然后實(shí)現(xiàn)方法:void process(AGateway gateway, MessageTypes msgType, InboundMessage msg)。
      從方法可以看出,傳入的參數(shù)為:網(wǎng)關(guān),短信類(lèi)型,進(jìn)站短信。
      這樣子,當(dāng)收到短信的時(shí)候這個(gè)方法會(huì)被自動(dòng)調(diào)用,你就得到短信,就可以做后續(xù)處理

  3. #3樓 admin
    2022-04-10 07:12:52
    0 0
    回復(fù)

    如配置完,調(diào)試?yán)映霈F(xiàn)上面圖上錯(cuò)誤
    一般是串口通訊庫(kù)沒(méi)有配置成功,也可以說(shuō)是找不到端口。
    解決辦法:
    1,檢查短信貓?zhí)摂M出來(lái)的端口號(hào)(com)是否與你例子配置的端口一致
    2、波特率是否與短信貓?jiān)O(shè)備默認(rèn)波特率一致
    3、看看項(xiàng)目啟用的是那個(gè)jre,看看對(duì)應(yīng)jre目錄下有沒(méi)通許庫(kù)的動(dòng)態(tài)文件存在
    4、操作系統(tǒng)是否安裝了兩個(gè)版本jdk,查看電腦當(dāng)前jdk使用版本是否與項(xiàng)目啟用的jdk一致

    上面4個(gè)解決點(diǎn)解決后基本上是能解決圖上出現(xiàn)問(wèn)題的,如果不能解決再另外處理
  4. #4樓
    2022-04-10 07:10:06
    0 0
    回復(fù)
    java短信貓二次開(kāi)發(fā)包smslib包刪除孤兒短信和刪除自主讀取短信及源代去掉重啟指令

    這個(gè)視頻主要是翻錄上個(gè)視頻錄制的時(shí)候沒(méi)開(kāi)啟賣(mài)這個(gè)40多分鐘的視頻沒(méi)聲音。java短信貓二次開(kāi)發(fā)包smslib包刪除孤兒短信和刪除自主讀取短信及源代去掉重啟指令 Service.getInstance().deleteMessage(msg);//屬于主動(dòng)讀取短信并刪除的方法, 如果是smslib里面自帶監(jiān)聽(tīng)的短信你是無(wú)法刪除的。 重啟命令at+cfun=1沒(méi)用的可以去掉。at+cfun=0是關(guān)機(jī)指令也是可以去掉可以減少初始化設(shè)備時(shí)間, 及關(guān)機(jī)后對(duì)于經(jīng)驗(yàn)不足的人誤以為設(shè)備出問(wèn)題。


  5. #5樓
    2022-04-10 07:08:47
    0 0
    回復(fù)

    win10下測(cè)試1.8JDK64位環(huán)境下調(diào)試smslib教程及常見(jiàn)錯(cuò)誤配置演示 采用RXTX64串口通訊庫(kù)+短信貓java二次開(kāi)發(fā)包smslib, 及JDK1.864位java環(huán)境進(jìn)行調(diào)試, 說(shuō)明了有些客戶沒(méi)注意系統(tǒng)庫(kù)的路徑導(dǎo)致配置不對(duì)的介紹, 及發(fā)送例子SendMessages和接收例子ReadMessages的測(cè)試 更多的測(cè)試關(guān)注下一個(gè)視頻 視頻請(qǐng)用高清觀看,不然比較模糊