<?php //php需要开启ssl(OpenSSL)支持 $apnsCert = "ck.pem";//连接到APNS时的证书许可文件,证书需格外按要求创建 $pass = "123456";//证书口令 $serverUrl = "ssl://gateway.sandbox.push.apple.com:2195";//push服务器,这里是开发测试服务器 $deviceToken = "a8fcd4aa8943b223d4ebcd54fe168a8b99b3f24c63dbc0612db25a8c0a588675";//ios设备id,中间不能有空格,每个ios设备一个id $message = $_GET ['message'] or $message = "hello!"; $badge = ( int ) $_GET ['badge'] or $badge = 2; $sound = $_GET ['sound'] or $sound = "default"; $body = array('aps' => array('alert' => $message , 'badge' => $badge , 'sound' => $sound)); $streamContext = stream_context_create(); stream_context_set_option ( $streamContext, 'ssl', 'local_cert', $apnsCert ); stream_context_set_option ( $streamContext, 'ssl', 'passphrase', $pass ); $apns = stream_socket_client ( $serverUrl, $error, $errorString, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $streamContext);//连接服务器 if ($apns) { echo "Connection OK <br/>"; } else { echo "Failed to connect $errorString"; return; } $payload = json_encode ( $body ); $msg = chr(0) . pack('n', 32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack('n', strlen($payload)) . $payload; $result = fwrite ( $apns, $msg);//发送消息 fclose ( $apns ); if ($result) echo "Sending message successfully: " . $payload; else echo 'Message not delivered'; ?>
php做推送服务端实现android消息推送 分类: php 2012-11-20 12:46 1058人阅读 评论(1) 收藏 举报 下载tokudu-PhpMQTTClient-ba4e494.zip 下载rsmb_1.2.0.zip(windows环境下要开\windows\broker.exe 切记切记) 解压tokudu-PhpMQTTClient-ba4e494.zip www下边新建目录androidpush 把解压文件tokudu-PhpMQTTClient-ba4e494中的SAM文件夹copy到androidpush目录下 把解压文件tokudu-PhpMQTTClient-ba4e494中的send_mqtt.php文件copy到androidpush目录下 结构如图: send_mqtt.php主文件 [php] view plaincopy <?php require('SAM/php_sam.php'); //create a new connection object //创建一个新的连接对象 $conn = new SAMConnection(); //start initialise the connection //开始初始化连接 SAM_HOST服务器host路径 ;SAM_PORT服务器port端口号 $conn->connect(SAM_MQTT, array(SAM_HOST => '127.0.0.1', SAM_PORT => 1883)); //create a new MQTT message with the output of the shell command as the body //建立一个新的MQTT shell命令的输出消息以作为主体($msgCpu是通知内容) //new SAMMessage() 参数一般写为json格式 $msgCpu = new SAMMessage("测试通知"); //send the message on the topic cpu //发送该信息的主体 //860173018344139是设备号,每一台android手机对应一个唯一的设备号 //$msgCpu通知内容 //send()推送通知 $conn->send('topic://'.'860173018344139', $msgCpu); //关闭连接 $conn->disconnect(); echo 'MQTT Message to ' . '860173018344139' . ' sent: ' . '测试通知'; ?> SAM目录 SAM/MQTT/sam_mqtt.php [php] view plaincopy <?php /* +----------------------------------------------------------------------+ | Copyright IBM Corporation 2006, 2007. | | All Rights Reserved. | +----------------------------------------------------------------------+ | | | Licensed under the Apache License, Version 2.0 (the "License"); you | | may not use this file except in compliance with the License. You may | | obtain a copy of the License at | | http://www.apache.org/licenses/LICENSE-2.0 | | | | Unless required by applicable law or agreed to in writing, software | | distributed under the License is distributed on an "AS IS" BASIS, | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | | implied. See the License for the specific language governing | | permissions and limitations under the License. | +----------------------------------------------------------------------+ | Author: Dave Renshaw | +----------------------------------------------------------------------+ $Id: sam_mqtt.php,v 1.1 2007/02/02 15:36:46 dsr Exp $ */ define("SAM_MQTT_CLEANSTART", "SAM_MQTT_CLEANSTART"); define("SAM_MQTT_QOS", "SAM_MQTT_QOS"); define("SAM_MQTT_SUB_SEPARATOR", "#-#"); /* --------------------------------- SAMConnection --------------------------------- */ class SAMConnection_MQTT { var $debug = false; var $errno = 0; var $error = ''; /* Info we need to keep between calls... */ var $sub_id = ''; var $port = ''; var $host = ''; var $cleanstart = false; var $virtualConnected = false; var $connected = false; /* Our current open socket... */ var $sock; /* Table of available operations using the MQTT protocol... */ var $operations = array("MQTT_CONNECT" => 1, "MQTT_CONNACK" => 2, "MQTT_PUBLISH" => 3, "MQTT_PUBACK" => 4, "MQTT_PUBREC" => 5, "MQTT_PUBREL" => 6, "MQTT_PUBCOMP" => 7, "MQTT_SUBSCRIBE" => 8, "MQTT_SUBACK" => 9, "MQTT_UNSUBSCRIBE" => 10, "MQTT_UNSUBACK" => 11, "MQTT_PINGREC" => 12, "MQTT_PINGRESP" => 13, "MQTT_DISCONNECT" => 14); /* --------------------------------- Constructor --------------------------------- */ function SAMConnection_MQTT() { if ($this->debug) e('SAMConnection_MQTT()'); if ($this->debug) x('SAMConnection_MQTT()'); } /* --------------------------------- Commit --------------------------------- */ function Commit() { if ($this->debug) e('SAMConnection_MQTT.Commit()'); $errno = 100; $error = 'Unsupported operation for MQTT protocol!'; $rc = false; if ($this->debug) x("SAMConnection_MQTT.Commit() rc=$rc"); return $rc; } /* --------------------------------- Connect --------------------------------- */ function Connect($proto, $options=array()) { if ($this->debug) e('SAMConnection_MQTT.Connect()'); /* Check our optional parameter array for the necessary bits... */ if ($options[SAM_PORT] == '') { $this->port = 1883; } else { $this->port = $options[SAM_PORT]; } if ($options[SAM_HOST] == '') { $this->host = 'localhost'; } else { $this->host = $options[SAM_HOST]; } $this->cleanstart = in_array(SAM_MQTT_CLEANSTART, $options); if ($this->debug) t("SAMConnection_MQTT.Connect() host=$this->host, port=$this->port, cleanstart=$this->cleanstart"); if ($this->checkHost($this->host, $this->port)) { $this->virtualConnected = true; } else { $this->virtualConnected = false; } if ($this->debug) x("SAMConnection_MQTT.Connect() rc=$this->virtualConnected"); return $this->virtualConnected; } /* --------------------------------- Disconnect --------------------------------- */ function Disconnect() { if ($this->debug) e('SAMConnection_MQTT.Disconnect()'); $rc = false; if ($this->virtualConnected) { if ($this->connected) { $msg = $this->fixed_header("MQTT_DISCONNECT").pack('C', 0); fwrite($this->sock, $msg); $response = fgets($this->sock, 128); if ($this->debug) t('SAMConnection_MQTT.Disconnect() response is '.strlen($response).' bytes'); if (strlen($response) == 0) { fclose($this->sock); $this->sock = NULL; } } $this->virtualConnected = false; $this->connected = false; $rc = true; } if ($this->debug) x("SAMConnection_MQTT.Disconnect() rc=$rc"); return $rc; } /* --------------------------------- IsConnected --------------------------------- */ function IsConnected() { if ($this->debug) e('SAMConnection_MQTT.IsConnected()'); $rc = false; if ($this->connected) { $rc = true; } if ($this->debug) x("SAMConnection_MQTT.IsConnected() rc=$rc"); return $rc; } /* --------------------------------- Peek --------------------------------- */ function Peek() { if ($this->debug) e('SAMConnection_MQTT.Peek()'); $errno = 100; $error = 'Unsupported operation for MQTT protocol!'; $rc = false; if ($this->debug) x("SAMConnection_MQTT.Peek() rc=$rc"); return $rc; } /* --------------------------------- PeekAll --------------------------------- */ function PeekAll() { if ($this->debug) e('SAMConnection_MQTT.PeekAll()'); $errno = 100; $error = 'Unsupported operation for MQTT protocol!'; $rc = false; if ($this->debug) x("SAMConnection_MQTT.PeekAll() rc=$rc"); return $rc; } /* --------------------------------- Receive --------------------------------- */ function Receive($sub_id, $options=array()) { if ($this->debug) e('SAMConnection_MQTT.Receive()'); $rc = false; /* strip the topic from the rear of the subscription id... */ $x = strpos($sub_id, SAM_MQTT_SUB_SEPARATOR); if (!$x) { $this->errno = 279; $this->error = 'Specified subscription id ('.$sub_id.') is not valid!'; return false; } $topic = substr($sub_id, $x + strlen(SAM_MQTT_SUB_SEPARATOR)); $si = substr($sub_id, 0, $x); /* Are we already connected? */ if (!$this->connected) { if ($this->debug) t('SAMConnection_MQTT.Receive() Not connected.'); /* No, so open up the connection... */ $this->sub_id = $si; $rc = $this->do_connect_now(); } else { /* We are already connected. Are we using the right subscriber id? */ if ($this->sub_id != $si) { if ($this->debug) t('SAMConnection_MQTT.Receive() Connected with wrong sub_id.'); /* No, We better reconnect then... */ $this->disconnect(); $this->sub_id = $si; $rc = $this->do_connect_now(); } else { if ($this->debug) t('SAMConnection_MQTT.Receive() Connected OK.'); $rc = true; } } if ($rc) { /* have we got a timeout specified? */ if ($options[SAM_WAIT] > 1) { $m = $options[SAM_WAIT] % 1000; $s = ($options[SAM_WAIT] - $m) /1000; if ($this->debug) t('SAMConnection_MQTT.Receive() timeout='.$options[SAM_WAIT]." ($s secs $m millisecs)"); stream_set_timeout($this->sock, $s, $m); if ($this->debug) t('SAMConnection_MQTT.Receive() timeout set.'); } else { if ($this->debug) t('SAMConnection_MQTT.Receive() no timeout value found!'); } $hdr = $this->read_fixed_header($this->sock); if (!$hdr) { $this->errno = 500; $this->error = 'Receive request failed, timed out with no data!'; $rc = false; } else { if ($hdr['mtype'] == $this->operations['MQTT_PUBLISH']) { $len = $this->read_remaining_length($this->sock); if ($len > 1) { /* read the topic length... */ $topic = $this->read_topic($this->sock); if (!$topic) { $this->errno = 303; $this->error = 'Receive request failed, message format invalid!'; $rc = false; } else { if ($this->debug) t('SAMConnection_MQTT.Receive() topic='.$topic); $len -= (strlen($topic) + 2); /* If QoS 1 or 2 then read the message id... */ if ($hdr['qos'] > 0) { $idb = fread($this->sock, 2); $len -= 2; $fields = unpack('na', $idb); $mid = $fields['a']; if ($this->debug) t('SAMConnection_MQTT.Receive() mid='.$mid); } $payload = fread($this->sock, $len); if ($this->debug) t('SAMConnection_MQTT.Receive() payload='.$payload); $rc = new SAMMessage(); $rc->body = $payload; $rc->header->SAM_MQTT_TOPIC = 'topic://'.$topic; $rc->header->SAM_MQTT_QOS = $hdr['qos']; $rc->header->SAM_TYPE = 'SAM_BYTES'; } } else { $this->errno = 303; $this->error = 'Receive request failed, received message too short! No topic data'; $rc = false; } } else { if ($this->debug) t('SAMConnection_MQTT.Receive() Receive failed response mtype = '.$mtype); $rc = false; } } } if ($this->debug) x("SAMConnection_MQTT.Receive() rc=$rc"); return $rc; } /* --------------------------------- Remove --------------------------------- */ function Remove() { if ($this->debug) e('SAMConnection_MQTT.Remove()'); $errno = 100; $error = 'Unsupported operation for MQTT protocol!'; $rc = false; if ($this->debug) x("SAMConnection_MQTT.Remove() rc=$rc"); return $rc; } /* --------------------------------- Rollback --------------------------------- */ function Rollback() { if ($this->debug) e('SAMConnection_MQTT.Rollback()'); $errno = 100; $error = 'Unsupported operation for MQTT protocol!'; $rc = false; if ($this->debug) x("SAMConnection_MQTT.Rollback() rc=$rc"); return $rc; } /* --------------------------------- Send --------------------------------- */ function Send($topic, $message, $options=array()) { if ($this->debug) e('SAMConnection_MQTT.Send()'); $rc = true; /* check the format of the topic... */ if (strncmp($topic, 'topic://', 8) == 0) { $t = substr($topic, 8); } else { $this->errno = 279; $this->error = 'Specified target ('.$topic.') is not a valid topic!'; return false; } if (in_array(SAM_MQTT_QOS, $options)) { $qos = $options[SAM_MQTT_QOS]; } else { $qos = 0; } /* Are we already connected? */ if (!$this->connected) { /* No, so open up the connection... */ $this->do_connect_now(); } $mid = rand(); $variable = $this->utf($t); if ($qos > 0) { $variable .= pack('n', $mid); } $payload = $message->body; // add in the remaining length field and fix it together $msg = $this->fixed_header("MQTT_PUBLISH", 0, $qos) . $this->remaining_length(strlen($variable)+strlen($payload)) . $variable . $payload; fwrite($this->sock, $msg); if ($qos > 0) { $hdr = $this->read_fixed_header($this->sock); if ($hdr) { /* is this a QoS level 1 message being sent? */ if ($qos == 1) { /* Yup, so we should get a PUBACK response message... */ if ($hdr['mtype'] == $this->operations['MQTT_PUBACK']) { $len = $this->read_remaining_length($this->sock); if ($len > 0) { $response = fread($this->sock, $len); } if ($len < 2) { if ($this->debug) t("SAMConnection_MQTT.Send() send failed, incorrect length response ($len) received!"); $this->errno = 302; $this->error = 'Send request failed!'; $rc = false; } else { $rc = true; } } else { if ($this->debug) t('SAMConnection_MQTT.Send() Send failed response mtype = '.$mtype.' Expected PUBREC!'); $rc = false; } } else { /* lets assume it's QoS level 2... */ /* We should get a PUBREC response message... */ if ($hdr['mtype'] == $this->operations['MQTT_PUBREC']) { $len = $this->read_remaining_length($this->sock); if ($len > 0) { $response = fread($this->sock, $len); } if ($len < 2) { if ($this->debug) t("SAMConnection_MQTT.Send() send failed, incorrect length response ($len) received!"); $this->errno = 302; $this->error = 'Send request failed!'; $rc = false; } else { $rc = true; /* Now we can send a PUBREL message... */ $variable = pack('n', $mid); $msg = $this->fixed_header("MQTT_PUBREL").$this->remaining_length(strlen($variable)).$variable; fwrite($this->sock, $msg); /* get a response... */ $hdr = $this->read_fixed_header($this->sock); if ($hdr['mtype'] == $this->operations['MQTT_PUBCOMP']) { $len = $this->read_remaining_length($this->sock); if ($len > 0) { $response = fread($this->sock, $len); } if ($len < 2) { if ($this->debug) t("SAMConnection_MQTT.Send() send failed, incorrect length response ($len) received!"); $this->errno = 302; $this->error = 'Send request failed!'; $rc = false; } else { $rc = true; } } else { if ($this->debug) t('SAMConnection_MQTT.Send() Send failed response mtype = '.$mtype.' Expected PUBCOMP!'); $rc = false; } } } else { if ($this->debug) t('SAMConnection_MQTT.Send() Send failed response mtype = '.$mtype); $rc = false; } } } } if ($this->debug) x("SAMConnection_MQTT.Send() rc=$rc"); return $rc; } /* --------------------------------- SetDebug --------------------------------- */ function SetDebug($option=false) { $this->debug = $option; return; } /* --------------------------------- Subscribe --------------------------------- */ function Subscribe($topic, $options=array()) { if ($this->debug) e("SAMConnection_MQTT.Subscribe($topic)"); $rc = true; /* check the format of the topic... */ if (strncmp($topic, 'topic://', 8) == 0) { $t = substr($topic, 8); } else { $this->errno = 279; $this->error = 'Specified target ('.$topic.') is not a valid topic!'; return false; } if (in_array(SAM_MQTT_QOS, $options)) { $qos = $options[SAM_MQTT_QOS]; } else { $qos = 0; } /* Are we already connected? */ if (!$this->connected) { /* No, so open up the connection... */ if (!$this->do_connect_now()) { return false; } } // variable header: message id (16 bits) $x = rand(1, 16000); $variable = pack('n', $x); // payload: client ID $payload = $this->utf($t).pack('C', $qos); // add in the remaining length field and fix it together $msg = $this->fixed_header("MQTT_SUBSCRIBE", 0, 1) . $this->remaining_length(strlen($variable)+strlen($payload)) . $variable . $payload; fwrite($this->sock, $msg); $hdr = $this->read_fixed_header($this->sock); if (!$hdr) { if ($this->debug) t("SAMConnection_MQTT.Subscribe() subscribe failed, no response from broker!"); $this->errno = 301; $this->error = 'Subscribe request failed, no response from broker!'; $rc = false; } else { if ($hdr['mtype'] == $this->operations['MQTT_SUBACK']) { $len = $this->read_remaining_length($this->sock); if ($len > 0) { $response = fread($this->sock, $len); /* Return the subscription id with the topic appended to it so we can unsubscribe easily... */ $rc = $this->sub_id.SAM_MQTT_SUB_SEPARATOR.$t; } if ($len < 3) { if ($this->debug) t("SAMConnection_MQTT.Subscribe() subscribe failed, incorrect length response ($len) received!"); $this->errno = 301; $this->error = 'Subscribe request failed, incorrect length response ($len) received!'; $rc = false; } } else { if ($this->debug) t('SAMConnection_MQTT.Subscribe() subscribe failed response mtype = '.$mtype); $rc = false; } } if ($this->debug) x("SAMConnection_MQTT.Subscribe() rc=$rc"); return $rc; } /* --------------------------------- Unsubscribe --------------------------------- */ function Unsubscribe($sub_id) { if ($this->debug) e("SAMConnection_MQTT.Unsubscribe($sub_id)"); /* Detach the topic from the rear of the subscription id... */ $x = strpos($sub_id, SAM_MQTT_SUB_SEPARATOR); if (!$x) { $this->errno = 279; $this->error = 'Specified subscription id ('.$sub_id.') is not valid!'; return false; } $topic = substr($sub_id, $x + strlen(SAM_MQTT_SUB_SEPARATOR)); $si = substr($sub_id, 0, $x); /* Are we already connected? */ if (!$this->connected) { if ($this->debug) t('SAMConnection_MQTT.Unsubscribe() Not connected.'); /* No, so open up the connection... */ $this->sub_id = $si; $rc = $this->do_connect_now(); } else { /* We are already connected. Are we using the right subscriber id? */ if ($this->sub_id != $si) { if ($this->debug) t('SAMConnection_MQTT.Unsubscribe() Connected with wrong sub_id.'); /* No, We better reconnect then... */ $this->disconnect(); $this->sub_id = $si; $rc = $this->do_connect_now(); } else { if ($this->debug) t('SAMConnection_MQTT.Unsubscribe() Connected OK.'); $rc = true; } } /* variable header: message id (16 bits) */ $x = rand(1, 16000); $variable = pack('n', $x); /* payload: client ID */ $payload = $this->utf($topic); /* add in the remaining length field and fix it together */ $msg = $this->fixed_header("MQTT_UNSUBSCRIBE", 0, 1) . $this->remaining_length(strlen($variable)+strlen($payload)) . $variable . $payload; fwrite($this->sock, $msg); $hdr = $this->read_fixed_header($this->sock); if (!$hdr) { if ($this->debug) t("SAMConnection_MQTT.Unsubscribe() unsubscribe failed, no response from broker!"); $this->errno = 302; $this->error = 'Unsubscribe request failed, no response from broker!'; $rc = false; } else { if ($hdr['mtype'] == $this->operations['MQTT_UNSUBACK']) { $len = $this->read_remaining_length($this->sock); if ($len > 0) { $response = fread($this->sock, $len); $rc = $this->sub_id; } if ($len != 2) { if ($this->debug) t("SAMConnection_MQTT.Unsubscribe() unsubscribe failed, incorrect length response ($len) received!"); $this->errno = 301; $this->error = "Unsubscribe request failed, incorrect length response ($len) received!"; $rc = false; } } else { if ($this->debug) t('SAMConnection_MQTT.Unsubscribe() unsubscribe failed response mtype = '.$hdr['mtype']); $rc = false; } } if ($this->debug) x("SAMConnection_MQTT.Unsubscribe() rc=$rc"); return $rc; } function remaining_length($l) { /* return the remaining length field bytes for an integer input parameter */ if ($this->debug) t("SAMConnection_MQTT.remaining_length() l=$l"); $rlf = ''; do { $digit = $l % 128; $l = ($l - $digit)/128; if ($this->debug) t("SAMConnection_MQTT.remaining_length() digit=$digit l=$l"); # if there are more digits to encode, set the top bit of this digit if ( $l > 0 ) { $digit += 128; } $digit = pack('C', $digit); $rlf .= $digit; if ($this->debug) t("SAMConnection_MQTT.remaining_length() rlf=$rlf"); } while ($l > 0); return $rlf; } function utf($s) { /* return the UTF-8 encoded version of the parameter */ $l = strlen($s); $b1 = pack('C', $l/256); $b2 = pack('C', $l%256); $rc = $b1.$b2.$s; return $rc; } function fixed_header($operation, $dup=0, $qos=0, $retain=0) { /* fixed header: msg type (4) dup (1) qos (2) retain (1) */ return pack('C', ($this->operations[$operation] * 16) + ($dup * 4) + ($qos * 2) + $retain); } function checkHost($hostname, $port) { if ($this->debug) e("SAMConnection_MQTT.checkHost($hostname)"); $rc = false; $fp = fsockopen($hostname, $port); if (!$fp) { $rc = false; } else { $this->sock = $fp; $rc = true; } if ($this->debug) x("SAMConnection_MQTT.checkHost(rc=$rc)"); return $rc; } function do_connect_now() { $rc = true; /* Do we have a client/subscriber id yet? */ if ($this->sub_id == '') { /* No, so create a unique one... */ $this->sub_id = uniqid('', true); if ($this->debug) t("SAMConnection_MQTT.do_connect_now() sub_id=$this->sub_id"); } else { if ($this->debug) t("SAMConnection_MQTT.do_connect_now() using existing sub_id=$this->sub_id"); } if ($this->cleanstart) { $x = "\x03"; } else { $x = "\x00"; } $variable = $this->utf('MQIsdp')."\x03$x\x00\x00"; /* payload is subscriber id */ $payload = $this->utf($this->sub_id); /* add in the remaining length field and fix it together */ $msg = $this->fixed_header("MQTT_CONNECT") . $this->remaining_length(strlen($variable)+strlen($payload)) . $variable . $payload; $errno = 0; $errstr = ''; if (!$this->virtualConnected) { $fp = fsockopen($this->host, $this->port, $errno, $errstr); if (!$fp) { if ($this->debug) t("SAMConnection_MQTT.do_connect_now() fsockopen failed! ($errno) $errstr"); $this->errno = 208; $this->error = 'Unable to open socket to broker!'; $this->sock = NULL; return false; } else { $this->virtualConnected = true; $this->sock = $fp; } } stream_set_timeout($this->sock, 10); fwrite($this->sock, $msg); $hdr = $this->read_fixed_header($this->sock); if ($hdr) { if ($hdr['mtype'] == $this->operations['MQTT_CONNACK']) { $len = $this->read_remaining_length($this->sock); if ($len < 2) { if ($this->debug) t("SAMConnection_MQTT.do_connect_now() connect failed, incorrect length response ($len) received!"); $this->errno = 218; $this->error = 'Unable to open connection to broker!'; $rc = false; } else { $response = fread($this->sock, $len); $fields = unpack('Ccomp/Cretcode', $response); if ($fields['retcode'] == 0) { $rc = $this->sock; $this->connected = true; $rc = true; if ($this->debug) t('SAMConnection_MQTT.do_connect_now() connected OK'); } else { if ($this->debug) t('SAMConnection_MQTT.do_connect_now() connect failed retcode = '.$fields['retcode']); $rc = false; if ($fields['retcode'] == 2) { $this->sub_id = ''; $this->errno = 279; $this->error = 'Invalid subscription id!'; } } } } else { if ($this->debug) t('SAMConnection_MQTT.do_connect_now() connect failed response mtype = '.$mtype); $rc = false; } } if (!$rc) { fclose($this->sock); $this->sock = NULL; $this->virtualConnected = false; } return $rc; } function read_fixed_header($conn) { $rc = false; $response = fread($conn, 1); if (strlen($response) > 0) { $fields = unpack('Cbyte1', $response); $x = $fields['byte1']; $ret = $x % 2; $x -= $ret; $qos = ($x % 8) / 2; $x -= ($qos * 2); $dup = ($x % 16) / 8; $x -= ($dup * 8); $mtype = $x / 16; if ($this->debug) t("SAMConnection_MQTT.read_fixed_header() mtype=$mtype, dup=$dup, qos=$qos, retain=$ret"); $rc = array('mtype' => $mtype, 'dup' => $dup, 'qos' => $qos, 'retain' => $ret); } return $rc; } function read_remaining_length($conn) { $rc = 0; $m = 1; while (!feof($conn)) { $byte = fgetc($conn); $fields = unpack('Ca', $byte); $x = $fields['a']; if ($this->debug) t('SAMConnection_MQTT.read_remaining_length() byte ('.strlen($byte).') = '.$x); if ($x < 128) { $rc += $x * $m; break; } else { $rc += (($x - 128) * $m); } $m *= 128; } if ($this->debug) t('SAMConnection_MQTT.read_remaining_length() remaining length = '.$rc); return $rc; } function read_topic($conn) { if ($this->debug) e('SAMConnection_MQTT.read_topic()'); $rc = false; while (!feof($conn)) { $tlen = fread($conn, 2); $fields = unpack('na', $tlen); if ($this->debug) t('SAMConnection_MQTT.read_topic() topic length='.$fields['a']); $rc = fread($conn, $fields['a']); break; } if ($this->debug) x("SAMConnection_MQTT.read_topic(rc=$rc)"); return $rc; } } ?> SAM/php_sam.php [php] view plaincopy <?php /* +----------------------------------------------------------------------+ | Copyright IBM Corporation 2006, 2007. | | All Rights Reserved. | +----------------------------------------------------------------------+ | | | Licensed under the Apache License, Version 2.0 (the "License"); you | | may not use this file except in compliance with the License. You may | | obtain a copy of the License at | | http://www.apache.org/licenses/LICENSE-2.0 | | | | Unless required by applicable law or agreed to in writing, software | | distributed under the License is distributed on an "AS IS" BASIS, | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | | implied. See the License for the specific language governing | | permissions and limitations under the License. | +----------------------------------------------------------------------+ | Author: Dave Renshaw | +----------------------------------------------------------------------+ $Id: php_sam.php,v 1.1 2007/02/02 15:38:53 dsr Exp $ */ /* Debugging flags and functions available to sub packages... */ $eol = "\n"; if (isset($_SERVER['REQUEST_URI'])) { $eol = '<br>'; } function e($s) {global $eol;echo '-->'.$s."$eol";} function t($s) {global $eol;echo ' '.$s."$eol";} function x($s) {global $eol;echo '<--'.$s."$eol";} define('SAM_MQTT', 'mqtt'); /* --------------------------------- SAMConnection --------------------------------- */ class SAMConnection { // var $debug = true; var $debug = false; var $errno = 0; var $error = ''; var $connection; /* --------------------------------- Create --------------------------------- */ function Create($proto) { if ($this->debug) e("SAMConnection.Create(proto=$proto)"); $rc = false; /* search the PHP config for a factory to use... */ $x = get_cfg_var('sam.factory.'.$proto); if ($this->debug) t('SAMConnection.Create() get_cfg_var() "'.$x.'"'); /* If there is no configuration (php.ini) entry for this protocol, default it. */ if (strlen($x) == 0) { /* for every protocol other than MQTT assume we will use XMS */ if ($proto != 'mqtt') { $x = 'xms'; } else { $x = 'mqtt'; } } /* Invoke the chosen factory to create a real connection object... */ $x = 'sam_factory_'.$x.'.php'; if ($this->debug) t("SAMConnection.Create() calling factory - $x"); $rc = include $x; if ($this->debug && $rc) t('SAMConnection.Create() rc = '.get_class($rc)); if ($this->debug) x('SAMConnection.Create()'); return $rc; } /* --------------------------------- Constructor --------------------------------- */ function SAMConnection() { if ($this->debug) e('SAMConnection()'); if ($this->debug) x('SAMConnection()'); } /* --------------------------------- Commit --------------------------------- */ function Commit() { if ($this->debug) e('SAMConnection.Commit()'); $rc = true; if (!$this->connection) { $errno = 106; $error = 'No active connection!'; $rc = false; } else { /* Call the method on the underlying connection object... */ $rc = $this->connection->commit($target, $options); $this->errno = $this->connection->errno; $this->error = $this->connection->error; if (!$rc) { if ($this->debug) t("SAMConnection.Commit() commit failed ($this->errno) $this->error"); $rc = false; } } if ($this->debug) x("SAMConnection.Commit() rc=$rc"); return $rc; } /* --------------------------------- Connect --------------------------------- */ function Connect($proto='', $options=array()) { if ($this->debug) e('SAMConnection.Connect()'); $rc = false; if ($proto == '') { $errno = 101; $error = 'Incorrect number of parameters on connect call!'; $rc = false; } else { $this->connection = $this->create($proto); if (!$this->connection) { $errno = 102; $error = 'Unsupported protocol!'; $rc = false; } else { if ($this->debug) t("SAMConnection.Connect() connection created for protocol $proto"); $this->connection->setdebug($this->debug); /* Call the connect method on the newly created connection object... */ $rc = $this->connection->connect($proto, $options); $this->errno = $this->connection->errno; $this->error = $this->connection->error; if (!$rc) { if ($this->debug) t("SAMConnection.Connect() connect failed ($this->errno) $this->error"); } else { $rc = true; } } } if ($this->debug) x("SAMConnection.Connect() rc=$rc"); return $rc; } /* --------------------------------- Disconnect --------------------------------- */ function Disconnect() { if ($this->debug) e('SAMConnection.Disconnect()'); $rc = true; if (!$this->connection) { $errno = 106; $error = 'No active connection!'; $rc = false; } else { /* Call the method on the underlying connection object... */ $rc = $this->connection->Disconnect(); $this->errno = $this->connection->errno; $this->error = $this->connection->error; if (!$rc) { if ($this->debug) t("SAMConnection.Disconnect() Disconnect failed ($this->errno) $this->error"); } else { $rc = true; $this->connection = false; } } if ($this->debug) x("SAMConnection.Disconnect() rc=$rc"); return $rc; } /* --------------------------------- IsConnected --------------------------------- */ function IsConnected() { if ($this->debug) e('SAMConnection.IsConnected()'); $rc = true; if (!$this->connection) { $errno = 106; $error = 'No active connection!'; $rc = false; } else { /* Call the method on the underlying connection object... */ $rc = $this->connection->isconnected(); $this->errno = $this->connection->errno; $this->error = $this->connection->error; if (!$rc) { if ($this->debug) t("SAMConnection.IsConnected() isconnected failed ($this->errno) $this->error"); $rc = false; } } if ($this->debug) x("SAMConnection.IsConnected() rc=$rc"); return $rc; } /* --------------------------------- Peek --------------------------------- */ function Peek($target, $options=array()) { if ($this->debug) e('SAMConnection.Peek()'); $rc = true; if (!$this->connection) { $errno = 106; $error = 'No active connection!'; $rc = false; } else { /* Call the method on the underlying connection object... */ $rc = $this->connection->peek($target, $options); $this->errno = $this->connection->errno; $this->error = $this->connection->error; if (!$rc) { if ($this->debug) t("SAMConnection.Peek() peek failed ($this->errno) $this->error"); $rc = false; } } if ($this->debug) x("SAMConnection.Peek() rc=$rc"); return $rc; } /* --------------------------------- PeekAll --------------------------------- */ function PeekAll($target, $options=array()) { if ($this->debug) e('SAMConnection.PeekAll()'); $rc = true; if (!$this->connection) { $errno = 106; $error = 'No active connection!'; $rc = false; } else { /* Call the method on the underlying connection object... */ $rc = $this->connection->peekall($target, $options); $this->errno = $this->connection->errno; $this->error = $this->connection->error; if (!$rc) { if ($this->debug) t("SAMConnection.PeekAll() peekall failed ($this->errno) $this->error"); $rc = false; } } if ($this->debug) x("SAMConnection.PeekAll() rc=$rc"); return $rc; } /* --------------------------------- Receive --------------------------------- */ function Receive($target, $options=array()) { if ($this->debug) e('SAMConnection.Receive()'); $rc = true; if (!$this->connection) { $errno = 106; $error = 'No active connection!'; $rc = false; } else { /* Call the receive method on the underlying connection object... */ $rc = $this->connection->receive($target, $options); $this->errno = $this->connection->errno; $this->error = $this->connection->error; if (!$rc) { if ($this->debug) t("SAMConnection.Receive() receive failed ($this->errno) $this->error"); } } if ($this->debug) x("SAMConnection.Receive() rc=$rc"); return $rc; } /* --------------------------------- Remove --------------------------------- */ function Remove($target, $options=array()) { if ($this->debug) e('SAMConnection.Remove()'); $rc = true; if (!$this->connection) { $errno = 106; $error = 'No active connection!'; $rc = false; } else { /* Call the method on the underlying connection object... */ $rc = $this->connection->remove($target, $options); $this->errno = $this->connection->errno; $this->error = $this->connection->error; if (!$rc) { if ($this->debug) t("SAMConnection.Remove() remove failed ($this->errno) $this->error"); $rc = false; } } if ($this->debug) x("SAMConnection.Remove() rc=$rc"); return $rc; } /* --------------------------------- Rollback --------------------------------- */ function Rollback() { if ($this->debug) e('SAMConnection.Rollback()'); $rc = true; if (!$this->connection) { $errno = 106; $error = 'No active connection!'; $rc = false; } else { /* Call the method on the underlying connection object... */ $rc = $this->connection->rollback($target, $options); $this->errno = $this->connection->errno; $this->error = $this->connection->error; if (!$rc) { if ($this->debug) t("SAMConnection.Rollback() rollback failed ($this->errno) $this->error"); $rc = false; } } if ($this->debug) x("SAMConnection.Rollback() rc=$rc"); return $rc; } /* --------------------------------- Send --------------------------------- */ function Send($target, $msg, $options=array()) { if ($this->debug) e('SAMConnection.Send()'); $rc = true; if (!$this->connection) { $errno = 106; $error = 'No active connection!'; $rc = false; } else { /* Call the send method on the underlying connection object... */ $rc = $this->connection->send($target, $msg, $options); $this->errno = $this->connection->errno; $this->error = $this->connection->error; if (!$rc) { if ($this->debug) t("SAMConnection.Send() send failed ($this->errno) $this->error"); $rc = false; } } if ($this->debug) x("SAMConnection.Send() rc=$rc"); return $rc; } /* --------------------------------- SetDebug --------------------------------- */ function SetDebug($option=false) { if ($this->debug) e("SAMConnection.SetDebug($option)"); $this->debug = $option; if ($this->connection) { $this->connection->setdebug($option); } if ($this->debug) x('SAMConnection.SetDebug()'); return; } /* --------------------------------- Subscribe --------------------------------- */ function Subscribe($topic, $options=array()) { if ($this->debug) e("SAMConnection.Subscribe($topic)"); $rc = true; if (!$this->connection) { $errno = 106; $error = 'No active connection!'; $rc = false; } else { /* Call the subscribe method on the underlying connection object... */ $rc = $this->connection->subscribe($topic, $options); $this->errno = $this->connection->errno; $this->error = $this->connection->error; if (!$rc) { if ($this->debug) t("SAMConnection.Subscribe() subscribe failed ($this->errno) $this->error"); $rc = false; } } if ($this->debug) x("SAMConnection.Subscribe() rc=$rc"); return $rc; } /* --------------------------------- Unsubscribe --------------------------------- */ function Unsubscribe($sub_id) { if ($this->debug) e("SAMConnection.Unsubscribe($sub_id)"); $rc = true; if (!$this->connection) { $errno = 106; $error = 'No active connection!'; $rc = false; } else { /* Call the subscribe method on the underlying connection object... */ $rc = $this->connection->unsubscribe($sub_id); $this->errno = $this->connection->errno; $this->error = $this->connection->error; if (!$rc) { if ($this->debug) t("SAMConnection.Unsubscribe() unsubscribe failed ($this->errno) $this->error"); $rc = false; } } if ($this->debug) x("SAMConnection.Unsubscribe() rc=$rc"); return $rc; } } /* --------------------------------- SAMMessage --------------------------------- */ class SAMMessage { /* --------------------------------- Constructor --------------------------------- */ function SAMMessage($body='') { if ($body != '') { $this->body = $body; } } } ?> SAM/sam_factory_mqtt.php [php] view plaincopy <?php /* +----------------------------------------------------------------------+ | Copyright IBM Corporation 2006, 2007. | | All Rights Reserved. | +----------------------------------------------------------------------+ | | | Licensed under the Apache License, Version 2.0 (the "License"); you | | may not use this file except in compliance with the License. You may | | obtain a copy of the License at | | http://www.apache.org/licenses/LICENSE-2.0 | | | | Unless required by applicable law or agreed to in writing, software | | distributed under the License is distributed on an "AS IS" BASIS, | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | | implied. See the License for the specific language governing | | permissions and limitations under the License. | +----------------------------------------------------------------------+ | Author: Dave Renshaw | +----------------------------------------------------------------------+ $Id: sam_factory_mqtt.php,v 1.1 2007/02/02 15:40:41 dsr Exp $ */ require_once('MQTT/sam_mqtt.php'); return new SAMConnection_MQTT(); ?> SAM/sam_factory_xms.php [php] view plaincopy <?php /* +----------------------------------------------------------------------+ | Copyright IBM Corporation 2006, 2007. | | All Rights Reserved. | +----------------------------------------------------------------------+ | | | Licensed under the Apache License, Version 2.0 (the "License"); you | | may not use this file except in compliance with the License. You may | | obtain a copy of the License at | | http://www.apache.org/licenses/LICENSE-2.0 | | | | Unless required by applicable law or agreed to in writing, software | | distributed under the License is distributed on an "AS IS" BASIS, | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | | implied. See the License for the specific language governing | | permissions and limitations under the License. | +----------------------------------------------------------------------+ | Author: Dave Renshaw | +----------------------------------------------------------------------+ $Id: sam_factory_xms.php,v 1.1 2007/02/02 15:40:00 dsr Exp $ */ if (!class_exists('SAMXMSConnection')) { global $eol; $l = (strstr(PHP_OS, 'WIN') ? 'php_' : '').'sam_xms.'.(strstr(PHP_OS, 'WIN') ? 'dll' : 'so'); echo $eol.'<font color="red"><b>Unable to access SAM XMS capabilities. Ensure the '.$l.' library is defined as an extension.</b></font>'.$eol; return false; } else { return new SAMXMSConnection(); } ?>
安卓和苹果推送源代码示例 2012-09-27 09:51:24| 分类: 苹果安卓开发 |字号 订阅 //////////////////=================== 安卓苹果推送 =====================//////////////////// //安卓推送方法封装 /* | 服务器下载地址:http://www.cnblogs.com/hanyonglu/archive/2012/03/16/2399655.html | -------------------------------------------------------- | 形式参数: | (1)$message:要推送的消息内容 | (2)$broadcast:要推送是否为广播模式,取值为"Y"或"N" | (3)$deviceID:要推送机器的硬件标识码 | 返回结果:无 | 调用示例: | sys_push_android("TEST_BROADCAST","Y");//广播模式示例 | sys_push_android("TEST_SINGLE","N","af05df6969a3400caed26576be400745");//单个推送示例 | -------------------------------------------------------- */ function sys_push_android($message,$broadcast,$deviceID = NULL) { //安卓推送服务器地址: //$post_server='http://192.168.1.146:7070/notification.do?action=send'; $post_data = array(); $broadcast = strtoupper($broadcast);//转换为大写 $post_data['broadcast'] = $broadcast; //$post_data['title'] = $message; $post_data['title'] = '妈咪掌中宝'; $post_data['message'] = $message; $post_data['uri'] = ""; if($broadcast != "Y" && !empty($deviceID)) $post_data['username'] = $deviceID; $url_str=""; foreach ($post_data as $key=>$value) { $url_str .= "$key=".urlencode($value)."&"; } $post_data=substr($url_str,0,-1);//去掉最后一个&号 $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL,$post_server); ////为了支持cookie,暂时屏蔽 //curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //此参数非常重要,可以防止短信服务器的返回内容,直接输出到客户端 curl_exec($ch); curl_close($ch); } //苹果推送方法封装 /* | -------------------------------------------------------- | 形式参数: | (1)$message:要推送的消息内容 | (2)$deviceID:要推送机器的硬件标识码 | 返回结果:无 | -------------------------------------------------------- */ function sys_push_iphone($message,$deviceID) { //选择开发环境: $passphrase = '123456'; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); stream_context_set_option($ctx, 'ssl', 'local_cert', $_SERVER['DOCUMENT_ROOT'].'/'.SYS_WEB_NAME.'/web/webservice/iphone_push_debug.pem');//正式环境需要使用iphone_push_run // Open a connection to the APNS server $fp = stream_socket_client( 'ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); ////whb:如果连接成功则提醒未能连接苹果服务器,暂时屏蔽。 ////if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL); ////echo 'Connected to APNS' . PHP_EOL; $body['aps'] = array('alert' => $message,'sound' => 'default'); $payload = json_encode($body); $msg = chr(0) . pack('n', 32) . pack('H*', $deviceID) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); // Close the connection to the server fclose($fp); } //系统推送总封装函数 /* | -------------------------------------------------------- | 形式参数: | (1)$device_type:设备类型 1:苹果 2:安卓 | (2)$deviceID:要推送机器的硬件标识码 | (3)$content:要推送的通知内容 | 返回结果:无 | 用法备忘: | -------------------------------------------------------- */ function sys_push_notice($device_type,$deviceID,$content) { if($device_type == 1) { sys_push_iphone($content,$deviceID); } if($device_type == 2) { sys_push_android($content,'N',$deviceID);//N表示是非广播模式 } }
实际操作
$post_data = implode('&',$post_data); $url='http://cqtv.sinosns.cn/app/index.php/tui'; $ch = curl_init(); //print_r($post_data);exit; curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL,$url); //传递一个作为HTTP “POST”操作的所有数据的字符串。 curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); ob_start(); curl_exec($ch); $result = ob_get_contents() ; ob_end_clean(); echo $result;
$alert=$_POST['msg']; // 这里是我们上面得到的deviceToken,直接复制过来(记得去掉空格) $deviceToken=$_POST['token']; //$deviceToken = '99972361c17f1443c2b9c75deda6cef698d8e60011784f8dcf799275a07332f1'; //print_r($alert);exit; // Put your private key's passphrase here: $passphrase = '111111'; // Put your alert message here: //$message = 'My first push test!'; $message=array('aps' => array('alert' => $alert, 'badge' => 1, 'sound'=>'default')); //////////////////////////////////////////////////////////////////////////////// print_r(dirname(__FILE__));exit; $pem = dirname(__FILE__).'/'.'sbone.pem'; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', $pem); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server //这个为正是的发布地址 //$fp = stream_socket_client(“ssl://gateway.push.apple.com:2195“, $err, $errstr, 60, //STREAM_CLIENT_CONNECT, $ctx); //这个是沙盒测试地址,发布到appstore后记得修改哦 $fp = stream_socket_client( 'ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("无法连接到苹果推送服务器: $err $errstr" . PHP_EOL); echo "连接到苹果推送服务器</br>"; // Encode the payload as JSON $payload = json_encode($message); //echo $payload; // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) echo 'Message not delivered' . PHP_EOL; else echo '推送成功'; fclose($fp);