準備
xampp を使ったロカールサーバーでのテストです。ディレクトリ構造は以下の通りで、『server.php』でサーバーを起動し『EspServer.php』と『EspMonitor.html』との間で通信をさせます
プロジェクトフォルダ
├ composer.json // ライブラリ管理ファイル
├ composer.lock // ライブラリ管理ファイル
└ vendor/ // ライブラリ本体
| └ autoload.php
├ bin/
| └ server.php // サーバープログラム(起動)
└ src/
├ EspServer.php // サーバープログラム(本体)
├ EspMonitor.html // サーバーモニタプログラム
『composer.json』にオートロードの設定をして、コマンドプロンプトから『c:\・・・> composer dump-autoload』を入力し autoload を反映させておきます。Composerのオートロードを参照してください
***************** composer.json *****************
{
"autoload": {
"psr-4": {
"EspApp\\": "src"
}
},
"require": {
"cboden/ratchet": "^0.4.4"
}
}
『server.php』は以下の通り
プロジェクトフォルダでコマンドプロンプトに『c:\・・・> php bin\server.php』と入力して起動します
<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use EspApp\EspServer;
require dirname ( __DIR__ ) . '/vendor/autoload.php';
$server = IoServer::factory ( new HttpServer( new WsServer( new EspServer() ) ), 8080 );
$server->run ();
『EspServer.php』は以下の通り
『onOpen』『onClose』『onError』『onMessage』のイベントを実装し、『onMessage』のみ『rcvMessage』関数を呼んで、受信データをコンソールに表示し、送信元『EspMonitor.html』へデータを返信する単純なプログラムです
<?php
namespace EspApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class EspServer implements MessageComponentInterface
{
public function __construct()
{
}
/*************************/
/* WebSocketオープン */
/*************************/
// $wsInterface Websocket接続オブジェクト
public function onOpen( ConnectionInterface $wsInterface )
{
}
/*************************/
/* WebSocketクローズ */
/*************************/
// $wsInterface Websocket接続オブジェクト
public function onClose( ConnectionInterface $wsInterface )
{
echo "Closed\n";
}
/*************************/
/* WebSocketエラー */
/*************************/
// $wsInterface Websocket接続オブジェクト
// $e イベント
public function onError( ConnectionInterface $wsInterface, \Exception $e )
{
echo 'An error has occurred: {$e->getMessage()}\n';
$wsInterface->close();
}
/*************************/
/* WebSocket受信 */
/*************************/
// $wsInterface Websocket接続オブジェクト
// $message 受信メッセージ
public function onMessage( ConnectionInterface $wsInterface, $message )
{
rcvMessage( $wsInterface, $message );
}
}
/*************************/
/* メッセージ受信 */
/*************************/
// $wsInterface Websocket接続オブジェクト
// $message 受信メッセージ
function rcvMessage( ConnectionInterface $wsInterface, $message )
{
echo $message . "\n"; // 受信データを表示
$wsInterface->send( $message . "_response" ); // 送信元へデータを返す
}
?>
『EspMonitor.html』は以下の通り
『onOpen』『onClose』『onError』『onMessage』のイベントを実装し、『onMessage』で受信データをコンソール出力します。『テスト送信』ボタンをクリックすると “Test” の文字列を『EspServer.php』へ送信します
なので、『テスト送信』ボタンで ”Test” が『EspServer.php』に送信され、『EspServer.php』から ”Test_Response” 文字列が返送されることになります
<!DOCTYPE HTML>
<html lang=ja>
<head>
<meta charset=UTF-8 name="viewport" content="width=device-width, initial-scale=1">
<title>Esp32モニタ</title>
<link rel="icon" href="data:,">
<style>
.cmd-menu
{
text-align: center;
background-color: #E1F0B4;
font-weight: bold;
font-size: 15px;
}
.cmd-btn
{
width: 100%;
margin-bottom: 2px;
}
</style>
</head>
<body>
<div class="connect-box">
<header class="cmd-menu"><h3>テスト</h3></header>
<input type="button" class="cmd-btn" id="Id_Test" value="テスト送信" onmouseup="mouseUp(this.id)">
</div>
<script>
var gGateway = '192.168.2.109'; // サーバIPアドレス
var gWebsocket = null; // Wgbsocket本体
window.addEventListener( 'load', onLoad );
/*************************/
/* ロード完了イベント */
/*************************/
function onLoad()
{
initWebSocket(); // WebSocket初期化
}
/*************************/
/* WebSocket初期化 */
/*************************/
function initWebSocket()
{
gWebsocket = new WebSocket( 'ws:' + gGateway + ':8080' );
gWebsocket.onopen = onOpen;
gWebsocket.onclose = onClose;
gWebsocket.onerror = onError;
gWebsocket.onmessage = onMessage;
}
/*************************/
/* WebSocketオープン */
/*************************/
function onOpen( event )
{
gWebsocket.send( "Opened" ); // オープン通知
}
/*************************/
/* WebSocketクローズ */
/*************************/
function onClose( event )
{
setTimeout( initWebSocket, 2000 ); // 2秒間隔で再接続を試行
}
/*************************/
/* WebSocketエラー */
/*************************/
function onError( event )
{
}
/*************************/
/* WebSocket受信 */
/*************************/
function onMessage( event )
{
console.log( event.data );
}
/*************************/
/* マウスアップ */
/*************************/
function mouseUp( id )
{
if (id === "Id_Test")
{
gWebsocket.send( "Test" ); // テスト通知
}
}
</script>
</body>
</html>
実行結果
『server.php』を起動すると、私の場合『Xdebug・・・』を表示してますが、VSCODEでPHPのデバッグツールを設定しているために表示されてしまっています(気にしないでください)
『EspMonitor.html』を立ち上げた時に ”Opened” が表示され、『テスト送信』ボタンをクリックした時に ”Test” が表示されます
『EspMonitor.html』を立ち上げて、開発者用のデバッグツールを立ち上げた画面です。『EspServer.php』から返信されたデータをコンソールに出力しています