當前位置: 首頁> 最新文章列表> 使用socket_accept() 接收IoT 設備的數據上傳

使用socket_accept() 接收IoT 設備的數據上傳

M66 2025-05-29

在物聯網(IoT)項目中,服務端通常需要實時接收設備上傳的數據。這些設備可能會使用TCP 連接將傳感器數據、狀態信息等發送到服務器。 PHP 雖然並不是傳統意義上的網絡編程首選語言,但通過其內置的socket 擴展,也可以勝任這一任務。本文將介紹如何使用socket_accept()函數來接收IoT 設備的數據,並進行基本的處理。

一、準備工作

首先,請確保您的PHP 環境已經啟用了sockets擴展。可以通過運行phpinfo();來確認是否已啟用。

二、創建服務器端Socket

以下是創建一個基礎的TCP socket 服務器的步驟:

 <?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(服務停止時)

 socket_close($socket);

五、IoT 設備端示例

IoT 設備端只需建立TCP 連接並上傳JSON 格式的數據。例如:

 {
  "device_id": "sensor_001",
  "temperature": 25.6
}

數據可通過TCP 客戶端(如ESP8266 的Arduino 程序、Python socket、甚至curl)發送至服務器的m66.net:8888地址。

六、安全性與擴展

  • 安全性:生產環境建議使用加密(如TLS)傳輸數據。

  • 並發處理:考慮使用pcntl_fork()創建子進程處理多個連接。

  • 數據持久化:可將設備數據寫入MySQL、Redis 或日誌文件中。

結語

儘管PHP 並非專為socket 編程設計,但通過內置函數如socket_accept() ,開發者仍能快速搭建一個簡單而實用的IoT 數據接收服務器。在小規模設備通信和測試環境中,使用PHP 完全是可行的。希望這篇文章能幫助你更好地理解並應用socket_accept()來處理IoT 數據。