回答
Hamibot 提供了多种方式来获取设备的电量和状态,主要通过脚本 API 和 REST API 两种途径。
1. 通过脚本 API 获取设备信息(在自动化脚本中)
在 Hamibot 的自动化脚本里,你可以使用 device 对象来获取当前运行脚本的手机的实时状态。
获取电量:
// 文档地址 https://docs.hamibot.com/
var batteryLevel = device.getBattery(); // 返回 0.0 ~ 100.0 的浮点数
log("当前电量: " + batteryLevel + "%");
获取其他设备状态:
// 文档地址 https://docs.hamibot.com/
// 检查是否在充电
var isCharging = device.isCharging();
log("是否正在充电: " + isCharging);
// 检查屏幕是否点亮
var isScreenOn = device.isScreenOn();
log("屏幕是否亮着: " + isScreenOn);
// 获取设备总内存(字节)
var totalMem = device.getTotalMem();
log("设备总内存: " + totalMem + " B");
// 获取设备当前可用内存(字节)
var availMem = device.getAvailMem();
log("可用内存: " + availMem + " B");
注意: device.getBattery() 等方法获取的是脚本当前运行设备的信息,无法直接通过脚本获取云端其他设备的信息。
2. 通过 REST API 获取设备列表和状态(远程管理)
你可以使用 Hamibot 的 REST API 来查询你账户下所有设备的基本状态,包括是否在线、型号等,但API 目前不直接返回设备的实时电量。
获取设备列表:
// 文档地址 https://docs.hamibot.com/
var res = http.request('https://api.hamibot.com/v1/devices', {
method: 'GET',
headers: {
authorization: '你的令牌(hmp 开头)', // 需要替换为你的实际令牌
},
});
var deviceList = res.body.json();
log(JSON.stringify(deviceList));
API 返回的示例数据包含设备在线状态、标签、名称、品牌和型号:
{
"count": 1,
"items": [
{
"_id": "a51d237e9af41ecc021c9ff6",
"online": true,
"tags": ["tag1", "tag2"],
"name": "零号机",
"brand": "Xiaomi",
"model": "MI 11"
}
]
}
获取特定设备信息:
使用 GET /v1/devices/设备_id 可以获取指定设备的详细信息,返回字段与上述列表一致。
总结对比
| 方式 | 电量获取 | 状态获取 | 范围 | 主要用途 |
|---|---|---|---|---|
脚本 API (device 对象) |
支持 (getBattery()) |
支持 (充电状态、屏幕状态、内存等) | 仅限脚本当前运行的设备 | 在自动化脚本中根据本机状态做逻辑判断 |
| REST API | 不支持 | 支持部分 (在线状态 online、设备型号信息) |
账户下所有设备 | 远程管理和监控设备池,查看设备是否在线 |
因此,如果你需要在脚本中根据当前手机电量决定是否执行任务,应使用 device.getBattery()。如果你只是想通过一个外部系统(如你自己的服务器)查看哪些设备在线,则应使用 REST API 查询设备列表。目前没有直接的 API 可以远程查询某一台设备的实时电量。
补充回答 1
在 Hamibot 应用内的“设备”栏点击设备查看详情时,获取电量、内存、充电状态等信息,是通过 脚本 API 实现的,而不是 REST API。
其原理是:远程向该设备下发一个简短的诊断脚本并执行,然后将脚本收集到的信息返回给应用界面。
实现原理与步骤
- 建立连接:当你点击设备详情时,Hamibot 应用(或云端)会通过已建立的 WebSocket 或长连接通道,向你选中的那个在线设备发送一个指令。
- 下发并执行脚本:这个指令包含一段内置的 JavaScript 代码(诊断脚本),设备上的 Hamibot 服务会接收并立即在自身环境中运行这段代码。
- 收集本地信息:这段脚本在目标设备本地运行,因此可以调用
device对象的所有 API 来获取该设备的实时信息。 - 回传数据:脚本执行完毕后,将收集到的数据(如电量、内存状态)通过通信通道发送回请求方(即 Hamibot 应用或云端服务器)。
- 前端展示:应用收到数据后,将其展示在设备详情页面上。
模拟这个过程的脚本代码
如果你想在自己的脚本中实现类似功能来监控本机,可以使用如下代码:
// 文档地址 https://docs.hamibot.com/
// 此脚本模拟了设备详情页收集信息的功能
function collectDeviceInfo() {
var info = {};
// 1. 获取电量
info.batteryLevel = device.getBattery(); // 返回 0.0 ~ 100.0 的浮点数
// 2. 获取充电状态
info.isCharging = device.isCharging();
// 3. 获取内存信息
info.totalMemory = device.getTotalMem(); // 总内存,单位字节
info.availableMemory = device.getAvailMem(); // 可用内存,单位字节
// 计算已用内存百分比(示例)
info.memoryUsagePercent = ((info.totalMemory - info.availableMemory) / info.totalMemory * 100).toFixed(2);
// 4. 获取屏幕状态
info.isScreenOn = device.isScreenOn();
// 5. 其他可能的信息(根据需求添加)
// info.alarmVolume = device.getAlarmVolume(); // 注意:需要权限
return info;
}
// 收集并打印信息
var deviceInfo = collectDeviceInfo();
log("设备诊断信息:");
log("当前电量: " + deviceInfo.batteryLevel + "%");
log("充电状态: " + (deviceInfo.isCharging ? "正在充电" : "未充电"));
log("总内存: " + (deviceInfo.totalMemory / (1024 * 1024)).toFixed(2) + " MB");
log("可用内存: " + (deviceInfo.availableMemory / (1024 * 1024)).toFixed(2) + " MB");
log("内存使用率: " + deviceInfo.memoryUsagePercent + "%");
log("屏幕状态: " + (deviceInfo.isScreenOn ? "亮屏" : "熄屏"));
// 在实际的远程调用场景中,这里会将 deviceInfo 对象发送回服务器
// 例如:http.post('https://your-server.com/device-info', deviceInfo);
关键点说明
- 本地性:所有
device.getBattery()、device.getTotalMem()等 API 调用都必须在目标设备上运行的脚本中执行,才能获取到该设备自身的实时信息。无法从一台设备或服务器直接远程读取另一台设备的这些传感器/系统数据。 - 权限:像
device.getAlarmVolume()这样的函数需要特定的系统权限(如“修改系统设置”)。如果脚本没有权限,可能会抛出异常或跳转到权限设置界面。标准的设备信息收集通常不需要这类敏感权限。 - 与 REST API 的区别:你之前看到的
GET /v1/devices等 REST API 用于设备资产管理(查看设备是否在线、名称、型号等静态或基础状态),而无法获取动态的传感器数据(电量、实时内存)。动态数据必须通过上述“下发脚本-执行-回传”的机制获得。
总结来说:设备详情页的实时数据是通过远程控制该设备执行一个信息收集脚本来实现的。如果你想在自己的项目中间接获取这些数据,你需要编写一个类似的脚本,并利用 Hamibot 的脚本执行控制机制(如定时任务或远程触发)来让目标设备运行这个脚本并将数据上报到你的服务器。