我们实现了通过Sunlogin远程控制电脑,运行python代码再通过wifi, adb控制安卓平板上的空调遥控器来遥控空调的目的。但是文章中只实现了开关键的单一功能,所以这边文章我设计了一个多功能版本,只通过一个程序实现开关,控温,调整风力,去除广告页面,反馈信息的功能。
image image'''ad_rid.py 这个模块的作用是清除广告'''
<pre class="ql-align-justify">
import os
import time
def arl():#调出遥控板程序并点击页面左上角的关闭按钮,关闭广告
os.system('adb shell am start -n com.weedle.haier_ac_remotes/com.weedle.haier_ac_remotes.InitialRoutingActivity')
time.sleep(3)
os.system('adb shell input tap 53 71')
def arm():#调出遥控板程序并点击页面中间的关闭按钮,关闭广告
os.system('adb shell am start -n com.weedle.haier_ac_remotes/com.weedle.haier_ac_remotes.InitialRoutingActivity')
time.sleep(3)
os.system('adb shell input tap 445 1382')
</pre>
'''capture_send.py 本模块的作用是截取遥控器APP的页面, 来向用户微信反馈所处的状态。'''
<pre class="ql-align-justify">
import os
import time
def cs():#截屏并发微信
os.system('adb shell am start -n com.weedle.haier_ac_remotes/com.weedle.haier_ac_remotes.InitialRoutingActivity')
time.sleep(5)
os.system('adb shell /system/bin/screencap -p /sdcard/screen.png')
time.sleep(1)
os.system('adb shell am start -n com.tencent.mm/.ui.LauncherUI')
time.sleep(5)
os.system('adb shell input tap 753 214')
time.sleep(1)
os.system('adb shell input tap 1545 2526')
time.sleep(1)
os.system('adb shell input tap 232 2208')
time.sleep(1)
os.system('adb shell input tap 246 333')
time.sleep(1)
os.system('adb shell input tap 789 2526')
time.sleep(1)
os.system('adb shell input tap 1497 95')
</pre>
'''fan_power.py 模块控制风力'''
<pre class="ql-align-justify">
import os
import time
def fp():
os.system('adb shell am start -n com.weedle.haier_ac_remotes/com.weedle.haier_ac_remotes.InitialRoutingActivity')
time.sleep(5)
os.system('adb shell input tap 783 2092')
</pre>
'''on_off_pad.py 本模块点亮或者关闭屏幕'''
<pre class="ql-align-justify">
import os
import time
def oop():
os.system('adb shell input keyevent 26')
</pre>
'''start_stop_air.py 本模块控制开关空调'''
<pre class="ql-align-justify">
import os
import time
def ssa():
os.system('adb shell am start -n com.weedle.haier_ac_remotes/com.weedle.haier_ac_remotes.InitialRoutingActivity')
time.sleep(5)
os.system('adb shell input tap 1069 1297')
</pre>
'''up_down_temp.py 本模块控制温度'''
<pre class="ql-align-justify">
import os
import time
def ut():
os.system('adb shell am start -n com.weedle.haier_ac_remotes/com.weedle.haier_ac_remotes.InitialRoutingActivity')
time.sleep(5)
os.system('adb shell input tap 788 1837')
def dt():
os.system('adb shell am start -n com.weedle.haier_ac_remotes/com.weedle.haier_ac_remotes.InitialRoutingActivity')
time.sleep(5)
os.system('adb shell input tap 778 2344')
</pre>
'''主程序'''
<pre class="ql-align-justify">
import os
import time
import sys
import easygui as eg
import ad_rid as ar
import capture_send as cs
import fan_power as fp
import on_off_pad as oop
import start_stop_air as ssa
import up_down_temp as udt
version = '远程遥控空调 1.0v 开发者:Sonic Huang'
oop.oop() #先点亮屏幕
def ask_feedback(): #定义一个反馈函数
ask_f = eg.buttonbox('请选择', version, ('反馈', '返回主菜单', '直接退出'))
if ask_f == '反馈':
cs.cs()
return 'continue'
elif ask_f == '返回主菜单':
return 'continue'
else:
return 'break'
while True: #询问是否确定APP的状态,再作出反应和操作
ask_p = eg.buttonbox('是否确定APP状态?', version, ('确定', '反馈', '清除广告'))
if ask_p == '确定':
break
if ask_p == '反馈':
cs.cs()
continue
if ask_p == '清除广告':
ask_a = eg.buttonbox('关闭键的位置', version, ('左上角', '中间', '其他'))
if ask_a == '左上角':
ar.arl()
continue
elif ask_a == '中间':
ar.arm()
continue
else:
continue
</pre>
<pre class="ql-align-justify">
while True: #主要的控制
ask_f = eg.buttonbox('请选择需要的功能', version, ('开关', '控温', '风力'))
if ask_f == '开关':
ssa.ssa()
ask_fe = ask_feedback()
if ask_fe == 'continue':
continue
else:
break
if ask_f == '控温':
ask_ud = eg.buttonbox('请选择需要的功能', version, ('升温', '降温','维持'))
if ask_ud == '升温':
udt.ut()
if ask_ud == '降温':
udt.dt()
ask_fe = ask_feedback()
if ask_fe == 'continue':
continue
else:
break
if ask_f == '风力':
fp.fp()
ask_fe = ask_feedback()
if ask_fe == 'continue':
continue
else:
break
else:
break
oop.oop() #熄屏
sys.exit()
</pre>
总结:
- 再次定义循环内的函数,通过返回字符串'continue', 'break'来实现简化代码的目的。
- 再次使用easygui来增强交互。(我目前唯一知道用的模块)
- 处理adb wifi连接异常
- a. 端口被占用
- adb出现启动异常,kill-server或者start-server无反应,或是提示无法启动daemon等,可能是端口被占用了。adb默认的端口是5037, 我们要找到占用这个端口的进程,并结束他就可以了。方法如下:1.cmd命令 netstat -aon|findstr '5037' 2. 如果显示出如下 TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 3676 表示3676进程号的程序占用了5037端口 3.打开windows任务管理器-->查看 -->选择列 -->勾选上 PID(进程标识符), 找到标识符是3676的进程,结束进程树。4.如果无法结束进程树,可以先设置优先级为低,然后结束进程树。进程树表示跟该进程相关联的一些进程。
b. 重启adb
如果端口没有被占用,还是无法运行adb, 可以在任务管理窗口结束adb的进程。在重新打开cmd, adb start-server
c. 重启usb调试
如果adb运行正常,能够ping通安卓设置的ip, 但是adb connect setip连接异常(有时出现第一次连接失败,第二次开始连接成功,但是adb devices还是现实设备offline,几次后又看不到设备),可以在开发者选项出重新勾选usb调试。
d. 重启用监听端口
如果上面的方法还是连接不上设备,就要用usb重新连接电脑,设备上确认授权电脑等,然后adb tcpip 8888 (也可以用其他端口), 这时设备上需要确认连接。然后再用adb连接设备的IP。
e. 在USB连接的情况下重启USB调试和删除所有已授权电脑
前面的方法都不行的话,拔掉USB, 撤回USB出错授权,和重新勾选USB调试,插上USB重复上面的步骤。
f. Google
网友评论