imediacorp/Hantek-10008B

GitHub: imediacorp/Hantek-10008B

这是一个通过逆向工程开发的 Python 驱动库,旨在解决 Hantek 1008B 示波器在 macOS 和 Linux 平台上缺乏官方驱动支持的问题。

Stars: 0 | Forks: 0

# 适用于 macOS/Linux 的 Hantek 1008B Python 驱动 [![Python Version](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) [![Platform](https://img.shields.io/badge/platform-macOS%20%7C%20Linux-lightgrey.svg)](https://github.com/imediacorp/Hantek-10008B) [![Release](https://img.shields.io/github/v/release/imediacorp/Hantek-10008B)](https://github.com/imediacorp/Hantek-10008B/releases) 一个用于在 macOS 和 Linux 上控制 Hantek 1008B 8 通道 USB 示波器的 Python 库。该驱动是通过逆向工程 USB 协议捕获数据开发的,提供了对设备的完全控制。 ## 功能 - ✅ **跨平台**:适用于 macOS (ARM64/Intel) 和 Linux - ✅ **USB 网桥支持**:自动处理通过 USB 网桥连接的设备 - ✅ **多通道**:同时采集所有 8 个通道的数据 - ✅ **完整协议**:完整实现 USB 通信协议 - ✅ **易于使用**:简单的 Python API 用于设备控制 - ✅ **无依赖**:仅需要 pyusb 和 libusb ## 为什么存在此项目 Hantek 1008B 是一款流行的 8 通道示波器,但 **官方 Mac 支持有限或根本不存在**。在联系制造商未获回复后,该驱动通过逆向工程从 Windows 软件捕获数据中提取 USB 协议而创建,使该设备能够在 macOS 和 Linux 平台上使用。 **这填补了社区的一个真正空白** - 拥有 Hantek 1008B 设备的 Mac 用户现在可以使用他们的硬件了! ## 安装 ### 前置条件 **macOS (Apple Silicon):** ``` # 通过 Homebrew 安装 libusb /opt/homebrew/bin/brew install libusb # 或者对于 Intel Mac brew install libusb ``` **Linux:** ``` sudo apt-get install libusb-1.0-0 # 或 sudo yum install libusb ``` ### Python 包 ``` pip install pyusb ``` 然后将 `hantek1008b` 目录复制到您的项目中,或者安装它: ``` cd hantek1008b_standalone pip install -e . ``` ## 快速开始 ``` from hantek1008b import Hantek1008B # 连接到设备 scope = Hantek1008B() if not scope.connect(): print("Device not found") exit(1) # 初始化 scope.initialize() # 从通道 1-2 读取数据 data = scope.read_channels([1, 2], samples=1024) # 处理数据 for channel, voltages in data.items(): print(f"Channel {channel}: {len(voltages)} samples") print(f" Min: {min(voltages):.3f}V, Max: {max(voltages):.3f}V") ``` ## API 参考 ### `Hantek1008B` 用于设备控制的主类。 #### `connect(backend=None) -> bool` 连接到 Hantek 1008B 设备。如果成功则返回 `True`。 **参数:** - `backend`:可选的 USB 后端(用于自定义 libusb 路径) **示例:** ``` scope = Hantek1008B() if scope.connect(): print("Connected!") ``` #### `initialize() -> bool` 初始化设备。必须在连接后调用。 #### `read_channels(channels, samples=4096, voltage_range=5.0, timeout=3000) -> dict` 从指定通道读取数据。 **参数:** - `channels`:通道号列表 (1-8) - `samples`:每个通道的采样点数(最大 4096) - `voltage_range`:满量程电压范围,单位为伏特(默认:5.0) - `timeout`:USB 超时时间,单位为毫秒 **返回:** 将通道号映射到电压值列表的字典。 **示例:** ``` data = scope.read_channels([1, 2, 3, 4], samples=2048, voltage_range=10.0) ``` #### `send_command(command) -> bool` 向设备发送原始命令。 #### `read_response(size=64) -> bytes` 从设备读取响应。 ## 设备规格 - **通道**:8 个同步通道 - **ADC 分辨率**:12 位 (0-4095) - **存储深度**:每通道 4K 采样点 - **采样率**:2.4 MSa/s - **电压范围**:10 mV/div 至 5 V/div - **最大输入**:400V (DC + AC 峰值) ## 协议信息 USB 协议是通过逆向工程捕获的命令序列得出的: - **VID**:0x0783 - **PID**:0x5725 - **端点**:0x81 (IN), 0x02 (OUT) - **数据包大小**:64 字节 - **识别出 10 种独特的命令类型** 详细的协议文档请参阅 `PROTOCOL.md`。 ## 故障排除 ### 未找到设备 1. 确保设备已连接并通电 2. 检查 USB 网桥连接(自动支持) 3. 在 Linux 上,您可能需要 `sudo` 或 udev 规则: ``` # 创建 udev 规则 sudo nano /etc/udev/rules.d/99-hantek1008b.rules ``` 添加: ``` SUBSYSTEM=="usb", ATTR{idVendor}=="0783", ATTR{idProduct}=="5725", MODE="0666" ``` 然后: ``` sudo udevadm control --reload-rules ``` ### USB 后端问题 (macOS) 如果您收到 "No backend available" 错误: 1. 验证 libusb 是否已安装: file /opt/homebrew/opt/libusb/lib/libusb-1.0.dylib 2. 显式指定后端: import usb.backend.libusb1 backend = usb.backend.libusb1.get_backend( find_library=lambda x: "/opt/homebrew/opt/libusb/lib/libusb-1.0.dylib" ) scope = Hantek1008B() scope.connect(backend=backend) ## 示例 ### 基本数据采集 ``` from hantek1008b import Hantek1008B import matplotlib.pyplot as plt scope = Hantek1008B() if not scope.connect(): print("Device not found") exit(1) scope.initialize() # 从通道 1 读取 data = scope.read_channels([1], samples=1024) # 绘图 plt.plot(data[1]) plt.xlabel("Sample") plt.ylabel("Voltage (V)") plt.title("Channel 1") plt.show() ``` ### 多通道采集 ``` scope = Hantek1008B() scope.connect() scope.initialize() # 读取所有 8 个通道 data = scope.read_channels([1, 2, 3, 4, 5, 6, 7, 8], samples=2048) # 处理每个通道 for ch in range(1, 9): voltages = data[ch] print(f"Channel {ch}: {len(voltages)} samples") if voltages: print(f" Range: {min(voltages):.3f}V to {max(voltages):.3f}V") ``` ## 许可证 该驱动按“原样”提供,用于教育和诊断目的。USB 协议是从公开信息和 USB 捕获数据中逆向工程得出的。 **注意**:这不是官方的 Hantek 驱动。使用风险自负。 ## 免责声明 本软件按“原样”提供,不提供任何担保。作者与 Hantek 没有任何关联。使用风险自负。 ## 支持 如有问题、疑问或贡献: - 在 [GitHub 仓库](https://github.com/imediacorp/Hantek-10008B/issues) 上提交 issue - 查阅协议文档了解详细信息 - 查看 `examples/` 目录中的示例 ## 最新版本 **v1.0.0** - [查看版本](https://github.com/imediacorp/Hantek-10008B/releases/tag/v1.0.0) 首个公开发布版本,提供对 macOS 和 Linux 的完整跨平台支持。 **由社区为社区打造** 🎉 **仓库**:https://github.com/imediacorp/Hantek-10008B
标签:Apple Silicon, Hantek 1008B, libusb, pyusb, USB通信, 云资产清单, 协议分析, 命令控制, 开源硬件, 数据采集, 权限提升, 电子测量, 硬件驱动, 示波器, 逆向工具, 逆向工程