在介绍本节内容之前,让我们先做一点准备工作,即在我们官网上下载并安装 Total Control软件。
JS API 和 REST API 是 Total Control 提供一系列脚本自动化接口,通过这些接口,可以对一个设备或多个设备操作。
当 Total Control 软件连接设备时(单击”连接”按钮或自动连接),将创建一个对象,该对象包含所有与设备相关的属性和功能,以执行对设备的操作/输入。一旦设备断开连接,对象将被销毁,每一个设备一个对象,设备的对象标识为设备 ID,设备 ID 格式为 “device@ <10位数字>”。
脚本需要设备 ID 来对设备执行查询或操作,Device.searchObject()提供了获取单个设备 ID 或多个设备 ID 的各种方法。有关与设备 ID 关联的属性,请参阅 JS API 手册 和 REST API 手册,有两种类型的功能:
设备 ID 是一个字符串,设备列表是一个数组。JS API 对单个设备操作使用 “device.
var device = Device.getMain(); //获取当前主控设备对象 var devices = Device.searchObject(sigmaConst.DevAll); //获取当前连接的所有设备 //对设备操作 device.click(0.100, 0.100); // 在主设备上点击相对坐标0.100, 0.100 devices.click(0.100, 0.100); // 在所有连接的设备上点击坐标0.100, 0.100 //获取设备属性值 device.IP; // 设备的IP地址 device.DPI; // 设备屏幕的像素尺寸 device.IMEI; // 设备的 IMEI 号
大部分 JS API 都有与其对应的 REST API,所以我们可以用两种不同的接口对单个或多个设备操作。更多接口请参见
例如,关闭指定包名的 app 的 JS API 和与其对应的 REST API:
REST API 地址以” http://IP:8090/TotalControl/v1/devices”开头,要获得设备对象,得先获得 Total Control 脚本开发所用的开发 token(REST API 认证机制,请求方式:GET, http://IP:8090/TotalControl/v1/login),再是获得设备对象,最后是对设备对象操作。
例如,在设备中对焦点输入框进行文字输入,其中,text 为输入的文字内容
//对单设备操作
http://IP:8090/TotalControl/v1/devices/device=:device/screen/texts
{
"token":"270eq7lXQK8bXYsJ",
"text":"33333",
}
//对多设备操作
http://IP:8090/TotalControl/v1/devices/ids/screen/texts
{
"token":"270eq7lXQK8bXYsJ",
"text":"33333",
"ids":["device@1116106541","device@1116106541"]
}
我们可以用多种方法获取手机这个设备对象,既可以获得单个设备对象,也可以获得设备对象集合。
下面我们介绍JS API与其相对应的 REST API获取设备对象的几种方法,不是所有的 JS API 获取设备对象都有相对应的 REST API(REST API 获取设备对象的请求方法 GET):
//(单设备)获取当前主控设备对象 Device.getMain() http://IP:8090/TotalControl/v1/devices/main?token=:token //(单设备)通过给定的设备名称获取设备对象 Device.searchObject() http://IP:8090/TotalControl/v1/devices?name=:name&token=:token //(单设备)通过给定的设备序列号获取设备对象 Device.searchObject(sigmaConst.DevSerial, ) //(多设备)获取当前连接Total Control的所有设备的对象集合 Device.searchObject(sigmaConst.DevAll) http://IP:8090/TotalControl/v1/devices?q=all&token=:token //(多设备)根据给定的组名称获取组内所有设备的对象集合 Device.searchObject(sigmaConst.DevGroup, ) http://IP:8090/TotalControl/v1/devices?q=group&name=:name&token=:token //(单设备)运行脚本后,弹出一个设备选择框,根据选择的一个设备进行设备对象获取 Device.searchObject(sigmaConst.DevSelectOne) //(多设备)运行脚本后,弹出一个设备选择框,根据选择的多个设备进行设备对象集合获取 Device.searchObject(sigmaConst.DevSelectMult) //(多设备)运行脚本后,弹出一个设备组选择窗口,根据选择的一个设备组获取组内所有设备的对象集合 Device.searchObject(sigmaConst.DevSelectGroup)
这里用Total Control JS API “TCHttpRequest”来解释怎么使用REST API,更多TCHttpRequest接口信息请看JS API手册,REST API对设备操作的步骤如下:
1. Base64编码用户名和密码
打开Total Control软件,在系统设置的REST API栏中找到REST API的账户信息(如下图所示),当然这里的用户名和密码也可以根据个人喜好改成其他的,用户名和密码用于token建立连接,获取token需要将用户名密码按照Base64编码。
将用户名和密码(username:password)组装进行 base64 编码生成字符串。 用户可以根据自己的代码语言,用其提供的方法将用户名和密码按照Base64编码。也可以用这个工具,http://tool.oschina.net/encrypt?type=3,在明文处输入” sigma:3D391497”点击BASE64编码,就可以获得BASE64编码值” c2lnbWE6M0QzOTE0OTc=”。
2. 获取 Total Control 脚本开发所用的开发 token
请求方式:GET
http://IP:8090/TotalControl/v1/login
//这里的“c2lnbWE6M0QzOTE0OTc=”是步骤一获得的BASE64编码值
var res = TCHttpRequest("http://localhost:8090/TotalControl/v1/login","GET",{Authorization:" c2lnbWE6M0QzOTE0OTc="},"",2000);
//用content来输出内容
print(res.content);
返回结果
//获得的token值就是" OEPux5xceiyIGO6r"
{"status":true,"value":{"token":" OEPux5xceiyIGO6r"}}
3. REST API 获取设备对象
REST API获取设备对象有很多种方法,请求方式GET,请看文章“获取设备对象方法”栏,这里的token就是第二步获取的token值" OEPux5xceiyIGO6r",IP就是IP地址。
//获取当前主控设备对象,返回值:设备对象,{"id":"device@-230441652"},对应的JS API 是Device.getMain()
TCHttpRequest("http://IP:8090/TotalControl/v1/devices/main?token=:token","GET",{},"",2000);
4. REST API 操作设备对象
对坐标(100,200)发送点击事件,请求方式POST,这里的device是步骤3获得的值,token是步骤2获得的值,x,y是这个REST API需要填的坐标值,state表示点击(按下+弹起)
//发送点击事件,对应的JS API 是device.click(x, y, state);
http://IP:8090/TotalControl/v1/devices/device@-230441652/screen/inputs
{
"token":"270eq7lXQK8bXYsJ",
"x":100,
"y":200,
"state":"press"
}
JS API实现打开手机上的QQ音乐软件
//获取设备对象device
var device = Device.getMain();
//用runApp(AppName) 打开QQ音乐
var runapp=device.runApp("com.tencent.qqmusic");
if (runapp == 0){
print("成功打开QQ音乐软件");
} else{
print(lastError());
}
运行结果
//当成功打开手机上的QQ音乐软件,则输出: 成功打开QQ音乐软件 //当打开QQ音乐软件失败,则输出错误信息
REST API实现打开手机上的QQ音乐软件
#!/user/bin/python
#-*- coding:utf-8 -*-
import urllib.parse
import urllib
import http.client
import json
import urllib.parse
import base64
import time
from argparse import Namespace
#定义一些基本的变量
REST_CONN = 'localhost:8090'
REST_BASIC_PATH = 'http://' + REST_CONN + '/TotalControl/v1/'
conn = http.client.HTTPConnection(REST_CONN)
user_pass = 'sigma:3D391497'
#定义获取token方法
#请求方式:GET,http://IP:8090/TotalControl/v1/login
def login(conn,key):
request_url = REST_BASIC_PATH + "login"
header = {'Authorization':key}
conn.request(method="GET", url=request_url, headers=header)
response = conn.getresponse()
res = response.readline()
return res
#定义获取设备对象方法
#请求方式:GET,http://IP:8090/TotalControl/v1/devices/main
def getMain(conn,token):
request_url = REST_BASIC_PATH + "devices/main?token="+token
conn.request(method="GET", url=request_url)
response = conn.getresponse()
res = response.readline()
resp = json.loads(res)
main = resp['id']
return main
#定义打开软件的方法
#请求方式:POST,http://IP:8090/TotalControl/v1/devices/:device/apps/:packageName
def runApp(conn,deviceId,appName,state,token):
request_url = REST_BASIC_PATH + "devices/" + deviceId + "/apps/" + appName
body={'state':state,'token':token}
body=json.dumps(body).encode(encoding='utf-8')
conn.request(method="POST",url=request_url,body=body)
response = conn.getresponse()
res = response.readline()
return res
print("第一步: Base64编码用户名和密码")
encodeStr=base64.b64encode(user_pass.encode("UTF-8"))
print("Base64编码后的值为: " ,encodeStr)
print("第二步: 获取token")
#json.loads 用于解码 JSON 数据
res=login(conn,encodeStr)
resp = json.loads(res)
token=resp['value']['token']
print("获取到的token为:",token)
print("第三步: 获取设备对象")
deviceId=getMain(conn,token)
print("获取到的设备对象为:",deviceId)
print("第四步: 打开QQ音乐软件")
ret = runApp(conn,deviceId,"com.tencent.qqmusic","active",token)
ret_json = json.loads(ret)
print(ret_json)
#休眠五秒
time.sleep(5)
运行结果
第一步: Base64编码用户名和密码
Base64编码后的值为: b'c2lnbWE6M0QzOTE0OTc='
第二步: 获取token
获取到的token为: cSb8XU8JQAk85X7d
第三步: 获取设备对象
获取到的设备对象为: device@-230441652
第四步: 打开QQ音乐软件
{'status': True, 'value': 'make it active.'}