public function init() { if (preg_match('/COM[0-9]+/', $this->source)) { $this->_logger->log(__METHOD__ . ' Check Serial port'); // else it is COM port connection: it can be DataLogger or GSM modem ListenerProcess::addComment($this->listener->listener_id, 'hardware_recognizing', SMSCOMPort::getLinuxComName($this->source) . ' is Serial port.'); try { // try to send AT command // if script recieves "OK" - this is GSM modem. Else - it can be only DataLogger $serial = new PhpSerial($this->_logger); $this->_logger->log(__METHOD__ . $this->source); $serial->deviceSet($this->source); $serial->confFlowControl(Yii::app()->params['com_connect_params']['hardwareflowcontrol']); $serial->confBaudRate(Yii::app()->params['com_connect_params']['baudrate']); $serial->confParity(Yii::app()->params['com_connect_params']['parity']); $serial->confStopBits(Yii::app()->params['com_connect_params']['stopbits']); $serial->confCharacterLength(Yii::app()->params['com_connect_params']['databits']); $this->_connector = new GsmModemSerialConnector($this->_logger, $serial); $this->_connector->setParams(array('port' => $this->source)); ListenerProcess::addComment($this->listener->listener_id, 'hardware_recognizing', 'Script started to recognize hardware connected to PC via Serial port'); if ($this->listener->additional_param == 'SMS') { while (1) { if ($this->_connector->check()) { $this->_logger->log(__METHOD__, array('hardware' => 'modem')); $this->hardware = 'modem'; ListenerProcess::addComment($this->listener->listener_id, 'hardware_recognizing', 'Hardware connected to PC via Serial port - is GSM Modem'); $this->_logger->log(__METHOD__, array('hardware' => $this->hardware)); return true; } sleep(60); } } $this->_connector = new DataLoggerSerialConnector($this->_logger, $serial); $this->_connector->setParams(array('port' => $this->source)); if ($this->listener->additional_param == 'DIRECT') { if ($this->_connector->check()) { $this->_logger->log(__METHOD__, array('hardware' => 'datalogger')); $this->hardware = 'dl'; ListenerProcess::addComment($this->listener->listener_id, 'hardware_recognizing', 'Hardware connected to PC via Serial port - is Datalogger'); $this->_logger->log(__METHOD__, array('hardware' => $this->hardware)); return true; } } } catch (Exception $e) { $this->_logger->log(__METHOD__, array('ExceptionMessage' => $e->getMessage())); } $this->_logger->log(__METHOD__, array('hardware' => 'unknown')); $this->hardware = 'unknown'; ListenerProcess::addComment($this->listener->listener_id, 'hardware_recognizing', 'No device found.'); $this->_logger->log(__METHOD__, array('hardware' => $this->hardware)); return false; } }
/** * Execute the console command. * * @return mixed */ public function fire() { while (true) { $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($this->argument('device')); // 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"); $serial->deviceOpen(); $read = ''; $theResult = ''; $start = microtime(true); while ($read == '' && microtime(true) <= $start + 0.5) { $read = $serial->readPort(); if ($read != '') { $theResult .= $read; $read = ''; } } $theResult = trim($theResult); if (!$theResult) { continue; } echo $theResult . "\n"; $line = explode("\n", $theResult); foreach ($line as $l) { $l = trim($l); $watt_array = explode(" ", $l); $unitId = 1; if ($watt_array[0] == "watt" && isset($watt_array[1]) && $watt_array[1] != false) { Watts::addWatt($unitId, $watt_array[1]); //funtion sa models/Watts.php Units::lessCredit($unitId, $watt_array[1]); } } $unitId = 1; if (Units::hasCredit($unitId)) { $serial->sendMessage("on"); } else { $serial->sendMessage("off"); } $serial->deviceClose(); } }
/** * Opens COM port and test it on specific device. * * @return boolean True if device is found, false - otherwise. */ public function check() { $this->_logger->log(__METHOD__); $result = false; set_error_handler(array($this, 'errorHandler')); try { if ($this->_serial->deviceSet($this->_port) === true) { if (!is_null($this->_baudrate)) { $this->_serial->confBaudRate($this->_baudrate); } if (!is_null($this->_flowControl)) { $this->_serial->confFlowControl($this->_flowControl); } if (!is_null($this->_parity)) { $this->_serial->confParity($this->_parity); } if (!is_null($this->_stopBits)) { $this->_serial->confStopBits($this->_stopBits); } if (!is_null($this->_dataBits)) { $this->_serial->confCharacterLength($this->_dataBits); } if ($this->_serial->deviceOpen('r+b') === true) { $result = $this->checkCustomData(); $this->_serial->deviceClose(); } else { $this->_errors[] = 'Can\'t open port "' . $this->_port . '".'; } } else { $this->_errors[] = 'Can\'t set port "' . $this->_port . '".'; } } catch (Exception $ex) { if ($this->_serial->_dState === PhpSerial::SERIAL_DEVICE_OPENED) { $this->_serial->deviceClose(); } $this->_errors[] = $ex->getMessage(); } restore_error_handler(); $this->returnResult(__METHOD__, $result); return $result && count($this->_errors) === 0; }
/** * */ public function send() { $this->_logger->log(__METHOD__, array('phone' => $this->_phoneNumber, 'message' => $this->_messageText)); $this->_errors = array(); set_error_handler(array($this, 'errorHandler')); try { if ($this->_serial->deviceSet($this->_serialPort) === true) { $this->_serial->confBaudRate($this->_serialPortParams['baudrate']); $this->_serial->confStopBits($this->_serialPortParams['stopbits']); $this->_serial->confParity($this->_serialPortParams['parity']); $this->_serial->confCharacterLength($this->_serialPortParams['databits']); $this->_serial->confFlowControl($this->_serialPortParams['hardwareflowcontrol']); if ($this->_serial->deviceOpen('r+b') === true) { if ($this->sendSmsMessage()) { $this->_logger->log(__METHOD__ . ' SMS message was sent', array('phone_number' => $this->_phoneNumber, 'serial_port' => $this->_serialPort, 'message' => $this->_messageText)); ListenerProcess::addComment($this->_listener->listener_id, 'sms_command', 'SMS message was sent to: "' . $this->_phoneNumber . '" using: ' . $this->_serialPort); } else { $this->_logger->log(__METHOD__ . ' Failed to send SMS message', array('phone_number' => $this->_phoneNumber, 'serial_port' => $this->_serialPort, 'message' => $this->_messageText)); ListenerProcess::addComment($this->_listener->listener_id, 'sms_command', 'Failed to send SMS message to: "' . $this->_phoneNumber . '" using: ' . $this->_serialPort); $this->_errors[] = 'SMS message was not sent.'; } $this->_serial->deviceClose(); } else { $this->_errors[] = 'Can\'t open port "' . $this->_serialPort . '".'; } } else { $this->_errors[] = 'Can\'t set port "' . $this->_serialPort . '".'; } } catch (Exception $ex) { if ($this->_serial->_dState === PhpSerial::SERIAL_DEVICE_OPENED) { $this->_serial->deviceClose(); } $this->_errors[] = $ex->getMessage(); } restore_error_handler(); return count($this->_errors) === 0; }
<?php include 'PhpSerial.php'; // Let's start the class $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("COM1"); // We can change the baud rate, parity, length, stop bits, flow control $serial->confBaudRate(2400); $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("Hello !"); // Or to read from $read = $serial->readPort(); // If you want to change the configuration, the device must be closed $serial->deviceClose(); // We can change the baud rate $serial->confBaudRate(2400); // etc... // // /* Notes from Jim : > Also, one last thing that would be good to document, maybe in example.php: > The actual device to be opened caused me a lot of confusion, I was > attempting to open a tty.* device on my system and was having no luck at
/** * * @param int $timeout Not used here * @return boolean True on success, false - otherwise. */ public function connect($timeout = 0) { $this->_logger->log(__METHOD__, array('port' => $this->_port)); set_error_handler(array($this, 'errorHandler')); try { if ($this->_serial->deviceSet($this->_port) === true) { $this->_serial->confFlowControl($this->_portParams['hardwareflowcontrol']); $this->_serial->confBaudRate($this->_portParams['baudrate']); $this->_serial->confParity($this->_portParams['parity']); $this->_serial->confStopBits($this->_portParams['stopbits']); $this->_serial->confCharacterLength($this->_portParams['databits']); if ($this->_serial->deviceOpen('w+b') === true) { return true; } else { $this->_errors[] = 'Can\'t open port "' . $this->_port . '".'; } } else { $this->_errors[] = 'Can\'t set port "' . $this->_port . '".'; } } catch (Exception $ex) { $this->_errors[] = $ex->getMessage(); } restore_error_handler(); }
public function test_AtAndCpinCommands() { $connector = new PhpSerial(); $connector->deviceSet('COM1'); $connector->confBaudRate(9600); $connector->confParity('none'); $connector->confFlowControl('rts/cts'); $connector->confCharacterLength(8); $connector->confStopBits(1); $connector->deviceOpen('r+b'); stream_set_timeout($connector->_dHandle, 2); $connector->sendMessage("AT+CPIN?\r\n"); $result = $connector->readPort(); $connector->deviceClose(); $result = explode("\r\n", $result); $this->assertEquals(4, count($result)); $this->assertEquals('AT+CPIN?', $result[0]); $this->assertEmpty($result[1]); $this->assertEquals('+CPIN: READY', $result[2]); $this->assertEmpty($result[3]); }
protected function _transmit($message, $fetch_answer = false) { $this->last_message = $message; $this->last_raw_message = $this->_buildRawMessage($this->last_message); $this->last_answer = ''; $this->last_raw_answer = ''; // start the serial connection $serial = $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($this->serial_port); // We can change the baud rate, parity, length, stop bits, flow control // http://forum.mysensors.org/topic/340/pidome-domotica-home-automation $serial->confBaudRate(115000); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->confFlowControl("none"); // ? // Then we need to open it $serial->deviceOpen(); // we may have to sleep before arduino restart ? // http://stackoverflow.com/questions/13114275/php-serial-port-data-return-from-arduino //sleep($this->arduino_boot_time); // We may need to return if nothing happens for $timeout seconds if ($fetch_answer) { $timeout = $this->socket_timeout_answer; } else { $timeout = $this->socket_timeout_message; } stream_set_timeout($serial->_dHandle, $timeout); // send message $serial->sendMessage($this->last_raw_message . "\n"); if ($fetch_answer) { $line = ''; $until_t = time() + $timeout; while (true) { if (!$serial->_dHandle or time() > $until_t) { break; } $line = $serial->readPort(); if ($this->last_answer = $this->_filterAnswer($line)) { $this->last_raw_answer = trim($line); $out = $this->last_answer['payload']; break; } } } else { $out = true; } $serial->deviceClose(); return $out; }