1*4882a593Smuzhiyun #include "m4gwidget.h"
2*4882a593Smuzhiyun #include "ui_m4gwidget.h"
3*4882a593Smuzhiyun #include <QDebug>
4*4882a593Smuzhiyun #include "terminal.h"
5*4882a593Smuzhiyun #include <QProcess>
6*4882a593Smuzhiyun #include <QFile>
7*4882a593Smuzhiyun #include <QDialog>
8*4882a593Smuzhiyun #include <QDomDocument>
9*4882a593Smuzhiyun #include "testserver.h"
10*4882a593Smuzhiyun #include "systemmanager.h"
11*4882a593Smuzhiyun #include "configurer.h"
12*4882a593Smuzhiyun #include <QTimer>
13*4882a593Smuzhiyun #include "messagebox.h"
14*4882a593Smuzhiyun #include "serialport.h"
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun Q_LOGGING_CATEGORY(flapp, "app.m4g")
M4gWidget(QWidget * parent)17*4882a593Smuzhiyun M4gWidget::M4gWidget(QWidget *parent) :
18*4882a593Smuzhiyun IWidget(parent),
19*4882a593Smuzhiyun ui(new Ui::M4gWidget),
20*4882a593Smuzhiyun m_dial(new Configurer)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun ui->setupUi(this);
23*4882a593Smuzhiyun }
24*4882a593Smuzhiyun
~M4gWidget()25*4882a593Smuzhiyun M4gWidget::~M4gWidget()
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun delete m_dial;
28*4882a593Smuzhiyun delete ui;
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun
initUi()31*4882a593Smuzhiyun void M4gWidget::initUi()
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun connect(ui->comboBox, &QComboBox::currentTextChanged, this, [=](){
34*4882a593Smuzhiyun ui->textBrowser->clear();
35*4882a593Smuzhiyun foreach (M4GModel m, m_list) {
36*4882a593Smuzhiyun if(m.id == ui->comboBox->currentText()){
37*4882a593Smuzhiyun m_curModel=m;
38*4882a593Smuzhiyun break;
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun QString cardName =m_curModel.cardName;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun bool bFindCard =Terminal::execCmd("ifconfig -a").contains(cardName);
45*4882a593Smuzhiyun if(!bFindCard)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun processMessage(QString("%1 Not find").arg(cardName));
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun ui->connectBtn->setEnabled(bFindCard);
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun });
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun foreach (M4GModel m, m_list) {
54*4882a593Smuzhiyun ui->comboBox->addItem(m.id);
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun ui->connectBtn->setCheckable(true);
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun //read apn conf
59*4882a593Smuzhiyun Configurer conf;
60*4882a593Smuzhiyun ui->apnEdt->setText(conf.conf("dial_APN"));
61*4882a593Smuzhiyun ui->userNameEdt->setText(conf.conf("dial_username"));
62*4882a593Smuzhiyun ui->passwordEdt->setText(conf.conf("dial_password"));
63*4882a593Smuzhiyun QString auth =conf.conf("dial_auth");
64*4882a593Smuzhiyun int t = auth.toInt();
65*4882a593Smuzhiyun switch (t) {
66*4882a593Smuzhiyun case 0:
67*4882a593Smuzhiyun ui->authCombox->setCurrentIndex(0);
68*4882a593Smuzhiyun break;
69*4882a593Smuzhiyun case 1:
70*4882a593Smuzhiyun ui->authCombox->setCurrentIndex(1);
71*4882a593Smuzhiyun break;
72*4882a593Smuzhiyun case 2:
73*4882a593Smuzhiyun ui->authCombox->setCurrentIndex(2);
74*4882a593Smuzhiyun break;
75*4882a593Smuzhiyun default:
76*4882a593Smuzhiyun break;
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun m_timer = new QTimer(this);
80*4882a593Smuzhiyun connect(m_timer, &QTimer::timeout, this, &M4gWidget::readInformation);
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun ui->hearLbl->setAutoFillBackground(true);
83*4882a593Smuzhiyun ui->hearLbl->setPalette(this->palette());
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun
loadData(const QDomElement & head,const QDomElement & body)87*4882a593Smuzhiyun void M4gWidget::loadData(const QDomElement &head, const QDomElement &body)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun for(int i=0; i<head.childNodes().size(); i++){
90*4882a593Smuzhiyun M4GModel m;
91*4882a593Smuzhiyun QDomElement head_child = head.childNodes().at(i).toElement();
92*4882a593Smuzhiyun m.id = head_child.attribute("id");
93*4882a593Smuzhiyun m.cardName = head_child.attribute("cardName");
94*4882a593Smuzhiyun m.startName = head_child.attribute("startName");
95*4882a593Smuzhiyun m.ttyName = head_child.attribute("ttyName");
96*4882a593Smuzhiyun m.arg = head_child.attribute("arg");
97*4882a593Smuzhiyun m_list << m;
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun
id()101*4882a593Smuzhiyun QString M4gWidget::id()
102*4882a593Smuzhiyun {
103*4882a593Smuzhiyun return "sim4g";
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun
processMessage(const QString & info)106*4882a593Smuzhiyun void M4gWidget::processMessage(const QString &info)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun ui->textBrowser->append(/*ui->textBrowser->toPlainText() +*/ info);
109*4882a593Smuzhiyun ui->textBrowser->moveCursor(QTextCursor::End);
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun if(info.contains("adding dns")){
112*4882a593Smuzhiyun ui->hearLbl->setText("Connect Successful");
113*4882a593Smuzhiyun //QTimer::singleShot(1000, this, &M4gWidget::readInformation);
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun
setNetowrkCard(bool bOpen)117*4882a593Smuzhiyun void M4gWidget::setNetowrkCard(bool bOpen)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun QString cmd = QString("ifconfig %1 up").arg(m_curModel.cardName);
120*4882a593Smuzhiyun if(!bOpen){
121*4882a593Smuzhiyun cmd = QString("ifconfig %1 down").arg(m_curModel.cardName);
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun Terminal::execCmd(cmd);
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun
setListenSim(bool bStart)126*4882a593Smuzhiyun void M4gWidget::setListenSim(bool bStart)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun if(bStart)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun m_timer->start(3000);
132*4882a593Smuzhiyun }else{
133*4882a593Smuzhiyun m_timer->stop();
134*4882a593Smuzhiyun ui->ISPLbl->clear();
135*4882a593Smuzhiyun ui->IMEILbl->clear();
136*4882a593Smuzhiyun ui->versionLbl->clear();
137*4882a593Smuzhiyun ui->RSSILbl->clear();
138*4882a593Smuzhiyun ui->IMEILbl->clear();
139*4882a593Smuzhiyun ui->IPLbl->clear();
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun
on_testBtn_clicked()143*4882a593Smuzhiyun void M4gWidget::on_testBtn_clicked()
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun QString s=ui->pingEdt->text();
146*4882a593Smuzhiyun if(s.isEmpty()){
147*4882a593Smuzhiyun s = "www.forlinx.com";
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun s = QString("ping %1 -c 5 -I %2").arg(s).arg(m_curModel.cardName);
151*4882a593Smuzhiyun ui->textBrowser->append(s);
152*4882a593Smuzhiyun this->start(s);
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun
readInformation()155*4882a593Smuzhiyun void M4gWidget::readInformation()
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun SerialPort serial;
158*4882a593Smuzhiyun QString portName =m_curModel.ttyName;
159*4882a593Smuzhiyun if(serial.config(portName, QSerialPort::Baud9600))
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun QString result;
162*4882a593Smuzhiyun QStringList list;
163*4882a593Smuzhiyun result = serial.execCMD("ATE0\r");
164*4882a593Smuzhiyun result = serial.execCMD("AT\r");
165*4882a593Smuzhiyun result = serial.execCMD("AT+CGMI\r");
166*4882a593Smuzhiyun list = SystemManager::instance()->getMatch(result, "[a-zA-Z0-9]+");
167*4882a593Smuzhiyun if(list.size() >0 && list.contains("OK")){
168*4882a593Smuzhiyun // ui->textBrowser->append(QString("manufacturer : %1").arg(list[0]));
169*4882a593Smuzhiyun ui->manufacturerLbl->setText(list[0]);
170*4882a593Smuzhiyun }else{
171*4882a593Smuzhiyun //ui->textBrowser->append(result);
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun result = serial.execCMD("AT+CGMR\r");
174*4882a593Smuzhiyun list = SystemManager::instance()->getMatch(result, "[a-zA-Z0-9]+");
175*4882a593Smuzhiyun if(list.size() >0 && list.contains("OK")){
176*4882a593Smuzhiyun // ui->textBrowser->append(QString("sofeware version : %1").arg(list[0]));
177*4882a593Smuzhiyun ui->versionLbl->setText(list[0]);
178*4882a593Smuzhiyun }else{
179*4882a593Smuzhiyun //ui->textBrowser->append(result);
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun result = serial.execCMD("AT+CGSN\r");
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun list = SystemManager::instance()->getMatch(result, "[a-zA-Z0-9]+");
184*4882a593Smuzhiyun if(list.size() >0 && list.contains("OK")){
185*4882a593Smuzhiyun // ui->textBrowser->append(QString("IMEI : %1").arg(list[0]));
186*4882a593Smuzhiyun ui->IMEILbl->setText(list[0]);
187*4882a593Smuzhiyun }else{
188*4882a593Smuzhiyun //ui->textBrowser->append(result);
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun result =serial.execCMD("AT+QENG=\"servingcell\"\r");
193*4882a593Smuzhiyun list = result.split(",");
194*4882a593Smuzhiyun bool bQNG=false;
195*4882a593Smuzhiyun if(list.size() == 18)
196*4882a593Smuzhiyun {
197*4882a593Smuzhiyun // +QENG: "servingcell","NOCONN", "LTE","FDD", 460, 00, 7F3C740, 219, 1300, 3, 5, 5, 3193, -87, -13, -53,-4,40
198*4882a593Smuzhiyun // QENG: "servingcell","NOCONN","LTE","FDD", 460, 11, 12C4000, 84, 100, 1, 5, 5, 1680, -62, -11, -31,16,65
199*4882a593Smuzhiyun if(list.size() == 18){
200*4882a593Smuzhiyun result = list[15];
201*4882a593Smuzhiyun ui->RSSILbl->setText(result);
202*4882a593Smuzhiyun bQNG = true;
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun if(!bQNG)
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun result = serial.execCMD("AT+CSQ\r");
210*4882a593Smuzhiyun list = SystemManager::instance()->getMatch(result, "[a-zA-Z0-9]+");
211*4882a593Smuzhiyun if(list.size() >1 && list.contains("OK")){
212*4882a593Smuzhiyun //RSSI和CSQ之间的对应关系式什么呢?OK,就是:CSQ值=(接收信号强度dBm+113)/2。
213*4882a593Smuzhiyun int csq = list[1].toInt();
214*4882a593Smuzhiyun int signal = -113 + csq*2;
215*4882a593Smuzhiyun //ui->textBrowser->append(QString("SIGNAL : %1").arg(signal));
216*4882a593Smuzhiyun ui->RSSILbl->setText(QString::number(signal));
217*4882a593Smuzhiyun }else{
218*4882a593Smuzhiyun //ui->textBrowser->append(result);
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun result = serial.execCMD("AT+CIMI\r");
223*4882a593Smuzhiyun list = SystemManager::instance()->getMatch(result, "[0-9]+");
224*4882a593Smuzhiyun if(list.size() >0){
225*4882a593Smuzhiyun QString cimi = list[0];
226*4882a593Smuzhiyun QString isp;
227*4882a593Smuzhiyun if (cimi.startsWith("46000") || cimi.startsWith("46002")) {
228*4882a593Smuzhiyun isp = "中国移动";
229*4882a593Smuzhiyun } else if (cimi.startsWith("46001")) {
230*4882a593Smuzhiyun isp = "中国联通";
231*4882a593Smuzhiyun } else if (cimi.startsWith("46003")) {
232*4882a593Smuzhiyun isp = "中国电信";
233*4882a593Smuzhiyun }else {
234*4882a593Smuzhiyun isp=QString("cimi:%1").arg(result);
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun if(!isp.isEmpty())
237*4882a593Smuzhiyun {
238*4882a593Smuzhiyun //ui->textBrowser->append(QString("ISP: %1").arg(isp));
239*4882a593Smuzhiyun ui->ISPLbl->setText(isp);
240*4882a593Smuzhiyun }
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun QString ip;
244*4882a593Smuzhiyun QString mask;
245*4882a593Smuzhiyun SystemManager::instance()->getNetwork(m_curModel.cardName, ip, mask);
246*4882a593Smuzhiyun ui->IPLbl->setText(ip);
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun serial.close();
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun
on_connectBtn_clicked()252*4882a593Smuzhiyun void M4gWidget::on_connectBtn_clicked()
253*4882a593Smuzhiyun {
254*4882a593Smuzhiyun if(ui->connectBtn->isChecked())
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun ui->comboBox->setEnabled(false);
257*4882a593Smuzhiyun ui->connectBtn->setText("disconnect");
258*4882a593Smuzhiyun QString processName = m_curModel.startName;
259*4882a593Smuzhiyun if(processName.isEmpty())
260*4882a593Smuzhiyun {
261*4882a593Smuzhiyun processName= m_dial->processName();
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun qDebug()<<"start = "<< processName;
265*4882a593Smuzhiyun this->start(processName);
266*4882a593Smuzhiyun ui->hearLbl->setText("Connnect...");
267*4882a593Smuzhiyun setListenSim(true);
268*4882a593Smuzhiyun }else{
269*4882a593Smuzhiyun ui->comboBox->setEnabled(true);
270*4882a593Smuzhiyun ui->connectBtn->setText("connect");
271*4882a593Smuzhiyun this->stop();
272*4882a593Smuzhiyun setNetowrkCard(false);
273*4882a593Smuzhiyun ui->hearLbl->clear();
274*4882a593Smuzhiyun ui->textBrowser->clear();
275*4882a593Smuzhiyun setListenSim(false);
276*4882a593Smuzhiyun }
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun
on_applyBtn_clicked()279*4882a593Smuzhiyun void M4gWidget::on_applyBtn_clicked()
280*4882a593Smuzhiyun {
281*4882a593Smuzhiyun QString dial_APN =ui->apnEdt->text();
282*4882a593Smuzhiyun if(dial_APN.isEmpty())
283*4882a593Smuzhiyun {
284*4882a593Smuzhiyun dial_APN = "cmnet";
285*4882a593Smuzhiyun }
286*4882a593Smuzhiyun QString dial_username = ui->userNameEdt->text();
287*4882a593Smuzhiyun QString dial_password = ui->passwordEdt->text();
288*4882a593Smuzhiyun QString dial_auth="1";
289*4882a593Smuzhiyun if(ui->authCombox->currentText() == "auth"){
290*4882a593Smuzhiyun dial_auth="0";
291*4882a593Smuzhiyun }else if(ui->authCombox->currentText() == "PAP")
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun dial_auth="1";
294*4882a593Smuzhiyun }else{
295*4882a593Smuzhiyun dial_auth="2";
296*4882a593Smuzhiyun }
297*4882a593Smuzhiyun QMap<QString, QString> maps;
298*4882a593Smuzhiyun maps.insert("dial_APN", dial_APN);
299*4882a593Smuzhiyun maps.insert("dial_username", dial_username);
300*4882a593Smuzhiyun maps.insert("dial_password", dial_password);
301*4882a593Smuzhiyun maps.insert("dial_auth", dial_auth);
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun Configurer conf;
304*4882a593Smuzhiyun conf.changConf(maps);
305*4882a593Smuzhiyun MessageBox::showMessage(this, "please reboot connect");
306*4882a593Smuzhiyun }
307