成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于Web實現(xiàn)遠程與硬件交互

chadLi / 2656人閱讀

摘要:功能實現(xiàn)服務(wù)器,服務(wù)器使用相對成熟的實現(xiàn)。被廣泛的用于手機移動通訊,微信小程序,手游服務(wù)端網(wǎng)絡(luò)游戲聊天室硬件通訊智能家居車聯(lián)網(wǎng)物聯(lián)網(wǎng)等領(lǐng)域的開發(fā)。支持長連接,支持等協(xié)議,支持自定義協(xié)議。擁有異步異步異步異步消息隊列等眾多高性能組件。

基于Web實現(xiàn)遠程與硬件交互 項目背景:

最近在做一個類似“速遞柜”的項目,項目需求大概如下:
1.用戶使用微信掃描二維碼
2.后臺匹配相關(guān)數(shù)據(jù),并存儲用戶信息,最終返回給用戶當前柜子當前狀態(tài)
3.用戶選擇“開柜”指令,進行存取物品

需求分析

1.實現(xiàn)跟硬件進行數(shù)據(jù)交互,使用TCP/IP 長連接,意味著,我們要有一個TCP服務(wù)器,TCP服務(wù)器一方面接受用戶發(fā)過來的相關(guān)請求指令,另一方面完成發(fā)送指令給指定硬件這一操作。
2.除了TCP 服務(wù)器我們還需要一個 Websocket 服務(wù)器,也有兩個功能,一方面接受客戶端發(fā)送的指令,另一方面處理轉(zhuǎn)發(fā)用戶指令給TCP服務(wù)器。

功能實現(xiàn)

TCP 服務(wù)器,Websocket 服務(wù)器 使用相對成熟的 Workman 實現(xiàn)。

Workerman是一款純PHP開發(fā)的開源高性能的PHP socket 服務(wù)器框架。被廣泛的用于手機app、移動通訊,微信小程序,手游服務(wù)端、網(wǎng)絡(luò)游戲、PHP聊天室、硬件通訊、智能家居、車聯(lián)網(wǎng)、物聯(lián)網(wǎng)等領(lǐng)域的開發(fā)。 支持TCP長連接,支持Websocket、HTTP等協(xié)議,支持自定義協(xié)議。擁有異步Mysql、異步Redis、異步Http、異步消息隊列等眾多高性能組件。
GatewayWorker 目錄結(jié)構(gòu)
├── Applications // 這里是所有開發(fā)者應(yīng)用項目
│   └── YourApp  // 其中一個項目目錄,目錄名可以自定義
│       ├── Events.php // 開發(fā)者只需要關(guān)注這個文件
│       ├── start_gateway.php // gateway進程啟動腳本,包括端口號等設(shè)置
│       ├── start_businessworker.php // businessWorker進程啟動腳本
│       └── start_register.php // 注冊服務(wù)啟動腳本
│
├── start.php // 全局啟動腳本,此腳本會依次加載Applications/項目/start_*.php啟動腳本
│
└── vendor    // GatewayWorker框架和Workerman框架源碼目錄,此目錄開發(fā)者不用關(guān)心

首先我們 Applications 復(fù)制兩份 YourApp 目錄下的文件,此時我們的目錄結(jié)構(gòu)應(yīng)該是這樣的

├── Applications // 這里是所有開發(fā)者應(yīng)用項目
│   └── TcpServer  // 其中一個項目目錄,目錄名可以自定義
│       ├── Events.php // 開發(fā)者只需要關(guān)注這個文件
│       ├── start_gateway.php // gateway進程啟動腳本,包括端口號等設(shè)置
│       ├── start_businessworker.php // businessWorker進程啟動腳本
│       └── start_register.php // 注冊服務(wù)啟動腳本
│   └── WSServer  
│       ├── Events.php 
│       ├── start_gateway.php 
│       ├── start_businessworker.php 
│       └── start_register.php 
│
├── start.php // 全局啟動腳本,此腳本會依次加載Applications/項目/start_*.php啟動腳本
│
└── vendor    // GatewayWorker框架和Workerman框架源碼目錄,此目錄開發(fā)者不用關(guān)心

修改以及配置 TCPServerstart_register.php 下我們不做任何修改,但需要注意的是register 必須是text協(xié)議

// register 必須是text協(xié)議
$register = new Register("text://0.0.0.0:1238");

2.修改 start_gateway.php

// gateway 進程,這里使用 TCP 協(xié)議,可以用telnet測試
$gateway = new Gateway("tcp://0.0.0.0:8282");
// gateway名稱,status方便查看
$gateway->name = "TcpGateway";
// gateway進程數(shù)
$gateway->count = 4;
// 本機ip,分布式部署時使用內(nèi)網(wǎng)ip
$gateway->lanIp = "127.0.0.1";
// 內(nèi)部通訊起始端口,假如$gateway->count=4,起始端口為4000
// 則一般會使用4000 4001 4002 4003 4個端口作為內(nèi)部通訊端口 
$gateway->startPort = 2900;
// 服務(wù)注冊地址
$gateway->registerAddress = "127.0.0.1:1238";

3.修改 start_businessworker.php

// bussinessWorker 進程
$worker = new BusinessWorker();
// worker名稱
$worker->name = "TcpBusinessWorker";
// bussinessWorker進程數(shù)量
$worker->count = 4;
// 服務(wù)注冊地址
$worker->registerAddress = "127.0.0.1:1238";

4.根據(jù)上面的操作,我們修改WSServer目錄下的文件,這個修改跟上面一樣的,但是要注意的是,兩個應(yīng)用應(yīng)該是不用的端口,所以需要修改的地方有兩個,start_gateway下的端口,還有start_register端口。!?。?! 兩個應(yīng)用下register 和 Gateway 端口一定不一致?。?!

好了,到目前為止,我們已經(jīng)完成了兩個服務(wù)器的創(chuàng)建,那么我們兩個服務(wù)器之間如何數(shù)據(jù)共享呢?答案很簡單,我們在ws服務(wù)下創(chuàng)建一個tcp 客戶端即可,讓tcp 客戶端與我們tcp 服務(wù)器連接就可以,然后通過tcp 客戶端直接發(fā)送相關(guān)數(shù)據(jù)給tcp服務(wù)器就可以,當然并不是所有數(shù)據(jù)都是通過這樣的方式共享的,我們其他信息還是通過共用一個數(shù)據(jù)庫來共享的。相關(guān)代碼如下:

  public static function onConnect($client_id)
    {
        // 向所有人發(fā)送
        $host = "127.0.0.1";
        $port = 8282;
        global $socket;
        if (empty($socket)) {
            $socket = TcpClient::getInstace()->connect($host, $port);
        Gateway::sendToClient($client_id, "$client_id welcome

");
        }
    }


    public static function onMessage($client_id, $message)
    {
        if ($GLOBALS["socket"]) {
            // 數(shù)據(jù)指令解包
            $message_arr = str_split(str_replace(" ", "", trim($message)), 2);
            $cmd=null;
            for ($j = 0; $j < count($message_arr); $j++) {
                //socket_write($GLOBALS["socket"], bin2hex($message_arr[$j]));
                socket_write($GLOBALS["socket"],chr(hexdec($message_arr[$j])));
            }
        }
    }

好了,截止目前我們就完成了服務(wù)端工作,當然客戶端只是簡單的創(chuàng)建一個ws連接就好。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28284.html

相關(guān)文章

  • dubbo的分析和使用

    摘要:統(tǒng)計服務(wù)的調(diào)用次調(diào)和調(diào)用時間的監(jiān)控中心。調(diào)用關(guān)系說明服務(wù)容器負責(zé)啟動,加載,運行服務(wù)提供者。服務(wù)提供者在啟動時,向注冊中心注冊自己提供的服務(wù)。調(diào)度中心基于訪問壓力自動增減服務(wù)提供者。 隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)站應(yīng)用的規(guī)模不斷擴大,常規(guī)的垂直應(yīng)用架構(gòu)已無法應(yīng)對,分布式服務(wù)架構(gòu)以及流動計算架構(gòu)勢在必行,亟需一個治理系統(tǒng)確保架構(gòu)有條不紊的演進。showImg(https://segmentfau...

    wow_worktile 評論0 收藏0
  • Java 應(yīng)用一般架構(gòu)

    摘要:服務(wù)提供方對外發(fā)布服務(wù),服務(wù)需求方調(diào)用服務(wù)提供方所發(fā)布的服務(wù)。應(yīng)用服務(wù)器通過統(tǒng)一數(shù)據(jù)訪問模塊訪問各種數(shù)據(jù),減輕應(yīng)用程序管理諸多數(shù)據(jù)源的麻煩。 原文地址:https://blog.coding.net/blog/General-architecture-for-Java-applications 當我們架設(shè)一個系統(tǒng)的時候通常需要考慮到如何與其他系統(tǒng)交互,所以我們首先需要知道各種系統(tǒng)之間是...

    sunnyxd 評論0 收藏0
  • 30 分鐘快速入門 Docker 教程

    摘要:分鐘快速入門教程一歡迎來到世界與虛擬化在沒有的時代,我們會使用硬件虛擬化虛擬機以提供隔離。倉庫分為公開倉庫和私有倉庫,最大的公開倉庫是官方倉庫,國內(nèi)的公開倉庫也有很多選擇,例如阿里云等。 30 分鐘快速入門 Docker 教程 一、歡迎來到 Docker 世界 1. Docker 與虛擬化 在沒有 Docker 的時代,我們會使用硬件虛擬化(虛擬機)以提供隔離。這里,虛擬機通過在操作系...

    LucasTwilight 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<