修复 ModemManager 中华为 CDMA 设备的信号获取

在 ModemManager 0.6 及之前版本中,华为 CDMA 设备的信号获取依赖于 MMGenericCdma 基类实现的 MMModemCdma 接口的 get_signal_quality 方法。在此方法的实现中通过 AT+CSQ 或 AT+CSQ? 查询设备的 CDMA 1X 信号强度。但是华为的设备返回的 +CSQ 数据格式与代码中的格式并不相符,导致返回的信号数据并不能使用,换言之什么也没做,NetworkManager 看到的就是无信号!

目前 CDMA 设备是有两类信号要获取的,分别是 CDMA 1X 和 EVDO,而当前的 org.freedesktop.ModemManager.Modem.Cdma D-Bus 接口中只有一个方法 GetSignalQuality 且只能返回一个信号值。

在插件中的 MMModemHuaweiCdma 子类里实现了对非主动上报的 CDMA 1X (^RSSILVL) 和 EVDO (^HRSSILVL) 信号进行了更新,也仅此一处涉及到了 EVDO 信号的获取。

基于上述的情况,产生了这样的一种修复方案:在 MMModemHuaweiCdma 中重新实现 MMModemCdma 接口类的 get_signal_quality 方法。在此方法中根据当前的 CDMA 1X 和 EVDO 网络注册情况获取信号,当 EVDO 注册状态为 Unknown 时通过 AT^CSQLVL 获取 CDMA 1X 信号并更新,而当 EVDO 注册状态为非 Unknown 时通过 AT^HDRCSQLVL 获取 EVDO 信号并更新。

https://github.com/heiher/ModemManager/commit/4711bfc79abafd04d678c4c95976e9e7d561d2c4

在基类 MMGenericCdma 中信号变更还会触发信号 org.freedesktop.ModemManager.Modem.Cdma.SignalQuality,与上述规则相同,当 EVDO 注册时只返回 EVDO,反之返回 CDMA 1X。

https://github.com/heiher/ModemManager/commit/2a13ed070c2762058b4150c7069967df1bd4e6de

Over!

Leave a Reply

Your email address will not be published. Required fields are marked *