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