- Carica Io - Non-Blocking I/O for PHP
- Carica Firmata - An implementation of the Firmata protocol
- Carica Chip - PHP classes representing hardware devices
First Step: Project Initialization
Carica Chip uses Composer. Make sure that it is installed and open a console. Go into your projects directory and execute the following line (it will create a new subdirectory "led"):
composer create-project carica/chip-skeleton led \ --stability=dev
Second Step: Create An HTML Interface
For the interface a simple html file is used. Just two links with an iframe set as the target. This is a basic version, some Javascript and CSS should be used to make it nicer and more usable.<html>
<head>
<title>Led Switch</title>
</head>
<body>
<a href="./switch/on" target="iframe">
On
</a>
<a href="./switch/off" target="iframe">
Off
</a>
<iframe name="iframe" src="about:blank"></iframe>
</body>
</html>
Store the html source as "index.html" in the project root.
Third Step: Create The PHP Server
This will be a step by step description, the complete file is below and on Gist.The skeleton includes a bootstrap file that returns a board depending on your configuration. Copy "dist.configuration.php" to "configuration.php" and change it if needed.
Now open "server.php". At the top "bootstrap.php" is included to fetch a Firmata board. If the board is activated, it executes a callback. Carica Chip provides a "Led" class. For the example an instance is created. The constructor needs the pin the led is connected to. Most Arduinos have a led that is connected to pin #13 on board.
$led = new Chip\Led($board->pins[13]);
We need to deliver the html interface to the browser. Carica Io includes a http server and file routings. Add "use Carica\Io\Network\Http as Http;" to the namespace definition, create a new route and add a file delivery for "index.html".
$route = new Http\Route(); // Define html file delivery for / $route->match( '/', new Http\Route\File(__DIR__.'/index.html') );
A second route defines the switch actions. This is specific and not much source, so an anonymous function is used. For more extensive logic I suggest functors, objects that implement the magic method "__invoke()", like the file handler. The state parameter is fetched from the path. Depending on the parameter the led is switched on or off. A response is created and a string with the new state is used as content. If you don't return a response, a 404 would be send to the browser.
$route->match(
'/switch/{state}',
function (Http\Request $request, array $parameters)
use ($led) {
$ledOn = ($parameters['state'] == 'on');
if ($ledOn) {
$led->on();
} else {
$led->off();
}
$response = $request->createResponse(
new Http\Response\Content\String(
$ledOn ? 'ON' : 'OFF',
'text/plain; charset=utf-8'
)
);
return $response;
}
);
Last the http server is created and started.
$server = new Carica\Io\Network\Http\Server($route); $server->listen(8080);
Finished!
That's all. You can now start the script on the command line and open the URL in a browser. Clicking the links will (de)activate the led.
I posted the full source of "server.php" including comments on Gist.
No comments:
Post a Comment