php打开蓝牙,ThinkPHP5中使用workman框架与硬件设备蓝牙锁通讯

本文介绍了如何在ThinkPHP5框架中利用Workerman工作进程管理库,实现服务器与蓝牙锁设备的通讯。通过创建Text协议服务监听APP的开锁、关锁指令,并使用AES加解密处理数据安全性。同时,文章涵盖了心跳检测、定时任务以及与硬件设备的数据交互流程。
摘要由CSDN通过智能技术生成

5cafc54153c57fa0830a0705d6b01123.png

通篇分为三大块:服务器、蓝牙锁、APP

先说服务器:

使用的是TP5、workman框架使用composer安装的

b7237a2ef8e1258bab131f72803c79e2.png

Server.php文件

这里我对Server类进行了一些改动为了加入定时器的功能

新增加了一个$inner_text_worker = new Worker('Text://0.0.0.0:5678');服务协议,用作APP端发送开锁指令&告知蓝牙锁进行开关锁;

构造函数里面重写了$this->worker->onWorkerStart函数,这样的话Worker控制器里面的onWorkerStart函数将失去作用,如果不在这里重写,去Worker控制器里面的onWorkerStart函数加定时器将不起作用,因为Server构造函数里面已经运行了(Worker::runAll();)所有协议。

由于这里进行了AES的加、解密,参考的时候可以忽略加解密容易浏览。<?php

// +----------------------------------------------------------------------

// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]

// +----------------------------------------------------------------------

// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.

// +----------------------------------------------------------------------

// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )

// +----------------------------------------------------------------------

// | Author: liu21st 

// +----------------------------------------------------------------------

namespace think\worker;

use Workerman\Worker;

use Workerman\Lib\Timer;

use Workerman\MySQL\Connection;

/**

* Worker控制器扩展类

*/

abstract class Server

{

protected $worker;

protected $worker2;

protected $socket    = '';

protected $protocol  = 'http';

protected $host      = '0.0.0.0';

protected $port      = '2346';

protected $processes = 1;

/**

* 架构函数

* @access public

*/

public function __construct()

{

// 实例化 Websocket 服务

$this->worker = new Worker($this->socket ?: $this->protocol . '://' . $this->host . ':' . $this->port);

// 设置进程数

$this->worker->count = $this->processes;

// 设置进程名称

$this->worker->name = "bluetooth";

// 初始化

$this->init();

// 自定义开始

// worker进程中开启一个Text协议进程

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

require_once "/data/var/www/html/zmartec_bluetooth/vendor/workerman/workerman/Lib/Connection.php";

// 将db实例存储在全局变量中(也可以存储在某类的静态成员中)

global $db;

$db = new Connection("mysql主机IP地址", "mysql端口", "mysql用户", "密码", "数据库名称");

// 心跳 start

// 进程启动后设置一个每秒运行一次的定时器

Timer::add(1, function ()use($worker){

$time_now = time();

foreach ($worker->connections as $connection) {

// 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间

if (empty($connection->lastMessageTime)) {

$connection->lastMessageTime = $time_now;

continue;

}

// 上次通讯时间间隔大于心跳间隔(300秒),则认为客户端已经下线,关闭连接

if ($time_now - $connection->lastMessageTime > 300) {

if ($connection->uid) {

$connection->close();

echo "\r\n" . "客户端:" . $connection->uid . "超过心跳时间,被断开" .  "\r\n"; // $connection->uid

} else {

$connection->close();

echo "\r\n" . "客户端:" . xxx . "超过心跳时间,被断开" .  "\r\n"; // $connection->uid

}

}

}

});

// 心跳end

// Text协议,处理APP的开锁、关锁指令

$inner_text_worker = new Worker('Text://0.0.0.0:5678');

$inner_text_worker->onMessage = function ($connection, $buffer) {

global $worker;

// $data数组格式,里面有uid,表示向哪个uid的用户推送数据

$data = json_decode($buffer, true);

var_dump($data);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值