PHP编程:通过串口+GSM MODEM发送短信示例

<?php

/*-

*版权没有,欢迎拷贝(x)2006胖头鱼.

*作者:pangty<pangty@ta139.com>

*

*$Id:RS232.php,v0.12006-7-2905:28PMExp$

*

*运行环境:WindowsXP,PHP5.1.4(cli),MySQL

*php.ini

*extension=php_mysql.dll

*extension=php_dio.dll

*硬件要求:熊猫PM818AGSM/GPRSMODEM或其他任何GSMMODEM模块

*相关知识:GSMAT指令集和PDU格式,去google吧

*

*mysql>usesmsc;

*mysql>descsm_submit;

*+----------+----------------------+------+-----+---------+----------------+

*|Field|Type|Null|Key|Default|Extra|

*+----------+----------------------+------+-----+---------+----------------+

*|smid|int(11)unsigned||PRI|NULL|auto_increment|

*|OrgAddr|varchar(11)|YES||NULL||

*|DestAddr|varchar(11)||PRI|||

*|Time|datetime|YES||NULL||

*|USERDATA|mediumtext|YES||NULL||

*|stat|smallint(3)unsigned|YES|MUL|NULL||

*+----------+----------------------+------+-----+---------+----------------+

*

*/

functiongb2unicode($str){

returniconv("gb2312","UCS-2",$str);

}



functionhex2str($hexstring){

$str='';

for($i=0;$i<strlen($hexstring);$i++){

$str.=sprintf("%02X",ord(substr($hexstring,$i,1)));

}

return$str;

}



functionInvertNumbers($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;

}



/*---------------主程序开始---------------*/

set_time_limit(0);

$DEBUG=0;



exec('modeCOM1:baud=115200data=8stop=1parity=nxon=on');



$fd=dio_open('COM1:',O_RDWR);

if(!$fd)

{

die("打开串口COM1失败");

}



$ff=dio_stat($fd);

print_r($ff);



echo"GSMATisstartonCOM1/n";



//短信中心号码

$smsc="8613800538500";

//短信最大长度70个汉字,Unicode表示需要280个字节

$max_len=280;

$invert_smsc=InvertNumbers($smsc);



$sql=mysql_connect("localhost","pangty","pangty");

mysql_select_db("smsc",$sql);



$query="select*fromsm_submitwherestat=0";

$result=mysql_query($query,$sql);



$len=1;$s=chr(13);



while($row=mysql_fetch_object($result)){

$msisdn="86".$row->DestAddr;

$sms_text=$row->USERDATA;



if($DEBUG)echodate("Y-m-dH:i:s")."DEBUG$row->DestAddr/n";

if($DEBUG)echodate("Y-m-dH:i:s")."DEBUG$sms_text/n";



$pdu_text=hex2str(gb2unicode($sms_text));

$invert_msisdn=InvertNumbers($msisdn);



//拆分发送超过70汉字的短信(todo:没有判断全英文的情况)

do{

$pdu_len=strlen($pdu_text);

if($pdu_len>$max_len){

$pdu_text1=substr($pdu_text,0,$max_len);

$pdu_text=substr($pdu_text,$max_len,$pdu_len-$max_len);

}else{

$pdu_text1=$pdu_text;

$pdu_text="";

}



$pdu_len1=sprintf("%02X",strlen($pdu_text1)/2);

$pdu_text1=$pdu_len1.$pdu_text1;



$pdu_text1="11000D91".$invert_msisdn."000800".$pdu_text1;



$atcmd="AT+CMGS=".sprintf("%d",strlen($pdu_text1)/2).chr(13);

$l=strlen($atcmd);

$ll=@dio_write($fd,$atcmd);

while($l!=$ll){

sleep(10);

$ll=@dio_write($fd,$atcmd);

}

if($DEBUG)echodate("Y-m-dH:i:s")."DEBUG$atcmd/n";



do{

$data=dio_read($fd,$len);

echo$data;

}while($data!=$s);



sleep(1);



$pdu_text1="0891".$invert_smsc.$pdu_text1.chr(26).chr(13);

$l=strlen($pdu_text1);

$ll=@dio_write($fd,$pdu_text1);

while($l!=$ll){

sleep(10);

$ll=@dio_write($fd,$pdu_text1);

}

if($DEBUG)echodate("Y-m-dH:i:s")."DEBUG$pdu_text1/n";



do{

$data=dio_read($fd,$len);

echo$data;

}while($data!=$s);



sleep(7);



}while($pdu_text!="");



mysql_query("updatesm_submitsetstat=1wheresmid=$row->smid",$sql);

}

mysql_close($sql);



dio_close($fd);



?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值