モノのインターネット(IoT)プロジェクトでは、サーバーは通常、デバイスによってアップロードされたデータをリアルタイムで受信する必要があります。これらのデバイスは、TCP接続を使用して、センサーデータ、ステータス情報などをサーバーに送信する場合があります。 PHPは、従来の意味でのネットワークプログラミングに適した言語ではありませんが、組み込みのソケット拡張機能を介してこのタスクにも能力がある可能性があります。この記事では、socket_accept()関数を使用してIoTデバイスからデータを受信し、基本的な処理を実行する方法を紹介します。
まず、PHP環境にソケットの拡張機能が有効になっていることを確認してください。 phpinfo() ;を実行することで有効になっているかどうかを確認できます。
基本的なTCPソケットサーバーを作成する手順は次のとおりです。
<?php
// サーバーアドレスとポートの設定
$host = '0.0.0.0';
$port = 8888;
// 作成する socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
die("无法作成する socket:" . socket_strerror(socket_last_error()));
}
// バインド socket 到着 IP およびポート
if (!socket_bind($socket, $host, $port)) {
die("バインド失敗:" . socket_strerror(socket_last_error($socket)));
}
// 接続を聞き始めます
if (!socket_listen($socket)) {
die("リスニングが失敗しました:" . socket_strerror(socket_last_error($socket)));
}
echo "サーバーが開始されました,デバイスが接続するのを待ちます...\n";
socket_accept()を使用して接続を受信します。この関数は、デバイス接続が発生するまでブロックされます。
while (true) {
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
echo "socket_accept 失敗:" . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
echo "デバイスが接続されています。\n";
// デバイスから送信されたデータを読み取ります
$input = socket_read($clientSocket, 1024);
if ($input === false) {
echo "读取失敗:" . socket_strerror(socket_last_error($clientSocket)) . "\n";
} else {
echo "接收到着数据:$input\n";
// データがあると仮定します JSON 形式,デコードを実行します
$data = json_decode(trim($input), true);
if (json_last_error() === JSON_ERROR_NONE) {
// 例:温度センサーデータの処理
if (isset($data['device_id'], $data['temperature'])) {
$deviceId = $data['device_id'];
$temperature = $data['temperature'];
// 假设保存到着数据库或执行其他处理逻辑
echo "装置 $deviceId 温度をアップロードします:$temperature °C\n";
// 処理結果を返します
$response = json_encode(['status' => 'ok']);
socket_write($clientSocket, $response);
} else {
echo "收到着非法数据。\n";
}
} else {
echo "JSON 解码失敗。\n";
}
}
// 現在の接続を閉じます
socket_close($clientSocket);
}
socket_close($socket);
IoTデバイスは、JSON形式でTCP接続とアップロードデータを確立する必要のみです。例えば:
{
"device_id": "sensor_001",
"temperature": 25.6
}
データは、TCPクライアント(ESP8266、Pythonソケット、さらにはCurlのArduinoプログラムなど)を介してサーバーのM66.net:8888アドレスに送信できます。
セキュリティ:暗号化(TLSなど)を使用して、生産環境でデータを送信することをお勧めします。
並行性処理: PCNTL_FORK()を使用して、複数の接続を処理する子プロセスを作成することを検討してください。
データの持続性:デバイスデータは、MySQL、Redis、またはログファイルに書き込むことができます。
PHPはソケットプログラミング用に設計されていませんが、開発者はsocket_accept()などの組み込み関数を備えたシンプルで実用的なIoTデータ受信サーバーを迅速に構築できます。小規模なデバイス通信およびテスト環境では、PHPを使用することは完全に実行可能です。この記事が、Socket_accept()をよりよく理解し、IoTデータを処理するのに役立つことを願っています。