首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SMSLib 發送中文短信完整範例:SerialModemGateway 配置、PDU 模式、回調處理

     編輯:Java 相關知識

前言

SMSLib 是成熟的 Java 短信庫,支援 GSM Modem/手機透過 AT 指令發送/接收短信。本文提供完整發送中文短信、接收回調、錯誤處理範例。

1. Maven 依賴

<dependency>
    <groupId>org.smslib</groupId>
    <artifactId>smslib</artifactId>
    <version>3.5.0</version>
</dependency>
<!-- RXTX 串口通訊 (Linux 需額外安裝 librxtx-java) -->
<dependency>
    <groupId>org.rxtx</groupId>
    <artifactId>rxtx</artifactId>
    <version>2.1.7</version>
</dependency>

2. 核心發送類

import org.smslib.*;
import org.smslib.modem.SerialModemGateway;

public class SmsSender {
    private final SerialModemGateway gateway;
    private final Service service;
    
    public SmsSender(String port, int baudRate, String manufacturer, String model, String pin) throws Exception {
        gateway = new SerialModemGateway("modem", port, baudRate, manufacturer, model);
        gateway.setSimPin(pin);
        gateway.setInbound(true);
        gateway.setOutbound(true);
        
        service = Service.getInstance();
        service.addGateway(gateway);
        service.startService();
    }
    
    public void send(String phone, String text) throws Exception {
        OutboundMessage msg = new OutboundMessage(phone, text);
        msg.setEncoding(Message.MessageEncodings.ENCUCS2); // 中文必須 UCS2
        service.sendMessage(msg);
    }
    
    public List readAll() throws Exception {
        List list = new ArrayList<>();
        service.readMessages(list, InboundMessage.MessageClasses.ALL);
        return list;
    }
    
    public void shutdown() {
        service.stopService();
    }
}

3. 回調監聽器實現

// 發送狀態回調
gateway.setOutboundNotification(new IOutboundMessageNotification() {
    @Override public void process(String gatewayId, OutboundMessage msg) {
        System.out.println("發送報告: " + gatewayId + " - " + msg.getStatus());
    }
});

// 接收短信回調
gateway.setInboundNotification(new IInboundMessageNotification() {
    @Override public void process(String gatewayId, MessageTypes type, InboundMessage msg) {
        if (type == MessageTypes.INBOUND) {
            System.out.println("收到短信: " + msg.getOriginator() + " - " + msg.getText());
        }
    }
});

// 語音來電回調
gateway.setCallNotification(new ICallNotification() {
    @Override public void process(String gatewayId, String callerId) {
        System.out.println("來電: " + callerId);
    }
});

4. 使用範例

public static void main(String[] args) {
    try {
        SmsSender sender = new SmsSender("COM10", 9600, "Wavecom", "M1306B", "0000");
        
        // 發送中文
        sender.send("+886912345678", "測試中文短信內容");
        
        // 讀取收件箱
        List msgs = sender.readAll();
        for (InboundMessage m : msgs) {
            System.out.println(m.getOriginator() + ": " + m.getText());
        }
        
        sender.shutdown();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

5. 關鍵配置說明

參數說明
ENCUCS2中文編碼,佔 70 字元/條(單條 160 字元 ASCII)
SIM PIN預設常為 0000 或 1234,視 SIM 卡而定
Baud Rate常見 9600/115200,需與 Modem 一致
PDU ModeSMSLib 內部自動使用 PDU 模式發送長短信/中文

6. 常見問題

  • Port busy:確保無其他程式佔用串口,Linux 需加入用戶至 dialout 群組。
  • 發送失敗 CMS ERROR:檢查號碼格式(需國碼)、SIM 餘額、訊號強度。
  • 中文亂碼:務必設定 msg.setEncoding(ENCUCS2),且 Java 檔案編碼為 UTF-8。
  • 長短信分段:SMSLib 自動分段重組,單條最多 10 段。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved