我有一台数据卡中兴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网站。
答案 0 :(得分:2)
在卡与提供商之间建立连接是不够的。您需要一些机制来创建此连接之外的网络接口,并设置您的网络堆栈以通过此接口路由数据包。
传统上,pppd
守护程序一直是此任务的热门选择。你会创建一个"聊天脚本"使用用于建立数据调用的命令(这些天,pppd
可能包含一个合适的固定脚本),并且守护进程将处理放置呼叫,验证,在电路上建立网络接口的整个过程,并配置系统在其上路由数据包,以及配置DNS等以将其用于解析器查询等。
答案 1 :(得分:1)
我试图嗅吸USB端口,但在这种情况下,由于端口繁忙,仪表板无法连接
当然可以。见this question
的这篇文章
该文章的内容是如何设置呼叫,而不是如何设置呼叫。
设置正确后,使用以下命令连接到Internet:
ATD*99***1#
UPDATE1 :经过一番研究后,我认为这篇文章的目的只是为了推广他们的软件而没有实际用途。实际上,拨号是使用pppd
或wvdial
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个串口。通常它是ttyUSB0
,ttyUSB1
和ttyUSB2
。在我的情况下,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;
}
}