基于Web的远程与硬件交互项目背景:最近在做一个类似“快递柜”的项目,项目需求如下:1.用户使用微信扫一扫二维码2.后台匹配相关数据,存储用户信息,最后返回给用户当前柜子当前状态3.用户选择“开柜”命令,分析获取物品的需求1.实现数据与硬件交互,使用TCP/IP长连接,这意味着,我们需要一个TCP服务器。TCP服务器一方面接受用户发送的相关请求指令,另一方面完成向指定硬件发送指令的操作。2、除了TCP服务器,我们还需要一个Websocket服务器,它也有两个功能。它一方面接受客户端发来的指令,另一方面对用户指令进行处理并转发给TCP服务器。该功能实现了TCP服务器,Websocket服务器使用了比较成熟的Workman实现。Workerman是一个用纯PHP开发的开源高性能PHP套接字服务器框架。广泛应用于手机APP开发、移动通讯、微信小程序、手游服务器、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域。支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。拥有异步Mysql、异步Redis、异步Http、异步消息队列等众多高性能组件。GatewayWorker目录结构├──Applications//这里是所有开发者应用项目│└──YourApp//其中一个项目目录,目录名可以自定义│├──Events.php//开发者只需要关注这个文件│├──start_gateway.php//网关进程启动脚本,包括端口号等设置│├──start_businessworker.php//businessWorker进程启动脚本│└──start_register.php//注册服务启动脚本│├──开始。php//全局启动脚本,该脚本会依次加载Applications/project/start_*.php启动脚本│└──vendor//GatewayWorker框架和Workerman框架源码目录,该目录开发者无需关心First,我们在ApplicationsFiles目录下复制两份YourApp,此时我们的目录结构应该是这样的├──Applications//这里都是开发者应用项目│└──TcpServer//其中一个项目目录,目录名可自定义│├──Events.php//开发者只需要关注这个文件│├──start_gateway.php//网关进程启动脚本,包括端口号等设置│├──start_businessworker.php//businessWorker进程启动脚本│└──start_register.php//注册服务启动脚本│└──WSServer│├──Events.php│├──start_gateway.php│├──start_businessworker.php│└──start_register.php│├──start.php//全局启动脚本,该脚本会依次加载Applications/project/start_*.php启动脚本│└──vendor//GatewayWorkerFramework和Workerman框架源代码目录。该目录下的开发者无需关心修改配置TCPServer。start_register.php下我们不做任何修改,但是要注意registermustbeatextprotocol//registermustbeatextprotocol$register=newRegister('text://0.0.0.0:1238');2.修改start_gateway.php//网关进程,这里使用TCP协议,可以用telnet测试$gateway=newGateway("tcp://0.0.0.0:8282");//网关名称,状态方便view$gateway->name='TcpGateway';//网关进程数$gateway->count=4;//本地ip,分布式部署的内网ip$gateway->lanIp='127.0.0.1';//内部通信初始端口,如果$gateway->count=4,则初始端口为4000//一般使用4个端口4000400140024003作为内部通信端口$gateway->startPort=2900;//服务注册地址$网关->registerAddress='127.0.0.1:1238';3.修改start_businessworker.php//businessWorker进程$worker=newBusinessWorker();//worker名称$worker->name='TcpBusinessWorker';//bussinessWorker进程数$worker->count=4;//服务注册地址$worker->registerAddress='127.0.0.1:1238';4、根据上面的操作,我们修改WSServer目录下的文件,这个修改和上面一样,但是需要注意的是两个应用应该是未使用的端口,所以有两个地方需要修改,start_gateway下的端口和start_register端口!!!!两个应用下register和Gateway端口一定要不一致!!!好了,至此,我们已经完成了两台服务器的创建,那么我们如何在两台服务器之间共享数据呢?答案很简单,我们可以在ws服务下创建一个tcpclient,让tcpclient连接到我们的tcpserver,然后通过tcpclient直接将相关数据发送给tcpserver,当然不是所有的数据都是共享的这样,我们的其他信息就通过共享数据库共享了。相关代码如下:publicstaticfunctiononConnect($client_id){//发送给大家$host="127.0.0.1";$端口=8282;全球$套接字;如果(空($socket)){$socket=TcpClient::getInstace()->connect($host,$port);Gateway::sendToClient($client_id,"$client_id欢迎\n\r");}}publicstaticfunctiononMessage($client_id,$message){if($GLOBALS['socket']){//解包数据指令$message_arr=str_split(str_replace('','',trim($message)),2);$cmd=空;对于($j=0;$j
