使用GSM调制解调器在PHP中发送短信

3

我是新手PHP开发者,目前参与了一个需要通过短信通知客户的项目。我知道有一些可以使用的短信服务,但是我的老板想尝试使用GSM调制解调器。

请问是否可以使用GSM调制解调器发送短信?如果有教程将会非常有帮助。

谢谢。


@Pekka웃 这并不是真的。PHP中有很多可用于打开串口的类,这正是此任务所需的。 - Brad
可能是为短信实现GSM调制解调器的重复问题。 - Brad
参见:https://dev59.com/ylLTa4cB1Zd3GeqPWgni#4231288 - Brad
@Brad 感谢您的回复。但是发送短信只是为了在分配新工作时通知组织的服务工程师,每天最多会产生约50条短信。这就是他想尝试使用GSM调制解调器的原因。我尝试寻找一些教程,但大多数都对COM端口等感到困惑...任何帮助将不胜感激。 - Karthik Nk
@KarthikNk 我不知道有没有现成的代码可以发送短信...不同的设备使用不同的命令,但许多命令是标准化的。请查看您的GSM调制解调器附带的文档。您需要查找“AT命令参考”文档。 - Brad
显示剩余3条评论
1个回答

3
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;

    }

}

?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接