如何通过数据卡以AT命令以编程方式连接互联网?

时间:2015-10-24 16:05:48

标签: java ubuntu at-command

我有一台数据卡中兴MF190。我想使用AT命令在2G或3G中注册并通过datacard访问互联网。找到有关how to make data call的文章:

AT+cgatt=1
AT+CGDCONT=1,”IP”,”epc.tmobile.com” //I used my operator PDP context
AT+CGACT=1,1

但是来自OS终端的ping显示100%的程序包丢失。 我试过Ubuntu 14和Windows 7。

如何在Ubuntu上使用datacard将AT连接到AT命令?

更新

我给了@ tripleee的答案赏金,因为它比第一个更丰满并且回答了我的所有问题。但我对答案不满意,所以我会在一周内回答我自己的问题。

在我的回答中,我将展示如何使用Java处理这个过程。因此,请不要将此问题移至其他Stack Exchange网站。

3 个答案:

答案 0 :(得分:2)

在卡与提供商之间建立连接是不够的。您需要一些机制来创建此连接之外的网络接口,并设置您的网络堆栈以通过此接口路由数据包。

传统上,pppd守护程序一直是此任务的热门选择。你会创建一个"聊天脚本"使用用于建立数据调用的命令(这些天,pppd可能包含一个合适的固定脚本),并且守护进程将处理放置呼叫,验证,在电路上建立网络接口的整个过程,并配置系统在其上路由数据包,以及配置DNS等以将其用于解析器查询等。

答案 1 :(得分:1)

  

我试图嗅吸USB端口,但在这种情况下,由于端口繁忙,仪表板无法连接

当然可以。见this question

  

找到关于how to make data call

的这篇文章

该文章的内容是如何设置呼叫,而不是如何设置呼叫。 设置正确后,使用以下命令连接到Internet: ATD*99***1#

UPDATE1 :经过一番研究后,我认为这篇文章的目的只是为了推广他们的软件而没有实际用途。实际上,拨号是使用pppdwvdial

进行的

UPDATE2 :我们在a chat room (in Russian)中讨论了解决问题的方法。事实证明cnetworkmanager将是最佳选择

答案 2 :(得分:0)

据我所知wvdial使用ppp daemon使用调制解调器连接到互联网。在桌面版的Ubuntu上预装了 wvdial

wvdial 使用位于/etc/wvdial.conf的配置文件。让我们编辑这个文件。输入您的终端

sudo nano /etc/wvdial.conf

你会看到类似这样的东西

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2
Stupid Mode = yes
ISDN = 0
Modem Type = Analog Modem
New PPPD = yes
Phone = *99#
Modem = /dev/ttyUSB2
Username = ''
Password = ''
Baud = 9600
Dial Timeout = 30
Dial Attempts = 3

您可以在wvdial.conf(5) - Linux man page中找到所有按键的说明。如果您需要更改提供商拨号号码,用户名,密码或有关连接和设备的任何其他信息,您可以更改文件内容并保存。

ZTE MF190 有3个串口。通常它是ttyUSB0ttyUSB1ttyUSB2。在我的情况下,ttyUSB2用于互联网连接。它不适用于其他端口。因此,您需要为调制解调器找到合适的串口。

有一个自动配置程序可以编辑 wvdial.conf 文件,设置串口波特率等。由于它并不总是正确配置我会不推荐使用它

sudo wvdialconf /etc/wvdial.conf

如果您手动配置 wvdial 会更好。

现在,当您的设备已连接且 wvdial 配置为使用设备时,您可以从终端执行此行:

wvdial

你会看到很多行。但如果你看到那些线 - 你已经成功了。

local  IP address XX.XX.XX.XX
remote IP address XX.XX.XX.XX
primary   DNS address XX.XX.XX.XX
secondary DNS address XX.XX.XX.XX

现在,我们如何在编程中使用它?我将提供一些在Java上使用它的代码。您可以使用此代码拨打。

public int dialer() { 
    // status for debug. If status == 4 then you connected successfully
    int status; 
    // create process of wvdial
    ProcessBuilder builder = new ProcessBuilder("wvdial");

    try {
        // start wvdial
        final Process process = builder.start();

        // wvdial listener thread
        final Thread ioThread = new Thread() {
            @Override
            public void run() {
                try {

                    final BufferedReader reader = new BufferedReader(
                            new InputStreamReader(process.getErrorStream()));
                    // wvdial output line
                    String line;

                    while ((line = reader.readLine()) != null) {
                        // if "local  IP address" line detected set status 1
                        if (line.contains("local  IP address")) {
                            status = 1;
                        }
                        if (line.contains("remote IP address")) {
                            status = 2;
                        }
                        if (line.contains("primary   DNS address")) {
                            status = 3;
                        }
                        if (line.contains("secondary DNS address")) {
                            status = 4;
                        }
                    }

                    reader.close();
                } catch (final Exception e) {
                }
            }
        };
        // start listener
        ioThread.start();
        // wait 6 secs and return status. Some kind of timeout
        Thread.sleep(6000);
    } catch (Exception e) {
    }
    return status;
}

这是一个断路器方法。你所需要的只是杀死 wvdial 进程,线程将被销毁:

public boolean disconnect() { 

    ProcessBuilder builder = new ProcessBuilder("pkill", "wvdial");
    try {
        builder.start();
        return true;
    } catch (IOException e) {
        return false;
    }
}