<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>技诉 Blog</title>
        <link>https://blog.js.gripe/zh-CN/</link>
        <description>记录技术实践、网络服务、写作与观察。</description>
        <lastBuildDate>Sat, 02 May 2026 13:10:27 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>2026 技诉 Blog</copyright>
        <item>
            <title><![CDATA[OpenWrt QModem 下 RM502Q-AE 无法接收短信的排障与恢复：IMS、5G SA 与短信承载配置]]></title>
            <link>https://blog.js.gripe/zh-CN/posts/rm502q-ae-openwrt-qmodem-sms-ims-fix/</link>
            <guid>https://blog.js.gripe/zh-CN/posts/rm502q-ae-openwrt-qmodem-sms-ims-fix/</guid>
            <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[一次真实排障记录：QModem 页面收不到短信，最终定位为中国移动 NR5G SA 下 IMS 未开启；开启 IMS 并重启 RM502Q-AE 后，短信恢复接收。]]></description>
            <content:encoded><![CDATA[<p>这是一篇真实排障记录：OpenWrt 上通过 QModem 管理 Quectel RM502Q-AE 时，QModem 短信页面一直收不到短信。最后确认问题不在页面读取，也不是短信存储满，而是在中国移动 NR5G SA 场景下 IMS 处于关闭状态。开启 IMS 并重启模组后，短信恢复接收。</p>
<p>文中涉及身份类信息均已脱敏；如果需要提到 CIMI/IMSI，只记录为 <code>46007************</code> 或“已脱敏”。短信正文不记录。</p>
<h2 id="1-背景与症状" tabindex="-1">1. 背景与症状</h2>
<p>环境很普通：OpenWrt 系统，QModem 管理 RM502Q-AE，AT 端口使用 <code>/dev/mhi_DUN</code>。模组信息如下：</p>
<pre><code class="language-text">ATI
Quectel
RM502Q-AE
Revision: RM502QAEAAR13A04M4G

AT+QGMR
RM502QAEAAR13A04M4G_01.203.01.203
</code></pre>
<p>运营商为中国移动，网络曾驻留在 NR5G SA：</p>
<pre><code class="language-text">AT+QNWINFO
+QNWINFO: &quot;TDD NR5G&quot;,&quot;46000&quot;,&quot;NR5G BAND 79&quot;,721824
</code></pre>
<p>排障过程中也出现过 <code>NR5G BAND 41</code>。5G SA 注册状态最终正常：</p>
<pre><code class="language-text">AT+C5GREG?
+C5GREG: 2,1,...,11,...

AT+C5GREG?
+C5GREG: 0,1
</code></pre>
<p>原始症状是 QModem 的短信页面没有任何短信。接口返回中 <code>msg</code> 为空，存储能力看起来正常：</p>
<pre><code class="language-json">{
  &quot;msg&quot;: [],
  &quot;result&quot;: {},
  &quot;sms_capabilities&quot;: {
    &quot;mem1&quot;: &quot;MT&quot;,
    &quot;mem2&quot;: &quot;MT&quot;,
    &quot;mem3&quot;: &quot;MT&quot;,
    &quot;ME&quot;: { &quot;used&quot;: &quot;0&quot;, &quot;total&quot;: &quot;127&quot; },
    &quot;SM&quot;: {}
  }
}
</code></pre>
<h2 id="2-先确认不是-qmodem-页面问题" tabindex="-1">2. 先确认不是 QModem 页面问题</h2>
<p>第一步不是改配置，而是确认短信到底有没有进入模组存储。分别检查 <code>ME</code>、<code>MT</code>、<code>SM</code>、<code>SR</code> 后，结果都为空：</p>
<pre><code class="language-text">AT+CPMS=&quot;ME&quot;,&quot;ME&quot;,&quot;ME&quot;
+CPMS: 0,127,0,127,0,127
OK

AT+CPMS=&quot;MT&quot;,&quot;MT&quot;,&quot;MT&quot;
+CPMS: 0,127,0,127,0,127
OK

AT+CPMS=&quot;SM&quot;,&quot;SM&quot;,&quot;SM&quot;
+CPMS: 0,50,0,50,0,50
OK

AT+CPMS=&quot;SR&quot;,&quot;SR&quot;,&quot;SR&quot;
+CPMS: 0,5,0,5,0,5
OK

AT+CMGL=4
OK
</code></pre>
<p><code>AT+CMGL=4</code> 返回 <code>OK</code> 但没有任何 <code>+CMGL</code> 行。这一点很关键：如果 <code>ME</code>、<code>MT</code>、<code>SM</code>、<code>SR</code> 都为空，就不是 QModem 页面只读错了 ME/SM，也不是存储满，而是短信没有进入模组可读存储。</p>
<h2 id="3-pdu-模式下-cmgl-的一个容易踩坑点" tabindex="-1">3. PDU 模式下 CMGL 的一个容易踩坑点</h2>
<p>排障初期曾看到：</p>
<pre><code class="language-text">AT+CMGL=&quot;ALL&quot;
ERROR
</code></pre>
<p>这很容易被误判成短信功能异常。后续确认当前是 PDU 模式：</p>
<pre><code class="language-text">AT+CMGF?
+CMGF: 0

AT+CMGL=?
+CMGL: (0-4)
</code></pre>
<p>在 PDU 模式下，列出全部短信应使用：</p>
<pre><code class="language-text">AT+CMGL=4
</code></pre>
<p>而不是：</p>
<pre><code class="language-text">AT+CMGL=&quot;ALL&quot;
</code></pre>
<p><code>AT+CMGL=&quot;ALL&quot;</code> 更适合文本模式，也就是先执行 <code>AT+CMGF=1</code> 的场景。验证码、中文短信和 Unicode 内容更适合保留 PDU 模式，所以这里最终使用 <code>AT+CMGF=0</code> 与 <code>AT+CMGL=4</code>。</p>
<h2 id="4-短信存储urc-和通知配置" tabindex="-1">4. 短信存储、URC 和通知配置</h2>
<p>排障中验证或设置过这一组基础短信配置：</p>
<pre><code class="language-text">AT+CMEE=2
AT+QURCCFG=&quot;urcport&quot;,&quot;all&quot;
AT+CSMS=1
AT+CMGF=0
AT+CPMS=&quot;MT&quot;,&quot;MT&quot;,&quot;MT&quot;
AT+CNMI=2,1,0,0,0
</code></pre>
<p>这些命令的作用可以这样理解：</p>
<ul>
<li><code>AT+QURCCFG=&quot;urcport&quot;,&quot;all&quot;</code>：让 URC 从所有可用 AT 端口输出，避免 QModem 使用的端口和手工调试的 AT 口不一致，导致新短信通知看不到。</li>
<li><code>AT+CPMS=&quot;MT&quot;,&quot;MT&quot;,&quot;MT&quot;</code>：使用模组短信总视图，避免短信落在 <code>ME</code> 或 <code>SM</code>，但读取时看了另一边。</li>
<li><code>AT+CNMI=2,1,0,0,0</code>：新短信存储后，通过 <code>+CMTI</code> 通知终端。</li>
<li><code>AT+CMGF=0</code>：保持 PDU 模式，更适合验证码、中文短信和 Unicode 内容。</li>
</ul>
<p>如果选择文本模式，才更适合使用：</p>
<pre><code class="language-text">AT+CMGF=1
AT+CMGL=&quot;ALL&quot;
</code></pre>
<h2 id="5-5g-sa-注册正常但短信仍未进入存储" tabindex="-1">5. 5G SA 注册正常但短信仍未进入存储</h2>
<p>当时 5G SA 注册已经正常，但短信仍然没有进入任何存储。继续检查短信承载偏好：</p>
<pre><code class="language-text">AT+CGSMS?
+CGSMS: 1
</code></pre>
<p><code>CGSMS=1</code> 可以理解为偏向传统 CS 域。对于当前中国移动 NR5G SA 场景，这并不是理想状态。随后设置为：</p>
<pre><code class="language-text">AT+CGSMS=2
OK
</code></pre>
<p><code>CGSMS=2</code> 可理解为 Packet domain preferred / PS preferred。这里不要写得过度绝对：不同运营商、不同固件、不同注册状态下，短信承载策略可能不同。但在这次 NR5G SA 排障中，不应继续让短信承载偏向传统 CS 域。</p>
<h2 id="6-关键发现ims-是关闭的" tabindex="-1">6. 关键发现：IMS 是关闭的</h2>
<p>真正的关键点来自 IMS 配置：</p>
<pre><code class="language-text">AT+QCFG=&quot;ims&quot;
+QCFG: &quot;ims&quot;,0,0
</code></pre>
<p>这表示 IMS 未开启。随后执行：</p>
<pre><code class="language-text">AT+QCFG=&quot;ims&quot;,1
OK
</code></pre>
<p>重启模组后，短信恢复正常，可以接收短信。也就是说，在这次 RM502Q-AE 驻留中国移动 NR5G SA 网络的场景里，短信恢复的关键动作不是清空存储，也不是换 QModem 页面读取方式，而是开启 IMS。</p>
<h2 id="7-修复步骤" tabindex="-1">7. 修复步骤</h2>
<p>核心修复命令如下：</p>
<pre><code class="language-text">AT+CMEE=2
AT+QCFG=&quot;ims&quot;,1
AT+CFUN=1,1
</code></pre>
<p>模组重启后，建议重新设置短信相关参数：</p>
<pre><code class="language-text">AT+QURCCFG=&quot;urcport&quot;,&quot;all&quot;
AT+CGSMS=2
AT+CSMS=1
AT+CMGF=0
AT+CPMS=&quot;MT&quot;,&quot;MT&quot;,&quot;MT&quot;
AT+CNMI=2,1,0,0,0
</code></pre>
<p>本次实际结果是：开启 IMS 并重启后，QModem 可以收到短信。</p>
<h2 id="8-回滚步骤" tabindex="-1">8. 回滚步骤</h2>
<p>如果开启 IMS 后出现注册、拨号或网络异常，可以回滚：</p>
<pre><code class="language-text">AT+QCFG=&quot;ims&quot;,0
AT+CFUN=1,1
</code></pre>
<p>但本次故障的实际恢复动作是开启 IMS，因此最终建议保留：</p>
<pre><code class="language-text">AT+QCFG=&quot;ims&quot;,1
</code></pre>
<p>如果需要回滚短信承载偏好，可以执行：</p>
<pre><code class="language-text">AT+CGSMS=1
</code></pre>
<p>不过这不推荐作为本次 NR5G SA 场景下的最终状态，因为短信恢复后使用的是：</p>
<pre><code class="language-text">AT+CGSMS: 2
</code></pre>
<h2 id="9-qmodem-初始化后-at-命令建议" tabindex="-1">9. QModem 初始化后 AT 命令建议</h2>
<p>建议写入 QModem 的“初始化后 AT 命令”：</p>
<pre><code class="language-text">AT+QCFG=&quot;ims&quot;,1
AT+QURCCFG=&quot;urcport&quot;,&quot;all&quot;
AT+CGSMS=2
AT+CSMS=1
AT+CMGF=0
AT+CPMS=&quot;MT&quot;,&quot;MT&quot;,&quot;MT&quot;
AT+CNMI=2,1,0,0,0
</code></pre>
<p>这里不依赖 <code>AT&amp;W</code>。实际排障中，<code>AT&amp;W</code> 没有稳定返回 <code>OK</code>，而 OpenWrt/QModem 的使用方式也更适合把关键初始化命令交给 QModem 在启动后执行。这样即使 profile 持久化行为不确定，重启后仍能把短信相关状态拉回预期配置。</p>
<h2 id="10-后续如何判断载波聚合是否触发" tabindex="-1">10. 后续：如何判断载波聚合是否触发</h2>
<p>短信恢复后，又继续看了载波聚合状态：</p>
<pre><code class="language-text">AT+QCAINFO
+QCAINFO: &quot;PCC&quot;,721824,6,&quot;NR5G BAND 79&quot;,347

AT+QNWINFO
+QNWINFO: &quot;TDD NR5G&quot;,&quot;46000&quot;,&quot;NR5G BAND 79&quot;,721824

AT+QENG=&quot;servingcell&quot;
+QENG: &quot;servingcell&quot;,&quot;NOCONN&quot;,&quot;NR5G-SA&quot;,&quot;TDD&quot;,460,00,...,721824,79,...

AT+QCFG=&quot;lteca&quot;
ERROR
</code></pre>
<p><code>QCAINFO</code> 只有 <code>PCC</code>，没有 <code>SCC</code>，说明查询当下没有触发载波聚合。但 <code>QENG=&quot;servingcell&quot;</code> 显示 <code>NOCONN</code>，代表当时处于空闲或未连接态，不能据此判断模组或网络不支持 CA。</p>
<p>正确判断方法是在测速或大流量下载过程中，反复执行：</p>
<pre><code class="language-text">AT+QCAINFO
AT+QENG=&quot;servingcell&quot;
</code></pre>
<p>如果出现 <code>SCC</code>，才说明 CA 被网络侧调度。<code>AT+QCFG=&quot;lteca&quot;</code> 返回 <code>ERROR</code>，只说明当前固件不支持这个配置项，或没有开放这个 <code>QCFG</code> 项，不等于 CA 被关闭。</p>
<p>对于 NR5G SA 下的 NR CA，更多取决于网络侧调度、基站配置、套餐、信号、频段组合和是否锁频。不要为了测试 CA 盲目写未知 AT 命令，更不要把已经验证有效的 IMS 关闭。</p>
<h2 id="11-结论" tabindex="-1">11. 结论</h2>
<p>这次故障的结论很明确：</p>
<ul>
<li>不是短信存储满。</li>
<li>不是 QModem 只读错 <code>ME</code> 或 <code>SM</code>。</li>
<li><code>ME</code>、<code>MT</code>、<code>SM</code>、<code>SR</code> 都为空，说明短信没有进入模组可读存储。</li>
<li>当前网络是中国移动 NR5G SA，5G 注册状态正常。</li>
<li>短信恢复的关键动作是开启 IMS：<code>AT+QCFG=&quot;ims&quot;,1</code>，然后通过 <code>AT+CFUN=1,1</code> 重启模组。</li>
<li>重启后可以接收短信。</li>
<li>后续建议保留 IMS 开启，并在 QModem 初始化后 AT 命令中固化短信相关配置。</li>
<li>关于 CA：查询时 <code>QCAINFO</code> 只有 <code>PCC</code>，说明当时没有触发 CA；<code>AT+QCFG=&quot;lteca&quot;</code> 返回 <code>ERROR</code> 不代表 CA 不能用，只代表该配置项不可用。正确方式是在大流量期间观察 <code>QCAINFO</code> 是否出现 <code>SCC</code>。</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[技诉 Blog 正式启用]]></title>
            <link>https://blog.js.gripe/zh-CN/posts/welcome/</link>
            <guid>https://blog.js.gripe/zh-CN/posts/welcome/</guid>
            <pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[这里会记录技术实践、网络服务、写作与观察，也留下一些问题被解决前后的痕迹。]]></description>
            <content:encoded><![CDATA[<p>技诉 Blog 正式启用。</p>
<p>这里会放一些慢慢写下来的内容：技术实践、网络服务、工具使用、问题排查，以及日常观察。它不追求热闹，更像一张持续更新的工作台，把遇到的问题、走过的路径和最后留下的判断整理出来。</p>
<p>第一篇文章先作为一个小小的起点。接下来，文章会按主题归档，也会保留标签，方便之后从同一个问题一路追到相关背景。</p>
<p>愿每一次记录都让下一次处理问题时少绕一点路。</p>
]]></content:encoded>
        </item>
    </channel>
</rss>