websocket h5控制 pc 大屏 進行協同操作


接到產品需求單 ,哎說多都是累 這幾天接口寫個沒停🤚 今天搗鼓一下這個需求

需求簡要說明:客戶找我們做的pc端可視化大屏 需要掃碼 到 h5端移動端控制pc端大屏 移動端當然也是一個網頁 一對一操控 分n個大屏 於是我快速梳理了一下需求 將結果完成之后做一個小小的總結:上圖

在這里插入圖片描述

整個流程用到的技術 前端 、websocket、redis 、workerman(原因使用方便 不限環境)

項目是前后端分離的 將邏輯梳理清楚后 工作量也就不大了 前后端對半開

下載 workerman 官網文檔
//composer 安裝
composer require workerman/workerman
編寫推送的websocket文件
<?php
/**
 * Created by PhpStorm
 * User: pl
 * Date: 2020/9/2
 * Time: 10:46
 */
use Workerman\Worker;

require_once './Autoloader.php';

$worker = new Worker("websocket://0.0.0.0:2345");

//開啟的worker進程
$worker->count = 4;

//前端連接發送的消息數據
$worker->onMessage = function ($connection,$data){
    $redis = new \Redis();
    $redis->connect('127.0.0.1','6379');
    $redis->select(2);
    //前端發送過來的唯一值 綁定連接的id
    $redis->set($connection->id,$data);
    $connection->send('已連接服務');
};

$worker->onWorkerStart = function ($ws_worker) {

    \Workerman\Timer::add(1,function () use($ws_worker){
        foreach($ws_worker->connections as $connection) {

            $redis = new \Redis();
            $queue = "nan_ling_";
            $redis->connect('127.0.0.1','6379');
            $redis->select(2);
            //獲取消費的隊列
            $rpop_list = $redis->get($connection->id);
            //消費路由數據
            if(!$rpop_list){

            }else{
                $queue = $queue.$rpop_list;
                $value = $redis->rPop($queue);
                if(!is_null($value)){
                     //推送給前端
                    $connection->send($value);
                }
            }
        }
    });
};

//監聽斷開連接
$worker->onClose = function ($connection){
    $redis = new \Redis();
    $redis->connect('127.0.0.1','6379');
    $redis->auth('');
    $redis->select(2);
    // 刪除連接的唯一值
    $redis->del($connection->id);
    echo "connection closed\n".$connection->id;
};

Worker::runAll();

二、h5更新路由接口
/**
 * 將用戶信息寫入隊列
 * @param Request $request
 * @throws \think\Exception
 */

public function updateRoute(Request $request)
{
    $db = new Redis();
     //掃碼獲取的唯一值
    $client_sn = $request->header("issue");

    if(!$client_sn) {
        return $this->error([],'請重新掃碼',500);
    }
    $data = $request->put();
  
    //組裝隊列名
    $queue = self::$table.$client_sn;
    //將點擊的路由放入隊列
    $db->redis->rPush($queue,json_encode($data,JSON_UNESCAPED_UNICODE));

    return $this->success([]);

}

執行文件
php h5_remote.php start

在這里插入圖片描述

測試一下結果 完成這兩個接口 其他的由前端去折騰吧~~

在這里插入圖片描述

在這里插入圖片描述

小伙伴們其他好點想法可以底下留言喲~~~☺️☺️☺️


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM