Sending SMS in PHP using GSM modem

后端 未结 1 340
醉话见心
醉话见心 2020-12-15 14:50

Am new to PHP. Am working in a recent project which needs to notify clients via sms. I know there are sms services we can use but my boss wants to try using a GSM modem. Is

相关标签:
1条回答
  • 2020-12-15 14:57
    you can use following code, it works on my gsm modem. its zyxel
    
    <?php
    
    //SMS via GSM Modem - A PHP class to send SMS messages via a GSM modem attached to the computers serial port.
    
    //Windows only (tested on XP with PHP 5.2.6)
    //Tested with the EZ863 (Telit GE863) GSM modementer code here
    //Requires that PHP has permission to access "COM" system device, and system "mode" command
    
    error_reporting(E_ALL);
    
    //Example
    
    $gsm_send_sms = new gsm_send_sms();
    $gsm_send_sms->debug = false;
    $gsm_send_sms->port = 'COM6';
    $gsm_send_sms->baud = 19200;
    $gsm_send_sms->init();
    
    $status = $gsm_send_sms->send('09360403533', 'testing 123');
    if ($status) {
        echo "Message sent\n";
    } else {
        echo "Message not sent\n";
    }
    
    
    
    $gsm_send_sms->close();
    
    
    
    
    
    
    
    //Send SMS via serial SMS modem
    class gsm_send_sms {
    
        public $port = 'COM1';
        public $baud = 115200;
    
        public $debug = false;
    
        private $fp;
        private $buffer;
    
        //Setup COM port
        public function init() {
    
            $this->debugmsg("Setting up port: \"{$this->port} @ \"{$this->baud}\" baud");
    
            exec("MODE {$this->port}: BAUD={$this->baud} PARITY=N DATA=8 STOP=1", $output, $retval);
    
            if ($retval != 0) {
                throw new Exception('Unable to setup COM port, check it is correct');
            }
    
            $this->debugmsg(implode("\n", $output));
    
            $this->debugmsg("Opening port");
    
            //Open COM port
            $this->fp = fopen($this->port . ':', 'r+');
    
            //Check port opened
            if (!$this->fp) {
                throw new Exception("Unable to open port \"{$this->port}\"");
            }
    
            $this->debugmsg("Port opened");
            $this->debugmsg("Checking for responce from modem");
    
            //Check modem connected
            fputs($this->fp, "AT\r");
    
            //Wait for ok
            $status = $this->wait_reply("OK\r\n", 5);
    
            if (!$status) {
                throw new Exception('Did not receive responce from modem');
            }
    
            $this->debugmsg('Modem connected');
    
            //Set modem to SMS text mode
            $this->debugmsg('Setting text mode');
            fputs($this->fp, "AT+CMGF=1\r");
    
            $status = $this->wait_reply("OK\r\n", 5);
    
            if (!$status) {
                throw new Exception('Unable to set text mode');
            }
    
            $this->debugmsg('Text mode set');
    
        }
    
        //Wait for reply from modem
        private function wait_reply($expected_result, $timeout) {
    
            $this->debugmsg("Waiting {$timeout} seconds for expected result");
    
            //Clear buffer
            $this->buffer = '';
    
            //Set timeout
            $timeoutat = time() + $timeout;
    
            //Loop until timeout reached (or expected result found)
            do {
    
                $this->debugmsg('Now: ' . time() . ", Timeout at: {$timeoutat}");
    
                $buffer = fread($this->fp, 1024);
                $this->buffer .= $buffer;
    
                usleep(200000);//0.2 sec
    
                $this->debugmsg("Received: {$buffer}");
    
                //Check if received expected responce
                if (preg_match('/'.preg_quote($expected_result, '/').'$/', $this->buffer)) {
                    $this->debugmsg('Found match');
                    return true;
                    //break;
                } else if (preg_match('/\+CMS ERROR\:\ \d{1,3}\r\n$/', $this->buffer)) {
                    return false;
                }
    
            } while ($timeoutat > time());
    
            $this->debugmsg('Timed out');
    
            return false;
    
        }
    
        //Print debug messages
        private function debugmsg($message) {
    
            if ($this->debug == true) {
                $message = preg_replace("%[^\040-\176\n\t]%", '', $message);
                echo $message . "\n";
            }
    
        }
    
        //Close port
        public function close() {
    
            $this->debugmsg('Closing port');
            var_dump($this->fp);
            fclose($this->fp);
    
        }
    
        //Send message
        public function send($tel, $message) {
            //Filter tel
            $tel = preg_replace("%[^0-9\+]%", '', $tel);
    
            //Filter message text
            //$message = preg_replace("%[^\040-\176\r\n\t]%", '', $message);
    
            $this->debugmsg("Sending message \"{$message}\" to \"{$tel}\"");
    
            //Start sending of message
            fputs($this->fp, "AT+CMGS=\"{$tel}\"\r");
    
            //Wait for confirmation
            $status = $this->wait_reply("\r\n> ", 5);
    
            if (!$status) {
                //throw new Exception('Did not receive confirmation from modem');
                $this->debugmsg('Did not receive confirmation from modem');
                return false;
            }
    
            //Send message text
             fputs($this->fp, $message);
    
    
            //Send message finished indicator
            fputs($this->fp, chr(26));
    
            //Wait for confirmation
            $status = $this->wait_reply("OK\r\n", 180);
    
            if (!$status) {
                //throw new Exception('Did not receive confirmation of messgage sent');
                $this->debugmsg('Did not receive confirmation of messgage sent');
                return false;
            }
    
            $this->debugmsg("Message sent");
    
            return true;
    
        }
    
    }
    
    ?>
    
    0 讨论(0)
提交回复
热议问题