php语言的cmpp协议应用
因为公司网站需要移动物联卡的获取短信内容和发送短信功能,本人上网查了一下,发现几乎全是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协议应用相关推荐
- OC语言Block和协议
OC语言Block和协议 分类: OC基础2014-10-07 09:24 162人阅读 评论(0) 收藏 举报 OC Block OC协议 OC语言BLOCK和协议 一.BOLCK (一)简介 B ...
- c语言编写modbus程序,C语言编写modbus协议
<C语言编写modbus协议>由会员分享,可在线阅读,更多相关<C语言编写modbus协议(23页珍藏版)>请在人人文库网上搜索. 1.include / 字地址 0 - 25 ...
- android 短信编解码方式,中移短信cmpp协议/smpp协议 netty实现编解码
性能测试 在48core,128G内存的物理服务器上测试协议解析效率:35K条/s, cpu使用率25%. Build 执行mvn package . jdk1.6以上. 增加了业务处理API 业务层 ...
- 从入门到入土:基于C语言采用UDP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统|代码展示
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
- 从入门到入土:基于C语言采用TCP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
- 从入门到入土:基于C语言采用TCP协议实现通信功能的程序(仅有代码)
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
- 从入门到入土:基于C语言采用UDP协议实现通信功能的程序
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
- 易语言客户端请求http_易语言通过Http协议上传下载文件
易语言通过Http协议上传下载文件 2018-11-29 .版本 2 .程序集 窗口程序集1 .程序集变量 程序集_数据, 字节集 .子程序 _按钮1_被单击 信息框 (客户1.连接 ("b ...
- CMPP协议对长短信的支持
1.CMPP3.0 超长短信 1.长短信息:是指超过70个汉字,140个字节的信息内容. 最近在做一个某地市公司运营商的GPRS导引项目的时候,运营商要求将对用户的提示短信息(超过140个字节)发送到 ...
- 使用java语言基于SMTP协议手写邮件客户端
使用java语言基于SMTP协议手写邮件客户端 1. 说明 电子邮件是互联网上常见的应用,他是互联网早期的产品,直至今日依然受到广大用户的喜爱(在中国可能因为文化背景不同,电子邮件只在办公的时候常用) ...
最新文章
- C++中const指针用法汇总
- 你的组织为自动化测试做好准备了吗?
- 测试篇|如何简便标定信号源电流大小?
- 数据仓库、数据湖、流批一体
- 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
- 微信小程序动态更改标题栏_微信小程序实现动态设置页面标题的方法【附源码下载】...
- Matlab图像处理系列1———线性变换和直方图均衡
- vc2012编译speex (编译通过)
- iMeta封面 | 宏蛋白质组学分析一站式工具集iMetaLab Suite(加拿大渥太华大学Figeys组)...
- 微信发红包测试用例——脑图
- 第1015期机器学习日报(2017-06-29)
- PHP数据结构基本概念
- 介绍一下openkylin(开放麒麟),优麒麟和统信UOS
- 谷歌2014年中国区应届毕业生校园招聘B轮机试第一题——数独问题的解法(C++实现)
- 一本通1645Fibonacci
- LQ0141 纸张尺寸【水题】
- C语言——整型整除,浮点数整除
- POE光纤收发器的三大应用场景
- 【天光学术】财务会计论文:家电连锁零售企业财务分析方法与注意问题(节选)
- archlinux 解决蓝牙无法连接问题