【问题标题】:How to reply to a USSD menu using Linux command line tools?如何使用 Linux 命令行工具回复 USSD 菜单?
【发布时间】:2018-02-04 03:32:38
【问题描述】:

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

我发现gammu 可以使用gammu getussd '100#' 发送该USSD 代码。作为回应,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)?

【问题讨论】:

  • 这不是真正的编程问题...

标签: linux ussd gammu


【解决方案1】:

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

安装(在 Debian / Ubuntu Linux 下):

sudo apt-get install modemmanager modem-manager-gui

用法(关注the manpage):

  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

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

(但是,对于我的硬件,由于一个错误,到目前为止我无法使用mmclimmcli 中的所有 USSD 相关命令都会回复error: modem not unlocked yetmmcli -m 12 | grep " lock" 会显示sim-pin2 锁定是启用。但它不是(意味着我无法通过禁用锁来解决这个问题)。即使启用它,该锁也不会限制 USSD 的使用(它只是用于限制对某些号码的拨出呼叫)。所以,我得把这个过分热心的测试条件from here去掉,自己编译再测试……)

【讨论】:

    【解决方案2】:

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

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

    它的使用方式是这样的(以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。更完整的文档是here

    【讨论】:

      【解决方案3】:

      我发现我可以直接使用 AT 命令成功导航 USSD 菜单。考虑到我的系统与其他更可取的 mmcli 解决方案(有关详细信息,请参阅 my other answer)的问题,这是迄今为止为我导航 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");
      

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          下面链接中的答案对我很有帮助。

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

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

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

          谢谢@tanius

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-27
            相关资源
            最近更新 更多