因为公司网站需要移动物联卡的获取短信内容和发送短信功能,本人上网查了一下,发现几乎全是java语言的,只有两个文章是关于cmpp的php开发.而且只有发短信,还有问题.

这里将我开发的程序贴出来.代码也有些冗余,但功能都可以使用了.

我开发的应用接收短信和发送短信在不同的文件

接收短信是通过linux服务器screen来执行php文件获取短信.

发送短信是前端页面填入卡号和内容,传给后台去建立连接发送短信. (cmpp一个账号可以建立10个连接)

接收短信:  填入公司的接入码什么的,然后使用screen执行下面这个文件就可以了

<?php

class Cmpp {
    // 设置项
    public $host = "";   //服务商ip
    public $port = "17890";           //端口号
    public $Source_Addr = "";           //企业id  企业代码
    public $Shared_secret = '';         //网关登录密码
    public $Dest_Id = "";      //短信接入码 短信端口号
    public $SP_ID = "";
    public $SP_CODE = "";
    public $Service_Id = "";  
    public $deliver;
    private $socket;
    private $Sequence_Id = 1;
    private $bodyData;
    private $AuthenticatorSource;
    public $CMPP_CONNECT = 0x00000001; // 请求连接
    public $CMPP_CONNECT_RESP = 0x80000001; // 请求连接
    public $CMPP_DELIVER = 0x00000005; // 短信下发
    public $CMPP_DELIVER_RESP = 0x80000005; // 下发短信应答
    public $CMPP_ACTIVE_TEST = 0x00000008; // 激活测试
    public $CMPP_ACTIVE_TEST_RESP = 0x80000008; // 激活测试应答
    public $CMPP_SUBMIT = 0x00000004; // 短信发送
    public $CMPP_SUBMIT_RESP = 0x80000004; // 发送短信应答
    public static $msgid = 1;
    public function createSocket(){
        $this->socket =socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        socket_connect($this->socket,$this->host, $this->port); 
    }
    public function CMPP_CONNECT(){
        date_default_timezone_set('PRC'); 
        $Source_Addr = $this->Source_Addr;
        $Version = 0x30;
        $Timestamp = date('mdHis');
        //echo $Timestamp;
        $AuthenticatorSource = $this->createAS($Timestamp);
        $bodyData = pack("a6a16CN", $Source_Addr, $AuthenticatorSource, $Version, $Timestamp);
        $this->AuthenticatorSource = $AuthenticatorSource;
        $this->send($bodyData, "CMPP_CONNECT"); 
    }
    public function CMPP_CONNECT_RESP(){
        echo "connect success";
        $body = unpack("CStatus/a16AuthenticatorISMG/CVersion", $this->bodyData);
    }
    public function send($bodyData, $Command,$Sequence=0){
        $Command_Id=0x00000001;
        if($Command =="CMPP_CONNECT"){
            $Command_Id = 0x00000001;
        }elseif($Command =="CMPP_DELIVER_RESP"){
            $Command_Id = 0x80000005;
        }elseif($Command =="CMPP_ACTIVE_TEST_RESP"){
            $Command_Id = 0x80000008;
        }elseif($Command =="CMPP_SUBMIT"){
            $Command_Id = 0x00000004;
        }
        $Total_Length = strlen($bodyData) + 12;
        if($Sequence==0){
            if($this->Sequence_Id <10){
                $Sequence_Id = $this->Sequence_Id;
            }else{
                $Sequence_Id =1;
                $this->Sequence_Id=1;
            }
            $this->Sequence_Id = $this->Sequence_Id+1;
        }else{
            $Sequence_Id = $Sequence;
        }
        $headData = pack("NNN", $Total_Length, $Command_Id, $Sequence_Id);
        // 发送消息
        $this->log("send $Command_Id");
        socket_write($this->socket, $headData.$bodyData, $Total_Length);  
        // $this->listen($Sequence_Id);
        $i=1;
        do{
            $this->listen($Sequence_Id);
            //$i = $i-1;
            sleep(15);//等待时间,进行下一次操作
        }while($i>0);
    }
    public function listen($Sequence_Id){
            // 处理头
            $headData = '';
        try {
            echo 1;
            $headData = socket_read($this->socket, 12);
            if($headData===false){
                system("php -f ./smtp465/smtpsenderror.php");
                $this->resets();
            }
        } catch (Exception $e) {
            echo "reset now \n";
            $this->resets();
            return false;
        }
            if(empty($headData)){
                $this->log("0000");
                return;
            }
            $head = unpack("NTotal_Length/NCommand_Id/NSequence_Id", $headData);
            $this->log("get ".($head['Command_Id'] & 0x0fffffff));
            $Sequence_Id = $head['Sequence_Id'];
            // 处理body
            $this->bodyData = socket_read($this->socket,$head['Total_Length'] - 12);
            //var_dump($this->bodyData);
            switch ( $head['Command_Id'] & 0x0fffffff ) {
                case 0x00000001:
                    $this->CMPP_CONNECT_RESP();
                    break;
                case 0x00000005:
                    $this->CMPP_DELIVER($head['Total_Length'],$Sequence_Id);
                    break;
                case 0x80000005:
                    $this->CMPP_DELIVER($head['Total_Length'],$Sequence_Id);
                    break;
                case 0x00000008:
                    $bodyData=pack("C",1);                   //数据联络包返回
                    $this->send($bodyData, "CMPP_ACTIVE_TEST_RESP",$Sequence_Id);
                    break;
                default:
                    $bodyData=pack("C",1);
                    $this->send($bodyData, "CMPP_ACTIVE_TEST_RESP",$Sequence_Id);
                    break;
            }
    }
    public function CMPP_DELIVER($Total_Length,$Sequence_Id){    //Msg_Id直接用N解析不行,N只有4位
        $contentlen = $Total_Length-109;
        $body = unpack("N2Msg_Id/a21Dest_Id/a10Service_Id/CTP_pid/CTP_udhi/CMsg_Fmt/a32Src_terminal_Id/CSrc_terminal_type/CRegistered_Delivery/CMsg_Length/a".$contentlen."Msg_Content/a20LinkID",$this->bodyData);
        var_dump($body);
        if($body['Msg_Length']>0){
            $data = $body['Msg_Content'];
            //$Msg_Id = $body['Msg_Id'];
            $Msg_Id = ($body['Msg_Id1']& 0x0fffffff);
            $Msg_Idfu = $body['Msg_Id2'];
            $msgidz = unpack("N",substr($this->bodyData,0,8));
            $msgidzz = '0000' .$msgidz[1];
            $kahao = $body['Src_terminal_Id'];
            mysql_connect('localhost','','');
            mysql_select_db('');
            mysql_query('set names utf8');
            $data = trim($data);
            $sql1 = "select id from socket_yd where msgid='".$Msg_Id."'";
            $chongfu = mysql_query($sql1);
            $arrs =array();
            while($arr= mysql_fetch_assoc($chongfu) ){
                $arrs[] = $arr;
            }
            if( $arrs==array() || $arrs[0] == null ){
                $sql = "insert into socket_yd set msgid='".$Msg_Id."',kahao='".$kahao."', content='".addslashes($data)."', add_time='".date('Y-m-d H:i:s')."'";
                mysql_query($sql);
            }
            mysql_close();
            //echo $Msg_Id."\n";
            echo $data."\n";
            echo $Msg_Id.'...'.$kahao."\n";
            $this->CMPP_DELIVER_RESP($msgidzz,$Msg_Idfu,$Sequence_Id);
        }
    }
    // N打包只有4位
    public function CMPP_DELIVER_RESP($Msg_Id,$Msg_Idfu,$Sequence_Id){
        $sendda2 = 0x00;
        $bodyData = pack("N", $Msg_Id).pack("N", $Msg_Idfu).pack("N",$sendda2);
        $this->send($bodyData, "CMPP_DELIVER_RESP",$Sequence_Id);
    }
    /**AuthenticatorSource = MD5(Source_Addr+9 字节的0 +shared secret+timestamp) */
    public function createAS($Timestamp){
        $temp = $this->Source_Addr . pack("a9","") . $this->Shared_secret . $Timestamp;
        return md5($temp, true);
    }
    /*** AuthenticatorISMG =MD5(Status + AuthenticatorSource + shared secret) */
    public function cheakAISMG($Status, $AuthenticatorISMG){
        $temp = $Status . $this->AuthenticatorSource . $this->Shared_secret;
        $this->debug($temp.pack("a",""), 1, 1);
        $this->debug($AuthenticatorISMG.pack("a",""), 2, 1);
        if($AuthenticatorISMG != md5($temp, true)){
            $this->throwErr("ISMG can't pass check .", __LINE__);
        }
    }
public function closes(){
        socket_close($this->socket);
    }
    public function resets(){
        socket_close($this->socket);
        $this->createSocket();
        $this->CMPP_CONNECT();
    }
    public function log($data, $line = null){
        if($line){
            $data = $line . " : ".$data;
        }
        file_put_contents("./cmpp.log", print_r($data, true).PHP_EOL, FILE_APPEND);
    }
    public function debug($data, $fileName, $noExit = false){
        file_put_contents("./$fileName.debug", print_r($data, true));
        if(!$noExit) exit;
    }
    public function throwErr($info, $line){
        die("info: $info in line :$line");
    }
   
}

@unlink("./cmpp.log");
$cmpp = new Cmpp;
$cmpp->createSocket();
$cmpp->CMPP_CONNECT();

?>

下面是发送短信:  前端部分就不发了,后端我也是用exec($str, $out, $res);来执行php文件,方便.

后台:

$tomsisdn = $_POST["tomsisdn"];
$contents = $_POST["contents"];
$str = "php -f /var/www/html/CmppSubmit.php {$tomsisdn} {$contents}";
//echo $str."\n";
exec($str, $out, $res);
if($res ==0)
echo $out[1];
//print_r($out);

<?php
class CMPPSubmit{
    // 设置项      
    public $host = "";   //服务商ip
    public $port = "17890";           //短连接端口号   17890长连接端口号
    public $Source_Addr = "";           //企业id  企业代码
    public $Shared_secret = '';         //网关登录密码
    public $Dest_Id = "";      //短信接入码 短信端口号
    public $SP_ID = "";
    public $SP_CODE = "";
    public $Service_Id = "";    //业务代码   这个是业务代码
    public $deliver;
    private $socket;
    private $Sequence_Id = 1;
    private $bodyData;
    private $AuthenticatorSource;
    public $CMPP_CONNECT = 0x00000001; // 请求连接
    public $CMPP_CONNECT_RESP = 0x80000001; // 请求连接
    public $CMPP_SUBMIT = 0x00000004; // 短信发送
    public $CMPP_SUBMIT_RESP = 0x80000004; // 发送短信应答
    public $CMPP_DELIVER = 0x00000005; // 短信下发
    public $CMPP_DELIVER_RESP = 0x80000005; // 下发短信应答
    public $CMPP_ACTIVE_TEST = 0x00000008; // 激活测试
    public $CMPP_ACTIVE_TEST_RESP = 0x80000008; // 激活测试应答
    public $msgid = 1;
    public $tomsisdn = '';
    public $contents = '';
    public function __construct($argv1,$argv2){
        if($argv1){
            $this->tomsisdn = $argv1;
            $this->contents = $argv2; 
        }else{
            $this->log("has no canshu");exit;
        }
    }
    public function createSocket(){
        $this->socket =socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        if(!$this->socket) {echo "can't creat socket";exit;}
        $result = socket_connect($this->socket,$this->host, $this->port) or die(socket_strerror());
        $this->CMPP_CONNECT();
    }
    public function CMPP_CONNECT(){
        date_default_timezone_set('PRC'); 
        $Source_Addr = $this->Source_Addr;
        $Version = 0x30;
        $Timestamp = date('mdHis');
        //echo $Timestamp;
        $AuthenticatorSource = $this->createAS($Timestamp);
        $bodyData = pack("a6a16CN", $Source_Addr, $AuthenticatorSource, $Version, $Timestamp);
        $this->AuthenticatorSource = $AuthenticatorSource;
        $this->send($bodyData, "CMPP_CONNECT");
        
    }
    public function CMPP_CONNECT_RESP(){
        echo "CMPP_CONNECT_RESP success \n";
        $body = unpack("CStatus/a16AuthenticatorISMG/CVersion", $this->bodyData);
        $this->CMPP_SUBMIT();
    }
    public function send($bodyData, $Command,$Sequence=0){
        $Command_Id=0x00000001;
        if($Command =="CMPP_CONNECT"){     //cmpp连接
            $Command_Id = 0x00000001;
        }elseif($Command =="CMPP_DELIVER_RESP"){     //下发应答
            $Command_Id = 0x80000005;
        }elseif($Command =="CMPP_ACTIVE_TEST_RESP"){    //数据链路应答
            $Command_Id = 0x80000008;
        }elseif($Command =="CMPP_SUBMIT"){        //发送短信
            $Command_Id = 0x00000004;
        }
        $Total_Length = strlen($bodyData) + 12;
        if($Sequence==0){
            if($this->Sequence_Id <10){
                $Sequence_Id = $this->Sequence_Id;
            }else{
                $Sequence_Id =1;
                $this->Sequence_Id=1;
            }
            $this->Sequence_Id = $this->Sequence_Id+1;
        }else{
            $Sequence_Id = $Sequence;
        }
        $headData = pack("NNN", $Total_Length, $Command_Id, $Sequence_Id);
        // 发送消息
        $this->log("send $Command_Id");
        socket_write($this->socket, $headData.$bodyData, $Total_Length);  
        $this->listen($Sequence_Id);
    }
    public function listen($Sequence_Id){
            // 处理头
            $headData = socket_read($this->socket, 12);
            if(empty($headData)){
                $this->log("0000");
                return;
            }
            $head = unpack("NTotal_Length/NCommand_Id/NSequence_Id", $headData);
            $this->log("get ".($head['Command_Id'] & 0x0fffffff));
            $Sequence_Id = $head['Sequence_Id'];
            // 处理body
            $this->bodyData = socket_read($this->socket,$head['Total_Length'] - 12);
            //var_dump($this->bodyData);
            switch ( $head['Command_Id'] & 0x0fffffff ) {
                case 0x00000001:
                    $this->CMPP_CONNECT_RESP();
                    break;
                // case 0x00000005:
                //     $this->CMPP_DELIVER($head['Total_Length'],$Sequence_Id);
                //     break;
                // case 0x80000005:
                //     $this->CMPP_DELIVER($head['Total_Length'],$Sequence_Id);
                //     break;
                case 0x00000008:
                    $bodyData=pack("C",1);                   //数据联络包返回
                    $this->send($bodyData, "CMPP_ACTIVE_TEST_RESP",$Sequence_Id);
                    break;
                case 0x00000004:
                    $this->CMPP_SUBMIT_RESP();
                    break;
                // case 0x80000004:
                //     $this->CMPP_SUBMIT_RESP();
                //     break;
                default:
                    $bodyData=pack("C",1);
                    $this->send($bodyData, "CMPP_ACTIVE_TEST_RESP",$Sequence_Id);
                    break;
            }
    }
    public function CMPP_DELIVER($Total_Length,$Sequence_Id){    //Msg_Id直接用N解析不行
        $contentlen = $Total_Length-109;
        $body = unpack("N2Msg_Id/a21Dest_Id/a10Service_Id/CTP_pid/CTP_udhi/CMsg_Fmt/a32Src_terminal_Id/CSrc_terminal_type/CRegistered_Delivery/CMsg_Length/a".$contentlen."Msg_Content/a20LinkID",$this->bodyData);
        var_dump($body);
        if($body['Msg_Length']>0){
            $data = $body['Msg_Content'];
            //$Msg_Id = $body['Msg_Id'];
            $Msg_Id = ($body['Msg_Id1']& 0x0fffffff);
            $Msg_Idfu = $body['Msg_Id2'];
            $msgidz = unpack("N",substr($this->bodyData,0,8));
            $msgidzz = '0000' .$msgidz[1];
            mysql_connect('localhost','','');
            mysql_select_db('');
            mysql_query('set names utf8');
            $data = trim($data);
            $sql1 = "select id from socket_yd where msgid='".$Msg_Id."'";
            $chongfu = mysql_query($sql1);
            $arrs =array();
            while($arr= mysql_fetch_assoc($chongfu) ){
                $arrs[] = $arr;
            }
            if( $arrs==array() || $arrs[0] == null ){
                $sql = "insert into socket_yd set msgid='".$Msg_Id."', content='".addslashes($data)."', add_time='".date('Y-m-d H:i:s')."'";
                mysql_query($sql);
            }
            mysql_close();
            //echo $Msg_Id."\n";
            echo $data."\n";
            echo $msgidzz."\n";
            echo $Sequence_Id."\n";
            $this->CMPP_DELIVER_RESP($msgidzz,$Msg_Idfu,$Sequence_Id);
        }
    }
    // N打包只有4位 
    public function CMPP_DELIVER_RESP($Msg_Id,$Msg_Idfu,$Sequence_Id){
        $sendda2 = 0x00;
        $bodyData = pack("NNN", $Msg_Id, $Msg_Idfu,$sendda2);
        $this->send($bodyData, "CMPP_DELIVER_RESP",$Sequence_Id);
    }
    public function CMPP_SUBMIT(){
        $Msg_Id = rand(1,100);
        //$bodyData = pack("a8", $Msg_Id);
        $bodyData = pack("N", $Msg_Id).pack("N", "00000000");
        $bodyData .= pack("C", 1).pack("C", 1);
        $bodyData .= pack("C", 0).pack("C", 0);
        $bodyData .= pack("a10", $this->Service_Id);
        $bodyData .= pack("C", 0).pack("a32", "").pack("C", 0).pack("C", 0).pack("C", 0).pack("C", 0).pack("a6", $this->SP_ID).pack("a2", "02").pack("a6", "").pack("a17", "").pack("a17", "").pack("a21", $this->Dest_Id).pack("C", 1);
        $bodyData .= pack("a32", $this->tomsisdn);
        $bodyData .= pack("C", 0);
        $len = strlen($this->contents);
        $bodyData .= pack("C", $len);
        $bodyData .= pack("a".$len, $this->contents);
        $bodyData .= pack("a20", "00000000000000000000");
        //echo '内容长度:包总长度-183='.(strlen($bodyData)-183)."字节\n"; 
        $this->send($bodyData, "CMPP_SUBMIT",$Msg_Id);
    }
    public function CMPP_SUBMIT_RESP(){
        echo "CMPP_SUBMIT_RESP success"."\n";
        $body = unpack("N2Msg_Id/NResult",$this->bodyData);
        print_r($body);
        socket_close($this->socket);
    }
    /**AuthenticatorSource = MD5(Source_Addr+9 字节的0 +shared secret+timestamp) */
    public function createAS($Timestamp){
        $temp = $this->Source_Addr . pack("a9","") . $this->Shared_secret . $Timestamp;
        return md5($temp, true);
    }
    public function log($data, $line = null){
        if($line){
            $data = $line . " : ".$data;
        }
        file_put_contents("./cmpp1.log", print_r($data, true).PHP_EOL, FILE_APPEND);
    }
}
// @unlink("./cmpp1.log");
$cmpp = new CMPPSubmit($argv[1],$argv[2]);
$cmpp->createSocket();
// $cmpp->CMPP_CONNECT();
// $cmpp->CMPP_SUBMIT();
?>

基本就是这样

php语言的cmpp协议应用相关推荐

  1. OC语言Block和协议

    OC语言Block和协议 分类: OC基础2014-10-07 09:24 162人阅读 评论(0) 收藏 举报 OC Block OC协议 OC语言BLOCK和协议 一.BOLCK (一)简介  B ...

  2. c语言编写modbus程序,C语言编写modbus协议

    <C语言编写modbus协议>由会员分享,可在线阅读,更多相关<C语言编写modbus协议(23页珍藏版)>请在人人文库网上搜索. 1.include / 字地址 0 - 25 ...

  3. android 短信编解码方式,中移短信cmpp协议/smpp协议 netty实现编解码

    性能测试 在48core,128G内存的物理服务器上测试协议解析效率:35K条/s, cpu使用率25%. Build 执行mvn package . jdk1.6以上. 增加了业务处理API 业务层 ...

  4. 从入门到入土:基于C语言采用UDP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统|代码展示

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  5. 从入门到入土:基于C语言采用TCP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  6. 从入门到入土:基于C语言采用TCP协议实现通信功能的程序(仅有代码)

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  7. 从入门到入土:基于C语言采用UDP协议实现通信功能的程序

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  8. 易语言客户端请求http_易语言通过Http协议上传下载文件

    易语言通过Http协议上传下载文件 2018-11-29 .版本 2 .程序集 窗口程序集1 .程序集变量 程序集_数据, 字节集 .子程序 _按钮1_被单击 信息框 (客户1.连接 ("b ...

  9. CMPP协议对长短信的支持

    1.CMPP3.0 超长短信 1.长短信息:是指超过70个汉字,140个字节的信息内容. 最近在做一个某地市公司运营商的GPRS导引项目的时候,运营商要求将对用户的提示短信息(超过140个字节)发送到 ...

  10. 使用java语言基于SMTP协议手写邮件客户端

    使用java语言基于SMTP协议手写邮件客户端 1. 说明 电子邮件是互联网上常见的应用,他是互联网早期的产品,直至今日依然受到广大用户的喜爱(在中国可能因为文化背景不同,电子邮件只在办公的时候常用) ...

最新文章

  1. C++中const指针用法汇总
  2. 你的组织为自动化测试做好准备了吗?
  3. 测试篇|如何简便标定信号源电流大小?
  4. 数据仓库、数据湖、流批一体
  5. 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
  6. 微信小程序动态更改标题栏_微信小程序实现动态设置页面标题的方法【附源码下载】...
  7. Matlab图像处理系列1———线性变换和直方图均衡
  8. vc2012编译speex (编译通过)
  9. iMeta封面 | 宏蛋白质组学分析一站式工具集iMetaLab Suite(加拿大渥太华大学Figeys组)...
  10. 微信发红包测试用例——脑图
  11. 第1015期机器学习日报(2017-06-29)
  12. PHP数据结构基本概念
  13. 介绍一下openkylin(开放麒麟),优麒麟和统信UOS
  14. 谷歌2014年中国区应届毕业生校园招聘B轮机试第一题——数独问题的解法(C++实现)
  15. 一本通1645Fibonacci
  16. LQ0141 纸张尺寸【水题】
  17. C语言——整型整除,浮点数整除
  18. POE光纤收发器的三大应用场景
  19. 【天光学术】财务会计论文:家电连锁零售企业财务分析方法与注意问题(节选)
  20. archlinux 解决蓝牙无法连接问题

热门文章

  1. 2021最新个人在线要饭网站源码
  2. CI框架email类发送邮件失败无报错,开启debug模式的方法
  3. Web前端开发 -- HTML基础(2)
  4. 在计算机检索中常用的中文数据库,国内三种常用中文数据库检索功能比较研究.doc...
  5. 考研英语 - word-list-23
  6. DEA_Malmquist指数模型学习笔记
  7. 基于java自行车租赁管理系统
  8. 人工智能之语音识别概述(一)
  9. 快速入门Maxwell基本操作流程(2D部分)
  10. 伺服电机常用参数设置_伺服驱动器重要参数的设置方法和技巧