xref: /OK3568_Linux_fs/app/forlinx/flapp/src/plugins/4g/m4gwidget.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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