hamibot 支持hid 设备吗?代码怎么写?
// 引入蓝牙模块
importClass(android.bluetooth.BluetoothAdapter);
importClass(android.bluetooth.BluetoothDevice);
importClass(android.bluetooth.BluetoothGatt);
importClass(android.bluetooth.BluetoothGattCallback);
importClass(android.bluetooth.BluetoothGattCharacteristic);
importClass(java.util.UUID);
// 调用蓝牙
var connectedGatt = null;
var isConnected = false;
var targetDevice = null;
// 初始化蓝牙适配器,只需一次
var bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// 检查并请求权限
// 获取当前 Android API 级别
var sdkVersion = android.os.Build.VERSION.SDK_INT;
// 判断是否为 Android 12 或以上版本
if (sdkVersion >= 31) {
// Android 12 或以上版本,使用 BLUETOOTH_CONNECT 权限方案
var BLUETOOTH_CONNECT_PERMISSION = "android.permission.BLUETOOTH_CONNECT";
if (context.checkSelfPermission(BLUETOOTH_CONNECT_PERMISSION) != android.content.pm.PackageManager.PERMISSION_GRANTED) {
context.requestPermissions([BLUETOOTH_CONNECT_PERMISSION], 1);
} else {
var bluetoothAdapter = android.bluetooth.BluetoothAdapter.getDefaultAdapter();
if (!bluetoothAdapter.isEnabled()) {
bluetoothAdapter.enable();
}
}
} else {
// Android 12 以下版本,不需要 BLUETOOTH_CONNECT 权限
var bluetoothAdapter = android.bluetooth.BluetoothAdapter.getDefaultAdapter();
if (!bluetoothAdapter.isEnabled()) {
bluetoothAdapter.enable();
}
}
像以上的这些代码,hamibot支持吗?
给一个使用蓝牙 HID 设备的代码例子
回答
对不起,我已经学习的知识中不包含问题相关内容,暂时无法提供答案。可以发送邮件到 support@hamibot.cn 寻求帮助,如果你有Hamibot产品的其他相关问题,我会帮助你解答。
补充回答 1
// 文档地址 https://docs.hamibot.com/
Hamibot 基于 Android 平台运行脚本,支持调用 Android SDK 提供的原生 API,包括蓝牙相关功能。你提供的代码逻辑在技术方向上是正确的,但需要根据 Hamibot 的运行环境和权限机制进行适当调整。
以下是关键点说明:
importClass支持
Hamibot 使用 Rhino 1.7.15 作为 JavaScript 引擎,支持通过importClass导入 Java 类,因此以下导入语句在 Hamibot 中是合法且可用的:
importClass(android.bluetooth.BluetoothAdapter);
importClass(android.bluetooth.BluetoothDevice);
importClass(android.bluetooth.BluetoothGatt);
importClass(android.bluetooth.BluetoothGattCallback);
importClass(android.bluetooth.BluetoothGattCharacteristic);
importClass(java.util.UUID);
- 权限处理注意事项
Hamibot 脚本无法直接响应requestPermissions的回调(如onRequestPermissionsResult),因为脚本运行在自动化环境中,不具备 Activity 上下文来处理动态权限请求。
- 对于 Android 12+(API 31+)的
BLUETOOTH_CONNECT权限,你需要手动在设备设置中授予该权限给 Hamibot 应用,否则即使调用requestPermissions,也不会弹窗或生效。 - 推荐做法:提前在手机设置 → 应用管理 → Hamibot → 权限中,开启所有必要权限(尤其是位置和蓝牙相关权限,某些 ROM 要求位置权限才能扫描蓝牙设备)。
-
蓝牙适配器启用建议
bluetoothAdapter.enable()是异步操作,在无用户交互的环境下可能被系统禁止静默开启。建议确保设备已手动打开蓝牙,避免脚本依赖自动开启。 -
BluetoothGattCallback 兼容性问题
Rhino 不完全支持 Java 接口实现语法(如匿名内部类)。要在 Hamibot 中使用BluetoothGattCallback,需通过扩展 Java 类的方式创建回调对象,例如:
var GattCallback = android.bluetooth.BluetoothGattCallback.extend({
onConnectionStateChange: function(gatt, status, newState) {
if (newState === android.bluetooth.BluetoothProfile.STATE_CONNECTED) {
isConnected = true;
log("BLE 设备连接成功");
gatt.discoverServices();
} else if (newState === android.bluetooth.BluetoothProfile.STATE_DISCONNECTED) {
isConnected = false;
log("BLE 设备断开连接");
}
},
onServicesDiscovered: function(gatt, status) {
if (status === android.bluetooth.BluetoothGatt.GATT_SUCCESS) {
log("服务发现成功");
// 可在此读取特征值或订阅通知
}
},
onCharacteristicRead: function(gatt, characteristic, status) {
if (status === android.bluetooth.BluetoothGatt.GATT_SUCCESS) {
log("读取特征值:" + Arrays.toString(characteristic.getValue()));
}
}
});
var gattCallback = new GattCallback();
- UUID 和其他 Java 类使用
java.util.UUID可正常使用,但在构造时注意语法兼容性,例如:
var serviceUUID = java.util.UUID.fromString("0000180F-0000-1000-8000-00805F9B34FB");
var charUUID = java.util.UUID.fromString("00002A19-0000-1000-8000-00805F9B34FB");
- 完整连接示例(简化版)
// 文档地址 https://docs.hamibot.com/
importClass(android.bluetooth.BluetoothAdapter);
importClass(android.bluetooth.BluetoothGatt);
importClass(java.util.UUID);
var bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (!bluetoothAdapter) {
toast("设备不支持蓝牙");
exit();
}
if (!bluetoothAdapter.isEnabled()) {
toast("请先打开蓝牙");
exit();
}
// 假设已知目标设备 MAC 地址
var deviceMac = "XX:XX:XX:XX:XX:XX";
var device = bluetoothAdapter.getRemoteDevice(deviceMac);
// 使用上述定义的 GattCallback 实例
var gatt = device.connectGatt(context, false, gattCallback);
setTimeout(function() {
if (gatt && !isConnected) {
gatt.disconnect();
gatt.close();
log("连接超时");
}
}, 10000);
总结
Hamibot 支持你列出的蓝牙相关代码结构
补充回答 2
// 文档地址 https://docs.hamibot.com/
Hamibot 运行在 Android 系统上,而 Android 本身作为 HID(Human Interface Device)的**主机(Host)**角色,通常用于连接和使用如蓝牙键盘、鼠标等外设。这意味着你可以通过 Hamibot 脚本触发某些操作来与已配对的蓝牙 HID 设备交互(例如模拟点击、滑动),但不能将运行 Hamibot 的设备变成一个 HID 从设备(比如虚拟成键盘向手机输入),因为这需要底层协议栈支持和特定权限,一般 Android 不开放此功能。
不过,如果你的目标是:
✅ 利用已连接的蓝牙 HID 设备(如扫码枪、手柄、键盘)触发或配合自动化任务,那么 Hamibot 可以监听这些输入并执行相应脚本。
✅ 示例:使用蓝牙 HID 扫码枪自动处理扫描结果
很多蓝牙扫码枪工作在 SPP 或 HID 模式下,当它扫描条码时,会像键盘一样输入文本并以回车结尾。你可以在 Hamibot 中监听输入框内容变化,捕获扫码结果并自动提交。
// 文档地址 https://docs.hamibot.com/
// 启用无障碍服务
auto.waitFor();
// 等待目标应用界面出现(例如订单录入页面)
app.launch("com.example.wms");
// 等待输入框可点击
var inputBox = null;
while (!inputBox) {
inputBox = className("EditText").findOnce();
sleep(1000);
}
inputBox.click();
toast("请使用扫码枪扫描条码");
// 监听输入框内容变化
events.observeText(function(texts) {
// 扫码枪通常以 '\n' 结尾,匹配最后一条文本
for (var i = texts.length - 1; i >= 0; i--) {
var text = texts[i].text.trim();
if (text && text.length > 3) { // 假设条码长度大于3
log("扫码成功: " + text);
// 自动点击“确认”按钮
var confirmBtn = textMatches(/(确认|提交|Save)/).findOnce();
if (confirmBtn) {
confirmBtn.click();
toast("已提交: " + text);
}
// 清空输入框以便下次扫描
inputBox.setText("");
break;
}
}
});
// 持续运行,直到脚本被停止
setInterval(() => {}, 1000);
💡 说明:该方案适用于所有以“键盘输入”方式工作的蓝牙 HID 设备(如扫码枪、刷卡器)。无需额外蓝牙 API,只需确保设备已配对并启用。
❌ 不支持:将 Hamibot 设备模拟为蓝牙 HID 键盘
你不能使用 Hamibot 将你的 Android 设备变成一个蓝牙键盘去向其他设备(如另一台手机或电脑)发送按键消息。原因如下:
- 需要启用 Bluetooth HID Device Profile(HID over GATT, HOGP),Android 默认不支持。
- 即使部分 ROM 支持,也需要 root 和系统级配置。
- Hamibot 无权调用
BluetoothAdapter.listenUsingRfcommChannel()或注册 HID 服务描述符。
因此,以下代码在 Hamibot 中无法实现:
// ❌ 以下功能在普通 Hamibot 环境中不可行
bluetoothAdapter.startHidDeviceServer(); // 不存在的方法
✅ 替代方案建议
如果你想实现“远程控制其他设备”的效果,可以考虑:
-
使用 ADB + USB OTG + 物理 HID 设备
将一个物理微控制器(如 Arduino Pro Micro)连接到 Android 设备 USB 接口,编程为 HID 键盘,由 Hamibot 发送指令给串口控制其输出。 -
结合外部 BLE Central 设备(如 ESP32)
使用 ESP32 模拟 BLE HID Keyboard,Hamibot 通过 HTTP 或本地通信通知 ESP32 发送按键。 -
远程输入法 + 网络同步
在目标设备安装自定义输入法,Hamibot 通过网络请求推送文本内容进行输入。
总结
- Hamibot 支持使用蓝牙 HID 外设(如扫码枪、键盘)作为输入源。
- 可通过
events.observeText()捕获 HID 输入并驱动自动化流程。 - 不支持将运行 Hamibot 的设备变为蓝牙 HID 输出设备(即不能模拟键盘