無電信猫、免費 API 受限制內容時,採用 4G USB 網卡 + AT 指令 直發簡訊,支援自訂內容。
/dev/ttyUSB0 (Linux) 或 COM3 (Windows)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');
?>
文字模式限制 160 字元(GSM 7-bit)。中文需用 PDU 模式 (UCS-2 編碼),編碼流程:
AT+CMGF=0 設定 PDU 模式,AT+CMGS=長度 發送| 現象 | 原因 | 解決 |
|---|---|---|
| dio_open 失敗 | 權限不足/裝置被佔用 | chmod 666 /dev/ttyUSB*; 關閉 ModemManager |
| 回應 ERROR | 指令語法/參數錯誤 | 啟用回顯 ATE1 除錯 |
| 發送超時但實際成功 | 網路延遲/回應丟失 | 增加等待時間、檢查 SMSC 設定 |
| 中文亂碼 | 未用 PDU/UCS-2 | 改用 PDU 模式編碼 |