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

Java ME Push Registry 實戰:基於 SMS 的 MIDlet 自動啟動與服務端 GSM Modem 發送全流程

     編輯:Java 程式設計入門

核心場景

企業級移動應用需求:服務器主動推送數據到手機,**無需用戶手動啟動**,自動喚醒已安裝的 MIDlet 進行業務處理(如工單派發、緊急通知、即時競價)。

MIDP 2.0 (JSR 118) 引入 **Push Registry** 機制,配合 SMS (WMA 1.1 支持) 實現「無 IP、無長連接」的可靠喚醒。

Push Registry 三步走機制

  1. 註冊:MIDlet 在 JAD/Manifest 或運行時動態註冊 MIDlet-Push-<n>: <ConnectionURL>, <MIDletClassName>, <AllowedSender>
  2. 推送:服務器向目標手機號發送帶**特定端口**的 SMS
  3. 喚醒:AMS (Application Management Software) 攔截 SMS,匹配端口/協議/發送者,自動啟動對應 MIDlet 並傳遞 PushRegistry.listConnections(true)

關鍵配置:JAD 中的 Push 註冊條目

MIDlet-Push-1: sms://:5000, com.example.AlertMidlet, *
MIDlet-Push-2: socket://:7777, com.example.SocketMidlet, 13800138000
  • sms://:5000:監聽端口 5000 的 SMS (WMA 標準)
  • *:允許任意發送者;可限制具體號碼提升安全性
  • 多條註冊按數字順序,首個缺失條目終止解析

為什麼選 SMS 而非 Socket?

維度Socket PushSMS Push
目標定址需知手機無線 IP (動態、NAT、防火牆難題)只需手機號 (公網唯一、穩定)
設備在線要求需保持長連接/心跳 (耗電、易斷)無需數據連接,僅需信號覆蓋
設備支持度所有 MIDP 2.0 必須支持需 WMA 1.1 可選包支持 (主流機型均支持)
成本數據流量費短信費 (企業批量通道較低)

客戶端 MIDlet 開發完整代碼

import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.wireless.messaging.*;

public class AlertMidlet extends MIDlet implements CommandListener {
    private Display display;
    private Form alertForm;
    private Command exitCmd;

    protected void startApp() {
        if (display == null) {
            display = Display.getDisplay(this);
            exitCmd = new Command("退出", Command.EXIT, 1);
            alertForm = new Form("服務器推送");
            alertForm.addCommand(exitCmd);
            alertForm.setCommandListener(this);
        }
        
        // 處理 Push 啟動傳入的連接
        String[] connections = PushRegistry.listConnections(true);
        for (String conn : connections) {
            try {
                MessageConnection mc = (MessageConnection) Connector.open(conn);
                Message msg = mc.receive(); // 阻塞讀取
                if (msg instanceof TextMessage) {
                    String text = ((TextMessage) msg).getPayloadText();
                    alertForm.append("收到推送: " + text + "\n");
                }
                mc.close();
            } catch (IOException e) { e.printStackTrace(); }
        }
        display.setCurrent(alertForm);
    }

    protected void pauseApp() {}
    protected void destroyApp(boolean unconditional) {}
    
    public void commandAction(Command c, Displayable d) {
        if (c == exitCmd) {
            notifyDestroyed();
        }
    }
}

服務端發送架構:GSM Modem + SMSLib

硬件方案對比

  • SMS 聚合商 API:HTTP/REST/SMPP 接口,價格透明、高可用、適合生產
  • GSM Modem (本文方案):插 SIM 卡、串口/USB 連接服務器、AT 指令控制,**適合測試/低量/無公網 IP 環境**

SMSLib for Java (原 jSMSEngine) 核心用法

import org.smslib.*;

public class SMSSender {
    public static void sendPush(String phone, int port, String text) throws Exception {
        SerialModemGateway gateway = new SerialModemGateway("modem.com1", "COM1", 115200, "Nokia", "6600");
        gateway.setInbound(true);
        gateway.setOutbound(true);
        gateway.setSimPin("0000"); // 如有 PIN
        
        Service.getInstance().addGateway(gateway);
        Service.getInstance().startService();
        
        OutboundMessage msg = new OutboundMessage(phone, text);
        msg.setPort(port); // 關鍵:設置目標端口,觸發 Push Registry
        msg.setEncoding(Message.MessageEncodings.ENC7BIT); // 或 UCS2 中文
        
        Service.getInstance().sendMessage(msg);
        System.out.println("發送成功: " + msg.getRefNo());
        
        Service.getInstance().stopService();
    }
}

完整測試流程

  1. 手機安裝 MIDlet (含正確 JAD Push 註冊)
  2. 電腦連接 GSM Modem (或另一台帶 Modem 的 Nokia 6600 通過藍牙/數據線)
  3. 運行服務端 Java 程序發送帶端口的 SMS
  4. 手機自動彈出 MIDlet 顯示推送內容 (無需用戶操作)

避坑指南

  • 端口衝突:系統保留端口 (如 2948 WAP Push),選用 5000+ 高位端口
  • 編碼問題:中文必須用 UCS2 (MessageEncodings.ENCUCS2),否則亂碼/截斷
  • 權限提示:首次發送/接收可能彈出「允許應用發送短信/讀取短信」確認,需用戶授權
  • SIM 卡費用:每條 SMS 按標準資費計費,測試建議用包月卡或企業測試卡
  • 設備兼容性:發布前必須在目標機型實測 Push Registry 行為 (部分早期機型不支持 SMS Push)

現代化替代方案

Java ME (J2ME) 已退出歷史舞台。現代移動推送請使用:

  • FCM (Firebase Cloud Messaging):Android/iOS/Web 統一、免費、高達 99%+ 送達率
  • APNs (Apple Push Notification service):iOS 原生
  • 華為/小米/OPPO/VIVO 廠商通道:國內 Android 覆蓋補強
  • Web Push (Service Worker + Push API):瀏覽器無感推送

但理解 Push Registry「無 IP 喚醒、協議解耦、端口多路復用」的設計思想,對設計現代推送系統依然極具啟發價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved