php怎么对接云快充系统

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()]);
    }
}

先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值