1

我想获取有关我安装在我计算机的移动宽带调制解调器中的 SIM 卡的帐户余额信息。对于我的移动网络运营商,这可以使用 USSD 代码100#

我发现gammu可以使用gammu getussd '100#'. 作为回应,gammu 向我展示了这个 USSD 菜单:

Press Ctrl+C to break...  
USSD received  
Status               : Action needed  
Service reply        : "Reply with your option:  
1.Account Balance  
2.Buy a Data Plan  
3.Top Up Now  
No response in specified timeout. Probably phone not connected.

如何从该菜单中选择一个选项(如,1)?

4

5 回答 5

5

在我看来,ModemManager(及其命令行客户端界面mmcli)是目前在 Linux 下与 USSD 和 USSD 菜单交互的最复杂、最高质量的解决方案。

安装(在 Debian / Ubuntu Linux 下):

sudo apt-get install modemmanager modem-manager-gui

用法(按照手册页):

  1. 列出您的调制解调器:mmcli -L。这将显示调制解调器设备路径/org/freedesktop/ModemManager1/Modem/12,您可以使用其末尾的数字来指定要-m在以下命令中的选项之后使用的调制解调器。

  2. 显示调制解调器的属性:mmcli -m 12

  3. 启用调制解调器(在将其用于 USSD 之前需要):mmcli -m 12 -e

  4. 启动 USSD 会话。例如,对于Ncell ,此命令显示 USSD 主菜单:mmcli -m 12 --3gpp-ussd-initiate="*100#"

  5. 响应 USSD 菜单。会话开始后,您可以使用这样的命令来响应,这里使用选项1mmcli -m 12 --3gpp-ussd-respond="1"

  6. 取消给定调制解调器上的 USSD 会话:mmcli -m 12 --3gpp-ussd-cancel

  7. 获取所有 USSD 会话(所有可用调制解调器)的状态:mmcli --3gpp-ussd-status

对于大多数硬件,这应该如所描述的那样立即正常工作。

mmcli(但是,对于我的硬件,由于错误,到目前为止我无法使用。所有与 USSD 相关的命令mmcli都会回复error: modem not unlocked yet,并mmcli -m 12 | grep " lock"显示sim-pin2锁定已启用。但事实并非如此(意味着我无法通过禁用锁定来解决这个问题). 即使它被启用,该锁也不会限制 USSD 的使用(它只是用于限制对某些号码的呼出)。所以,我必须从这里删除这个过分热心的测试条件,自己编译它并再次测试 … 。)

于 2015-08-06T19:50:51.400 回答
2

Linux 命令行工具gsm-ussd支持 USSD 会话,可让您回答 USSD 菜单。有关详细的安装和配置说明,请参见此处。那里提供的用于安装的 0.4 版 Debian 软件包是最新的 dev 分支版本

但是,对此的支持还不稳定[来源]。至少对我来说,它不起作用。使用不同的硬件和/或移动网络运营商,您可能会有更多的运气。

它的使用方式是这样的(以Ncell为例):

$ gsm-ussd -m /dev/ttyUSB1 "*100#"
USSD session open, to cancel use "gsm-ussd -c".
1 Account
2 Services operations
3 Offices information
4 How to call Call Center
5 Change password
Note:
Back:* Top:#

要回复并选择一个选项,您可以发送如下内容:

$ gsm-ussd -m /dev/ttyUSB1 "1"

要结束会话并返回正常的单命令 USSD 模式,您将执行gsm-ussd -c. 更完整的文档在这里

于 2015-08-06T17:26:07.627 回答
2

我发现我可以直接使用 AT 命令成功导航 USSD 菜单。鉴于我的系统存在其他更可取的mmcli解决方案的问题(有关详细信息,请参阅我的其他答案),这是迄今为止为我导航 USSD 的唯一可行解决方案。

如何让它工作:

(1)安装 AT 端子。我选择atinout通过 AT 命令与调制解调器通信。您还可以使用任何其他 AT 终端软件,如puttyminicom。安装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;

(2)如果您使用 ModemManager(这是 Ubuntu Linux 下的默认设置),您可能必须先禁用它以允许atinout访问您的调制解调器:

sudo stop modemmanager;

(3)现在,要接收和回复 USSD 菜单,您可以使用如下命令:

atinout - /dev/ttyUSB1 - < <(echo "AT+CUSD=1,\"100#\",15") && sleep 4 && \
atinout - /dev/ttyUSB1 - < <(echo "AT") && \
\
atinout - /dev/ttyUSB1 - < <(echo "AT+CUSD=1,\"1\",15") && sleep 4 && \
atinout - /dev/ttyUSB1 - < <(echo "AT");

这假设您的调制解调器是 at/dev/ttyUSB1并且接收 USSD 菜单的代码是100#。适应你的情况。

说明:该命令发送100#到网络接收USSD菜单,然后1选择第一个选项。atinout如果您不超过超时时间(通常 > 20 秒),像这样将一个 USSD 菜单会话分散到多个调用中不会中断会话。

故障排除:如果上述多合一命令不起作用,请尝试手动执行各个部分,重复那些失败的部分。如果某些事情反复失败(“资源繁忙”等),您的调制解调器可能处于奇怪的状态。重置它,或者让计算机经历一个暂停/恢复周期。

于 2015-08-08T17:46:05.227 回答
1

下面链接的答案对我很有用。

您可以添加调制解调器 PPA 并更新您的 apt。链接中提到了一些 USB 调制解调器的错误,但已通过更新修复

sudo add-apt-repository ppa:aleksander-m/modemmanager-xenial<br>
sudo apt-get update

然后按照这个:https ://stackoverflow.com/a/31864567/6161579

谢谢@tanius

于 2018-02-03T17:01:15.027 回答
1

Gammu 命令行目前无法使用,但您可以使用 python-gammu 使用简单的 Python 脚本:https ://github.com/gammu/python-gammu/blob/master/examples/service_numbers.py

于 2015-07-23T05:43:06.070 回答