1.用户利用微信扫描二维码
2.后台匹配干系数据,并存储用户信息,终极返回给用户当前柜子当前状态
3.用户选择“开柜”指令,进行存取物品

1.实现跟硬件进行数据交互,利用TCP/IP 长连接,意味着,我们要有一个TCP做事器,TCP做事器一方面接管用户发过来的干系要求指令,另一方面完成发送指令给指定硬件这一操作。
2.除了TCP 做事器我们还须要一个 Websocket 做事器,也有两个功能,一方面接管客户端发送的指令,另一方面处理转发用户指令给TCP做事器。
### 功能实现
TCP 做事器,Websocket 做事器 利用相对成熟的 Workman 实现。
> Workerman是一款纯PHP开拓的开源高性能的PHP socket 做事器框架。被广泛的用于手机app、移动通讯,微信小程序,手游做事端、网络游戏、PHP谈天室、硬件通讯、智能家居、车联网、物联网等领域的开拓。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。拥有异步Mysql、异步Redis、异步Http、异队伍列等浩瀚高性能组件。
GatewayWorker 目录构造├── Applications // 这里是所有开拓者运用项目
│ └── YourApp // 个中一个项目目录,目录名可以自定义
│ ├── Events.php // 开拓者只须要关注这个文件
│ ├── start_gateway.php // gateway进程启动脚本,包括端口号等设置
│ ├── start_businessworker.php // businessWorker进程启动脚本
│ └── start_register.php // 注册做事启动脚本
│
├── start.php // 全局启动脚本,此脚本会依次加载Applications/项目/start_.php启动脚本
│
└── vendor // GatewayWorker框架和Workerman框架源码目录,此目录开拓者不用关心
1. 首先我们 `Applications ` 复制两份 `YourApp` 目录下的文件,此时我们的目录构造该当是这样的
├── Applications // 这里是所有开拓者运用项目
│ └── TcpServer // 个中一个项目目录,目录名可以自定义
│ ├── Events.php // 开拓者只须要关注这个文件
│ ├── start_gateway.php // gateway进程启动脚本,包括端口号等设置
│ ├── start_businessworker.php // businessWorker进程启动脚本
│ └── start_register.php // 注册做事启动脚本
│ └── WSServer
│ ├── Events.php
│ ├── start_gateway.php
│ ├── start_businessworker.php
│ └── start_register.php
│
├── start.php // 全局启动脚本,此脚本会依次加载Applications/项目/start_.php启动脚本
│
└── vendor // GatewayWorker框架和Workerman框架源码目录,此目录开拓者不用关心
2. 修正以及配置 `TCPServer`,`start_register.php` 下我们不做任何修正,但须要把稳的是register 必须是text协议
// register 必须是text协议
$register = new Register('text://0.0.0.0:1238');
2.修正 `start_gateway.php`
// gateway 进程,这里利用 TCP 协议,可以用telnet测试
$gateway = new Gateway(\"大众tcp://0.0.0.0:8282\"大众);
// gateway名称,status方便查看
$gateway->name = 'TcpGateway';
// gateway进程数
$gateway->count = 4;
// 本机ip,分布式支配时利用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,如果$gateway->count=4,起始端口为4000
// 则一样平常会利用4000 4001 4002 4003 4个端口作为内部通讯端口
$gateway->startPort = 2900;
// 做事注册地址
$gateway->registerAddress = '127.0.0.1:1238';
3.修正 `start_businessworker.php`
// bussinessWorker 进程
$worker = new BusinessWorker();
// worker名称
$worker->name = 'TcpBusinessWorker';
// bussinessWorker进程数量
$worker->count = 4;
// 做事注册地址
$worker->registerAddress = '127.0.0.1:1238';
4.根据上面的操作,我们修正`WSServer`目录下的文件,这个修正跟上面一样的,但是要把稳的是,两个运用该当是不用的端口,以是须要修正的地方有两个,`start_gateway`下的端口,还有`start_register`端口。!
!
!
!
两个运用下register 和 Gateway 端口一定不一致!
!
!
好了,到目前为止,我们已经完成了两个做事器的创建,那么我们两个做事器之间如何数据共享呢?答案很大略,我们在ws做事下创建一个tcp 客户端即可,让tcp 客户端与我们tcp 做事器连接就可以,然后通过tcp 客户端直接发送干系数据给tcp做事器就可以,当然并不是所有数据都是通过这样的办法共享的,我们其他信息还是通过共用一个数据库来共享的。干系代码如下:
public static function onConnect($client_id)
{
// 向所有人发送
$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\n\r\公众);
}
}
public static function onMessage($client_id, $message)
{
if ($GLOBALS['socket']) {
// 数据指令解包
$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])));
}
}
}
好了,截止目前我们就完成了做事端事情,当然客户端只是大略的创建一个ws连接就好。