PHP串口访问


PHP Serial Port Access

我正试图实现下面的代码,我有一个wavecom gsm调制解调器连接到COM6 https://i.stack.imgur.com/yFH8l.jpg它适用于第三方短信网关软件,但它是非常昂贵的。

我得到这些错误

致命错误:未捕获的异常' exception '与消息'无法设置COM端口,检查它是正确的'在C:'wamp'www'sms'index.php第53行(!)异常:无法设置COM端口,请在C:'wamp'www'sms'index.php第53行检查是否正确

我需要做什么才能使它工作?

<?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 modem
//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 = 9600;
$gsm_send_sms->init();
$status = $gsm_send_sms->send('+642102844012', '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 = 'COM6';
    public $baud = 9600;
    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');
        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;
    }
}
?>

试试下面的代码,希望能有所帮助,注意:使用php_serial.class.php

代码:

<?php

require("php_serial.class.php");

$serial = new phpSerial;
// First we must specify the device. This works on both linux and windows (if
// your linux serial device is /dev/ttyS0 for COM1, etc)
$serial->deviceSet("/dev/ttyS0");
// We can change the baud rate, parity, length, stop bits, flow control
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");
// Then we need to open it
$serial->deviceOpen();  

// To write into
$serial->sendMessage("AT+CMGF=1'n'r"); 
$serial->sendMessage("AT+cmgs='"+912709345x23'"'n'r");
$serial->sendMessage("Hi, This is the sms that I sent to you using PHP script with serial Port communication with my phone as serial device!! GN - VKSALIAN 'n'r");
$serial->sendMessage(chr(26));
//wait for modem to send message
sleep(7);

// Or to read from
$read = $serial->readPort();
echo $read;
// If you want to change the configuration, the device must be closed
$serial->deviceClose();
?>