【问题标题】:How to call writeValue in Web Bluetooth with Wireshark (Reverse engineer bluetooth device)如何使用 Wireshark(反向工程蓝牙设备)在 Web 蓝牙中调用 writeValue
【发布时间】:2020-10-19 20:08:23
【问题描述】:

我正在尝试对蓝牙设备进行逆向工程,以便创建可以与之通信的自己的应用程序。

我已经设法从我的 Android 手机获取蓝牙日志,并且还能够通过网络连接到蓝牙设备。

不幸的是,每当我尝试向特征写入值时,都会收到错误消息: bluetooth.html:1 Uncaught (in promise) DOMException: GATT operation failed for unknown reason.

在 Wireshark 中,我在写请求中找到的值为: 0120030000000000

如何在 Javascript 中发送此内容? 我尝试了以下方法,但都不起作用:

characteristic.writeValue(0x0120030000000000)
characteristic.writeValue(new Uint16Array([0x0120030000000000]));
characteristic.writeValue(new Uint8Array([0x0120030000000000]));
characteristic.writeValue(new Uint16Array([0x0120030000000000]));
characteristic.writeValue(new TextEncoder("utf-16").encode(0x0120030000000000));

我知道原始值为 0120030000000000,如何通过 ArrayBuffer 发送?

【问题讨论】:

    标签: javascript reverse-engineering web-bluetooth


    【解决方案1】:

    假设 Wireshark 已将数据编码为十六进制,那么您应该像这样创建一个 Uint8Array

    new Uint8Array([0x01, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00])
    

    如果在您的程序中将这些数据表示为字符串很方便,那么您可以编写一个函数来构建Uint8Array,通过一次解析两个字符的字符串。

    【讨论】:

    • 这适用于任何设备吗?我有一个 HM-17 模块,想向它发送一系列十六进制值。尝试了许多不同的设置,但徒劳无功。最后一个是你的吗?我错过了什么吗?我们需要将格式设置为 Uint8 吗?
    • 当您说“发送一个十六进制值序列”时有些歧义。这可能意味着您有一系列十六进制值(如我的示例中),并且您希望将这些值表示的字节发送到设备。这也可能意味着设备需要用 ASCII 编写的十六进制值,即原始示例中的文字字符串 "0120030000000000"。在这种情况下,您将使用new TextEncoder('utf-8').encode("0120030000000000")。无论哪种方式,Web 蓝牙 API 都需要一个 ArrayBuffer(或像 Uint8Array 这样的缓冲区视图)并将其内容发送到设备。
    • 我明白你的意思。很多歧义。有时您还认为十六进制值是 char 值的表示等。这就是为什么我使用“发送十六进制值”的表达方式,十六进制值只是一个数字。我目前正在发送characteristic.writeValue(new Uint8Array([0xbb, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x7e, 0x0A]),我把0x0A放在我的价值流的末尾(十六进制值“新行"),但它不起作用。似乎我做错了什么。使用 DSD 蓝牙应用程序,我正在发送相同的序列(作为十六进制值)并且我得到了立即响应
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2016-07-05
    • 2014-10-04
    相关资源
    最近更新 更多