【Node】占空比机制

协议栈代码:LoRaMac-node v4.7.0 参考文档 《RP002-1.0.4 LoRaWAN® Regional Parameters》 《TS001-1.0.4 LoRaWAN® L2 1.0.4 Specification》 一、占空比 1. 区域和占空比 参考《RP002-1.0.4 LoRaWAN® Regional Parameters》1.3 Regional Parameters Summary Tables 有些 Region 是有占空比限制,有些 Region 是没有占空比限制的。 对于动态频点的 Region: 对于固定频点的 Region: 2. 占空比规则 参考《TS001-1.0.4 LoRaWAN® L2 1.0.4 Specification》7 Retransmissions Backoff 3. 占空比代码 占空比代码涉及到两个概念: 时间信用(Time Credit) 不同的时间段内,都有一个最大可花费的时间信用,每次发送数据都会消耗一笔时间信用,当时间信用不满足下一次发送的花费时,则不允许发送数据。 观察时间(Observation Time) 当出现当时间信用不满足下一次发送的花费这种情况时,则会计算到达下一个时间段的观察时间,在下一个时间段内所花费的时间信息会清零。 3.1. 占空比参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 /* src/mac/region/RegionCommon.c */ /* Duty Cycle 1% */ #define BACKOFF_DC_1_HOUR 100 #define BACKOFF_DUTY_CYCLE_1_HOUR_IN_S 3600 #define BACKOFF_DUTY_CYCLE_10_HOURS_IN_S (BACKOFF_DUTY_CYCLE_1_HOUR_IN_S + (BACKOFF_DUTY_CYCLE_1_HOUR_IN_S * 10)) #define BACKOFF_DUTY_CYCLE_24_HOURS_IN_S (BACKOFF_DUTY_CYCLE_10_HOURS_IN_S + (BACKOFF_DUTY_CYCLE_1_HOUR_IN_S * 24)) #define BACKOFF_24_HOURS_IN_S (BACKOFF_DUTY_CYCLE_1_HOUR_IN_S * 24) #ifndef DUTY_CYCLE_TIME_PERIOD /* Default duty cycle observation time period is 1 hour (3600000 ms) according to ETSI. */ #define DUTY_CYCLE_TIME_PERIOD 3600000 #endif #ifndef DUTY_CYCLE_TIME_PERIOD_JOIN_BACKOFF_24H /* Time credits for the join backoff algorithm for the 24H period. */ #define DUTY_CYCLE_TIME_PERIOD_JOIN_BACKOFF_24H 870000 #endif 3.2. 更新占空比最大值 更新时间信用和观察时间: ...

November 11, 2025 · 8 min · 1492 words

【Go】结构体的内存布局

测试环境:go1.25.3 windows/amd64 1. 结构体布局 Go 语言中,结构体和它所包含的数据在内存中是以连续块的形式存在的,即使结构体中嵌套有其他的结构体。 2. 示例 2.1. 结构体 定义的结构体如下: 1 2 3 4 5 6 type studentInfo struct { id int // 学号 name string // 姓名 sorce float32 // 总分 rank int // 年纪排名 } 2.2. 示意图 1 2 3 4 5 6 7 8 9 10 Bytes 8 16 4 4 8 +----+------+--------+---------+------+ | id | name | source | padding | rank | +----+------+--------+---------+------+ / \ / \ +-----+--------+ | ptr | length | +-----+--------+ 8 8 由于结构体是 8 字节对齐,所以 source 有 4 字节填充,那么总共是 40 字节。 ...

November 9, 2025 · 3 min · 489 words

【Blog】支持网站访问统计

一、网站访问统计 对于静态网站来说,不好统计访问这些动态数据。 这里使用的是Vercount提供的网站访问统计功能(感谢大佬)。 具体操作就是:每次打开网站时,都会运行 vercount 提供的脚本,往 vercount 的服务器发送和接收数据。 这里我使用的是 PaperMod 主题。 1、新建 extend_head.html 文件 新建 layouts/partials/extend_head.html。 如果没有子目录的话,需要自己新建。 其目的是在网站里引入 vercount 的 js 脚本。 在该 HTML 文件添加以下内容: 1 <script defer src="https://cn.vercount.one/js"></script> 2. 新建 extend_footer.html 文件 新建 layouts/partials/extend_footer.html.html。 如果没有子目录的话,需要自己新建。 其目的是在网站底部添加显示访问信息。 在该 HTML 文件添加以下内容: 1 2 3 4 5 6 7 8 {{- if not (.Param "hideFooter") }} <footer class="footer"> <div> 网站总访客数<span id="vercount_value_site_uv"></span>次 网站总访问量<span id="vercount_value_site_pv"></span>人次 </div> </footer> {{- end }} 3. 新建 single.html 文件 将 themes/PaperMod/layouts/_default/single.html 拷贝一份到 layouts/_default/single.html。 ...

November 2, 2025 · 1 min · 181 words

【Go】命名规范

一些关键的命名规范。 一、包 对于包的命名,建议是以小写形式的单个单词命名。 在 Go 里面,包的名称不要求是唯一的。 包的名称尽量和包的导入路径里面的最后一个路径一致。 每个包的导入路径是唯一的。 比如 Go 的 Web 框架 Gin,包的名称是 gin,导入路径是: 1 import "github.com/gin-gonic/gin" 对于包的导出标识符的命令,在名字中不要再包含包的名称。 假如有个名为 github.com/zeepunt/lora 的包,对于包的导出标识符: 1 2 3 4 5 6 7 import "github.com/zeepunt/lora" // 推荐 lora.Sx126xOpen() // 不推荐, 因为 LoraSx126xOpen 携带了包的名称 lora.LoraSx126xOpen() 二、标识符 标识符的命名采用驼峰命名法(CamelCase)。 标识符可以指的是变量名称、函数名称、接口名称等。 小驼峰拼写法(lowerCamelCase) 第一个单词的首字母小写,后面每个单词的首字母大写。 大驼峰拼写法(UpperCamelCas) 又称为帕斯卡拼写法(PascalCase)。 每个单词的首字母都需大写。 注意 Go 里面默认大驼峰拼写法的标识符用于包导出标识符。 比如,在 lora 包里面有两个函数,分别是 Sx126xOpen 和 sx1262Info,那么只有 Sx126xOpen 函数可以被外部访问,sx1262Info 只能被包的内部访问。 如果缩略词的首字母是大写的,那么其他的字母也要大写。 比如,HTTP 不要写成 Http。 ...

November 2, 2025 · 1 min · 175 words

【C】结构体的使用

一、结构体对齐 1. 默认对齐规则 1.1. 规则 数据类型自身的对齐值 int8_t / uint8_t 型:1 字节。 int16_t / uint16_t 型:2 字节。 int32_t / uint32_t / float 型:4 字节。 double 型:8 字节。 结构体的自身对齐值 其成员中自身对齐值最大的那个值。 数据成员、结构体的有效对齐值 自身对齐值和指定对齐值中较小者,即 有效对齐值 = min(自身对齐值,当前指定的对齐值)。 1.2. 示例 假如结构体的声明如下: 1 2 3 4 5 6 typedef struct { uint8_t a; uint16_t b; uint16_t c; uint32_t d; } struct_demo_t; 假设当前默认是 4 字节对齐,该结构体的大小是 12 Bytes,内存的使用空间如下: 1 2 3 4 5 6 7 +---+---+---+---+ | a | | b | +---+---+---+---+ | c | | +---+---+---+---+ | d | +---+---+---+---+ 代码测试(main.c): ...

October 27, 2025 · 9 min · 1746 words

【C】个人代码风格规范

1. 注释 所有的注释统一使用 /**/,除了一些特殊的注释以外。 单行注释: 1 /* 单行注释 */ 多行注释: 1 2 3 4 /** * 多行注释 1 * 多行注释2 */ 特殊的注释:用于表面一些待办事项,比如:TODO、FIXME、BUG、HACK。 1 2 // TODO 实现 xxx 功能 // FIXME 需修复 xxx 功能 特殊的注释:在第三方 SDK 中加入修改,并方便后续升级 SDK 时方便区分。 1 2 3 4 5 6 7 8 // [公司名] [人名] [时间] S : 实现 xxx 功能 ... // [公司名] [人名] [时间] E : 实现 xxx 功能 // Github Zeepunt 2025.10.01 S: 添加调试打印信息 ... // Github Zeepunt 2025.10.01 E: 添加调试打印信息 2.大括号 对于所有非函数的语句块,把起始大括号放在行尾,而把结束大括号放在行首。 ...

October 26, 2025 · 3 min · 459 words

【Blog】Hugo支持相对路径的图片

问题 当前的文章是使用 Typroa 编辑的,在 Typora 上可以显示图片,但是在 Hugo 中就无法显示图片。 Hugo 版本是 0.152.1 原因 当前的目录结构如下: 1 2 3 4 5 6 7 8 9 content └── article └── 使用Hugo和Github搭建个人博客搭建 ├── assets │ ├── 1761370605.png │ ├── 1761370606.png │ ├── 1761370607.png │ └── 1761370608.png └── 使用Hugo和Github搭建个人博客搭建.md 在 Typora 里面,我们如果要引用相对路径的图片,写法是这样的: 1 ![](assets/1761370607.png) 但如果此时使用 hugo server 在本地预览的话,你会发现这个图片的路径是: http://localhost:1313/article/使用hugo和github搭建个人博客搭建/使用hugo和github搭建个人博客搭建/assets/1761370607.png。 可以发现,Hugo 是将 xxx.md 是当作一个目录去看待的。 解决方案 我们应该将 xxx.md 改为 index.md,只有这样,Hugo 才能将这个目录识别为 Page Bundle。 ...

October 25, 2025 · 1 min · 73 words

【Blog】使用Hugo和Github搭建个人博客搭建

一、工具安装 1. Go 这里安装的 Go 版本为 1.25.3,官网地址:Go。 安装过程:略。 安装完成后,查看 Go 版本: 1 2 $ go version go version go1.25.3 windows/amd64 2. Hugo Hugo 是一个用 Go 写的静态网站生成器。 这里安装的是标准版的 Hugo。 1 2 3 4 5 6 $ go install github.com/gohugoio/hugo@latest go: downloading github.com/gohugoio/hugo v0.152.1 ... $ hugo version hugo v0.152.1 windows/amd64 BuildDate=unknown 3. Hugo 的常用命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 创建网站 $ hugo new site <网站名> # 启动本地服务器 $ hugo server # 启动本地服务器 (包含草稿文章) $ hugo server -D # 创建文章 $ hugo new <文章名称> # 生成静态网站 $ hugo 二、创建网站 1. 创建流程 基本创建流程如下: ...

October 25, 2025 · 4 min · 807 words