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