PHP中利用gsm modem发送短信的实例代码(兼容windows和Linux),这个时本人测试过的在windows上绝对能用。

参考了http://rainbird.blog.51cto.com/211214/279201

使用了php_serial.class.php类

附件中为完整代码(包括php_serial.class.php):

<?php
/*
*     author: mayu8758(mayu8758@gmail.com) thanks:rainbird <chinakapalink@gmail.com> http://rainbird.blog.51cto.com/211214/279201
*      Website:http://blog.opendigest.org  , http://www.osedu.net
*     date:2010-12-2
*     system:Windows Server 2003 , Linux
*     php cli:5.2.10
*      gsm modem:西门子 MODEM
*      注意:使用php.ini-recommended配置文件改为php.ini,使用php.ini-production将不能发短信。
*            配置文件里的有所内容,没有详细看是哪里的配置导致的问题。
*/
include "php_serial.class.php";

//加载php操作串口的类
$serial = new phpSerial;

//连接USB gas modem
$serial->deviceSet("com1");
$serial->deviceOpen();

//要发送的手机号:1531170xxxx
$phone_sendto = InvertNumbers('861356922XXXX');
//要发送的短信内容
$sms_content = "你好";
/*
*hex2str容易出错,导致发送中文乱码
*"晚上好123"的正确转码后的内容为:665A4E0A597D003100320033
*可以和自己的转码结果对比,验证转码是否有问题。
*/
$message = hex2str($sms_content);

$mess = "11000D91".$phone_sendto."000800".sprintf("%02X",strlen($message)/2).$message;
$serial->sendMessage("at+cmgf=0".chr(13));
$serial->sendMessage("at+cmgs=".sprintf("%d",strlen($mess)/2).chr(13));
//不加短信中心号码
$serial->sendMessage('00'.$mess.chr(26));
//加短信中心号码
//$phone_center = InvertNumbers('8613800100500');
//$mess_ll = "0891".$phone_center.$mess;
//$serial->sendMessage($mess_ll.chr(26));

//用完了就关掉,有始有终好习惯
$serial->deviceClose();

//将utf8的短信转成ucs2格式
function hex2str($str) {
        //本转码函数在Windows和Linux下都正常运行。因为linux系统和windows系统,对unicode处理的时候,正好是高低位相反。
        $hexstring=iconv("UTF-8", "UCS-2", $str);
        $str = '';
        if(PHP_OS == "WINNT"){//如果操作系统是winnt时的转码操作
            for($i=0; $i<strlen($hexstring)/2; $i++){
                $temp_str = "";
                $temp_str .= sprintf("%02X",ord(substr($hexstring,$i*2+1,1)));
                $temp_str = sprintf("%02X",ord(substr($hexstring,$i*2,1))) . $temp_str;
                $str .= $temp_str;
            }
        }
        if(PHP_OS == "Linux"){                //如果操作系统是Linux时的转码操作,这里
            for($i=0; $i<strlen($hexstring)/2; $i++){
                $str .= sprintf("%02X",ord(substr($hexstring,$i*2+1,1)));
                $str .= sprintf("%02X",ord(substr($hexstring,$i*2,1)));
            }
        }
        return $str;
}
//手机号翻转,pdu格式要求
function InvertNumbers($msisdn) {
        $len = strlen($msisdn);
        if ( 0 != fmod($len, 2) ) {
                $msisdn .= "F";
                $len = $len + 1;
        }

        for ($i=0; $i<$len; $i+=2) {
                $t = $msisdn[$i];
                $msisdn[$i] = $msisdn[$i+1];
                $msisdn[$i+1] = $t;
        }
        return $msisdn;
}
?>

 

完整代码:sendsmswithphp.rar