案例:
市场上的定时器,只支持简单的按日期,星期几点到几点执行, 几乎没有做到按国家法定节假日来执行指令
例如国家法定节假日前后周末调休,既是周末,也不是周一到周五.做一个支持法定节假日的数据列表.得到JSON数据.
云平台定时去查询这个接口返回JSON数据去修改简单的定时器,就做到了支持法定节假日功能的定时器
在功能上,增加了按经纬度获取日出日落时间,如下.
<?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);
?>
有人物联网云平台https://mp.usr.cn 提供了API接口.
接口见http://cloud.usr.cn/document/117.html
首先封装一个PHP 函数,登录带Cookies
<?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;
}
Curl模拟登录得到token
//登陆,想得到token
$curlPost='{"account":"ci78XXXX","password":"密码的MD5加密","platformId":"W3rfV"}';
/* $curlPost=array{
"account"=>"ci78XXXX",
"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;
接下来根据API 增加一个定时器,获取列表,修改一个定时器.均能实现
//得到定时器列表
//$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;
以下是完整PHP 源代码
<?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":"ci78XXXX","password":"密码的MD5加密","platformId":"W3rfV"}';
/* $curlPost=array{
"account"=>"ci78XXXX",
"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;