• 支持节假日,支持经纬度,支持调休时控器


    1.时控器为什么要支持经纬度?

       我国地大物博,每个地区天亮天黑时间不一样,东部沿海与中部地区相差近1个小时.新疆地区更多,北京时间晚上23点还没黑.因此PHP 函数date_sunrise()可以直接根据经纬度输出天黑时间.

    http://www.wmdfw.com/jiejiari/jiejiari.php
    返回JSON数据:
    zhouein({"code":"200","msg":"success","newslist":[{"city":"HangZhou","cnweekday":"星期四","correctsunsettime":"17:31","date":"2020-11-12","daycode":0,"end":"","enname":"","holiday":"","info":"工作日","isnotwork":0,"latitude":"30.26667","longitude":"120.20000","lunarday":"廿七","lunarmonth":"九月","lunaryear":"庚子","name":"","remarks":"不开灯","rest":"","start":"","sunrisetime":"06:25","sunsettime":"17:01","tip":"","vacation":"","weekday":4}]})
    View Code

    2.目前我们法定节假日是根据国务院办公厅下发通知,春节,元旦,端午等休息,又考虑到五一放个小长假,将前后某几天周末调休.每年都不一样,程序上很难实现统一的标准.因此写了一个法定节假日的列表.

    //法定节假日 daycode=1 
        $lst_holiday = [
            '2020-1-1' => '元旦',
            '2020-1-24' => '春节',
            '2020-1-25' => '春节假',
            '2020-1-26' => '春节假',
            '2020-1-27' => '春节假',
            '2020-1-28' => '春节假',
            '2020-1-29' => '春节假',
            '2020-1-30' => '春节假',
            '2020-4-4' => '清明节',
            '2020-4-5' => '清明假',
            '2020-4-6' => '清明假',
            '2020-5-1' => '劳动节',
            '2020-5-2' => '劳动假',
            '2020-5-3' => '劳动假',
            '2020-5-4' => '劳动假',
            '2020-5-5' => '劳动假',
            '2020-6-25' => '端午节',
            '2020-6-26' => '端午假',
            '2020-6-27' => '端午假',
            '2020-10-1' => '国庆',
            '2020-10-2' => '国庆假',
            '2020-10-3' => '国庆假',
            '2020-10-4' => '国庆假',
            '2020-10-5' => '国庆假',
            '2020-10-6' => '国庆假',
            '2020-10-7' => '国庆假',
            '2020-10-8' => '国庆假',
        ];
     
     
        // 调休日 (传统节日前后补班)daycode=3
        $lst_working_day = [
            '2020-1-19' => '春节调休',
            '2020-2-1' => '春节调休',
            '2020-4-26' => '劳动节调休',
            '2020-5-9' => '劳动节调休',
            '2020-6-28' => '端午调休',
            '2020-9-27' => '国庆调休',
            '2020-10-10' => '国庆调休',
        ];
    3.剩下就是诸如周末休假具有规律的查询,PHP 语言也好,其他的语言都很轻松.
        $weekarray=array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
        $cnweekday = $weekarray[date("w",strtotime($date))];
    
        if((date('w',strtotime($date))==6) || (date('w',strtotime($date)) == 0)){
            if (key_exists($date, $lst_working_day)) {
                $daycode=3;
                $info = "调休日";
                //echo "{'daycode':".$daycode."}";
                //echo "调休日";
             }
    
    
    
    4.上全代码:
    <?php
    //header("Content-Type: text/html; charset=utf-8");
    header('Content-type: application/json');  
    if(isset($_REQUEST["callback"])){
       $callback = $_REQUEST["callback"];
       }else{
       $callback = "zhouein";
       }
    if(isset($_REQUEST["date"])){
       $date = $_REQUEST["date"];
       }else{
       $date = date("Y-m-d");
       }
    if(isset($_REQUEST["correcttime"])){
       $correcttime = $_REQUEST["correcttime"];
       }else{
       $correcttime = 30;  //修正时间,正为延迟,负为提前,单位分钟
       }
    if(isset($_REQUEST["latitude"])){
       $latitude = $_REQUEST["latitude"];
       }else{
       $latitude = '30.26667';
       }
    if(isset($_REQUEST["longitude"])){
       $longitude = $_REQUEST["longitude"];
       }else{
       $longitude = '120.20000';
       }
    if(isset($_REQUEST["tianding"])){
       $tianding = $_REQUEST["tianding"];
       }else{
       $tianding = 90;
       }
    if(isset($_REQUEST["shiqu"])){
       $shiqu = $_REQUEST["shiqu"];
       }else{
       $shiqu = 8;
       }
        //计算日落日出时间
        $sunrise = date_sunrise(time(),SUNFUNCS_RET_STRING,$latitude,$longitude,$tianding,$shiqu);
        $sunset=date_sunset(time(),SUNFUNCS_RET_STRING,$latitude,$longitude,$tianding,$shiqu);
        $sunsetcorrect = date("H:i", strtotime("$sunset +$correcttime min"));
    function is_weekend($date,$callback){
    //法定节假日 daycode=1 
        $lst_holiday = [
            '2020-1-1' => '元旦',
            '2020-1-24' => '春节',
            '2020-1-25' => '春节假',
            '2020-1-26' => '春节假',
            '2020-1-27' => '春节假',
            '2020-1-28' => '春节假',
            '2020-1-29' => '春节假',
            '2020-1-30' => '春节假',
            '2020-4-4' => '清明节',
            '2020-4-5' => '清明假',
            '2020-4-6' => '清明假',
            '2020-5-1' => '劳动节',
            '2020-5-2' => '劳动假',
            '2020-5-3' => '劳动假',
            '2020-5-4' => '劳动假',
            '2020-5-5' => '劳动假',
            '2020-6-25' => '端午节',
            '2020-6-26' => '端午假',
            '2020-6-27' => '端午假',
            '2020-10-1' => '国庆',
            '2020-10-2' => '国庆假',
            '2020-10-3' => '国庆假',
            '2020-10-4' => '国庆假',
            '2020-10-5' => '国庆假',
            '2020-10-6' => '国庆假',
            '2020-10-7' => '国庆假',
            '2020-10-8' => '国庆假',
        ];
     
     
        // 调休日 (传统节日前后补班)daycode=3
        $lst_working_day = [
            '2020-1-19' => '春节调休',
            '2020-2-1' => '春节调休',
            '2020-4-26' => '劳动节调休',
            '2020-5-9' => '劳动节调休',
            '2020-6-28' => '端午调休',
            '2020-9-27' => '国庆调休',
            '2020-10-10' => '国庆调休',
        ];
        $weekarray=array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
        $cnweekday = $weekarray[date("w",strtotime($date))];
    
        if((date('w',strtotime($date))==6) || (date('w',strtotime($date)) == 0)){
            if (key_exists($date, $lst_working_day)) {
                $daycode=3;
                $info = "调休日";
                //echo "{'daycode':".$daycode."}";
                //echo "调休日";
             }
            elseif (key_exists($date, $lst_holiday)) {
                $daycode=1;
                $info = "法定节假日";
                //echo "{'daycode':".$daycode."}";
                //echo "法定节假日";
             }else{
                $daycode=2;
                $info = "双休日";
                //echo '双休日'.date('w',strtotime($date)).'$daycode=2'; 
             }
    
          }else{
              //echo '工作日'.date('w',strtotime($date));
              $daycode=0;
              $info = "工作日";
              //echo "{'daycode':".$daycode."}";
          }
          //print_r($daycode);
          $arry= array(
            'code' => '200',
            'msg' => 'success',
            'newslist' => array(
                '0'=>array(
                    'city' => 'HangZhou',
                    'cnweekday' => $cnweekday,
                    'correctsunsettime' => '17:37',
                    'date' => '2020-10-11',
                    'daycode'=>$daycode,
                    'end' => '',
                    'enname' => '',
                    'holiday' => '',
                    'info' => $info,
                    'isnotwork' => 1,
                    'latitude' => '30.26667',
                    'longitude' => '120.20000',
                    'lunarday' => '廿五',
                    'lunarmonth' => '八月',
                    'lunaryear' => '庚子',
                    'name' => '',
                    'remarks' => '开灯',
                    'start' => '',
                    'sunrisetime' => '06:18',
                    'sunsettime' => '17:07',
                    'tip' => '',
                    'vacation' => '',
                    'weekday' => 0
               )
            ),
                  
          );
          $json_date=json_encode($arry,JSON_UNESCAPED_UNICODE);//转换为json数据
          //print_r($arry);
          echo $callback."(".$json_date.")";
          
       }
    is_weekend($date,$callback);
    ?>
    View Code
    
    

      5.查询别的平台,再显示的数据的代码:

    <?php
    //header("Content-Type: text/html; charset=utf-8");
    header('Content-type: application/json');          
    if(isset($_REQUEST["callback"])){
       $callback = $_REQUEST["callback"];
       }else{
       $callback = 'zhouein';
       }
    if(isset($_REQUEST["date"])){
       $date = $_REQUEST["date"];
       }else{
       $date = date("Y-m-d");
       }
    if(isset($_REQUEST["correcttime"])){
       $correcttime = $_REQUEST["correcttime"];
       }else{
       $correcttime = 30;  //修正时间,正为延迟,负为提前,单位分钟
       }
    if(isset($_REQUEST["latitude"])){
       $latitude = $_REQUEST["latitude"];
       }else{
       $latitude = '30.26667';
       }
    if(isset($_REQUEST["longitude"])){
       $longitude = $_REQUEST["longitude"];
       }else{
       $longitude = '120.20000';
       }
    if(isset($_REQUEST["tianding"])){
       $tianding = $_REQUEST["tianding"];
       }else{
       $tianding = 90;
       }
    if(isset($_REQUEST["shiqu"])){
       $shiqu = $_REQUEST["shiqu"];
       }else{
       $shiqu = 8;
       }
        //计算日落日出时间
        $sunrise = date_sunrise(time(),SUNFUNCS_RET_STRING,$latitude,$longitude,$tianding,$shiqu);
        $sunset=date_sunset(time(),SUNFUNCS_RET_STRING,$latitude,$longitude,$tianding,$shiqu);
        $sunsetcorrect = date("H:i", strtotime("$sunset +$correcttime min"));
        //查询国家法定节假日
        $date = file_get_contents ('http://api.tianapi.com/txapi/jiejiari/index?key=KEY自己申请&date='.$date );//API接口
        $json = json_decode($date,true);//将json解析成数组
        $tip=$json['newslist']['0']['tip'];
    
    function zhouein($latitude,$longitude,$sunrise,$sunset,$sunsetcorrect,$tip,$json,$remarks,$callback){
          $number = array(
                'city'              => 'HangZhou',
                'latitude'          => $latitude,
                'longitude'         => $longitude,
                'sunrisetime'       => $sunrise,
                'sunsettime'        => $sunset,
                'correctsunsettime' => $sunsetcorrect,
                'remarks'               => $remarks
                
                );
        $hebing = array_merge_recursive($json['newslist']['0'], $number);
        ksort($hebing);
        $arryA= array(
            'code' => '200',
            'msg' => 'success',
            'newslist' => Array
                  (
                  '0' =>$hebing
                  )
        );
    
        $json_date=json_encode($arryA,JSON_UNESCAPED_UNICODE);//转换为json数据
        //print_r($arryA);
        echo $callback ."(". $json_date.")";
    }
    
      if($json['code'] == 200){ //判断状态码
          if($json['newslist']['0']['daycode'] == 0){
            zhouein($latitude,$longitude,$sunrise,$sunset,$sunsetcorrect,$tip,$json,$remarks='不开灯',$callback);
          }
          if($json['newslist']['0']['daycode'] == 1){
            zhouein($latitude,$longitude,$sunrise,$sunset,$sunsetcorrect,$tip,$json,$remarks='开灯',$callback);
          }
          if($json['newslist']['0']['daycode'] == 2){
            zhouein($latitude,$longitude,$sunrise,$sunset,$sunsetcorrect,$tip,$json,$remarks='开灯',$callback);
          }
          if($json['newslist']['0']['daycode'] == 3){
            zhouein($latitude,$longitude,$sunrise,$sunset,$sunsetcorrect,$tip,$json,$remarks='不开灯',$callback);
          }
    
        }else{    
            echo "返回错误,状态消息:".$json['msg'];
          }
    
    
    ?>
      6.因此,我们想在休息日(周末,以及法定节假日,排除调休)在天黑前打开路灯,我们是不是不难做到了?  再举例来说,工作日(周一到周五,以及调班,排除法定节假日).
    7.接下来,我们需要去找一个智能开关,目前市场上的云平台只支持简单的周一到周日,几点到几点,很显然是不支持法定佳节日和经纬度天黑.我们将解析到的JSON数据,定时同步到云平台即可.
    8.根据有人物联网云平台提供的API,采用 PHP 中的函数CURL 去模拟登录,提交数据.见代码:
    <?php
    //公共方法
    /**
     * 模拟post进行url请求
     * @param $postUrl
     * @param $curlPost
     * @return string
     */
    function http_json_data($postUrl, $curlPost, $token) {
        if (empty($postUrl) || empty($curlPost)) {
            return false;
        }
        $ch = curl_init();//初始化curl
        $header = array();
        $header[] = 'Accept:application/json';
        $header[] = 'Content-Type:application/json';
        //兼容新版api接口,token在header中请求
        $header[] = 'token:'.$token;
        curl_setopt($ch, CURLOPT_URL,$postUrl);//抓取指定网页
        curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//验证对方的SSL证书
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//检查声称服务器的证书的身份
        $data = curl_exec($ch);//运行curl
        curl_close($ch);
        return $data;
        
    }
    function json_to_array($data) {    //得到数组,JSON转数组
          $data = json_decode($data,JSON_UNESCAPED_UNICODE);
          return $data;
       }
    function array_to_json($data) {    //得到JSON,数组转JSON
          $data = json_encode($data,JSON_UNESCAPED_UNICODE);
          return $data;
       }
    
       //登陆,想得到token
       $curlPost='{"account":"ci78dny8","password":"密码为MD5后的小写","platformId":"W3rfV"}';
       /* $curlPost=array{
           "account"=>"ci78dny8",
           "password"=>"密码为MD5后的小写",
           "platformId"=>"W3rfV"
           }; */
       $getToken = http_json_data($postUrl='https://openapi.mp.usr.cn/usrCloud/user/login', $curlPost,$token='');
       $usrInfo = json_decode($getToken,JSON_UNESCAPED_UNICODE);
       //$usrInfo = json_to_array($data);
       //echo $getToken;
       $token = $usrInfo['data']['token'];
       echo "//得到Token";
       echo "<BR>";
       echo $token;
       echo "<BR>";
       //得到定时器列表
       //$curlPost = '{"uid":'.$usrInfo['data']['uid'].'}';
       /* $curlPost = array{
             "uid"=>$usrInfo['data']['uid']
       } */
       //$getTask=http_json_data($postUrl='https://api.mp.usr.cn/usrCloud/timing/getTimingTasksByUid', $curlPost, $token);
       //echo $getTask;
    
       //修改定时器
       //$curlPost = '{"id":1330,"name":"u672au547du540d_u5b9au65f6u4efbu52a1_78","projectId":33222,"cronType":1,"recordType":1,"deviceNo":"01001219121100008587","taskTargets":[{"slaveIndex":"1","dataId":587555,"sendData":"0","cronWeek":"7,1","cronHour":"18","cronMinute":"44"}]}';
    
       //$updateTask=http_json_data($postUrl='https://api.mp.usr.cn/usrCloud/timing/updateTimingTask', $curlPost, $token);
       //echo $updateTask;
       //增加定时器
       $curlPost = '{"name":"u672au547du540d_u5b9au65f6u4efbu52a1_12","projectId":33222,"cronType":1,"recordType":1,"deviceNo":"01001219121100008587","taskTargets":[{"slaveIndex":"1","dataId":587555,"sendData":"0","cronWeek":"2,1,7","cronHour":22,"cronMinute":4,"startDt":1605141168000,"endDt":4102415940000,"taskType":1}]}';
    
       $updateTask=http_json_data($postUrl='https://api.mp.usr.cn/usrCloud/timing/addTimingTask', $curlPost, $token);
       echo "<BR>";
       echo "//反馈增加定时器结果";
       echo $updateTask;
    View Code
  • 相关阅读:
    Django REST Framework
    Django REST Framework 序列化和校验 知识点
    Django REST Framework 数码宝贝
    浏览器的跨域解决方案
    Django Rest Framework 简介及 初步使用
    javaScript
    jQuery 事件流的概念
    jQuery 文档操作
    Django
    crm 系统项目(三) 业务
  • 原文地址:https://www.cnblogs.com/zhouein/p/13963412.html
Copyright © 2020-2023  润新知