https://d226lax1qjow5r.cloudfront.net/blog/blogposts/building-a-queue-for-the-emf-roamer-with-the-vonage-sms-api-and-php/building-queue_roamer.png

Vonage SMS APIとPHPでEMF Roamerのキューを構築する

最終更新日 October 6, 2022

所要時間:2 分

もしご存知なければ 電磁場(EMF)キャンプ光ファイバーインターネット、無線マスト、ロボットバーテンダー、空を照らすレーザー、見渡す限りのワイルドで奇抜な発明品......。

このような奇抜な発明のひとつがEMF Roamerで、1/4スケールの木製テスラ・サイバートラックで、インターネットを通じて誰でもコントロールできるように、横を歩き回るように配置されている!

The Roamer, photographed at dusk with RGB underglow lighting.The Roamer, photographed at dusk with RGB underglow lighting.

画像クレジット ヴィックハークネス.

ただ、見通しで運転できるようにするだけでは十分ではなかった!特にモノのインターネットの世界では。カメラからのライブ・ビデオと地図上の位置は、ユーザーがローマーを操作している間にストリーミングされる。

自由なコントロールは混乱を招くので、私たちはキュー・システムを考案した。人々はウェブブラウザでキューに入り、順番を待ったり、携帯電話番号を伝えて順番が来たらSMSを受け取ったりすることができる(Vonageに感謝!)。このキュー・システムは「サーバーレス」であり、専用サーバーを必要としない。PHPがオンデマンドでキューを調整し、MySQLデータベースに保存される。

私たちが作っているもの

この記事では、必要なライブラリとデータベースのセットアップ方法を説明し、EMF Roamerを駆動するために使用されるような簡単なキューの例を作成します。ユーザーが電話番号を入力し、キューに入った後にページを閉じると、順番が来たときにVonageを使ってSMSが送られます。システムはPHPとMySQLのバックエンドで書かれており、共有ホスティングで動作するように設計されている。すでにウェブホストを持っていない場合は、次のようなソフトウェアを使って自分のコンピュータでフォローすることができる。 WAMP.

Flowchart illustrating the queueing process (Start > Wait until at the front > Control until time is up > LeaveFlowchart illustrating the queueing process (Start > Wait until at the front > Control until time is up > Leave

インストール

SMS配信をフル活用するには Vonageデベロッパーアカウント.今すぐサインアップして、無料クレジットを使ってこのチュートリアルに従ってください。APIキー/シークレットは Vonage API ダッシュボード.

をクローンする必要があります。 PHPウェブユーザキューをクローンする必要があります。

また、Vonage PHP クライアントライブラリをインストールする必要があります。これは コンポーザー.

composer require vonage/client

初めてComposerをお使いになる方は、Composerの 入門ページが役に立つだろう。

PHP Web User Queue ライブラリをプロジェクトにインストールするには、 PHPWebUserQueue をサーバーにコピーし、名前を settings.template.phpにリネームします。 settings.phpにリネームし、それを編集します:

$selfdrive = TRUE; //Allow user page requests to self drive the worker in order to keep things running faster
$timeout =3*60; //Time in seconds, how long a session lasts
$noshowtimeout = 2*60; //Time in seconds their place at the front of the queue will be held
$sqlserver = "localhost";
$sql_db = "queuetest";
$sql_user = "queuetest";
$sql_pass = "abab";
$vonagekey = "abab";
$vonagesecret = "abab";
$composerpath = __DIR__ . "/../vendor/autoload.php";
$sitepath = "https://your.site";

MySQLサーバーを使用して、デフォルト設定で空のデータベースを作成し、以下の権限を持つユーザーを関連付ける:

Minimum required MySQL permissions are SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX.Minimum required MySQL permissions are SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX.

その後、セットアップスクリプトを実行して必要なテーブルを作成する:

http://[your site]/PHPWebUserQueue/setup.php

MySQL を初めて使用する場合は、ホスティングプロバイダのドキュメントを確認するか、次のようなツールを使用してください。 phpMyAdmin.

ワーカースクリプトを cron ジョブとして定期的に実行するようにサーバーを設定することをお勧めします。これにより、たとえすべてのユーザーがページを閉じたとしても、テキストメッセージは送信され続けます。あなたのウェブホストがこれをサポートしていなくても、心配はいりません。また、Web User Queueライブラリを呼び出すページにアクセスするたびに、キューは "自己駆動 "します。wp-cron "から拝借したテクニックで、WordPressがタスクを処理する方法です。あなたのサイトが特にトラフィックが多い場合、サーバークーロンだけを実行し、各ページ実行時のオーバーヘッドを取り除きたいかもしれません。これは $selfdriveフラグ FALSE.

スクリプトが cronworker.phpスクリプトが実行可能であることを確認する:

chmod +x PHPWebUserQueue/cronworker.php

crontab を使って毎分 Worker を実行する実装例:

* * * * * /path/to/site/PHPWebUserQueue/cronworker.php

cronを初めて使用する場合は、ホスティングプロバイダのドキュメントを確認するか、以下のようなツールを使用してください。 cron-job.org.

例を作る

これから簡単なキューの例を作ります。あなたはキューに入り、自分の順番を待ちます。 index.phpで順番を待ち、最後に control.phpに到達します。以下のチュートリアルに沿ってゼロから始めるか、GitHub の "Example" フォルダにある完全なサンプルにアクセスしてください。 GitHub の "Example" フォルダにある完全なサンプルにアクセスしてください。.

ジョイニングとキューイング

ファイルを作成し index.phpライブラリファイルをインクルードし、最初のキューを作成する:

<?php
include '../PHPWebUserQueue/WebUserQueue.php';
$q = new WebUserQueue();

私たちのキューでは、SMSからのリンクをたどってポジションを再開することもできる:

if (isset($_GET["i"]) and isset($_GET["s"]))
{
    $_SESSION["i"] = $_GET["i"];
    $_SESSION["s"] = $_GET["s"];
}

ユーザーがすでにセッションを持っているかどうか、あるいはキューに参加するためにフォームを送信したかどうかをチェックします。もしそうでなければ、フォームを表示します:

if (!isset($_SESSION["i"])){ 
	//User is not already in the queue.
	if(!isset($_POST['name'])){
		//User has not posted the form, so show them the form.
		echo "<form method=\"post\"><input type=\"text\" name=\"name\" placeholder=\"Name\"> (optional)<br />";
		echo "<input type=\"text\" name=\"phone\" placeholder=\"Phone # e.g. 07712345678\"> (optional)<br />";
		echo "We can send you an SMS when it's your turn.<br /><button>Put me in the queue</button></form>";
	}

The form before joining the queue.The form before joining the queue.ユーザーがフォームを投稿した場合、そのユーザーをキューに追加します:

	else{
		//user has posted the form, add them to the queue.
		if($q->join($_POST["name"],$_POST["phone"])){
			echo "<head><meta http-equiv=\"refresh\" content=\"2\" ></head>";
            echo "Welcome to the queue, your ID is: " . $_SESSION["i"] . " <br />";
		}
	}
}

もしユーザーがセッションを持っていて、キューに入っていれば、その詳細をチェックし、どのくらい待てばいいかを知らせます。順番が来たら、コントロールページに送ります:

else{//User is in the queue
	if($q->checkValid($_SESSION["i"],$_SESSION["s"])) { //Their session matches the database
		if(isset($_GET["end"])){ //Request to end their session
			if($q->kick($_SESSION["i"],$_SESSION["s"])){
        		echo "Thank you for queueing.<br /><a href='index.php'>Click here to enter the queue again</a>";
    		}
		}
		else{
	        list($queuePos,$waitTime) = $q->checkWait($_SESSION["i"],$_SESSION["s"]);
	        if ($queuePos == 0){ //It's their turn
	            header("Location: control.php");
	        }
	        else{ //They're waiting
	            echo "<head><meta http-equiv=\"refresh\" content=\"5\" ></head>";
	            echo "There are " . $queuePos . " people in front of you. This will take about ". $waitTime . "  seconds.<br />";
	        }
    	}
	} else { //Session is not valid
	    echo "Your session has expired. Please refresh the page to queue again!";
	    unset($_SESSION['i']);
	    unset($_SESSION['s']);
	}
}
?>

Waiting in the queueWaiting in the queue

前線に到達

ファイルを作成する。 control.phpファイルを作成し、ライブラリ・ファイルとキューを含める:

<?php
include '../PHPWebUserQueue/WebUserQueue.php';
$q = new WebUserQueue();

ユーザーのセッションが有効であり、ユーザーの番であることを確認する:

//User already has a session. Check it's not already used, all their details are valid, and they are first in the queue.
if (isset($_SESSION["i"]))
{
    if($q->checkFirst($_SESSION["i"],$_SESSION["s"])){

    } else {
        echo "<a href='index.php'>Your session is not valid or has expired. Please click here to join the queue</a>";
        die();
    }
} else {
    header("Location: index.php");
    echo "<a href='index.php'>Your session is not valid. Please go back to the home page</a>";
    die();
}
?>

そして、彼らに良い知らせを伝えよう!

<html>
  <head>
    <title>Front of queue</title>
    <script>
      var secondsleft = <?php echo $q->checkRemaining($_SESSION["i"],$_SESSION["s"]);?>;
      var countdowncaller = setInterval(function(){countdown()}, 1000);//Update the countdown every second.
      function countdown() {
            secondsleft = secondsleft - 1;
            document.getElementById('timeleft').innerHTML = secondsleft + " seconds remaining.";
            if (secondsleft < 10) {
              document.body.style.backgroundColor = "red";//warn them
            }
            if (secondsleft <= 0) {
              window.location.replace("index.php?end");//kick them
            }
          }
    </script>
  </head>
  <body>
    You are at the front of the queue! <br />
    <div id="timeleft">Loading...</div>
    <button onclick="window.location.href='index.php?end'">End session</button>
  </body>
</html>

At the front of the queueAt the front of the queue

次のステップ

初めてのオンラインキューの設定、おめでとうございます。これで、あなた自身のインターネット制御ロボットを構築する準備が整ったことになる(電子工作も少し必要だが)!このコンセプトは、複数のユーザーが同時にさまざまなコマンドを送信するフリーフォーオールではなく、一度に一人のユーザーによって操作されることに適したさまざまなアプリケーションに適用できるだろう。参照 Twitchがポケモンをプレイを参照のこと!

キューを管理するための管理ツールを使ってこの例をさらに発展させたい場合は、GitHubの GitHub リポジトリ.

The queue bouncer (queue admin tool)The queue bouncer (queue admin tool)

2024年のEMFキャンプでEMF Roamerに再会できることを願っています!

有用なリソース

シェア:

https://a.storyblok.com/f/270183/400x300/58ce070338/chris-stubbs.png
Chris Stubbs

Chris is an engineer with an interest in DIY, electronics, embedded software and web applications. He lives in England, enjoys building wacky creations and attending hacker camps.