Serial port support for ReactPHP
Note
Only Linux is supported for now. Feel free to contribute support for additional platforms.
Installing
$ composer require noccylabs/react-serial:@dev
Using
The SerialFactory
is really a SerialStreamFactory. Its open()
method returns a promise
that will resolve with a duplex stream for the port.
$serial = new SerialFactory();
$serial->open("/dev/ttyUSB0", 115200)
->then(function (DuplexStreamInterface $stream) { ... });
You may find that you need line buffering, in which case you should wrap the stream in a
LineBufferedDuplexStream
. The wrapped stream will emit the same data
and close
events
as the original stream, but it will also emit a line
event once a full line has been
received. If you give it a $promptPattern
in the constructor it will also emit a prompt
event whenever a matching prompt is detected, and with $bufferOutput
you will also get
an output
event with all the line
s emitted since the last prompt
.
// Wrap our stream and use '#> ' as the prompt pattern.
$shell = new LineBufferedDuplexStream($stream, promptPattern: '/\#\> /', bufferOutput:true);
// Prepare the commands to execute, in order. These are the commands you would use
// on an OpenWRT router to configure the WiFi password for the "main" WiFi interface.
$commands = [
'uci set wireless.main.key="pennyisafreeloader"',
'uci commit wireless',
'wifi restart',
];
// Execute the next command once we get a prompt
$shell->on("prompt", function () use ($shell, &$commands) {
$command = array_shift($commands);
if (!$command) {
// Closing the wrapper closes the stream
$shell->close();
return;
}
echo $command."\n";
$shell->write($command."\n");
});
// Receives all the output lines from the last command.
$shell->on("output", function(array $lines) {
echo " ".join("\n ",$lines)."\n";
});
// write "echo" to the shell on our fictive device to get a fresh prompt
$shell->write("echo\n");
Languages
PHP
100%