如何在 c++ linux 中获取 3g 调制解调器信号强度?
Posted
技术标签:
【中文标题】如何在 c++ linux 中获取 3g 调制解调器信号强度?【英文标题】:how to get 3g modem signal strength in c++ linux? 【发布时间】:2013-06-23 17:09:53 【问题描述】:不使用AT命令如何获取3g调制解调器的信号强度? gdbus object for NetworkManager 没有像 getSignalStrength
这样的方法。
网络管理器正在锁定设备文件以防止使用 AT 命令。
nm-applet 能够在系统托盘中显示信号强度。所以应该有办法从网络管理员那里获取信号强度!
nmcli
是 nm-applet 的命令行计数器部分。我可以使用nmcli
获得信号强度吗?手册页中没有提及信号强度。
【问题讨论】:
【参考方案1】:终于知道答案了!
在 c++ 中使用 libnm-glib 对 dbus 代理进行操作。从命令行使用..
gdbus call --system --dest org.freedesktop.ModemManager --object-path /org/freedesktop/ModemManager/Modems/0 --method org.freedesktop.ModemManager.Modem.Gsm.Network.GetSignalQuality
为您提供 gsm 调制解调器的信号强度。
如果 MM 说连接时无法获得信号质量,那是因为 所有命令和数据只有一个 AT 端口。所以当 AT 端口 已连接,无法发送 AT 指令采集信号质量。 您需要获得具有更多 AT 端口的更好的调制解调器,或者切换 到非 AT 调制解调器,如 QMI 或 MBIM 供电的调制解调器。 ——亚历山大·莫尔加多
可以使用org.freedesktop.ModemManager.Modem.Gsm.Network.GetSignalQuality
信号收听
gdbus monitor --system --dest org.freedesktop.NetworkManager --object-path /org/freedesktop/NetworkManager/Modems/0
问。代理是否会在每次信号强度发生异步变化时发出信号,或者 ModemManager 会定期轮询调制解调器以获取信号质量?
A.这取决于所使用的调制解调器;如果调制解调器支持未经请求的 质量变化指示,我们将使用它们;否则 MM 将轮询每个 信号质量值 30 秒。接口中的属性值将 一旦我们获得新值(或多或少),就会更新。 ——亚历山大·莫尔加多
【讨论】:
【参考方案2】:NetworkManager 使用 ModemManager 进行移动宽带调制解调器控制。您可以查看 ModemManager 而不是查看 NetworkManager DBus API,它实际上会公开连接/注册详细信息,包括信号质量。
如果目标是使用 C++ 开发应用程序以从调制解调器收集信息,我建议使用 libmm-glib(基于 GLib 的库)透明地访问 ModemManager DBus API(即无需了解 DBus)。
【讨论】:
【参考方案3】:我正在做一项作业,其中我必须通过建筑物中接入点的信号强度来确定室内位置。我正在使用
iwlist wlan0 扫描
命令以查看获取附近接入点的信号强度。然后我在 Bash 中处理它的输出并将其重定向到 C++ 可执行文件,这在 Bash 中很容易。我希望它会帮助你。
【讨论】:
我的设备是 3g 调制解调器。我可以使用iwlist ppp0 scanning
吗?我会试试看。
有效吗?我正在寻找一个 C++ 库来做同样的事情,但我做不到。我虽然在android中找到了。然后通过这种方式 Bash + C++ 有效地解决了我的问题。希望它也适用于您。
但我没有尝试过。我正在关注这个link。它也可以帮助你。
$ iwlist ppp0 scanning
ppp0 Interface doesn't support scanning.
仅适用于 wifi 网络。
这个答案是关于 wifi,而 OP 询问的是 3G 调制解调器。以上是关于如何在 c++ linux 中获取 3g 调制解调器信号强度?的主要内容,如果未能解决你的问题,请参考以下文章