php怎么对接云快充系统
<?php
namespace cgcore\gateways;
use app\admin\model\device\Device;
use app\admin\model\device\DeviceLoop;
use app\admin\model\device\DeviceProfile;
use cgcore\enums\CacheKeyEnum;
use cgcore\enums\CqrsEnum;
use cgcore\enums\DeviceStateEnum;
use cgcore\logics\CqrcGatewayLogic;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
//云快充客户端
class CqrcEvent
{
private $myRedis;
private $device_no;
public function __construct($myRedis, $device_no)
{
$this->myRedis = $myRedis;
$this->device_no = $device_no;
}
public function onConnect(TcpConnection $connection)
{
echo date('Y-m-d H:i:s') . ' onConnect:' . $this->device_no . PHP_EOL;
$device = Device::get(['device_no' => $this->device_no, 'cec_id' => 0], 'profile');
if (empty($device)) {
$aKey = CacheKeyEnum::FAKEDEVICELIST;
$this->myRedis->sRem($aKey, $this->device_no);
$connection->close();
return;
}
if (empty($device['profile'])) {
$device['profile'] = DeviceProfile::create([
'device_id' => $device['device_id'],
'iccid' => mt_rand(1000000000, 9999999999),
'app_id' => $device['app_id'],
]);
} else {
if (empty($device['profile']['iccid'])) {
$device->profile->iccid = mt_rand(1000000000, 9999999999);
$device->profile->save();
}
}
$arr = [
'package_type' => CqrsEnum::PACKAGE_01,
'body' => str_pad($this->device_no, 14, '0', STR_PAD_LEFT) .
($device['device_type'] == 0 ? '01' : '00') .
str_pad($device['loop_num'], 2, '0', STR_PAD_LEFT) .
'0f' . '56342E312E353000' . '00' . str_pad($device['profile']['iccid'] ?: 0, 20, '0', STR_PAD_LEFT) . '04'
];
$connection->send($arr);
$connection->ping_timer_id = Timer::add(10, function () use ($connection, $device) {
$deviceLoops = DeviceLoop::where(['device_id' => $device->device_id])->field('connector_id,loop_state')->order('loop_id asc')->select();
foreach ($deviceLoops as $deviceLoop) {
$connection->send([
'package_type' => CqrsEnum::PACKAGE_03,
'body' => $deviceLoop->connector_id . ($deviceLoop->loop_state == DeviceStateEnum::$loop_bad ? '01' : '00'),
]);
}
});
}
public function onMessage(TcpConnection $connection, $message)
{
$logic = new CqrcGatewayLogic($connection, $message);
extract($message, EXTR_PREFIX_ALL, 'pre');
switch (strtoupper($pre_package_type)) {
case CqrsEnum::PACKAGE_02:
$logic->loginAuthReply();
break;
case CqrsEnum::PACKAGE_06:
$logic->rechargeModelCheckReply();
break;
case CqrsEnum::PACKAGE_0A:
$logic->rechargeModelReply();
break;
case CqrsEnum::PACKAGE_12:
$logic->realtime();
break;
case CqrsEnum::PACKAGE_34:
$logic->openCharge();
break;
case CqrsEnum::PACKAGE_36:
$logic->closeCharge();
break;
case CqrsEnum::PACKAGE_40:
$logic->closeOrderReply();
break;
case CqrsEnum::PACKAGE_56:
$logic->synctime();
break;
case CqrsEnum::PACKAGE_58:
$logic->updateChargeModel();
break;
case CqrsEnum::PACKAGE_92:
$logic->restart();
break;
case CqrsEnum::PACKAGE_F0:
$logic->qrcode();
break;
}
}
public function onClose(TcpConnection $connection)
{
echo 'onClose:' . $this->device_no . PHP_EOL;
echo $connection->id;
//移除,让设备能自动重连
global $cqrsConnections;
unset($cqrsConnections[$this->device_no]);
global $redis;
$redis->unsubscribe(["cqrc_{$this->device_no}"]);
// 删除定时器
isset($connection->ping_timer_id) && Timer::del($connection->ping_timer_id);
isset($connection->realtime_timer_id) && Timer::del($connection->realtime_timer_id);
//更新设备数据库状态
Device::where('device_no', $this->device_no)->where('cec_id', 0)->update(['device_state' => DeviceStateEnum::$device_offline, 'offlinetime' => time()]);
}
public function onError(TcpConnection $connection)
{
echo 'onError:' . $this->device_no . PHP_EOL;
echo $connection->id;
global $cqrsConnections;
unset($cqrsConnections[$this->device_no]);
global $redis;
$redis->unsubscribe(["cqrc_{$this->device_no}"]);
isset($connection->ping_timer_id) && Timer::del($connection->ping_timer_id);
isset($connection->realtime_timer_id) && Timer::del($connection->realtime_timer_id);
//更新设备数据库状态
Device::where('device_no', $this->device_no)->where('cec_id', 0)->update(['device_state' => DeviceStateEnum::$device_offline, 'offlinetime' => time()]);
}
}
1522

被折叠的 条评论
为什么被折叠?



