LightService.php 3.2 KB
<?php
// +----------------------------------------------------------------------
// | bronet [ 以客户为中心 以奋斗者为本 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2017 http://www.bronet.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 老猫 <bronet@126.com>
// +----------------------------------------------------------------------
namespace app\admin\service;

use think\Db;

class LightService
{
    public function lightChange($id="",$status1='01',$status2='01',$u="",$c=""){
        if ($id==""){
            return false;
        }else {
            $light=Db::name('light')->where('id',$id)->find();
            $client = fsockopen('114.215.223.17', 5002, $errno, $errmsg, 1);
            $code=$light['addr'].'10000000306001'.$light['addr'].$status1.$status2.$this->strtoascii1($u).$this->strtoascii2($c).'00';
            $crc=$this->crc16_modbus($code);
            $changeCode=$code.substr($crc,2,2).substr($crc,0,2);
//            var_dump($queryCode);
            $data = array('uid' => $light['number'], 'percent' => "$changeCode");
            // 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
            fwrite($client, json_encode($data) . "\n");
            // 读取推送结果
            return fread($client, 8192);
        }
    }

    function crc16_modbus($msg)
    {
        $data = pack('H*',$msg);
        $crc = 0xFFFF;
        for ($i = 0; $i < strlen($data); $i++)
        {
            $crc ^=ord($data[$i]);

            for ($j = 8; $j !=0; $j--)
            {
                if (($crc & 0x0001) !=0)
                {
                    $crc >>= 1;
                    $crc ^= 0xA001;
                }
                else $crc >>= 1;
            }
        }
        return sprintf('%04X', $crc);
    }
    public function strtoascii1($str="")
    {
        $str = mb_convert_encoding($str, 'GB2312');
        $change_after = '';
        for ($i = 0; $i < strlen($str); $i=$i+2) {
            $change_after .= dechex(ord($str[$i])).dechex(ord($str[$i+1]));
        }
        for ($i=0;strlen($change_after)<50;$i++){
            $change_after=$change_after.'00';
        }
        return strtoupper($change_after);
    }
    public function strtoascii2($str="")
    {
        $str = mb_convert_encoding($str, 'GB2312');
//        var_dump(strlen($str));
        if(strlen($str)%2!=0){
            $change_after = '';
            for ($i = 0; $i < strlen($str); $i = $i + 1) {
                $change_after .= dechex(ord($str[$i]));
//                var_dump($change_after);
            }
        }else {
            $change_after = '';
            for ($i = 0; $i < strlen($str); $i = $i + 2) {
                $change_after .= dechex(ord($str[$i])) . dechex(ord($str[$i + 1]));
//                var_dump($change_after);
            }
        }
//        exit();
        for ($i=0;strlen($change_after)<130;$i++){
            $change_after=$change_after.'00';
        }
        return strtoupper($change_after);
    }
}