如何在C++ Linux中获取3G调制解调器的信号强度?

5
不使用AT命令,我们如何获取3G调制解调器的信号强度?NetworkManager的gdbus对象没有像getSignalStrength这样的方法。 网络管理器锁定设备文件,防止使用AT命令。
nm-applet能够在系统托盘中显示信号强度。所以必须有一种方式可以从网络管理器中获取信号强度! nmcli是nm-applet的命令行版本。我能否使用nmcli获得信号强度?它的手册中没有提到关于信号强度的任何信息。
3个回答

4

终于找到答案了!

在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。-- Aleksander Morgado

可以使用org.freedesktop.ModemManager.Modem.Gsm.Network.GetSignalQuality信号来监听。

gdbus monitor --system --dest org.freedesktop.NetworkManager --object-path /org/freedesktop/NetworkManager/Modems/0

问:代理是否异步地每次信号强度发生变化时发送信号,还是ModemManager定期轮询调制解调器以获取信号质量?

答:这取决于所使用的调制解调器。如果调制解调器支持不经请求即可更改信号质量指示,我们将使用它们;否则,MM将每30秒轮询一次信号质量值。接口中的属性值将在我们获得新值后更新(或多或少)。-- Aleksander Morgado


2
NetworkManager使用ModemManager来控制移动宽带调制解调器。如果您想查看连接/注册详细信息,包括信号质量,可以查看ModemManager的DBus API,而不是查看NetworkManager的DBus API。
如果要使用C++开发应用程序从调制解调器收集信息,建议使用libmm-glib(基于GLib的库)透明地访问ModemManager的DBus API(即无需了解DBus)。

-1
我正在做一份作业,需要通过建筑物中访问点的信号强度确定室内位置。我使用以下命令来查看附近访问点的信号强度:

iwlist wlan0 scanning

然后,我在Bash中处理其输出并将其重定向到C++可执行文件中,这在Bash中非常容易。希望这能对你有所帮助。

我的设备是3G调制解调器。我可以使用iwlist ppp0 scanning吗?我会试一下。 - Necktwi
它能工作吗?我在寻找一个能做同样事情的C++库,但我找不到。虽然我在Android上找到了一些东西。然后通过Bash + C++这种方式有效地解决了我的问题。希望对你也有用。 - Tlos
但我还没有尝试过。我正在按照这个链接(http://arachnoid.com/linux/linux_mobile_internet_access.html)进行操作。它也可能会对你有所帮助。 - Necktwi
$ iwlist ppp0 scanning ppp0接口不支持扫描。这仅适用于WiFi网络。 - Necktwi
这个答案涉及到Wi-Fi,而原帖是关于3G调制解调器的。 - Dolf Andringa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接