|
本帖最后由 咫尺望佳人 于 2025-3-30 20:38 编辑
使用python代码建立TCP连接对接巴法云平台,实现小爱同学开关机电脑。
软件实现,完全免费。不用智能插座,不用pci卡。
方案总体思路:在局域网运行一个米家支持的“代码运行的虚拟设备”,小爱同学的指令发送到虚拟设备,虚拟设备运行代码发送数据开关机电脑。
需要解决两个问题:
- 寻找米家或其它智能家居支持的第三方平台。
- 局域网里有一个设备一直待机,且能运行程序,对接第三方平台设备,发送网络唤醒数据包。
----------------------------------------------------
我这里选用的是openwrt路由器和巴法云平台。
openwrt路由要有足够的运行内存和磁盘空间安装python3运行环境,代码是用python写的。
电脑主板bios和系统好先设置好网络唤醒,固定电脑IP地址,静态dhcp或其它,测试ok再继续。
--------------------------
具体步骤:
- 注册巴法云账号,(可选安装手机APP):https://bemfa.com
- 在巴法云控制台,获得密钥和新建主题,
请先查看一下设备类型说明:https://cloud.bemfa.com/docs/src/index_device.html
推荐主题名以开关设备的006结尾。
并在主题的更多设置里修改一下昵称,这个昵称将用在小爱语音中。 - 安装代码运行环境
登录openwrt路由,opkg软件包安装python3和coreutils-nohup - 上传编辑好的代码到op路由器,并设置开机自启动,启动项-->本地启动脚本-->插入一行:
sleep 180s & nohup python /root/bemfa/bemfa.py > /dev/null 2>&1 &
说明:
- sleep 180s是给断电后光猫启动和拨号预留足够的时间。
- nohup是linux系统用来保持python后台运行的,需要先安装软件包coreutils-nohup
- "/root/bemfa/bemfa.py" 是代码存放路径,需要与实际路径对应,
root路径下可能会在系统sysupgrade后消失,请自行选择路径。 - “/dev/null” 是输出日志的保存路径,/dev/null用来忽略不保存,py代码已有日志路径
- 最后的 "2>&1 &" 符号不能删。
- 保存后可以登录ssh手动运行py代码或直接重启路由器:
nohup python /root/bemfa/bemfa.py > /dev/null 2>&1 &
可在巴法云控制台或app查看设备状态,
在线则表示代码正在运行,订阅主题的TCP已连接,
离线则表示代码未能运行。
具体问题可查看输出日志:cat /tmp/bemfa.log - 米家APP绑定设备
- 打开米家App,>我的>添加其它平台>点击添加>巴法>绑定账号 ,绑定巴法账号
- 绑定成功后,支持小爱控制的巴法设备会出现在 我的>其他平台设备>巴法 设备列表中,或者手动点击同步设备
- 第三方的设备只有小爱同学语音能控制,米家里不会单独显示,不能在自动化里面操作,但可以在小爱训练里面操作。
- 此时喊小爱同学开你的设备昵称,比如“打开电脑”。到这里就实现语音开机了。
如果不能开机在op路由里安装luci-app-wol,手动唤醒试试。或者在巴法云控制台或app点击操作,或查看输出日志分析问题。 - 剩下如何让小爱同学关电脑
到了这一步,实现的方法有很多,我用的方法是:
- 在op路由器的py代码中监听TCP的 ‘33333’端口,让电脑端主动连接,当运行关闭电脑时发送指令到电脑端。
- 在电脑端也运行一个python代码,连接路由器的TCP ‘33333’端口,如果接收到指定的数据就运行关机命令。
这样的好处是可以实时判断电脑是否开机,将向巴法云发送心跳包和更新状态的功能合二为一。还避免长期使用ping命令。
这里不是非要用python,用java,nodejs,c/c++等语言实现都行。 -------------------------------------------------------------------------------------------------
----------------------------------------------------------
代码文件:
链接:https://pan.baidu.com/s/1C37ASQoqB9vVqcH0ykcSUQ?pwd=qxun
----------------------------------------------------------
python语言的代码缩进的是非常严格的,不要随意添加删除或加空格回车,
尽量使用代码编辑器编辑和格式化代码。
openwrt运行的python代码需自行修改两处:
- UID 修改成自己的密钥
- DEVICES 按照格式修改订阅主题和电脑的信息
需要支持几台电脑就插入几个数组对象
openwrt路由的py代码运行时将使用约18M内存。
windows电脑端运行的关机代码bemfa_shutdown.py:
bemfa_shutdown.py修改说明:
- gl_server_ip:修改为服务器的实际IP地址
- gl_tcp_port:tcp连接端口,须和op路由器代码的一致:33333
- gl_cmd:这一行可不用修改,shutdown.exe使用的是绝对路径,可避免环境变量问题。
shutdown的参数-t时间可自己延长一些,避免说错话就把电脑关了,
要是不想关了可立即打开cmd输入“shutdown -a”取消计划关机
再新建一个bat批处理,并设置开机自启:
添加计划任务,开机启动时运行bat文件:
bat里写上:start / b pythonw ./bemfa_shutdown.py
"./bemfa_shutdown.py"是代码的实际路径,必须对应上
开机后可在任务管理器中查看是否有python进程在运行
----------------------------------------
巴法云平台的文档:https://cloud.bemfa.com/docs/src/tcp.html
----------------------------------------
以下是python代码逻辑说明,AI总结的:
用于与巴法云服务器进行通信,并实现设备的远程唤醒和关机功能。以下是该系统的设计逻辑总结:
### 配置管理
- **AppConfig 类**:集中管理所有配置项,包括服务器IP地址、端口、重连延迟、心跳包发送间隔时间、日志文件路径及大小限制等。
### 日志管理
- **setup_logging 函数**:设置日志记录的方式,使用`RotatingFileHandler`来确保日志文件不会无限增长,并设定日志级别为DEBUG。
- **logger 函数**:自定义的日志记录函数,能够在每条日志信息前加上设备的`topic`信息,便于区分不同设备的日志输出。
### 网络通信
- **send_magic_packet 函数**:根据MAC地址发送魔术包(Magic Packet),用于远程唤醒设备。
- **connect_and_monitor 函数**:
- 建立与巴法云服务器的TCP连接,并订阅指定主题。
- 启动一个后台线程定期发送心跳包以保持连接。
- 接收来自服务器的数据,将数据缓存并在每次接收后检查是否有完整的消息(以`\n`分隔)。若有,则处理消息并根据内容决定是否发送唤醒或关机命令。
- **handle_client 函数**:处理从设备端发起的TCP连接请求,当设备连接时更新其在线状态,断开时则标记为离线。
- **start_tcp_server 函数**:在指定接口上启动TCP服务器,监听来自设备的连接请求,并为每个连接启动一个新的线程调用`handle_client`处理。
### 心跳包管理
- **heartbeat_payloads 字典**:存储每个设备的心跳包内容,以便于发送心跳包时直接获取而无需判断设备状态。
- **update_heartbeat_payload 函数**:根据设备的状态(上线或下线)更新对应的心跳包内容。
### 主流程控制
- **main 函数**:
- 初始化日志记录。
- 根据设备列表中的信息,针对每个网络接口启动TCP服务器监听设备连接。
- 对于每个设备,建立到巴法云服务器的连接并监控消息,同时初始化其心跳包内容为离线状态。
### 多线程支持
整个系统广泛使用了多线程技术,通过`threading.Thread`为每个需要独立运行的任务(如心跳检测、消息监听、客户端处理等)创建新的线程,保证系统的并发性和响应速度。
这种设计使得系统能够有效地管理多个设备的连接状态,及时响应来自巴法云服务器的指令,并对设备执行相应的操作(如唤醒或关机),同时也确保了良好的可扩展性和维护性。
---------------------------------------- |
|