之前写的CMPP3.0未完成代码

如题,参考大佬博客写的代http://blog.csdn.net/blin911/article/details/54344609,我自个因公司决策没继续往下写了,贴出来做分享参考

class Cmpp {
    // 设置项
    public $host = ;
    public $port = ;
    public $Source_Addr = ;
    public $Shared_secret = ;
    public $SP_ID = ;
    public $SP_CODE = ;
    public $Service_Id = ;

    private $socket;
    private $Sequence_Id = 0;

    private $bodyData;
    private $AuthenticatorSource;


    public function createSocket(){
        $socket = fsockopen(
            $this->host, 
            $this->port,
            $errno, 
            $errstr, 20
        );
        if(!$socket) $this->throwErr("can't create socket .", __LINE__);
        socket_set_timeout($socket, 1200);
        $this->socket = $socket;
    }


    public function CMPP_CONNECT(){
        $Source_Addr = $this->Source_Addr;
        $Version = 0x30;
        $Timestamp = date('mdHis');
        $AuthenticatorSource = $this->createAS($Timestamp);
        // 06 Octet String      Source_Addr
        // 16 Octet String      AuthenticatorSource
        // 01 Unsigned Integer  Version
        // 04 Unsigned Integer  Timestamp
        $bodyData = pack("a6a16CN", $Source_Addr, $AuthenticatorSource, $Version, $Timestamp);
        $this->AuthenticatorSource = $AuthenticatorSource;
        $this->send($bodyData, 0x00000001);
    }

    public function CMPP_CONNECT_RESP(){
        // 04 Unsigned Integer  Status
        // 16 Octet String      AuthenticatorISMG
        // 01 Unsigned Integer  Version
        $body = unpack("NStatus/a16AuthenticatorISMG/CVersion", $this->bodyData);
        // TODO ISMG认证失败,检查原因
        // $this->cheakAISMG($body['Status'], $body['AuthenticatorISMG']);
        $this->Sequence_Id = $this->Sequence_Id + 1;
    }

    public function CMPP_SUBMIT($to, $text){
        // 08 Unsigned Integer  Msg_Id
        // 01 Unsigned Integer  Pk_total
        // 01 Unsigned Integer  Pk_number
        // 01 Unsigned Integer  Registered_Delivery
        // 01 Unsigned Integer  Msg_level
        // 10 Octet String      Service_Id
        // 01 Unsigned Integer  Fee_UserType
        // 32 Octet String      Fee_terminal_Id
        // 01 Unsigned Integer  Fee_terminal_type
        // 01 Unsigned Integer  TP_pId
        // 01 Unsigned Integer  TP_udhi
        // 01 Unsigned Integer  Msg_Fmt
        // 06 Octet String      Msg_src
        // 02 Octet String      FeeType
        // 06 Octet String      FeeCode
        // 17 Octet String      ValId_Time
        // 17 Octet String      At_Time
        // 21 Octet String      Src_Id
        // 01 Unsigned Integer  DestUsr_tl
        // *  Octet String      Dest_terminal_Id
        // 01 Unsigned Integer  Dest_terminal_type
        // 01 Unsigned Integer  Msg_Length
        // *  Octet String      Msg_Content
        $Msg_Id = 0;
        $Pk_total = 1;
        $Pk_number = 1;
        $Registered_Delivery = 0;
        $Msg_level = 0;
        $Service_Id = $this->Service_Id;
        $Fee_UserType = 2;
        $Fee_terminal_Id = '';
        $Fee_terminal_type = 0;
        $TP_pId = 0;
        $TP_udhi = 0;
        $Msg_Fmt = 0;
        $Msg_src = $this->SP_ID;
        $FeeType = 03;
        $FeeCode = "";
        $ValId_Time = "";
        $At_Time = "";
        $Src_Id = $this->SP_CODE;
        $DestUsr_tl = 1;
        $Dest_terminal_Id = $to;
        $Dest_terminal_type = 1;
        $Msg_Length = strlen($text);
        $Msg_Content = $text;

        $bodyData = pack(
            "a8CCCCa10Ca32CCCCa6a2a6a17a17a21Ca32CCa".$Msg_Length,
            $Msg_Id,                $Pk_total,          $Pk_number,
            $Registered_Delivery,   $Msg_level,         $Service_Id,
            $Fee_UserType,          $Fee_terminal_Id,   $Fee_terminal_type,
            $TP_pId,                $TP_udhi,           $Msg_Fmt,
            $Msg_src,               $FeeType,           $FeeCode,
            $ValId_Time,            $At_Time,           $Src_Id,
            $DestUsr_tl,            $Dest_terminal_Id,  $Dest_terminal_type,
            $Msg_Length,            $Msg_Content
        );


        $this->log([
            $Msg_Id,                $Pk_total,          $Pk_number,
            $Registered_Delivery,   $Msg_level,         $Service_Id,
            $Fee_UserType,          $Fee_terminal_Id,   $Fee_terminal_type,
            $TP_pId,                $TP_udhi,           $Msg_Fmt,
            $Msg_src,               $FeeType,           $FeeCode,
            $ValId_Time,            $At_Time,           $Src_Id,
            $DestUsr_tl,            $Dest_terminal_Id,  $Dest_terminal_type,
            $Msg_Length,            $Msg_Content]);
        $this->log($bodyData);

        $this->send($bodyData, 0x00000004);
    }

    public function CMPP_SUBMIT_RESP(){
        // 08 Unsigned Integer  Msg_Id
        // 04 Unsigned Integer  Result
        $body = unpack("N2Msg_Id/NResult", $this->bodyData);
        $this->debug($this->bodyData, 1);
    }





    public function send($bodyData, $Command_Id){
        $Total_Length = strlen($bodyData) + 12;
        $Sequence_Id = $this->Sequence_Id;
        // 04 Unsigned Integer  Total_Length
        // 04 Unsigned Integer  Command_Id
        // 04 Unsigned Integer  Sequence_Id
        $headData = pack("NNN", $Total_Length, $Command_Id, $Sequence_Id);
        // 发送消息
        $this->log("send $Command_Id");
        fwrite($this->socket, $headData.$bodyData, $Total_Length);  
        $this->listen($Sequence_Id);
    }



    public function listen($Sequence_Id){
        // do{
            if(feof($this->socket)){
                $this->throwErr("socket was close .", __LINE__);
            }
            // 处理头
            $headData = fread($this->socket, 12);
            if(empty($headData)){
                $this->throwErr("can't get any data.", __LINE__);
            }
            $head = unpack("NTotal_Length/NCommand_Id/NSequence_Id", $headData);
            $this->log("get ".($head['Command_Id'] & 0x0fffffff));

            // 处理body
            $this->bodyData = fread($this->socket, $head['Total_Length'] - 12);
            switch ( $head['Command_Id'] & 0x0fffffff ) {
                case 0x00000001:
                    $this->CMPP_CONNECT_RESP();
                    break;
                case 0x00000004:
                    $this->CMPP_SUBMIT_RESP();
                    break;
                default:
                    $this->throwErr("unknow Command_Id .".$head['Command_Id'], __LINE__);
                    break;
            }

        // } while ( $this->Sequence_Id != $Sequence_Id );
    }



    /**
     * AuthenticatorSource = MD5(Source_Addr+9 字节的0 +shared secret+timestamp) 
     * @param  [type] $Timestamp [description]
     * @return [type]            [description]
     */
    public function createAS($Timestamp){
        $temp = $this->Source_Addr . pack("a9","") . $this->Shared_secret . $Timestamp;
        return md5($temp, true);
    }

    /**
     * AuthenticatorISMG =MD5(Status + AuthenticatorSource + shared secret)
     * @param  [type] $Status            [description]
     * @param  [type] $AuthenticatorISMG [description]
     * @return [type]                    [description]
     */
    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 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();

// $cmpp->CMPP_SUBMIT("xxxxxxxxx", '123');

简单说一下,因为时间太久了很多参数什么的我也忘了,只记得是调通了握手那里,其他的我也没做,当时只给了两天来着,代码应该也巨坑,我也没搞定就交给java仁兄了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java cmpp2.0 3.0 无jar纯源码demo(含服务端测试工具)[20171205] 找了挺多资料,CMPP的资源很多,但可以参考可用的不多, 特此开源cmpp的DEMO程序,无jar插件,纯源码实现。 语言为:java 工具为:Intellij IDEA 2017 附带第三方CMPP服务器测试工具,便于调试。 注解详细如: private long Msg_Id=0x00;//信息标识,由SP接入的短信网关本身产生,本处填空。 private byte Pk_total=0x01;//相同Msg_Id的信息总条数,从1开始 private byte Pk_number=0x01;//相同Msg_Id的信息序号,从1开始 private byte Registered_Delivery=0x01;//是否要求返回状态确认报告:0:不需要 1:需要 private byte Msg_level=0x01;//信息级别 private String Service_Id="";//业务类型,是数字、字母和符号的组合。 private byte Fee_UserType=0x00;//计费用户类型字段 0:对目的终端MSISDN计费; 1:对源终端MSISDN计费;2:对SP计费 private String Fee_terminal_Id="";//被计费用户的号码 private byte TP_pId=0x00;//GSM协议类型 private byte TP_udhi=0x00;//GSM协议类型。详细是解释请参考 private byte Msg_Fmt=0x0f;//信息格式0:ASCII串 3:短信卡操作 4:二进制信息 8:UCS2编码 (0f)15:含GB汉字 private String Msg_src="";//信息内容来源(SP_Id) private String FeeType="01";//资费类别 01:对“计费用户号码”免费 02:对“计费用户号码”按条计信息费 03:对“计费用户号码”按包月收取信息费 04:对“计费用户号码”的信息费封顶 05:对“计费用户号码”的收费是由SP实现 private String FeeCode="000000";//资费代码(以分为单位) private String ValId_Time="";//存活有效期 private String At_Time="";//定时发送时间 private String Src_Id="";//源号码 SP的服务代码或前缀为服务代码的长号码, 网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,该号码最终在用户手机上显示为短消息的主叫号码 private byte DestUsr_tl=0x01;//接收信息的用户数量(小于100个用户) private String Dest_terminal_Id="";//接收短信的MSISDN号码 private byte Msg_Length;//信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节) private byte[] Msg_Content;//信息内容 private String Reserve="";//保留

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值