SMSLib 是成熟的 Java 短信庫,支援 GSM Modem/手機透過 AT 指令發送/接收短信。本文提供完整發送中文短信、接收回調、錯誤處理範例。
<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>
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();
}
}
// 發送狀態回調
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);
}
});
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();
}
}
| 參數 | 說明 |
|---|---|
| ENCUCS2 | 中文編碼,佔 70 字元/條(單條 160 字元 ASCII) |
| SIM PIN | 預設常為 0000 或 1234,視 SIM 卡而定 |
| Baud Rate | 常見 9600/115200,需與 Modem 一致 |
| PDU Mode | SMSLib 內部自動使用 PDU 模式發送長短信/中文 |
dialout 群組。msg.setEncoding(ENCUCS2),且 Java 檔案編碼為 UTF-8。