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

PHP 透過 AT 指令發送簡訊:4G 網卡串口通訊完整實作

     編輯:PHP 綜合知識

應用場景

無電信猫、免費 API 受限制內容時,採用 4G USB 網卡 + AT 指令 直發簡訊,支援自訂內容。

硬體與驅動準備

  1. 4G 網卡插入伺服器,驅動正常載入
  2. 確認裝置節點:/dev/ttyUSB0 (Linux) 或 COM3 (Windows)
  3. PHP 啟用 dio 擴展(Direct I/O):pecl install dio

核心程式碼架構

 115200,
        'bits' => 8,
        'stop' => 1,
        'parity' => 0
    ]);

    // 3. 發送 AT 指令序列
    $cmds = [
        "AT\r",                    // 測試連線
        "AT+CMGF=1\r",             // 設定文字模式
        "AT+CSCS=\"GSM\"\r",       // 字元集
        "AT+CMGS=\"$phone\"\r",    // 目標號碼
    ];

    foreach ($cmds as $cmd) {
        dio_write($fd, $cmd);
        usleep(500_000); // 等待回應
        $resp = dio_read($fd, 256);
        if (strpos($resp, 'ERROR') !== false) {
            dio_close($fd);
            return false;
        }
    }

    // 4. 發送訊息內容 + Ctrl+Z (0x1A) 結束
    dio_write($fd, $message . chr(26));
    sleep(3); // 等待發送完成

    // 5. 讀取最終回應
    $final = dio_read($fd, 256);
    dio_close($fd);

    return strpos($final, 'OK') !== false || strpos($final, '+CMGS:') !== false;
}

// 使用
send_sms('0912345678', '驗證碼:123456');
?>

PDU 模式進階(支援中文/長簡訊)

文字模式限制 160 字元(GSM 7-bit)。中文需用 PDU 模式 (UCS-2 編碼),編碼流程:

  1. 號碼轉 BCD 碼 (半字節反轉)
  2. 訊息中心號碼編碼
  3. 訊息內容 UTF-8 → UCS-2BE → 十六進位字串
  4. 計算 PDU 長度,組裝完整 PDU 字串
  5. AT+CMGF=0 設定 PDU 模式,AT+CMGS=長度 發送

常見問題排查

現象原因解決
dio_open 失敗權限不足/裝置被佔用chmod 666 /dev/ttyUSB*; 關閉 ModemManager
回應 ERROR指令語法/參數錯誤啟用回顯 ATE1 除錯
發送超時但實際成功網路延遲/回應丟失增加等待時間、檢查 SMSC 設定
中文亂碼未用 PDU/UCS-2改用 PDU 模式編碼

Linux 系統服務化建議

  • 建立 Systemd 服務管理 PHP 守行程
  • 使用佇列 (Redis/RabbitMQ) 解耦 HTTP 請求與發送流程
  • 記錄發送日誌、失敗重試機制

相關專題

  • 《PHP 串口通訊開發指南》
  • 《Linux 序列埠程式設計》
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved