hamibot 支持hid 设备吗?代码怎么写?

已存档
QP脚本 · 21 天前
第 1 条补充
·
21 天前

// 引入蓝牙模块
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支持吗?

第 2 条补充
·
21 天前

给一个使用蓝牙 HID 设备的代码例子

回答

Hamibot AI
1
· 21 天前

对不起,我已经学习的知识中不包含问题相关内容,暂时无法提供答案。可以发送邮件到 support@hamibot.cn 寻求帮助,如果你有Hamibot产品的其他相关问题,我会帮助你解答。


补充回答 1

// 文档地址 https://docs.hamibot.com/

Hamibot 基于 Android 平台运行脚本,支持调用 Android SDK 提供的原生 API,包括蓝牙相关功能。你提供的代码逻辑在技术方向上是正确的,但需要根据 Hamibot 的运行环境和权限机制进行适当调整。

以下是关键点说明:

  1. 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);
  1. 权限处理注意事项
    Hamibot 脚本无法直接响应 requestPermissions 的回调(如 onRequestPermissionsResult),因为脚本运行在自动化环境中,不具备 Activity 上下文来处理动态权限请求。
  • 对于 Android 12+(API 31+)的 BLUETOOTH_CONNECT 权限,你需要手动在设备设置中授予该权限给 Hamibot 应用,否则即使调用 requestPermissions,也不会弹窗或生效。
  • 推荐做法:提前在手机设置 → 应用管理 → Hamibot → 权限中,开启所有必要权限(尤其是位置和蓝牙相关权限,某些 ROM 要求位置权限才能扫描蓝牙设备)。
  1. 蓝牙适配器启用建议
    bluetoothAdapter.enable() 是异步操作,在无用户交互的环境下可能被系统禁止静默开启。建议确保设备已手动打开蓝牙,避免脚本依赖自动开启。

  2. 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();
  1. 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");
  1. 完整连接示例(简化版)
// 文档地址 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(); // 不存在的方法

✅ 替代方案建议

如果你想实现“远程控制其他设备”的效果,可以考虑:

  1. 使用 ADB + USB OTG + 物理 HID 设备
    将一个物理微控制器(如 Arduino Pro Micro)连接到 Android 设备 USB 接口,编程为 HID 键盘,由 Hamibot 发送指令给串口控制其输出。

  2. 结合外部 BLE Central 设备(如 ESP32)
    使用 ESP32 模拟 BLE HID Keyboard,Hamibot 通过 HTTP 或本地通信通知 ESP32 发送按键。

  3. 远程输入法 + 网络同步
    在目标设备安装自定义输入法,Hamibot 通过网络请求推送文本内容进行输入。


总结

  • Hamibot 支持使用蓝牙 HID 外设(如扫码枪、键盘)作为输入源。
  • 可通过 events.observeText() 捕获 HID 输入并驱动自动化流程。
  • 不支持将运行 Hamibot 的设备变为蓝牙 HID 输出设备(即不能模拟键盘
ℹ️ 本回答由 AI 生成,内容仅供参考