三川智控定时控制开关灯

三川智控定时控制开关灯

    • 代码
    • 使用
      • 命令行模式
      • web模式
      • 定时

代码

配置文件
config.env

client_id=100002
client_secret=123456
username=123456
password=123456
api=http:/aaa.abc.com:88/
<?php
class Single
{protected $config;public function __construct(){// 从 config.env 文件中读取配置信息$this->config = parse_ini_file('config.env');}public function open($name,$status){if(empty($name))return '不能为空';// 获取开关信息接口$controlSwitchUrl = $this->config['api'] . 'stu/workerman/single';$accessToken = $this->getAccessToken();$headers = array('Authorization: Bearer ' . $accessToken);$switchData = $this->getSingle();// 控制开关接口$key = array_search($name, array_column($switchData, "name"));if ($key !== false) {$channelId = $switchData[$key]['channel_id'];} else {return "未找到匹配的信息";}// 构造控制开关请求参数$controlData = array('channel_id' => $channelId,'status' => $status);// 发送控制开关请求$controlSwitchResponse = $this->sendRequest($controlSwitchUrl, 'POST', $controlData, $headers);$this->log(json_encode($controlSwitchResponse));// 解析控制开关响应if (isset($controlSwitchResponse['msg'])) {$res['code'] = true;$res['msg'] = $name."控制结果: " . $controlSwitchResponse['msg'];} else{$res['code'] = false;$res['msg'] = json_encode($controlSwitchResponse);}return $res;}// 发送HTTP请求的函数private function getAccessToken(){// 文件缓存路径$cacheFilePath = 'access_token.cache';// 检查是否存在有效的 accessToken 缓存if (file_exists($cacheFilePath)) {$cache = unserialize(file_get_contents($cacheFilePath));$accessToken = $cache['access_token'];if ($cache['expires_time'] > time() && $this->refresh($accessToken))return $accessToken;}// 如果没有有效的 accessToken 缓存,进行登录认证$accessToken = $this->login();if ($accessToken) {// 缓存 accessToken$cache = $accessToken;$cache['expires_time'] = time() + $accessToken['expires_in'];file_put_contents($cacheFilePath, serialize($cache));return $accessToken;} else {echo "认证失败";}}public function login(){// 在这里实现登录认证并获取 accessToken 的逻辑// 使用 $config 中的配置信息发送登录请求,并解析响应获取 accessToken// 返回获取到的 accessToken 或者返回 false 如果认证失败// 你可以参考之前提供的示例代码// 注意要使用缓存的配置信息// 登录接口$loginUrl = $this->config['api'] . 'oauth/token';$loginData = array('grant_type' => 'password','client_id' => $this->config['client_id'],'client_secret' => $this->config['client_secret'],'username' => $this->config['username'],'password' => $this->config['password']);// 发送登录请求$loginResponse = $this->sendRequest($loginUrl, 'POST', $loginData);// 解析登录响应,获取Bearer Token$accessToken = isset($loginResponse['access_token']) ? $loginResponse : '';if (empty($accessToken)) {die("登录失败");}return $accessToken;}private function getSingle(){// 文件缓存路径$cacheFilePath = 'switch_data.cache';// 检查是否存在有效的 accessToken 缓存if (file_exists($cacheFilePath)) {$cache = unserialize(file_get_contents($cacheFilePath));$data = $cache['switch_data'];if ($cache['expires_time'] > time())return $data;}// 获取开关信息接口$getSwitchUrl = $this->config['api'] . 'stu/home/single';$accessToken = $this->getAccessToken();$headers = array('Authorization: Bearer ' . $accessToken);$getSwitchResponse = $this->sendRequest($getSwitchUrl, 'POST', array(), $headers);// 解析获取开关信息响应$switchData = isset($getSwitchResponse['data']) ? $getSwitchResponse['data'] : '';$cache['switch_data'] = $switchData;$cache['expires_time'] = time() + 86400 * 15;file_put_contents($cacheFilePath, serialize($cache));return $switchData;}function sendRequest($url, $method, $data = array(), $headers = array()){$ch = curl_init();if ($method === 'POST') {curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));} elseif ($method === 'GET') {$url .= '?' . http_build_query($data);}curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);if (!empty($headers)) {curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);}$response = curl_exec($ch);curl_close($ch);return json_decode($response, true);}function refresh($accessToken){$url = $this->config['api'] . '/stu/home/refresh';$headers = array('Authorization: Bearer ' . $accessToken);$getSwitchResponse = $this->sendRequest($url, 'POST', array(), $headers);// 解析获取开关信息响应$switchData = isset($getSwitchResponse['data']) ? $getSwitchResponse['data'] : 0;return $switchData;}function log($message){// 将消息写入到文件$filePath = date("Y-m-d").".log";error_log("\n".date("Y-m-d H:i:s").$message, 3, $filePath);return true;}}

start.php

<?php
require_once('Single.php');
// 命令行入口点
if (php_sapi_name() === 'cli') {$name = $argv[1];$status = $argv[2];var_dump($argv);
} else {$name = isset($_GET['name']) ? $_GET['name'] : '';$status = isset($_GET['status']) ? $_GET['status'] : 0;
}$single = new Single();
//重试次数
$tryCount = 4;
$i = 0;
//失败,重复请求
while ($i < $tryCount) {$res = $single->open($name,$status);echo $res['msg']."\n";if ($res['code']){break;}$i++;sleep(5);
}

使用

参数解释

name 开关名称

status 开关状态0关1开

命令行模式

php start.php 房间 0

第一个参数name 第二个参数status

web模式

http://abc.com/start.php?name=&status=0

定时

  • linux corntab 里添加定时任务
  • 宝塔里添加定时任务
php start.php 阳台 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/95270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch入门之【tensor】

目录 tensor的创建tensor的相关信息tensor的运算 tensor的创建 1.手动创建 import torch test1torch.tensor([1,2,3])#一维时为向量 test2torch.tensor([[1,2,3]])#二维时为矩阵 test3torch.tensor([[[1,2,3]]])#三维及以上统称为tensor print(test1) print(test2) print(tes…

Python---类的定义和使用语法

定义&#xff1a; # 类的定义和使用语法 """ class 类名称: # 定义类类的属性(成员变量)类的行为(成员方法) 对象 类名称() # 创建对象 对象.类的属性 # 使用 对象.类的行为 # 使用 """# 成员方法的定义语法 #…

容器安全检测工具KubeHound使用

目录 前言 安装 下载kubehound 启动kubehound后端服务 连接服务器 参考 前言 Kubernetes集群攻击路径AES工具 安装

rust cargo

一、cargo是什么 Cargo是Rust的构建工具和包管理器。 Cargo除了创建工程、构建工程、运行工程等功能&#xff0c;还具有下载依赖库、编译依赖等功能。 真正编写程序时&#xff0c;我们不直接用rustc&#xff0c;而是用cargo。 二、使用cargo &#xff08;一&#xff09;使用…

【RP-RV1126】烧录固件使用记录

文章目录 烧录完整固件进入MASKROM模式固件烧录升级中&#xff1a;升级完成&#xff1a; 烧录部分进入Loader模式选择文件切换loader模式 烧录完整固件 完整固件就是update.img包含了所有的部件&#xff0c;烧录后可以直接运行。 全局编译&#xff1a;./build.sh all生成固件…

TCP端口崩溃,msg:socket(): Too many open files

一、现象 linux系统中运行了一个TCP服务器&#xff0c;该服务器监听的TCP端口为10000。但是长时间运行时发现该端口会崩溃&#xff0c;TCP客户端连接该端口会失败&#xff1a; 可以看到进行三次握手时&#xff0c;TCP客户端向该TCP服务器的10000端口发送了SYN报文&#xff0c;…

leetcode做题笔记162. 寻找峰值

峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须实现时间复杂度为 O(…

(二)正点原子STM32MP135移植——TF-A移植

目录 一、TF-A概述 二、编译官方代码 2.1 解压源码 2.2 打补丁 2.3 编译准备 &#xff08;1&#xff09;修改Makfile.sdk &#xff08;2&#xff09;设置环境变量 &#xff08;3&#xff09;编译 三、移植 3.1 复制官方文件 3.2 修改电源 3.3 修改TF卡和emmc 3.4 添…

【面试HOT100】哈希双指针滑动窗口

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于LeetCodeHot100进行的&#xff0c;每个知识点的修正和深入主要参考…

【数据结构与算法】树、二叉树的概念及结构(详解)

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--树以及二叉树的概念与结构 目录 一.树概念及结构 1.树的概念 1.1树与非树 树的特点&#xff1…

对象数组去重

针对去重问题&#xff0c;有这么几种解决方式&#xff0c;如Set&#xff0c;for循环遍历属性值等。 问题如下&#xff1a; // 对象数组去重&#xff0c;只要对象的所有属性值相同&#xff0c;则表示相同对象。 const arr [{ a: 1, b: 2 },{ b: 2, a: 1 },{ a: 1, b: 2, c: {…

计算机网络---TCP/UDP

TCP/UDP 1、TCP三次握手 四次挥手? TCP是一种面向连接的、可靠的字节流服务。在建立TCP连接时,需要进行三次握手,而在关闭TCP连接时,需要进行四次挥手。具体来说,TCP三次握手的过程如下: 客户端向服务端发送SYN报文,表示请求建立连接。服务端收到SYN报文后,向客户端发…

XXL-JOB源码梳理——一文理清XXL-JOB实现方案

分布式定时任务调度系统 流程分析 一个分布式定时任务&#xff0c;需要具备有以下几点功能&#xff1a; 核心功能&#xff1a;定时调度、任务管理、可观测日志高可用&#xff1a;集群、分片、失败处理高性能&#xff1a;分布式锁扩展功能&#xff1a;可视化运维、多语言、任…

部署并应用ByteTrack实现目标跟踪

尽管YOLOv8已经集成了ByteTrack算法&#xff0c;但在这里我还是想利用ByteTrack官网的代码&#xff0c;自己实现目标跟踪。 要想应用ByteTrack算法&#xff0c;首先就要从ByteTrack官网上下载并安装。虽然官网上介绍得很简单&#xff0c;只需要区区6行代码&#xff0c;但对于国…

【计算机网络笔记八】应用层(五)HTTPS

什么是 HTTPS HTTPS 解决了 HTTP 不安全的问题 HTTP 整个传输过程数据都是明文的&#xff0c;任何人都能够在链路中截获、修改或者伪造请求&#xff0f;响应报文&#xff0c;数据不具有可信性。 ① HTTPS 使用加密算法对报文进行加密&#xff0c;黑客截获了也看不懂 ② HTTP…

Play Beyond:Sui让优秀的游戏变得更好

自问世以来&#xff0c;视频游戏就紧随着文化产业发展。从Pong和Space Invaders的时代到Animal Crossing和Among Us&#xff0c;伟大的游戏总有能力吸引玩家&#xff0c;并推动娱乐产业发展。根据Grand View Research的数据&#xff0c;全球视频游戏市场在2022年估计为2170.6亿…

CUDA C编程权威指南:1.1-CUDA基础知识点梳理

主要整理了N多年前&#xff08;2013年&#xff09;学习CUDA的时候开始总结的知识点&#xff0c;好长时间不写CUDA代码了&#xff0c;现在LLM推理需要重新学习CUDA编程&#xff0c;看来出来混迟早要还的。 1.CUDA 解析&#xff1a;2007年&#xff0c;NVIDIA推出CUDA&#xff08…

java练习 day5

一、Nim 游戏 1、题目链接 点击跳转到题目位置 2、代码 class Solution {public boolean canWinNim(int n) {if(n % 4 0){return false;}return true;} }3、知识点 (1) 通过模拟来寻找 规律。 二、区域和检索 - 数组不可变 1、题目链接 点击跳转到题目位置 2、代码 …

Docker 日志管理 - ELK

Author&#xff1a;rab 目录 前言一、Docker 日志驱动二、ELK 套件部署三、Docker 容器日志采集3.1 部署 Filebeat3.2 配置 Filebeat3.3 验证采集数据3.4 Kibana 数据展示3.4.1 创建索引模式3.4.2 Kibana 查看日志 总结 前言 如何查看/管理 Docker 运行容器的日志&#xff1f;…