# go-duijiang **Repository Path**: longcat99/go-duijiang ## Basic Information - **Project Name**: go-duijiang - **Description**: No description available - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-31 - **Last Updated**: 2026-01-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Go-Duijiang 多设备 MQTT 对讲系统 基于 Go 语言 + MQTT 协议开发的嵌入式多设备对讲系统,专为 ARM Linux 设备设计。 ## 功能特性 ### 🎙️ 对讲功能 - **PTT 按键控制**:通过 `/dev/input/event3` 的 KEY_1(code=2) 按键长按≥500ms 触发对讲 - **分组对讲**:基于 MQTT 保留消息实现分组 PTT 锁机制 - **防啸叫设计**:发言时自动本地静音 - **锁超时机制**:5秒自动释放发言锁 ### 📡 MQTT 通信 - **主题分层设计**:`talk/{分组ID}/{设备ID}/{play/send/status}` - **全局广播**:支持 `talk/global/play` 全局广播频道 - **设备状态**:自动发送 online/offline 状态消息 - **断线重连**:5秒自动重连机制 ### 🔊 音频处理 - **ALSA 驱动**:录音设备 `plughw:2,0`,播放设备 `plughw:0,0` - **音频格式**:S16_LE、单声道、16000Hz、512字节分块传输 - **提示音**:群组有人发言时自动播放 `/mnt/sdcard/beep.wav` ### 💡 LED 状态指示 - **双色 LED**:红绿 LED 状态指示 - **状态模式**: - 空闲:绿灯常亮(允许发言) - 群组占用:红灯常亮(禁止发言) - 自身发言:红灯闪烁 - 锁获取中:红灯慢闪 - 错误状态:红灯快闪 ## 系统架构 ``` go-duijiang/ ├── main.go # 主程序入口 ├── config/ # 配置管理 │ └── config.go ├── mqtt/ # MQTT 客户端 │ └── client.go ├── ptt/ # PTT 控制 │ └── controller.go ├── audio/ # 音频处理 │ ├── controller.go │ ├── alsa.go # Linux ALSA 实现 │ └── mock.go # Windows 模拟实现 ├── led/ # LED 控制 │ ├── controller.go │ ├── gpio.go # Linux GPIO 实现 │ └── mock.go # Windows 模拟实现 ├── test/ # 测试程序 │ └── test.go ├── config.yaml # 配置文件 ├── build.sh # Linux 构建脚本 └── build.bat # Windows 构建脚本 ``` ## 快速开始 ### 1. 环境要求 - **开发环境**:Go 1.20+ - **目标平台**:ARM Linux (ARMv7 / ARM64) - **MQTT 服务器**:任意 MQTT 3.1.1 兼容服务器 - **音频设备**:ALSA 兼容声卡 - **GPIO**:Linux GPIO 子系统 ### 2. 配置系统 编辑 `config.yaml` 文件: ```yaml device_id: device001 # 设备唯一标识 group_id: group001 # 对讲分组ID mqtt: broker: 192.168.1.100 # MQTT 服务器地址 port: 1883 # MQTT 端口 username: "" # 认证用户名 password: "" # 认证密码 client_id: go-duijiang # 客户端ID keep_alive: 60 # 保活时间(秒) qos: 1 # 服务质量等级 audio: record_device: plughw:2,0 # 录音设备 play_device: plughw:0,0 # 播放设备 sample_rate: 16000 # 采样率 channels: 1 # 声道数 format: S16_LE # 音频格式 chunk_size: 512 # 数据块大小 beep_file: /mnt/sdcard/beep.wav # 提示音文件 ptt: input_device: /dev/input/event3 # PTT 按键设备 key_code: 2 # 按键代码(KEY_1) hold_duration: 500 # 长按时间(ms) lock_timeout: 5 # 锁超时时间(秒) led: red_pin: 17 # 红色LED GPIO引脚 green_pin: 18 # 绿色LED GPIO引脚 active_high: true # 有效电平(高电平有效) ``` ### 3. 编译部署 #### 交叉编译 (在开发机上) ```bash # Linux/Mac - 编译 ARM64 版本 chmod +x build.sh ./build.sh arm64 # Linux/Mac - 编译 ARMv7 版本 ./build.sh arm # Windows - 编译 ARM64 版本 build.bat arm64 # Windows - 编译 ARMv7 版本 build.bat arm ``` #### 部署到目标设备 1. 根据设备架构选择对应的二进制文件: - ARM64 设备:`go-duijiang-arm64` - ARMv7 设备:`go-duijiang-armv7` 2. 将编译好的二进制文件上传到设备 3. 创建配置文件 `config.yaml` 4. 确保音频设备和 GPIO 权限正确 5. 运行程序: ```bash # ARM64 设备 chmod +x go-duijiang-arm64 ./go-duijiang-arm64 # ARMv7 设备 chmod +x go-duijiang-armv7 ./go-duijiang-armv7 ``` ### 4. 后台运行 使用 systemd 服务: ```ini # /etc/systemd/system/go-duijiang.service [Unit] Description=Go-Duijiang MQTT Intercom After=network.target [Service] Type=simple User=root WorkingDirectory=/opt/go-duijiang ExecStart=/opt/go-duijiang/go-duijiang-armv7 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target ``` 启用服务: ```bash sudo systemctl enable go-duijiang.service sudo systemctl start go-duijiang.service ``` ## MQTT 主题说明 ### 设备状态主题 - `talk/{group_id}/{device_id}/status` - 设备状态消息 ### 对讲控制主题 - `talk/{group_id}/lock` - 分组发言锁(保留消息) - `talk/{group_id}/{device_id}/send` - 发送音频数据 - `talk/{group_id}/+/play` - 接收组内音频 ### 全局广播主题 - `talk/global/play` - 全局广播音频 ## 消息格式 ### 状态消息 ```json { "device_id": "device001", "group_id": "group001", "status": "online", "timestamp": 1630000000 } ``` ### 锁消息 ```json { "device_id": "device001", "group_id": "group001", "locked": true, "timestamp": 1630000000 } ``` ## 硬件连接 ### GPIO 引脚连接 - **红色 LED**:连接到配置的 red_pin (如 GPIO17) - **绿色 LED**:连接到配置的 green_pin (如 GPIO18) - **PTT 按键**:连接到 KEY_1 对应的 GPIO 输入 ### 音频设备连接 - **麦克风**:连接到录音设备 (如 plughw:2,0) - **扬声器**:连接到播放设备 (如 plughw:0,0) ## 故障排除 ### 常见问题 1. **权限问题** ```bash # 确保对音频设备和 GPIO 有访问权限 sudo usermod -a -G audio, gpio $USER ``` 2. **音频设备不可用** ```bash # 检查音频设备 arecord -l aplay -l ``` 3. **MQTT 连接失败** - 检查网络连接 - 验证 MQTT 服务器地址和端口 - 检查防火墙设置 4. **GPIO 不可用** ```bash # 检查 GPIO 权限 ls -la /sys/class/gpio/ ``` ## 开发测试 运行测试程序: ```bash cd test go run test.go ``` ## 许可证 本项目采用 MIT 许可证。 ## 贡献 欢迎提交 Issue 和 Pull Request!