emuehlstein/OpenGD77_SSRFLite_Generator

GitHub: emuehlstein/OpenGD77_SSRFLite_Generator

一个数据驱动的对讲机 codeplug 生成器,通过解析 YAML 格式的射频参考数据并叠加策略配置,自动生成适用于 OpenGD77、CHIRP 及 VGC N76 等平台的信道导入文件。

Stars: 1 | Forks: 0

# OpenGD77 SSRFLite 生成器 一个适用于运行 OpenGD77 固件的对讲机以及兼容 CHIRP 的对讲机的、可复现且数据驱动的 codeplug 构建器。该生成器接收 [SSRF-Lite YAML](#ssrflite) 文件并生成: - **OpenGD77 CSVs**:用于导入 OpenGD77 CPS 的 `Channels.csv`、`Contacts.csv`、`TG_Lists.csv`、`Zones.csv` - **CHIRP CSV**:通过 CHIRP 软件兼容大多数业余无线电的通用格式 - **VGC N76 CSV**:适用于 VGC N76 对讲机的格式 ## 输出格式 ### OpenGD77 格式(默认) 生成适用于通过 OpenGD77 CPS 导入的 OpenGD77 专用 CSV 文件。包含完整的 DMR 支持,涵盖联系人、通话组列表和区域。 📖 **[OpenGD77 文档](README.md)**(此文件) ### CHIRP 格式 生成兼容 [CHIRP](https://chirpmyradio.com/) 的通用 CSV 文件,这是一款免费、开源的用于对数百种业余无线电型号进行编程的工具。仅导出 FM/模拟信道(不包含 DMR 和数字模式)。 📖 **[CHIRP Generator 文档 →](README_CHIRP.md)** 支持的对讲机包括:Baofeng UV-5R、Yaesu FT-60/FT-7800、Icom IC-880/IC-2730、Kenwood TH-D72/TM-V71 以及[更多型号](https://chirpmyradio.com/projects/chirp/wiki/Supported_Radios)。 ### VGC N76 格式 生成兼容 VGC N76 对讲机且按库整理的 CSV 文件。 📖 **[N76 Generator 文档 →](README_N76.md)** ## 概览 ``` ┌────────────────┐ ┌────────────────────┐ ┌────────────────────┐ │ SSRF-Lite data │ → │ Profiles (selection│ → │ Policies (opinions │ │ Reference-only │ │ & scoping) │ │ & rendering rules) │ └────────────────┘ └────────────────────┘ └────────────────────┘ ``` - **SSRF-Lite** 记录权威的射频事实:谁拥有某个系统,其物理位置,如何发射,以及存在哪些授权。 - **Profiles** 选择哪些 SSRF 分配适用于请求的配置(例如:“Chicago GMRS”或“仅限紧急情况”)。 - **Policies** 表达特定于使用者的意见,例如发射启用、扫描跳过默认值、区域成员资格、排序和命名约定。 保持这些关注点相互分离,使得 SSRF-Lite 能够跨对讲机、服务和策略堆栈重复使用。 **配置库:** - **RF 系统和信道规划数据库** – [浏览 SSRF 文档 →](docs/ssrf/README.md) - **用于各种地理位置的示例 Profiles** – [浏览 Profile 文档 →](docs/profiles/README.md) - **Policy 叠加和分配覆盖** – [浏览 Policy 文档 →](docs/policies/README.md) **理念:** 本项目坚持的几个理念: - **关注点分离:** 保持 RF 参考数据独立于 codeplug 呈现形式,从而使相同的事实能够支持多种构建。 - **分层配置:** SSRF 参考 → profile 选择 → policy 叠加,允许每一层独立演进而不破坏其他层。 - **可复现的输出:** 生成器基于版本控制的数据和确定性的工具(`uv`)运行,因此 CSV 能够可靠地重新生成和比对。 - **安全优先的默认设置:** 除非明确许可,否则发射保持禁用状态,从而降低非法或意外发射的风险。 - **可扩展性:** 新的服务、profiles 或对讲机应能通过添加额外的 SSRF 文件或 policies 接入,而无需重构核心代码。 ## 快速开始 1. **安装前提条件** – 确保您的系统上安装了 Python 3.10+ 和 `uv` 包管理器。 2. **克隆代码库并进入目录。** git clone https://github.com/emuehlstein/OpenGD77_SSRFLite_Generator.git cd OpenGD77_SSRFLite_Generator 3. **使用 `uv` 同步虚拟环境。** 这将创建 `.venv/` 并安装生成器、Pydantic 模型和测试工具。 uv sync 4. **构建 OpenGD77 CSV 包。** 结果将存放在 `opengd77_cps_import_generated/` 中。 uv run python generate_opengd_import.py 5. **导入到 CPS。** 在 OpenGD77 CPS 中选择 **File → CSV → Import CSV**,指向生成的文件夹,并加载 Channels/Contacts/TG Lists/Zones 文件。 需要其他 profile?添加如 `--profile chicago_amateur` 或 `--profile gmrs_only` 等标志。当您希望在 Amateur 默认设置之外启用发射时,请添加 `--tx-service gmrs`(或 `--tx-all-services`)。 要在编辑后验证所有内容,请运行冒烟测试: ``` uv run python -m pytest tests/test_profiles.py ``` ## SSRF‑Lite 本项目包含一种用于共享 RF 系统信息的拟议格式,即“SSRF-Lite”,它是美国国防部 (US DoD) 使用的 SSRF 格式的简化和 YAML 化版本。 - 项目文档:[SSRF‑Lite Spec](./ssrf/_schema/SSRF-Lite-Spec.md) - 背景(NTIA SSRF):[https://www.ntia.gov/publications/2023/standard-spectrum-resource-format-ssrf](https://www.ntia.gov/publications/2023/standard-spectrum-resource-format-ssrf) ### 验证 每个 SSRF-Lite 文件都对应一个版本化的 JSON Schema,该 schema 与规范一起发布在 [`ssrf-lite-0.5.3.schema.json`](./ssrf/_schema/ssrf-lite-0.5.3.schema.json)。每个 YAML 文件 都包含一个 `# yaml-language-server:` modeline 以及顶层的 `$schema` 和 `ssrf_lite_version: "0.5.3"` 键,因此编辑器和 CI 无需导入 Python 模型即可进行验证。 ``` make schema # regenerate the JSON Schema from the Pydantic models make stamp-headers # (re)apply schema headers to every SSRF-Lite YAML make validate-schema # verify the schema and headers are up to date (CI) ``` ## Profiles & Policies Profiles 为 SSRF 参考数据提供包含过滤器。每个 profile 位于 `profiles/.yml`,并在 `profile.include` 下声明 glob 模式以及可选的服务过滤器。 Profiles 现在可以使用可选的 `profile.policy` 块指向一个或多个 **policy** 文件: ``` profile: name: "chicago_amateur" include: paths: - "ssrf/plans/US/amateur/*.yml" - "ssrf/systems/US/IL/Cook/Chicago/amateur/*.yml" policy: files: - policies/base.yml paths: - policies/chicago/**/*.yml ``` 为了保持叠加层的可组合性,较大的系统和规划被拆分为专注的文件(例如 `policies/ham_fm_simplex.yml` 或 `policies/marine_vhf.yml`)。Profiles 按需选择所需部分,使得将来将多个 profiles 或叠加层组合在一起变得非常直接。 Policies 是简单的 YAML 文档,用于描述应如何渲染选定的分配。典型的键包括: - `assignments..codeplug.name` – 重命名信道、标记 `rx_only`、选择 `preferred_contacts` 等。 - `assignments..zones` – 提供区域包含/排除列表。 - `assignments..scan` – 配置 `all_skip`、`zone_skip`、`tot`、`power`、`vox` 及相关扫描提示。 - `assignments..tx` – 为仅接收构建明确禁用发射。 如果 profile 省略了 `policy` 块,则生成器将在存在 `policies/.yml` 时回退到该文件,从而保持小型构建的流程便捷。 可用的入门 profiles: - `default` – 包含国家规划系统和芝加哥地区系统的广泛构建。 - `chicago_light` – 专注于 GMRS 和公共安全的精简扫描列表。 - `chicago_amateur` – 芝加哥业余中继台加上 simplex 规划。 - `chicago_gmrs` – 芝加哥 GMRS 中继台和全美 GMRS 规划。 - `gmrs_only` – 带有 policy 调优 GMRS 区域布局的全美 GMRS 规划。 `policies/gmrs_only.yml` 将全美 GMRS 规划分类到 `GMRS Simplex`、`GMRS Listen` 和 `GMRS Repeaters` 区域中,同时默认将仅限 FRS 的互调信道设为仅接收。 检查可用的 profiles: ``` uv run python generate_opengd_import.py --list-profiles ``` 使用特定 profile 生成: ``` uv run python generate_opengd_import.py --profile chicago_light uv run python generate_opengd_import.py --profile gmrs_only --tx-service gmrs # GMRS-only build, TX enabled on GMRS channels ``` 在其他服务上启用发射(默认仅限 Amateur): ``` uv run python generate_opengd_import.py --profile chicago_light --tx-service gmrs # 允许在 radio 支持的所有地方进行 transmit uv run python generate_opengd_import.py --profile chicago_light --tx-all-services ``` 预览 profile 将加载的 SSRF 文件: ``` uv run python generate_opengd_import.py --profile chicago_light --dry-run ``` ## 工作原理 生成器加载并合并 SSRF‑Lite YAMLs,然后: - 从 `contacts[]` 构建 `Contacts.csv`(仅生成具有数字 ID 的项目)。 - 解析 policy 叠加层(如果有),并将它们与遗留的 `assignments.codeplug` 提示合并: - Policy 键驱动信道命名、TX 启用、跳过标志、TOT、功率级别、VOX、APRS 和区域成员资格。 - `preferred_contacts` 和 `default_contact` 可以引用联系人 ID、号码或名称;第一个有效条目将设置默认的 DMR 联系人/时隙。 - 从 `assignments[]` 构建 `Channels.csv`: - 如果设置了 `rf_chain_id` 且链路在支持的频段内属于 FM 或 DMR,生成器将使用 policy+遗留提示生成模拟或数字行。 - 如果设置了 `channel_plan_id`,匹配的规划信道将作为模拟信道生成(例如 NOAA),受频段过滤器限制。 - 根据每个分配的 policy/遗留 `preferred_contacts` 构建 `TG_Lists.csv`(最多 32 个,列表名称派生自分配或 `codeplug.tg_list_name`)。 - 从派生自 policy 的区域列表构建 `Zones.csv`(回退到遗留的 `assignments[].zones`),每个区域最多 80 个信道。 不支持的模式(例如 D‑STAR、C4FM)和频段外的项目将被跳过。 ## 设置与用法 (uv) 要求: - Python 3.10+ - 已安装 uv(通过 Homebrew 或官方安装程序) 安装依赖并运行(默认 profile = `default`): ``` uv sync uv run python generate_opengd_import.py --profile default ``` 预期输出: ``` Wrote channels, contacts, TG lists, and zones to opengd77_cps_import_generated CSV validation: PASS (headers and column counts correct) ``` 将 `opengd77_cps_import_generated` 文件夹复制到您的 OpenGD77 CPS 可以读取的位置(例如,Documents 子文件夹或可移动媒体)。在 CPS 中,打开 **File → CSV → Import CSV**,浏览到该文件夹,然后选择生成的文件夹并将其加载到您的 codeplug 项目中。 ## 文档 ### Profile 文档 📚 **[浏览所有 Profile 文档 →](docs/profiles/README.md)** 为 profiles 生成全面的 Markdown 文档: ``` # 为所有 profiles 生成文档 uv run python generate_profile_docs.py # 为特定的 profile 生成文档 uv run python generate_profile_docs.py --profile chicago_amateur # 列出可用的 profiles uv run python generate_profile_docs.py --list-profiles ``` 生成的文档包括信道详细信息、区域组织、联系人列表、授权要求和源文件引用。请参阅 [profile 文档索引](docs/profiles/README.md) 以获取所有可用 profiles 的完整概述和比较。 ### Policy 文档 📋 **[浏览所有 Policy 文档 →](docs/policies/README.md)** 为 policies 生成全面的 Markdown 文档: ``` # 为所有 policies 生成文档 uv run python generate_policy_docs.py # 为特定的 policy 生成文档 uv run python generate_policy_docs.py --file gmrs_only.yml # 列出可用的 policies uv run python generate_policy_docs.py --list-files ``` 生成的文档包括分配覆盖、区域配置、扫描设置、自定义名称以及 TX/RX 行为。请参阅 [policy 文档索引](docs/policies/README.md) 以获取所有 policy 配置和使用模式的完整概述。 ### SSRF 数据文档 📡 **[浏览所有 SSRF 文档 →](docs/ssrf/README.md)** 为 SSRF 文件生成全面的 Markdown 文档: ``` # 为所有 SSRF 文件生成文档 uv run python generate_ssrf_docs.py # 为特定的 SSRF 文件生成文档 uv run python generate_ssrf_docs.py --file ssrf/plans/US/gmrs/gmrs_channels.yml # 列出可用的 SSRF 文件 uv run python generate_ssrf_docs.py --list-files ``` 生成的文档提供了 RF 系统、信道规划、分配和地理覆盖范围的详细视图。每个 SSRF 文件都有其独立的文档页面,包含频率详细信息、服务信息和组织数据。请参阅 [SSRF 文档索引](docs/ssrf/README.md) 以获取完整概述和可浏览的文件目录。 ### 自动文档更新 🔄 **文档会自动与您的更改保持同步!** 本项目包含多种自动化选项,以保持文档最新: #### 本地开发 ``` # 一次性更新所有文档 ./update-docs.sh # 或者为了方便使用 Makefile make docs # Generate all documentation make docs-profiles # Generate profile docs only make docs-policies # Generate policy docs only make docs-ssrf # Generate SSRF docs only make status # Show project status ``` #### Git Hooks(自动) 当您提交更改时,文档会自动重新生成: - **Pre-commit hook**:当 profiles、policies 或 SSRF 文件发生更改时更新文档 - **选择性更新**:仅重新生成受影响的文档类型 - **自动暂存**:更新后的文档会自动添加到您的提交中 #### GitHub Actions (CI/CD) - **自动更新**:文档在推送到 main/develop 分支时重新生成 - **Pull request 验证**:确保 PR 中的文档是最新的 - **一致性检查**:验证所有文件都有相应的文档 #### 开发命令 ``` # 带有文档自动化的项目设置 make dev-setup # 验证文档是否为最新 make validate-docs # 查看项目状态和文档数量 make status # 列出所有可用的 targets make help ``` 该自动化确保文档永远不会与您的数据文件不同步,随着项目的演进,能够轻松维护全面、准确的文档。 ## 数据说明与约定 - 这里使用的 SSRF‑Lite 实体:`organizations`、`locations`、`stations`、`antennas`、`rf_chains`、`contacts`、`channel_plans`、`assignments`。这些仍然是仅供参考的事实。 - Policies(或遗留的 `assignments.codeplug`)提供渲染指令:信道名称、区域成员资格、跳过标志、TOT、功率、VOX 和首选联系人。除非通过 `--tx-service` 或 `--tx-all-services` 将其他服务列入白名单,否则发射启用默认仅限 Amateur。 - 对于 DMR,`mode.color_code` 设置色码;默认时隙派生自 policy/遗留的首选联系人(回退到全局默认值)。 - 如果可用,纬度/经度取自信道的 station → location 链接。 - DCS 码被规范化为数字;如果需要,我们可以保留前导(例如 073)。 ## 限制 - 仅生成 136–174 & 400–480 MHz 范围内的 FM 和 DMR。 - 其他数字模式(D‑STAR、C4FM)不会导出到 OpenGD77 CSVs。 - TG 列表根据每个分配生成;以后可以添加项目级的管理列表。 - 其他 SSRF‑Lite 系统可以放入 `ssrf/systems/` 下相应的文件夹中,并将被默认 profile 自动包含。 ## 路线图 - **Profile 继承与按系统覆盖** *(计划中)* 未来的 profiles 将允许: - 继承/默认值(例如 `rx_only`、`all_skip`、`zone_cap`) - 位于 `profiles//overrides/` 下的按系统覆盖文件 `.overrides.yml` 使用原生 SSRF schema,通过 `name` 合并信道列表。 - `--strict` 用于未知的键或模糊的匹配。 - `--explain` 显示每个最终值的来源。 ## 安全 / 合规 - 仅在获得许可的情况下监听公共安全和商业频率;仅在获得许可/授权的情况下进行发射。 - 验证亚音频、频偏和活动;数据可能会发生变化。 ## 贡献 1. 创建分支 2. 在 `ssrf/` 中编辑或添加 SSRF‑Lite YAML(规划或系统) 3. `uv run python generate_opengd_import.py` 并查看差异 4. 根据需要更新文档/测试,并提交 PR ## 许可证 本项目根据 Apache License, Version 2.0 授权。有关详细信息,请参阅 [LICENSE](./LICENSE) 文件。 ## 致谢 感谢当地俱乐部/目录以及将 NTIA SSRF 作为参考模型。
标签:CHIRP, OpenGD77, SOC Prime, YAML, 业余无线电, 代码插件生成器, 安全库, 开发工具, 数据转换, 逆向工具