---
title: "适用于 TTN 与 ChirpStack 的 LoRaWAN Payload Decoder 测试器"
canonical: https://wavect.io/zh/tools/lorawan-payload-codec-tester/
language: zh
description: "在浏览器本地测试 The Things Stack 与 ChirpStack 的 LoRaWAN JavaScript decoder 和 encoder，支持 Hex、Base64 与字节 fixture。"
image: "https://wavect.io/img/general/bak/open_graph_preview.jpg"
---

浏览器本地 LORAWAN 工作台

# 先测试 codec，别让下一个传感器数据包变成生产环境谜题。

粘贴实际部署的 JavaScript codec，加入真实 payload 和预期 JSON，再在隔离的本地沙箱中运行整套 fixture。支持现代 TTN、ChirpStack 函数以及旧式 Decoder 和 Encoder。

[打开工作台](#tool-app) [查看源码](https://github.com/wavect/lorawan-payload-codec-tester)

- 配置 TTN v3 · ChirpStack v4 · Legacy
- 价格 免费 · 开源
- 执行 在浏览器内隔离
- 导出 Fixture · 测试 · 报告

**PAYLOAD 实验室**

FPORT 4 · UPLINK **temperature: -21.3°C**

Fixture 与预期结果一致

真正有用的部分

这是测试框架，不是 decoder 目录。它用你的 payload 运行你的 codec，指出具体失败的 fixture，并生成可与设备集成代码一起保存的测试。

运行真实代码

## Payload Codec 工作台

从示例开始，或粘贴厂商 codec。每个向量都可测试不同操作、fPort、编码、变量、downlink 输入和预期结果。

代码和 payload 留在本地

**LoRaWAN Codec 实验室** 一次性沙箱 · 确定性 fixture

现代 Uplink标准化 PayloadDownlink 往返旧式 Decoder无效返回结构卡死的 Codec 加载示例 全部运行

01

### Codec 源码

兼容配置The Things Stack v3ChirpStack v4旧式 Decoder / Encoder

沙箱只提供 formatter 输入。网络、存储、import 和页面访问均不可用。

02

### 测试向量

03

### 结果与导出

运行一个向量或整套测试，查看输出、契约问题、字节读取和预期差异。

不透明来源 Worker 沙箱 1 秒执行上限 不上传，不持久化

从厂商 PDF 到回归测试

## 经得住试点阶段的 codec 工作流

翻译厂商规范、迁移网络服务器和检查后续固件变更时，都能复用同一套 fixture。

1. 01 - **粘贴实际部署的 formatter** - 使用设备配置中的原始 JavaScript，包括辅助函数和查找表。
2. 02 - **添加真实数据包和预期** - 采集代表性的 uplink 与 downlink，并声明完整的预期 JSON。
3. 03 - **导出长期测试** - 把 fixture 与 Vitest 文件放在集成代码旁，避免固件或 codec 变更悄悄改变字段含义。

来自现场实践

## 当设备群不止一台理想设备时真正有用

Wavect 为城市级 LoRaWAN 平台中的多厂商硬件编写过 uplink decoder 和 downlink encoder。代价高的错误往往是字节、端口、固件版本和输出契约之间的隐性分歧。

### 两类网络服务器约定

无需先创建应用，即可测试现代 The Things Stack、ChirpStack 签名和旧式 Decoder、Encoder 函数。

### 依靠预期结果，不靠看起来正确

完整输出与声明值不一致时，fixture 会明确失败。

### 可带走的产物

导出可移植向量、可运行测试或 Markdown 报告，用于代码审查和交接。

明确边界

## 工作台无法证明什么

- 工具使用浏览器 JavaScript 语义，目标网络服务器的运行时限制仍需最终验证。
- 只有预期结果暴露差异时，工具才会指出大小端或有符号问题，不会猜测厂商意图。
- 它测试应用 payload formatter，不测试 LoRaWAN 加密、覆盖、join、duty cycle 或网关调度。
- 通过的 fixture 只验证提供的案例，不代表覆盖所有固件变体。

## 关于 Codec 测试器

### 工具会上传 codec 或传感器 payload 吗？

不会。代码与 fixture 在不透明来源沙箱中的一次性 worker 里运行，不会发送或保存。

### 能测试 The Things Stack 和 ChirpStack 吗？

可以。支持当前 decodeUplink、encodeDownlink 契约和旧式 Decoder、Encoder 签名。

### 能测试多个固件版本吗？

可以。为各固件和数据包形态建立命名向量。如果 codec 本身不同，也可导出独立 fixture 文件。

### 能自动判断温度是不是小端吗？

只有提供预期结果时可以。多种字节解释都可能语法有效，所以工具不会虚构设备语义。

免费 · 开源 · 不上传

## 把今天失败的数据包，变成保护明天的测试。

在本地运行 codec，导出 fixture，并把证据留在集成代码旁。

[返回工作台](#tool-app) [查看源码](https://github.com/wavect/lorawan-payload-codec-tester)

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/zh/tools/lorawan-payload-codec-tester/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-08-05",
      "inLanguage": "zh",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-08-05",
      "url": "https://wavect.io/zh/tools/lorawan-payload-codec-tester/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "applicationCategory": "DeveloperApplication",
  "browserRequirements": "JavaScript、Web Worker 和沙箱 iframe",
  "codeRepository": "https://github.com/wavect/lorawan-payload-codec-tester",
  "description": "在浏览器本地测试 The Things Stack 与 ChirpStack 的 LoRaWAN JavaScript decoder 和 encoder，支持 Hex、Base64 与字节 fixture。",
  "isAccessibleForFree": true,
  "name": "LoRaWAN Payload Codec 测试器",
  "offers": {
    "@type": "Offer",
    "price": "0",
    "priceCurrency": "EUR"
  },
  "operatingSystem": "任意现代浏览器",
  "url": "https://wavect.io/zh/tools/lorawan-payload-codec-tester/"
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/",
      "name": "首页",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/tools/",
      "name": "有些工作，本来就不该一直这么麻烦。",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/tools/lorawan-payload-codec-tester/",
      "name": "LoRaWAN Payload Codec 测试器",
      "position": 3
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "不会。代码与 fixture 在不透明来源沙箱中的一次性 worker 里运行，不会发送或保存。"
      },
      "name": "工具会上传 codec 或传感器 payload 吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "可以。支持当前 decodeUplink、encodeDownlink 契约和旧式 Decoder、Encoder 签名。"
      },
      "name": "能测试 The Things Stack 和 ChirpStack 吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "可以。为各固件和数据包形态建立命名向量。如果 codec 本身不同，也可导出独立 fixture 文件。"
      },
      "name": "能测试多个固件版本吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "只有提供预期结果时可以。多种字节解释都可能语法有效，所以工具不会虚构设备语义。"
      },
      "name": "能自动判断温度是不是小端吗？"
    }
  ],
  "speakable": {
    "@type": "SpeakableSpecification",
    "cssSelector": [
      ".faq-question",
      ".faq-answer"
    ]
  }
}
```
