<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on virusdefender's blog ʕ•ᴥ•ʔ</title><link>https://strcpy.me/</link><description>Recent content in Home on virusdefender's blog ʕ•ᴥ•ʔ</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://strcpy.me/feed/index.xml" rel="self" type="application/rss+xml"/><item><title>ESA 切换到 EdgeOne</title><link>https://strcpy.me/index.php/archives/810/</link><pubDate>Sat, 25 Jul 2026 00:00:01 +0000</pubDate><guid>https://strcpy.me/index.php/archives/810/</guid><description>&lt;p&gt;本博客是一个纯静态网站，随便找个静态网站托管服务就能跑起来。不过为了自己用着舒心，前几年我一直把静态文件放在阿里云 OSS 上，再通过阿里云 CDN 对外提供访问。这套方案一直很稳定，加上博客平时也没什么访问量，每个月的费用最多也就几块钱。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://help.aliyun.com/zh/cdn/product-overview/billing-overview"&gt;阿里云 CDN 的计费方案&lt;/a&gt;简单来说就是流量费用 + HTTPS 请求数费用，流量费用对于普通用户来说从中国地区的 0.24/GB 到中东非洲区域的 1.31/GB 不等，
HTTPS 请求是 0.05/万次，但是每个月有 500 万次免费。&lt;/p&gt;
&lt;p&gt;24 年 7 月份，我突然收到了阿里云的欠费提醒，看了一下账单，才发现 CDN 产生了 105 GB 的下行流量，扣了 30 多块钱。
这个流量对普通网站也许不算多，但本站的访问量一直没有什么变化，显然不是正常的。通过日志查了一下 IP，才发现是 PCDN 刷量。&lt;/p&gt;
&lt;p&gt;PCDN 用户为了平衡上下行流量，防止被运营商发现，进行了大规模的刷量行为，这个事情网上已经有很多讨论了，可以看下 &lt;a href="https://github.com/unclemcz/ban-pcdn-ip"&gt;https://github.com/unclemcz/ban-pcdn-ip&lt;/a&gt; 和里面的相关链接。PCDN 数量都是请求大文件，所以整体请求数量不是很多，不到 100 万次，所以这次没有产生 HTTPS 请求数费用。&lt;/p&gt;
&lt;p&gt;26 年 6 月份，突然发现阿里云又欠费了，接着查日志，发现有一些非洲的 IP 在持续的使用简单的 GET 请求访问不存在的地址，总请求数量 1000 多万，导致 HTTPS 请求数直接超了免费额度 500 多万次，又被扣了 30 多块钱。。。还好 404 页面比较小，流量费用很少，这要是访问大文件再加上非洲地区 1.31/GB 的流量费，估计我就直接注销阿里云账号跑路了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://strcpy.me/blog/images/810/1.jpg" alt=""&gt;
&lt;/p&gt;
&lt;p&gt;经历这两次异常账单之后，我觉得继续使用按量付费的 CDN 还是有些不太可控，于是把网站迁到了阿里云的 &lt;a href="https://www.aliyun.com/product/esa"&gt;ESA&lt;/a&gt; 网站加速服务。为了省事，这时的源站仍然是 OSS。ESA 免费版目前不收取流量费和 HTTPS 请求数费用，因此日常使用基本只会产生 ESA 回源时的 OSS 出方向流量费用。&lt;/p&gt;</description></item><item><title>POCSAG 协议考古 - SX1276 Packet Mode 实现</title><link>https://strcpy.me/index.php/archives/809/</link><pubDate>Tue, 26 May 2026 00:00:01 +0000</pubDate><guid>https://strcpy.me/index.php/archives/809/</guid><description>&lt;p&gt;上一篇文章讨论了硬件选型，最终选择了基于 Ebyte E32 开发板（SX1276 + STM32F103C8T6）的方案。这一篇来聊聊软件实现——如何用最简单的方式接收 POCSAG 信号。&lt;/p&gt;
&lt;h2 id="现有开源实现direct-mode-的全手动挡路线"&gt;现有开源实现：Direct Mode 的&amp;quot;全手动挡&amp;quot;路线&lt;/h2&gt;
&lt;p&gt;GitHub 上能找到的几个 POCSAG/LBJ 接收项目，不约而同地选择了同一条路：SX1276 的 &lt;strong&gt;Direct Mode&lt;/strong&gt;（直接模式，也叫 Continuous Mode）。要理解 Packet Mode 为什么更好，首先得看清楚 Direct Mode 到底在做什么。&lt;/p&gt;
&lt;h3 id="sx1276-的-continuous-mode-硬件配置"&gt;SX1276 的 Continuous Mode 硬件配置&lt;/h3&gt;
&lt;p&gt;以 &lt;a href="https://github.com/livequr/SX1276_Receive_LBJ"&gt;SX1276_Receive_LBJ&lt;/a&gt; 为例，它的底层是 RadioLib 的 SX127x 驱动。首先看 &lt;code&gt;SX127x::directMode()&lt;/code&gt; 如何配置芯片：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="n"&gt;SX127x&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;directMode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RADIOLIB_SX127X_STANDBY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// DIO1 → DCLK (连续数据时钟输出), DIO2 → DATA (连续解调数据输出)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;SPIsetRegValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;REG_DIO_MAPPING_1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;RADIOLIB_SX127X_DIO1_CONT_DCLK&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;RADIOLIB_SX127X_DIO2_CONT_DATA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 不需要等 preamble 或 RSSI 触发，直接开始接收
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setAFCAGCTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RADIOLIB_SX127X_RX_TRIGGER_NONE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 切换到 Continuous Mode（PACKET_CONFIG_2 bit 6 = 1）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;SPIsetRegValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;REG_PACKET_CONFIG_2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;RADIOLIB_SX127X_DATA_MODE_CONTINUOUS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;三个关键操作：&lt;/p&gt;</description></item><item><title>POCSAG 协议考古 - 硬件实现</title><link>https://strcpy.me/index.php/archives/808/</link><pubDate>Sun, 10 May 2026 00:00:01 +0000</pubDate><guid>https://strcpy.me/index.php/archives/808/</guid><description>&lt;p&gt;上一篇文章梳理了 POCSAG 的协议格式，这一篇来看看硬件的实际选型。POCSAG 是运行在 2-FSK 调制之上的应用层协议，硬件层面只需要两个核心能力：一个支持 FSK 调制解调的射频前端，一个能跑协议解析的 MCU。看上去选择很多，但真要做的时候，射频芯片的寄存器配置、FSK 极性的匹配、频率稳定度、开发门槛都是坑。&lt;/p&gt;
&lt;p&gt;好在 GitHub 上有几个开源项目，各走了一条路，拿来当硬件选型的参考很合适。&lt;/p&gt;
&lt;h2 id="硬件选型"&gt;硬件选型&lt;/h2&gt;
&lt;div class="admonition warning"&gt;
 &lt;div class="admonition-header"&gt;
 &lt;span&gt;Warning&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="admonition-content"&gt;
 &lt;p&gt;无线电设备的研发必须严格遵守相关法律法规：禁止在非民用频段进行信号发射；严禁违规接收非授权频段信号；严禁将非公开的信号与数据上传至互联网。&lt;/p&gt;
 &lt;/div&gt;
 &lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;MCU&lt;/th&gt;
					&lt;th&gt;射频前端&lt;/th&gt;
					&lt;th&gt;板卡方案&lt;/th&gt;
					&lt;th&gt;简介&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://github.com/killeder/GoRail_Pager"&gt;GoRail_Pager&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;STM32F103C8T6&lt;/td&gt;
					&lt;td&gt;TI CC1101&lt;/td&gt;
					&lt;td&gt;自己画 PCB&lt;/td&gt;
					&lt;td&gt;纯 FSK 芯片；外挂 ESP8266 走 MQTT。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://github.com/livequr/SX1276_Receive_LBJ"&gt;SX1276_Receive_LBJ&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;ESP32&lt;/td&gt;
					&lt;td&gt;SX1276&lt;/td&gt;
					&lt;td&gt;现成开发板&lt;/td&gt;
					&lt;td&gt;TTGO LoRa 32 v1.6.1，约 18 美元到手即用。SX1276 支持 LoRa/FSK 双模。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://github.com/MisakaXing/RP2040-Based-LBJ-Receiver"&gt;RP2040-Based&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;RP2040&lt;/td&gt;
					&lt;td&gt;SX1276&lt;/td&gt;
					&lt;td&gt;自己画 PCB&lt;/td&gt;
					&lt;td&gt;同样基于 SX1276，MCU 换成树莓派 RP2040，有完整的 PCB 和外壳文件。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;TTGO LoRa 32 价格不算低，但完全不用 DIY——一块板子到手即用，代码现成，不需要画 PCB。缺点是板子形态固定，体积、功耗、接口都没法自己调整。&lt;/p&gt;
&lt;p&gt;自己画板的灵活度最高：通过嘉立创免费打板和淘宝采购芯片，成本应该会低于现成开发板，而且可以根据需求自由调整 PCB 尺寸、外设取舍等。代价是需要一定的 PCB 设计知识，尤其是射频走线部分——阻抗匹配、接地设计这些还是有一定的难度。如果要提高灵敏度再加入温度补偿晶振或者放大器等，就会更加复杂。对于我这种小白不太友好。&lt;/p&gt;</description></item><item><title>POCSAG 协议考古 - 协议基本格式</title><link>https://strcpy.me/index.php/archives/807/</link><pubDate>Fri, 01 May 2026 00:00:01 +0000</pubDate><guid>https://strcpy.me/index.php/archives/807/</guid><description>&lt;p&gt;在智能手机普及之前，有一个时代的移动通信是靠 BP 机（Pager/寻呼机）撑起来的。POCSAG 就是那个时代最成功的寻呼协议之一。虽然 BP 机早已淡出大众视野，但 POCSAG 在今天并没有完全消失——一些医院的老式内部呼叫系统、工厂的报警通知、铁路列车接近预警（800MHz 机车电台 LBJ）等场景中，仍然能看到它的身影。&lt;/p&gt;
&lt;p&gt;今天让我们翻开这份来自上世纪的&lt;a href="https://www.raveon.com/pdfiles/AN142(POCSAG).pdf"&gt;技术文档&lt;/a&gt;，看看它是如何在极其有限的带宽和功耗约束下，设计出一套完整的一对多消息广播系统的。&lt;/p&gt;
&lt;h2 id="什么是-pocsag"&gt;什么是 POCSAG&lt;/h2&gt;
&lt;p&gt;POCSAG 全称是 Post Office Code Standardization Advisory Group（邮政总局编码标准化咨询组），由当时掌管全英电信的英国邮政总局制定。它是一种无线数据传输的协议，用于向&amp;quot;寻呼机&amp;quot;（Pager）单向发送消息。&lt;/p&gt;
&lt;p&gt;POCSAG 定义了三种标准数据速率：512 bps、1200 bps、2400 bps。512 bps 的通信距离最远，而 1200 和 2400 bps 允许每秒传的寻呼消息数量更多。&lt;/p&gt;
&lt;h2 id="物理层调制方式"&gt;物理层：调制方式&lt;/h2&gt;
&lt;p&gt;POCSAG 采用 Frequency Shift Keying（FSK，频移键控）调制。FSK 是一种数字调制技术，用载波频率的变化来表示数字信号——不同的频率对应不同的 bit 值，接收端通过检测频率来判断发过来的是 0 还是 1。&lt;/p&gt;
&lt;p&gt;具体到 POCSAG：在射频载波上使用 ±4500Hz 的频偏，高频代表数字 &lt;code&gt;0&lt;/code&gt;，低频代表数字 &lt;code&gt;1&lt;/code&gt;。同一个传输频道上可以混合不同速率的数据块。&lt;/p&gt;
&lt;h2 id="cap-code寻呼机的身份证"&gt;CAP Code：寻呼机的&amp;quot;身份证&amp;quot;&lt;/h2&gt;
&lt;p&gt;CAP Code（Channel Access Protocol code，频道接入协议码）是每台寻呼机独一无二的地址标识，总共 21 位，这意味着一个频道理论上可以分配 2097152 个不同的地址。&lt;/p&gt;
&lt;p&gt;这 21 位实际上被拆成了两部分：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;字段&lt;/th&gt;
					&lt;th&gt;位数&lt;/th&gt;
					&lt;th&gt;位置&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;地址位（Address bits）&lt;/td&gt;
					&lt;td&gt;18 bit&lt;/td&gt;
					&lt;td&gt;高位（MSB）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;帧位置位（Frame location bits）&lt;/td&gt;
					&lt;td&gt;3 bit&lt;/td&gt;
					&lt;td&gt;低位（LSB）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;拆出 3 个帧位置位的设计非常精巧——它允许寻呼机只在&amp;quot;属于自己&amp;quot;的那几帧时间里打开接收器，其他帧时间直接断电休眠，显著延长电池寿命。后文会详细展开。&lt;/p&gt;</description></item><item><title>体验 LetsEncrypt 的短期证书</title><link>https://strcpy.me/index.php/archives/806/</link><pubDate>Thu, 27 Nov 2025 00:00:01 +0000</pubDate><guid>https://strcpy.me/index.php/archives/806/</guid><description>&lt;p&gt;在今年 2 月份的时候，LetsEncrypt 就发布了&lt;a href="https://letsencrypt.org/2025/01/16/6-day-and-ip-certs"&gt;一篇文章&lt;/a&gt;称要推出六天的短期证书，而目前 LetsEncrypt 的默认证书还是 90 天的。&lt;/p&gt;
&lt;p&gt;为何要使用有效期更短的证书呢，这个主要有两个重要的原因：&lt;/p&gt;
&lt;h2 id="证书吊销机制不可靠"&gt;证书吊销机制不可靠&lt;/h2&gt;
&lt;p&gt;证书吊销一直是依赖 OCSP 或 CRL 机制，但是都需要是客户端主动的去检查，否则对证书有效性没有任何的影响。&lt;/p&gt;
&lt;h3 id="crl证书吊销列表"&gt;CRL（证书吊销列表）&lt;/h3&gt;
&lt;p&gt;CA 定期生成一个签名的列表，其中包含所有已被吊销但尚未过期的证书序列号。客户端在验证证书时，会下载这个列表，并检查目标证书的序列号是否在其中。
如果在，则说明该证书已被吊销，不应信任。&lt;/p&gt;
&lt;p&gt;缺点包括&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;体积大：随着吊销证书增多，CRL 文件会变得很大，影响性能。&lt;/li&gt;
&lt;li&gt;存在时效性问题：两次更新之间的窗口期内吊销的证书无法被及时发现。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ocsp在线证书状态协议"&gt;OCSP（在线证书状态协议）&lt;/h3&gt;
&lt;p&gt;客户端向 CA 指定的 OCSP 响应服务器发送一个查询请求，包含目标证书的序列号等信息，OCSP 服务器实时返回该证书的状态。&lt;/p&gt;
&lt;p&gt;缺点包括&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每次查询都会暴露用户正在访问哪个网站&lt;/li&gt;
&lt;li&gt;依赖网络和服务器可用性：如果 OCSP 服务器宕机或响应慢，可能导致连接延迟甚至失败。某些客户端可能会忽略 OCSP 错误继续连接。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其改进版为 OCSP Stapling，即服务器主动从 CA 获取 OCSP 响应，并在 TLS 握手时一并发送给客户端。避免了客户端直接连接 OCSP 服务器，提升性能和隐私。&lt;/p&gt;
&lt;p&gt;短期证书的主要优势在于，它们能显著缩短潜在的风险暴露时间，因为这类证书会相对较快地过期。这降低了对证书吊销机制的依赖。因为上述吊销机制一直不够可靠，所以短期证书将不包含 CRL 或者 OCSP 的配置信息。&lt;/p&gt;
&lt;p&gt;此外，短期证书实际上要求必须实现自动化管理，实现证书签发的自动化也对于安全性至关重要。&lt;/p&gt;
&lt;h2 id="支持-ip-证书"&gt;支持 IP 证书&lt;/h2&gt;
&lt;p&gt;虽然说 IP 和域名的 SSL 的验证和签发本质都是一样的，但是过去只有少数几家 CA 小规模提供此类服务。&lt;/p&gt;
&lt;p&gt;IP 证书很少见最重要的原因是 IP 地址的所有权的变动比域名频繁多了，比如你在某个云厂商创建了一个新的虚拟机，分配了一个 IP 地址，在释放虚拟机的时候，如果你同时选择了释放 IP 的话，这个 IP 可能随时就被其他人所占用。这时候已经签发的长期有效的 IP 地址的证书可能就存在安全隐患了，而使用短期证书即可以匹配 IP 生命周期也可能比较短的场景。&lt;/p&gt;</description></item></channel></rss>