Answers:
以下是一些具有USSD余额检查支持的应用程序:
预付费管理器是GNOME桌面的小程序,可让您检查并充值GSM移动预付费SIM卡的余额。它是一个简单而简约的应用程序,具有USSD余额检查和充值功能。但另一方面,它是一个过时的应用程序,很长一段时间没有收到任何新更新。而且,如果不支持您的提供商,则必须按照其主页上的说明手动进行配置。要安装,请单击此处:
或运行以下命令:
sudo apt install prepaid-manager-applet
调制解调器管理器GUI是管理和监视基于移动网络的调制解调器的完整解决方案。它包含许多功能,而USSD支持只是其中之一。有关功能的完整列表,请访问其官方主页。要安装,请单击此处:
或运行以下命令:
sudo apt install modem-manager-gui
V Mobile Broadband是由Vodafone的开源Betavine Connection Manager团队改写为与Network Manager兼容的,用于Linux 的原始Vodafone Mobile Connect软件。不幸的是,目前看来它并没有得到非常积极的维护,并且在Ubuntu仓库中也没有。但是,您可以尝试从源代码构建项目。查看他们的GitHub页面。
警告:v-mobile-broadband
取决于wader
,它将取代Ubuntu的默认设置modemmanager
。因此,如果您在使用新设置时遇到问题并决定卸载v-mobile-broadband
,请不要忘记重新安装modemmanager
软件包。
您可以直接使用AT命令通过USSD查询余额。为此,请使用任何可让您直接与调制解调器通信的串行终端程序(putty
,minicom
等等)。
我选择atinout
它是因为它与命令行很好地集成在一起。首先安装它:
sudo apt-get install ruby-ronn;
git clone git://git.code.sf.net/p/atinout/code atinout;
cd atinout;
make;
sudo checkinstall make install;
然后,如果使用ModemManager(Ubuntu Linux下的默认设置),则可能必须先禁用它才能允许atinout
访问调制解调器:
sudo stop modemmanager;
现在,要将用于余额查询的USSD代码发送到网络(例如* 901#)并显示结果,可以使用以下命令:
atinout - /dev/ttyUSB1 - < <(echo "AT+CUSD=1,\"*901#\",15") && sleep 4 && \
atinout - /dev/ttyUSB1 - < <(echo "AT");
这假设您的调制解调器位于/dev/ttyUSB1
。将AT
在第二个命令atinout
的命令只是让显示的副作用,应后已经到达了不请自来的USSD答案sleep
。
对于查询余额需要操作USSD菜单的情况:也可以使用atinout
,请参见此答案。
您可以使用mmcli
Ubuntu默认ModemManager 的命令行客户端发送USSD代码并获得回复:
首先列出您的调制解调器:mmcli -L
。这将显示调制解调器设备路径,如/org/freedesktop/ModemManager1/Modem/0
。最后的数字是调制解调器索引,记住它。
启用调制解调器(假设您的调制解调器索引为0): mmcli -m 0 -e
发送USSD请求并显示答案。假设您的网络运营商的USSD代码获取余额为* 901#,则命令为:
mmcli -m 0 --3gpp-ussd-initiate="*901#"
对于查询余额需要操作USSD菜单的情况:也可以使用mmcli
,请参见此答案。
error: couldn't initiate USSD session: 'GDBus.Error:org.freedesktop.ModemManager1.Error.Core.Unsupported: Operation not supported.'
对我来说,这两种基于ModemManager的解决方案gammu
都不能与多行USSD响应一起正常使用;例如,我的操作员有一个USSD命令*104#
,它会响应以下内容:
You have:
2.07 GB of traffic, valid until N
47 minutes
仅看到第一行无用的代码令人失望You have:
。
最后,我找到了一种解决方法,picocom
并使用了手动AT命令。因此,每次我要检查余额时,都必须执行以下操作:
首先,停止调制解调器管理器:
$ sudo stop modemmanager
现在,您需要知道您的调制解调器端口。就我而言,是/dev/ttyACM0
。
如果您不知道自己的端口,请尝试以下操作:
for n in `ls /sys/class/*/*{ACM,wdm}*/device/interface`;do echo $(echo $n|awk -F '/' '{print $5}') : $(cat $n);done
并使用查找条目Mobile Broadband Modem
。例如,我的输出如下所示:
ttyACM0 : F5521gw Mobile Broadband Modem
ttyACM1 : F5521gw Mobile Broadband Data Modem
ttyACM2 : F5521gw Mobile Broadband GPS Port
cdc-wdm0 : F5521gw Mobile Broadband Device Management
cdc-wdm1 : F5521gw Mobile Broadband USIM Port
有关获取正确端口的更多信息,请参见以下链接:https : //gist.github.com/heyalexej/cc6c97b1ea42736b3ff7
然后,使用picocom连接到您的端口:
$ sudo picocom /dev/ttyACM0
您应该会看到以下内容:
picocom v1.7
port is : /dev/ttyACM0
flowcontrol : none
baudrate is : 9600
parity is : none
databits are : 8
escape is : C-a
local echo is : no
noinit is : no
noreset is : no
nolock is : no
send_cmd is : sz -vv
receive_cmd is : rz -vv
imap is :
omap is :
emap is : crcrlf,delbs,
Terminal ready
*EMRDY: 1
(如果您未看到此信息*EMRDY: 1
,则可能意味着您尚未停止Modem Manager,请参见上文)
然后输入:
AT+CUSD=1,"*104#"
几秒钟后,您应该会收到答复,可以是多行:
+CUSD: 0,"You have:
2.07 GB of traffic, valid until N
47 minutes
",15
OK
要退出picocom,请使用 Ctrl-A Ctrl-X
并再次启动调制解调器管理器:
$ sudo start modemmanager
您可以使用开源虚拟PBX解决方案FreeSwitch及其扩展名GSMopen来发送USSD命令[ source ]。
例如,如果要获取余额的USSD代码是(例如)* 901#,则应执行:
chat SMS|interface3|ussd|*901#
当然,在其他答案中还有更简单的解决方案,但是如果仍然要使用GSMopen(例如,因为这是在Linux下进行GSM语音通话的唯一方法……)。