需求: 發送簡訊至使用者輸入的手機號碼,並能自訂簡訊內容。
問題: 缺乏電信數據機,使用免費 API 介面無法自訂簡訊內容。
解決方案: 透過 4G 網卡連接伺服器,利用 AT 指令操作網卡發送簡訊。
經查閱資料,AT 指令發送簡訊需對資訊進行多重編碼,且存在發送逾時但實際發送成功的情況,問題尚未完全解決。
<?php
send_message('', '您好, 您正在申請註冊服務平台, 您的驗證碼是: ');
function send_message($phone, $message) {
$phone = decode_phone($phone);
$message_center = decode_message_center('+'); // 此步驟似乎無效
$message = decode_message($message);
$length = get_message_length($phone, $message);
set_time_limit(); // 依情況選擇 COM 埠,此處為 COM,在裝置管理員中查看網路調制解調器的 COM 埠
exec('mode COM: baud= data= stop= parity=n xon=on');
$fd = dio_open('COM:', O_RDWR);
$ff = dio_stat($fd);
if (!$fd) {
die("failed open com");
}
// chr(13) 為換行,chr(26) 為 Ctrl+Z
dio_write($fd, "AT+CMGF=" . chr(13)); // 設定發送模式為 PDU
dio_write($fd, "AT+CMGS=" . $length . chr(13)); // 發送訊息長度
dio_write($fd, 'D' . $phone . '' . $message . chr(13) . chr(26)); // 發送簡訊
sleep(1);
dio_close($fd);
}
function decode_phone($phone) {
$phone = str_replace('+', '', $phone);
if (strlen($phone) % 2 !== 0) {
$phone = $phone . 'F';
}
$newPhone = '';
for ($i = 0; $i < strlen($phone); $i += 2) {
$newPhone = $newPhone . substr($phone, $i + 1, 1) . substr($phone, $i, 1);
}
return $newPhone;
}
function decode_message_center($phone) {
$newPhone = '' . decode_phone($phone);
$len = strtoupper(dechex(strlen($newPhone) / 2));
if (strlen($len) % 2 !== 0) {
$len = '0' . $len;
}
$newPhone = $len . $newPhone;
return $newPhone;
}
function decode_message($message) {
$newMessage = utf_unicode($message);
$len = strtoupper(dechex(strlen($newMessage) / 2));
if (strlen($len) % 2 !== 0) {
$len = '0' . $len;
}
$newMessage = $len . $newMessage;
return $newMessage;
}
function utf_unicode($name) {
$name = iconv('UTF-8', 'UCS-2', $name);
$len = strlen($name);
$str = '';
for ($i = 0; $i < $len - 1; $i = $i + 2) {
$c1 = $name[$i];
$c2 = $name[$i + 1];
if (ord($c1) > 0) { // 兩個位元組的文字
$str .= base_convert(ord($c1), 10, 16) . str_pad(base_convert(ord($c2), 10, 16), 2, '0', STR_PAD_LEFT);
} else {
$str .= str_pad(base_convert(ord($c1), 10, 16), 2, '0', STR_PAD_LEFT);
}
}
$str = strtoupper($str); // 轉換為大寫
return $str;
}
function get_message_length($phone, $message) {
$str = 'D' . $phone . '' . $message;
$length = strlen($str) / 2;
if ($length < 10) {
$length = '0' . $length;
}
return $length;
}
?>
以上介紹 PHP 發送 AT 指令實例代碼,希望對大家有所幫助。若有任何疑問歡迎留言,小編會及時回覆。感謝大家對幫客之家網站的支持!