| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989 | <?php/*** 通用函数helper*///移除空参数function remove_null_params($data = array()) {	foreach ($data as $key => $value) {		if ($value === NULL || $value === '') {			unset($data[$key]);		}	}	return $data;}// 通过pm2.5获取aqi的值function get_aqi_and_level_by_pm25($pm25){    if ($pm25 < 35) {  // 很好        $aqi = 50 / 35 * $pm25;    }elseif ($pm25 >= 35 && $pm25 < 75) {  // 好        $aqi = 50 / 40 * ($pm25 - 35) + 50;    }elseif ($pm25 >= 75 && $pm25 < 115) { // 一般        $aqi = 50 / 40 * ($pm25 - 75) + 100;    }elseif ($pm25 >= 115 && $pm25 < 150) { // 较差        $aqi = 50 / 35 * ($pm25 - 115) + 150;    }elseif ($pm25 >= 150 && $pm25 < 250) { // 差        $aqi = 100 / 100 * ($pm25 - 150) + 200;    }elseif ($pm25 >= 250 && $pm25 < 350) {  // 很差        $aqi = 100 / 100 * ($pm25 - 250) + 300;    }elseif ($pm25 >= 350) {  // 非常差        $aqi = 100 / 150 * ($pm25 - 350) + 400;    }    $level = get_aqi_str($aqi);        return array('aqi'=>round($aqi),'level'=>$level);}function get_aqi_str($aqi){    if ($aqi < 50) {  // 很好        $level = 'Very good';    }elseif ($aqi >= 50 && $aqi < 100) {  // 好        $level = 'Good';    }elseif ($aqi >= 100 && $aqi < 150) { // 一般        $level = 'Commonly';    }elseif ($aqi >= 150 && $aqi < 200) { // 较差        $level = 'Poor';    }elseif ($aqi >= 200 && $aqi < 300) { // 差        $level = 'Difference';    }elseif ($aqi >= 300 && $aqi < 400) {  // 很差        $level = 'Very bad';    }elseif ($aqi >= 400) {  // 非常差        $level = 'Very bad';    }    return $level;}// modbus crc 16 校验码计算function crc16($string) {  $crc = 0xFFFF;  for ($x = 0; $x < strlen ($string); $x++) {    $crc = $crc ^ ord($string[$x]);    for ($y = 0; $y < 8; $y++) {      if (($crc & 0x0001) == 0x0001) {        $crc = (($crc >> 1) ^ 0xA001);      } else { $crc = $crc >> 1; }    }  }  $crc = strval(base_convert($crc, 10, 16));  $crc = substr('0000'.$crc, -4);  return substr($crc, -2).substr($crc, 0,2);}function crc_result($cmd){    $begin = pack('H*',substr($cmd, 0,2));    for ($i=0; $i < intval(strlen($cmd) / 2) - 1; $i++) {         $begin = $begin ^ pack('H*',substr($cmd, $i*2+2,2));    }    $begin = unpack('H*', $begin);    return substr('00'.$begin[1], -2);}function lampMqttCmd($sendTopic,$backTopic,$sendData,$timeout = 5,$seq = ''){    require_once './application/libraries/Mqtt.php';    // 订阅信息,接收一个信息后退出    $CI =& get_instance();    $server = $CI->config->item('WIFIMqttServer');    $port = $CI->config->item('WIFIMqttPort');    $username = $CI->config->item('WIFIMqttUsername');    $password = $CI->config->item('WIFIMqttPassword');    $client_id = time().rand(100000,999999); // 设置你的连接客户端id    $mqtt = new Mqtt($server, $port, $client_id);    if($mqtt->connect(true, NULL, $username, $password)) { //链接不成功再重复执行监听连接        $mqtt->publish($sendTopic, $sendData, 0);        // $mqtt->publish('/WEGW/ReadIn/865860046894466', pack('H*','010AA00B'), 2);    }else{        return '';    }    $topics[$backTopic] = array("qos" => 0,"function" => "procmsg");    // $topics['/WEGW/ReadOut/865860046894466'] = array("qos" => 2, "function" => "procmsg");    // 订阅主题    $mqtt->subscribe($topics, 0);    $true = 1;    $t = time();    while($true == 1){        $true = $mqtt->proc();        if (!empty($seq) && $true != 1){            $res = unpack('H*', $true['msg']);            if (substr($res[1], 0,4) != strtolower($seq) && substr(substr($res[1], 0,4), -2).substr(substr($res[1], 0,4), 0,2) != strtolower($seq)) $true = 1;        }        if (time() - $t >= $timeout) {            return '';        }    }    $mqtt->close();    return $true;}function get_seq(){    $seq = rand(0,255);    $seq = base_convert($seq, 10, 16);    return substr('00'.$seq, -2);}function get_check_sum($data){    $sum = 0;    for ($i=0; $i < strlen($data)/2; $i++) {         $sum += base_convert(substr($data, $i*2,2), 16, 10);    }    $sum = base_convert($sum, 10, 16);    $sum = substr('00'.$sum, -2);    return $sum;}// 设置时区function set_timezone($date,$timezone){    $time = strtotime($date) + $timezone*3600;    return date('Y-m-d H:i:s',$time);}//小时数function secToTime($times){    $result = '00';    if ($times>0) {        $hour = floor($times/3600);        $minute = floor(($times-3600 * $hour)/60);        $second = floor((($times-3600 * $hour) - 60 * $minute) % 60);        $result = $hour;    }    return $result;}// 发送邮件function send_email($to,$msg,$title = '维修通知'){    // $this->load->library('Smtp');    require_once FCPATH.'application/libraries/Smtp.php';    //******************** 配置信息 ********************************    $CI =& get_instance();    $config = $CI->config->config['email'];    $smtpserver = $config['smtp_host'];//SMTP服务器    $smtpserverport = $config['smtp_port'];//SMTP服务器端口    $smtpusermail = $config['user_email'];//SMTP服务器的用户邮箱    $smtpemailto = $to;//发送给谁    $smtpuser = $config['smtp_user'];//SMTP服务器的用户帐号,注:部分邮箱只需@前面的用户名    $smtppass = $config['smtp_pass'];//SMTP服务器的用户密码    $mailtitle = $title;//邮件主题    $mailcontent = $msg;//邮件内容    $mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件    //************************ 配置信息 ****************************    $smtp = new Smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.    $smtp->debug = false;//是否显示发送的调试信息    return $smtp->sendmail($smtpemailto, $smtpusermail, $mailtitle, $mailcontent, $mailtype);}/**  * 获取密码安全等级  * @param string $password 密码  * @return int 0:低,1:中,2:高  */function get_password_level($password){    if(preg_match('/^([0-9]{6,16})$/',$password)){    	return 0;    } else if (preg_match('/^[0-9 a-z]{6,16}$/',$password)){    	return 1;    } else if (preg_match('/^[0-9 a-z A-Z !@#$%^&*]{6,16}$/',$password)) {    	return 2;    }    return 0;}// 天气信息翻译function weather_translate_en($code){    $data = array(        '100' => 'Sunny/Clear',        '101' => 'Cloudy',        '102' => 'Few Clouds',        '103' => 'Partly Cloudy',        '104' => 'Overcast',        '200' => 'Windy',        '201' => 'Calm',        '202' => 'Light Breeze',        '203' => 'Moderate/Gentle Breeze',        '204' => 'Fresh Breeze',        '205' => 'Strong Breeze',        '206' => 'High Wind, Near Gale',        '207' => 'Gale',        '208' => 'Strong Gale',        '209' => 'Storm',        '210' => 'Violent Storm',        '211' => 'Hurricane',        '212' => 'Tornado',        '213' => 'Tropical Storm',        '300' => 'Shower Rain',        '301' => 'Heavy Shower Rain',        '302' => 'Thundershower',        '303' => 'Heavy Thunderstorm',        '304' => 'Thundershower with hail',        '305' => 'Light Rain',        '306' => 'Moderate Rain',        '307' => 'Heavy Rain',        '308' => 'Extreme Rain',        '309' => 'Drizzle Rain',        '310' => 'Storm',        '311' => 'Heavy Storm',        '312' => 'Severe Storm',        '313' => 'Freezing Rain',        '314' => 'Light to moderate rain',        '315' => 'Moderate to heavy rain',        '316' => 'Heavy rain to storm',        '317' => 'Storm to heavy storm',        '318' => 'Heavy to severe storm',        '399' => 'Rain',        '400' => 'Light Snow',        '401' => 'Moderate Snow',        '402' => 'Heavy Snow',        '403' => 'Snowstorm',        '404' => 'Sleet',        '405' => 'Rain And Snow',        '406' => 'Shower Snow',        '407' => 'Snow Flurry',        '408' => 'Light to moderate snow',        '409' => 'Moderate to heavy snow',        '410' => 'Heavy snow to snowstorm',        '499' => 'Snow',        '500' => 'Mist',        '501' => 'Foggy',        '502' => 'Haze',        '503' => 'Sand',        '504' => 'Dust',        '507' => 'Duststorm',        '508' => 'Sandstorm',        '509' => 'Dense fog',        '510' => 'Strong fog',        '511' => 'Moderate haze',        '512' => 'Heavy haze',        '513' => 'Severe haze',        '514' => 'Heavy fog',        '515' => 'Extra heavy fog',        '900' => 'Hot',        '901' => 'Cold',        '999' => 'Unknown',    );    return isset($data[$code]) ? $data[$code] : '';}function weather_translate_cn($code){    $data = array(        '100' => '晴',        '101' => '多云',        '102' => '少云',        '103' => '晴间多云',        '104' => '阴',        '200' => '有风',        '201' => '平静',        '202' => '微风',        '203' => '和风',        '204' => '清风',        '205' => '强风/劲风',        '206' => '疾风',        '207' => '大风',        '208' => '烈风',        '209' => '风暴',        '210' => '狂爆风',        '211' => '飓风',        '212' => '龙卷风',        '213' => '热带风暴',        '300' => '阵雨',        '301' => '强阵雨',        '302' => '雷阵雨',        '303' => '强雷阵雨',        '304' => '雷阵雨伴有冰雹',        '305' => '小雨',        '306' => '中雨',        '307' => '大雨',        '308' => '极端降雨',        '309' => '毛毛雨/细雨',        '310' => '暴雨',        '311' => '大暴雨',        '312' => '特大暴雨',        '313' => '冻雨',        '314' => '小到中雨',        '315' => '中到大雨',        '316' => '大到暴雨',        '317' => '暴雨到大暴雨',        '318' => '大暴雨到特大暴雨',        '399' => '雨',        '400' => '小雪',        '401' => '中雪',        '402' => '大雪',        '403' => '暴雪',        '404' => '雨夹雪',        '405' => '雨雪天气',        '406' => '阵雨夹雪',        '407' => '阵雪',        '408' => '小到中雪',        '409' => '中到大雪',        '410' => '大到暴雪',        '499' => '雪',        '500' => '薄雾',        '501' => '雾',        '502' => '霾',        '503' => '扬沙',        '504' => '浮尘',        '507' => '沙尘暴',        '508' => '强沙尘暴',        '509' => '浓雾',        '510' => '强浓雾',        '511' => '中度霾',        '512' => '重度霾',        '513' => '严重霾',        '514' => '大雾',        '515' => '特强浓雾',        '900' => '热',        '901' => '冷',        '999' => '未知',    );    return isset($data[$code]) ? $data[$code] : '';}function weather_translate_ru($code){    $data = array(        '100' => 'чинг',        '101' => 'облачно',        '102' => 'Меньше облако',        '103' => 'Ясная и облачная',        '104' => 'инь',        '200' => 'дует',        '201' => 'спокойствие',        '202' => 'ветерок',        '203' => 'зефир',        '204' => 'Свежий ветер',        '205' => 'Сильный ветер/сильный ветер',        '206' => 'шквал',        '207' => 'ветер',        '208' => 'шторм',        '209' => 'шторм',        '210' => 'Сильный ветер',        '211' => 'ураган',        '212' => 'Торнадо',        '213' => 'Тропический шторм',        '300' => 'ливень',        '301' => 'Сильный душ',        '302' => 'Грозовой дождь',        '303' => 'Сильный грозовой дождь',        '304' => 'Ливень сопровождается градом',        '305' => 'дождик',        '306' => 'Средний дождь',        '307' => 'дождь',        '308' => 'Экстремальный дождь',        '309' => 'Дождик/мелкий дождь',        '310' => 'Проливной дождь',        '311' => 'Сильный дождь',        '312' => 'Сильный ливень',        '313' => 'Ледяной дождь',        '314' => 'Немного дождя',        '315' => 'Под дождём',        '316' => 'Большой до грозы',        '317' => 'От грозы до грозы',        '318' => 'Сильные ливни, сильные ливни',        '399' => 'дождь',        '400' => 'Мелкий снежок',        '401' => 'средний снег',        '402' => 'снегопад',        '403' => 'Снежная буря',        '404' => 'Дождь и снег',        '405' => 'Дождливая и снежная погода',        '406' => 'Дождь и снег',        '407' => 'снежный',        '408' => 'Маленький до снега',        '409' => 'Прямо в снег',        '410' => 'От большой до снежной бури',        '499' => 'снег',        '500' => 'дымка',        '501' => 'туман',        '502' => 'мгла',        '503' => 'янша',        '504' => 'пыль',        '507' => 'Песчаная буря',        '508' => 'Сильная песчаная буря',        '509' => 'Густой туман',        '510' => 'Сильный густой туман',        '511' => 'Умеренный туман',        '512' => 'Тяжелая смола',        '513' => 'Туман',        '514' => 'Сильный туман',        '515' => 'Густой туман',        '900' => 'горячая',        '901' => 'холодно',        '999' => 'неизвестный',    );    return isset($data[$code]) ? $data[$code] : '';}//输出jsonfunction json_result($code, $msg, $data = array()) {    $res = array('code' => $code,'msg' => $msg,'data' => $data);    $CI =& get_instance();    $clientId = $CI->input->post('clientId',true);    if (!empty($clientId)) {        if (is_array($res['data']) && !isset($res['data']['status'])) {            $res['data']['status'] = 2;        }else{            $res['data'] = array('status'=>2);        }        exit(send_websocket($clientId,$res));    }else{        echo json_encode($res);    }	}// 获取jwt的token值function get_jwt_token(){    $CI =& get_instance();    $CI->load->library('Jwt');    $payload=array("iss"=>"chirpstack-application-server","aud"=>"chirpstack-application-server","nbf"=>time()-60, "exp"=>time()+7200,'sub'=>'user','username'=>'admin');    return $CI->jwt->getToken($payload);}//发送命令到serverfunction send_cmd($cmd, $timeout = 30, $ms_timeout = 200) {    return false;	$CI =& get_instance();	$host = $CI->config->item('cmd_server');	$ip = $host['ip'];	$port = $host['port'];	$client = @stream_socket_client("tcp://{$ip}:{$port}", $errno, $errstr, 30);	if ($client) {		fwrite($client, $cmd);		stream_set_timeout($client, $timeout, $ms_timeout);		$result = fread($client, 8196);		fclose($client);		return $result;	} else {		return false;	}}/*** 模拟post进行url请求* @param string $url* @param string $param*/function request_post($url = '', $data = '',$header=array(),$timeout = 30) {    $tuCurl = curl_init();     //参数    curl_setopt($tuCurl, CURLOPT_URL,$url);        curl_setopt($tuCurl, CURLOPT_POSTFIELDS, $data);    curl_setopt($tuCurl, CURLOPT_SSL_VERIFYPEER, false);    // curl_setopt($tuCurl, CURLOPT_SSL_VERIFYHOST, false);    curl_setopt($tuCurl, CURLOPT_SSLVERSION, 1);    curl_setopt($tuCurl, CURLOPT_RETURNTRANSFER, 1);    curl_setopt($tuCurl, CURLOPT_TIMEOUT, $timeout);    if (!empty($header)) {        curl_setopt($tuCurl, CURLOPT_HTTPHEADER, $header);     }    $tuData = curl_exec($tuCurl);    curl_close($tuCurl);    return $tuData;}// 通过时区获取当地时间function get_time_by_timezone($timezone){    $time = strtotime(gmdate("Y-m-d H:i:s"));    return date('Y-m-d H:i:s',$time + $timezone*3600);}// 给定时间、时区计算目标时区时间function date_change($date,$start,$end){    $H = intval(date('H',strtotime($date)));    $d = intval(date('d',strtotime($date)));    $m = intval(date('m',strtotime($date)));    $Y = intval(date('Y',strtotime($date)));    if ($m <= 1) {        $beginDateMonth = date(($Y-1).'-12-01', strtotime($date));    }else{        $beginDateMonth = date($Y.'-'.($m-1).'-01', strtotime($date));    }    $day = intval(date('d', strtotime("$beginDateMonth +1 month -1 day")));     $day1 = intval(date('d', strtotime(date('Y-m-01',strtotime($date))." +1 month -1 day")));     $H1 = $H-($start - $end);    if ($H1 < 0) {        $H1 += 24;        if ($d <= 1) {            $d = $day;            if ($m <= 1) {                $Y -= 1;                $m = 12;            }else{                $m -= 1;            }        }else{            $d -= 1;        }    }elseif ($H1 >= 24) {        $H1 -= 24;        if ($d >= $day1) {            $d = 1;            if ($m >= 12) {                $m = 1;                $Y += 1;            }else{                $m += 1;            }        }else{            $d += 1;        }    }    if ($m < 10) $m = '0'.$m;    if ($d < 10) $d = '0'.$d;    if ($H1 < 10) $H1 = '0'.$H1;    return date("{$Y}-{$m}-{$d} {$H1}:i:s",strtotime($date));}// 文件下载function file_download($filePath){    $file_name = basename($filePath);     //下载文件名        //检查文件是否存在        if (! file_exists ( $filePath )) {            exit (json_result('0012','找不到文件',array()));        } else {            //打开文件            $file = fopen ( $filePath, "r" );            //输入文件标签             Header ( "Content-type: application/octet-stream" );            Header ( "Accept-Ranges: bytes" );            Header ( "Accept-Length: " . filesize ( $filePath) );            Header ( "Content-Disposition: attachment; filename=" . $file_name );            //输出文件内容             //读取文件内容并直接输出到浏览器            echo fread ( $file, filesize ( $filePath ) );            fclose ( $file );            exit ();        }}/*** 模拟get进行url请求* @param string $url*/function http_get($url,$header = array()) {    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    curl_setopt($ch, CURLOPT_HEADER, 0);    if (!empty($header)) {        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);     }    // curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1);    $result = curl_exec($ch);    curl_close($ch);    return $result;}//截取字符串function cut_str($string, $length, $append=true) {	if(strlen($string) <= $length ) { 		return $string; 	} else { 		$i = 0; 		while ($i < $length) { 			$stringTMP = substr($string,$i,1); 			if ( ord($stringTMP) >=224 ) { 				$stringTMP = substr($string,$i,3); 				$i = $i + 3; 			} elseif( ord($stringTMP) >=192 ) { 				$stringTMP = substr($string,$i,2); 				$i = $i + 2; 			} else { 				$i = $i + 1; 			} 			$stringLast[] = $stringTMP; 		} 		$stringLast = implode("",$stringLast); 		if($append) { 			$stringLast .= "..."; 		} 		return $stringLast; 	}}//填充数组不存在的键值对function fillUnsetData($array, $length) {	for ($i=1; $i <= $length; $i++) { 		if (!isset($array[$i])) {			$array[$i] = '';		} 	}	return $array;}//查找数组第一个元素的keyfunction findFirstKey($array) {	foreach ($array as $k => $v){		return $k;	}}function doAsyncRequest($url, $param=array()){      $urlinfo = parse_url($url);      $host = $urlinfo['host'];      $path = $urlinfo['path'];      $query = isset($param)? http_build_query($param) : '';      $port = 80;      $errno = 0;      $errstr = '';      $timeout = 10;      $fp = fsockopen($host, $port, $errno, $errstr, $timeout);      $out = "POST ".$path." HTTP/1.1\r\n";      $out .= "host:".$host."\r\n";      $out .= "content-length:".strlen($query)."\r\n";      $out .= "content-type:application/x-www-form-urlencoded\r\n";      $out .= "connection:close\r\n\r\n";      $out .= $query;      fputs($fp, $out);      fclose($fp);  }function send_websocket($clientid,$data = array(),$resType='cmd'){    if (!empty($clientid)) {        $CI =& get_instance();        $CI->db->insert('message',['client'=>$clientid,'msg'=>json_encode($data)]);    }    }//token生成算法function generate_token($username, $password, $client_key) {	$CI =& get_instance();	$salt = $CI->config->config['encryption_key'];    return md5($username.$password.$client_key.$salt);	// return md5($username.$password.date('yyyy').date('mm').$client_key.$salt);}//获取汉字拼音的第一个字母function get_first_char($str) {    $firstchar_ord = ord(strtoupper($str{0}));    if (($firstchar_ord >= 65 and $firstchar_ord <= 91) or ($firstchar_ord >= 48 and $firstchar_ord <= 57)) return $str{0};    $s = iconv("UTF-8", "GBK//TRANSLIT//IGNORE", $str);    $asc = ord($s{0}) * 256 + ord($s{1}) - 65536;    if ($asc >= - 20319 and $asc <= - 20284) return "A";    if ($asc >= - 20283 and $asc <= - 19776) return "B";    if ($asc >= - 19775 and $asc <= - 19219) return "C";    if ($asc >= - 19218 and $asc <= - 18711) return "D";    if ($asc >= - 18710 and $asc <= - 18527) return "E";    if ($asc >= - 18526 and $asc <= - 18240) return "F";    if ($asc >= - 18239 and $asc <= - 17923) return "G";    if ($asc >= - 17922 and $asc <= - 17418) return "H";    if ($asc >= - 17417 and $asc <= - 16475) return "J";    if ($asc >= - 16474 and $asc <= - 16213) return "K";    if ($asc >= - 16212 and $asc <= - 15641) return "L";    if ($asc >= - 15640 and $asc <= - 15166) return "M";    if ($asc >= - 15165 and $asc <= - 14923) return "N";    if ($asc >= - 14922 and $asc <= - 14915) return "O";    if ($asc >= - 14914 and $asc <= - 14631) return "P";    if ($asc >= - 14630 and $asc <= - 14150) return "Q";    if ($asc >= - 14149 and $asc <= - 14091) return "R";    if ($asc >= - 14090 and $asc <= - 13319) return "S";    if ($asc >= - 13318 and $asc <= - 12839) return "T";    if ($asc >= - 12838 and $asc <= - 12557) return "W";    if ($asc >= - 12556 and $asc <= - 11848) return "X";    if ($asc >= - 11847 and $asc <= - 11056) return "Y";    if ($asc >= - 11055 and $asc <= - 10247) return "Z";    return '~';}//翻译错误function transfer_error_tips($msg) {    if(strpos($msg,'project not existed') !== false) {        return '项目不存在';    } else if(strpos($msg,'all of networks in this project are not online') !== false) {        return '当前项目下所有网络都不在线';    } else if(strpos($msg,'error check_code') !== false) {        return '路灯发生未知错误';    } else if(strpos($msg,'cmd not existed') !== false) {        return '未知命令';    } else if(strpos($msg,'address not correct') !== false) {        return '无线模块地址不正确';    } else if(strpos($msg,'current address not online') !== false) {        return '无线模块不在线';    } else if(strpos($msg,'time out no response') !== false) {        return '超时未响应';    } else if(strpos($msg,'PDU error') !== false) {        return 'PDU错误';    } else if(strpos($msg,'not online') !== false) {        return '网络不在线';    } else if(strpos($msg,'send command timeout') !== false) {        return '下发指令超时';    } else if(strpos($msg,'The file you are attempting to upload is larger than the permitted size.') !== false) {        return '上传文件过大';    } else if(strpos($msg,'The filetype you are attempting to upload is not allowed.') !== false) {        return '上传文件类型错误';    }else if($msg == '') {        return '未知错误';    } else {        return '未知错误';    }}//俄语翻译错误function transfer_error_tips_ru($msg) {    if(strpos($msg,'project not existed') !== false) {        return 'Проект не существует';    } else if(strpos($msg,'all of networks in this project are not online') !== false) {        return 'Все сети в рамках текущего проекта не подключены';    } else if(strpos($msg,'error check_code') !== false) {        return 'Неизвестная ошибка уличных фонарей';    } else if(strpos($msg,'cmd not existed') !== false) {        return 'Неизвестная команда';    } else if(strpos($msg,'address not correct') !== false) {        return 'Неверный адрес модуля';    } else if(strpos($msg,'current address not online') !== false) {        return 'беспроводной модуль не подключен';    } else if(strpos($msg,'time out no response') !== false) {        return 'задержка без ответа';    } else if(strpos($msg,'PDU error') !== false) {        return 'ошибка PDU';    } else if(strpos($msg,'not online') !== false) {        return 'сеть не работает';    } else if(strpos($msg,'send command timeout') !== false) {        return 'время ожидания следующей команды';    } else if(strpos($msg,'The file you are attempting to upload is larger than the permitted size.') !== false) {        return 'загружать слишком большой файл';    } else if(strpos($msg,'The filetype you are attempting to upload is not allowed.') !== false) {        return 'Ошибка загрузки типа файла';    }else if($msg == '') {        return 'Неизвестная ошибка';    } else {        return 'Неизвестная ошибка';    }}/** * 把返回的数据集转换成Tree * @param array $list 要转换的数据集 * @param string $pid parent标记字段 * @param string $level level标记字段 * @return array * @author 麦当苗儿 <zuojiazi@vip.qq.com> */function list_to_tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) {    // 创建Tree    $tree = array();    if(is_array($list)) {        // 创建基于主键的数组引用        $refer = array();        foreach ($list as $key => $data) {            $refer[$data[$pk]] =& $list[$key];        }        foreach ($list as $key => $data) {            // 判断是否存在parent            $parentId =  $data[$pid];            if ($root == $parentId) {                $tree[] =& $list[$key];            }else{                if (isset($refer[$parentId])) {                    $parent =& $refer[$parentId];                    $parent[$child][] =& $list[$key];                }            }        }    }    return $tree;}function getTree($data, $pId){    $tree = [];    foreach($data as $k => $v)    {        if($v['pid'] == $pId)        {            $v['subList'] = getTree($data, $v['id']);            $tree[] = $v;            unset($data[$k]);        }    }    return $tree;}// 编号设置function set_number($n){    $n = intval($n);    $res = $n + 1000000;    return substr($res, 1);}function get_fields_by_type($fileds,$type){    // 系统默认    $data = array(        'number' => array('name'=>'路灯编号','enname'=>'Lamp number'),        'section' => array('name'=>'路段','enname'=>'Road'),        'lampstatus' => array('name'=>'路灯状态','enname'=>'Lamp status'),        'status' => array('name'=>'信号状态','enname'=>'Network status'),        'updatetime' => array('name'=>'更新时间','enname'=>'Update time'),        'lighteness' => array('name'=>'路灯亮度(%)','enname'=>'Brightness(%)'),        'address' => array('name'=>'无线模块地址','enname'=>'Wireless module address'),        'loadpower' => array('name'=>'负载功率(W)','enname'=>'load power(W)'),        'chargestage' => array('name'=>'蓄电池充电阶段','enname'=>'Charging stage'),        'battvoltage' => array('name'=>'蓄电池电压(V)','enname'=>'Battery voltage(V)'),        'overtimes' => array('name'=>'蓄电池总过放次数','enname'=>'Over discharge times'),        'solarpower' => array('name'=>'太阳能板功率(W)','enname'=>'Solar panel power(W)'),        'isfaulted' => array('name'=>'是否故障','enname'=>'Fault'),        'id' => array('name'=>'路灯id','enname'=>'Lamp ID'),        'networkname' => array('name'=>'网络名称','enname'=>'Network name'),        'projectname' => array('name'=>'项目名称','enname'=>'Project name'),        'longitude' => array('name'=>'经度','enname'=>'Longitude'),        'latitude' => array('name'=>'纬度','enname'=>'Latitude'),        'simid' => array('name'=>'sim卡号','enname'=>'SIM card number'),        'packageSurplus' => array('name'=>'套餐剩余','enname'=>'Package surplus'),        'poleheight' => array('name'=>'灯杆高度(m)','enname'=>'Lamp-post length(m)'),        'polediameter' => array('name'=>'灯杆直径(m)','enname'=>'Lamp-post diameter(m)'),        'polematerial' => array('name'=>'灯杆材质','enname'=>'Lamp-post materials'),        'lighttype' => array('name'=>'灯具类型','enname'=>'Light type'),        'lamptype' => array('name'=>'路灯类型','enname'=>'Lamp type'),        'boardtype' => array('name'=>'太阳能板类型','enname'=>'Solar panel type'),        'boardpower' => array('name'=>'太阳能板功率(W)','enname'=>'Solar panel power(W)'),        'batterytype' => array('name'=>'蓄电池类型','enname'=>'Battery type'),        'batteryah' => array('name'=>'蓄电池AH数(ah)','enname'=>'Battery capacity(ah)'),        'loadpower' => array('name'=>'负载功率(W)','enname'=>'LED power(W)'),        'electricleft' => array('name'=>'蓄电池剩余电量','enname'=>'Remaining battery capacity(Ah)'),        'lampvoltage' => array('name'=>'路灯电压(V)','enname'=>'Lamp voltage(V)'),        'lampcurrent' => array('name'=>'路灯电流(A)','enname'=>'Lamp current(A)'),        'temper' => array('name'=>'灯头温度(℃)','enname'=>'Lamp temperature(℃)'),        'solarvoltage' => array('name'=>'太阳能板电压(V)','enname'=>'Solar panel voltage(V)'),        'solarcurrent' => array('name'=>'太阳能板电流(A)','enname'=>'Solar panel current(A)'),        'battstatus' => array('name'=>'蓄电池状态','enname'=>'Battery status'),        'chargecurrent' => array('name'=>'蓄电池充电电流(A)','enname'=>'Charging current(A)'),        'discharcurrent' => array('name'=>'蓄电池放电电流(A)','enname'=>'Discharging current(A)'),        'chargepower' => array('name'=>'蓄电池充电功率(w)','enname'=>'Charging power(w)'),        'dischargepower' => array('name'=>'蓄电池放电功率(w)','enname'=>'Discharging power(w)'),        'batttemper' => array('name'=>'蓄电池表面温度(℃)','enname'=>'Battery surface temperature(℃)'),        'electrictotal' => array('name'=>'蓄电池总电量','enname'=>'Total battery capacity(Ah)'),        'electricSOC' => array('name'=>'蓄电池电量SOC(%)','enname'=>'Battery SOC(%)'),        'voltagedaymin' => array('name'=>'当天最低电压(V)','enname'=>'Minimum voltage(V)'),        'voltagedaymax' => array('name'=>'当天最高电压(V)','enname'=>'Highest voltage(V)'),        'daychargeah' => array('name'=>'当天充电安时数(ah)','enname'=>'Charging AH(ah)'),        'daydischarah' => array('name'=>'当天放电安时数(ah)','enname'=>'Discharging AH(ah)'),        'daychargemaxpow' => array('name'=>'当天充电最大功率(W)','enname'=>'Charging max-power(W)'),        'daydischarmaxpow' => array('name'=>'当天放电最大功率(W)','enname'=>'Discharging max-power(W)'),        'daychargemincurrent' => array('name'=>'当天灯亮时间(hh:mm)','enname'=>'Turn-on duration'),        'daycharmaxcurrent' => array('name'=>'当天充电最大电流(A)','enname'=>'Highest charging current(A)'),        'daydischargemincurrent' => array('name'=>'当天充电时间(hh:mm)','enname'=>'Charging duration'),        'daydischarmaxcurrent' => array('name'=>'当天放电最大电流(A)','enname'=>'Highest discharging current(A)'),        'daybattmintemper' => array('name'=>'当天蓄电池最低温度(℃)','enname'=>'Battery min-temperature(℃)'),        'daybattmaxtemper' => array('name'=>'当天蓄电池最高温度(℃)','enname'=>'Battery max-temperature(℃)'),        'daygeneration' => array('name'=>'当天发电量(W)','enname'=>'Power generation(W)'),        'dayconsumption' => array('name'=>'当天用电量(W)','enname'=>'Power consumption(W)'),        'totalgeneration' => array('name'=>'累计发电量(W)','enname'=>'Cumulative power generation(W)'),        'totalconsumption' => array('name'=>'累计用电量(W)','enname'=>'Cumulative power consumption(W)'),        'sysvoltage' => array('name'=>'系统电压(V)','enname'=>'System voltage(V)'),        'syscurrent' => array('name'=>'系统电流(A)','enname'=>'System current(A)'),        'controlTemper' => array('name'=>'控制器温度(℃)','enname'=>'Controller temperature(℃)'),        'rundays' => array('name'=>'运行天数','enname'=>'Running duration'),        'fulltimes' => array('name'=>'蓄电池总充满次数','enname'=>'Full charge times'),        'totalchargeah' => array('name'=>'蓄电池总充电安时数(ah)','enname'=>'Total charge AH(ah)'),        'totaldischarah' => array('name'=>'蓄电池总放电安时数(ah)','enname'=>'Total discharge AH(ah)'),        'policyid' => array('name'=>'当前策略','enname'=>'Current strategy'),    );    $temp = [];    $filedArr = explode(',', $fileds);    if ($type == 0) {        foreach ($filedArr as $f) {            if (!empty($data[$f])) {                $temp[] = $data[$f]['name'];            }        }    }else{        foreach ($filedArr as $f) {            if (!empty($data[$f])) {                $temp[] = $data[$f]['enname'];            }        }    }    return $temp;}// 翻译故障信息function alarm_translate($msg){    $data = array(        '过放' => 'over release',        '超压' => 'overpressure',        '负载短路' => 'load short circuit',        '电池故障' => 'Error display',        '内部超温' => 'internal overtemperature',        '外部超温' => 'external overtemperature',        '负载开路' => 'load opening',        '输出电容超压保护' => 'output capacitance overvoltage protection',        '电池板过流' => 'panel overcurrent',        '电池板短路' => 'panel short circuit',        '电池板超压' => 'panel overpressure',        '充电逆流' => 'charging current',        '锂电池低温关闭充电' => 'the lithium battery is turned off and charged at low temperature',        '电池电压异常' => 'Abnormal battery voltage'    );    return isset($data[$msg]) ? $data[$msg] : 'unknown error';}// 新控制器翻译故障信息function modbus_alarm_translate($msg){    $data = array(        'BMS过充保护' => 'BMS Overcharge Protection',        '电池低温保护,停止充电' => 'Battery Low Temperature Protection, Stop Charging',        '电池反接' => 'Battery reverse connection',        '电容超压' => 'Capacitance overpressure',        '感应探头损坏' => 'Damage of induction probe',        '负载开路' => 'Load open circuit',        '蓄电池过放' => 'Battery Overdischarge',        '蓄电池超压' => 'Battery overvoltage',        '欠压警告' => 'Undervoltage warning',        '负载短路' => 'Load short circuit',        '负载功率过大或负载过流' => 'Excessive Load Power or Overcurrent',        '控制器温度过高' => 'Controller temperature is too high',        '外部环境温度过高' => 'External ambient temperature is too high',        '光伏输入功率过大' => 'Excessive input power of photovoltaic',        '光伏输入端短路' => 'Photovoltaic Input Short Circuit',        '光伏输入端超压' => 'Photovoltaic Input Overvoltage',        '太阳板逆流' => 'Solar plate countercurrent',        '太阳板工作点超压' => 'Operating point overpressure of solar panel',        '太阳板反接' => 'Solar Plate Reverse Connection'    );    return isset($data[$msg]) ? $data[$msg] : 'unknown error';}function alarm_translate_ch($msg){    $data = array(        'over release' => '过放',        'overpressure' => '超压',        'load short circuit' => '负载短路',        'battery failure' => '电池故障',        'internal overtemperature' => '内部超温',        'external overtemperature' => '外部超温',        'load opening' => '负载开路',        'output capacitance overvoltage protection' => '输出电容超压保护',        'panel overcurrent' => '电池板过流',        'panel short circuit' => '电池板短路',        'panel overpressure' => '电池板超压',        'charging current' => '充电逆流',        'the lithium battery is turned off and charged at low temperature' => '锂电池低温关闭充电',        'BMS Overcharge Protection'=>'BMS过充保护',        'Battery Low Temperature Protection, Stop Charging'=>'电池低温保护,停止充电',        'Battery reverse connection'=>'电池反接',        'Capacitance overpressure'=>'电容超压',        'Damage of induction probe'=>'感应探头损坏',        'Undervoltage warning'=>'欠压警告',        'Excessive Load Power or Overcurrent'=>'负载功率过大或负载过流',        'Controller temperature is too high'=>'控制器温度过高',        'External ambient temperature is too high'=>'外部环境温度过高',        'Excessive input power of photovoltaic'=>'光伏输入功率过大',        'Photovoltaic Input Short Circuit'=>'光伏输入端短路',        'Photovoltaic Input Overvoltage'=>'光伏输入端超压',        'Solar plate countercurrent'=>'太阳板逆流',        'Operating point overpressure of solar panel'=>'太阳板工作点超压',        'Solar Plate Reverse Connection'=>'太阳板反接',    );    return isset($data[$msg]) ? $data[$msg] : '';}?>
 |