-
Notifications
You must be signed in to change notification settings - Fork 83
Expand file tree
/
Copy pathgsmapi.cpp
More file actions
157 lines (137 loc) · 3.62 KB
/
gsmapi.cpp
File metadata and controls
157 lines (137 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
#include "gsmapi.h"
#include "myhelper.h"
#include "api.h"
#include "dbhelper.h"
#include "sendmsgthread.h"
GSMAPI::GSMAPI(QObject *parent) :
QObject(parent)
{
portName = "COM1";
isOpen = false;
isLive = false;
timerTask = new QTimer(this);
timerTask->setInterval(10000);
connect(timerTask, SIGNAL(timeout()), this, SLOT(DoTask()));
timerTask->start();
}
void GSMAPI::SetPortName(QString portName)
{
this->portName = portName;
}
bool GSMAPI::Open()
{
headMsg = "端口:短信端口";
GSM_COM = new QextSerialPort(portName);
isOpen = GSM_COM->open(QIODevice::ReadWrite);
if (isOpen) {
GSM_COM->flush();
GSM_COM->setBaudRate(BAUD9600);
GSM_COM->setDataBits(DATA_8);
GSM_COM->setParity(PAR_NONE);
GSM_COM->setStopBits(STOP_1);
GSM_COM->setFlowControl(FLOW_OFF);
GSM_COM->setTimeout(10);
}
return isOpen;
}
void GSMAPI::Init()
{
if (Islive()) {
//设置短信模式为PDU模式
SendAT("AT+CMGF=0", 100);
}
}
bool GSMAPI::Islive()
{
if (isOpen) {
GSM_COM->write(QString("%1\r").arg("AT").toLatin1());
myHelper::Sleep(300);
QString data = GSM_COM->readAll();
data = data.replace(" ", "");
data = data.replace("\r", "");
data = data.replace("\n", "");
//收到返回ATOK说明短信猫连接成功
if (data == "ATOK") {
isLive = true;
} else {
isLive = false;
}
} else {
isLive = false;
}
return isLive;
}
void GSMAPI::Close()
{
GSM_COM->close();
GSM_COM = 0;
isLive = false;
isOpen = false;
}
QString GSMAPI::SendAT(QString cmd, int sleep)
{
if (!isOpen || !isLive) {
return "";
}
GSM_COM->flush();
GSM_COM->write(QString("%1\r").arg(cmd).toLatin1());
myHelper::Sleep(sleep);
QString data = GSM_COM->readAll();
data = data.replace(" ", "");
data = data.replace("\r", "");
data = data.replace("\n", "");
return data;
}
//对于多个号码,将号码分割开来,如果短信内容超过70个字符则分割成小于70个字符的短信
void GSMAPI::SendMsgAll(QString tels, QStringList msgs)
{
QStringList t = tels.split(";");
foreach (QString tel, t) {
foreach (QString msg, msgs) {
task.append(QString("%1|%2").arg(tel).arg(msg));
}
}
}
void GSMAPI::SendMsgOne(QString tel, QString msg)
{
qDebug() << TIME << headMsg << "命令解析:" << "发送告警短信" << "号码:" << tel << "内容:" << msg;
SendMsgThread *sendMsgThread = new SendMsgThread(this);
connect(sendMsgThread, SIGNAL(finished()), sendMsgThread, SLOT(deleteLater()));
sendMsgThread->SetPar(this, tel, msg);
sendMsgThread->start();
}
QString GSMAPI::GetGSMType()
{
QString result = SendAT("AT+CGMI", 300);
QString type = "";
//如果成功会返回 AT+CGMISIEMENSOK,对应类型要减去开头7位和末尾2位
if (result.right(2) == "OK") {
type = result.mid(7, result.length() - 7 - 2);
}
return type;
}
QString GSMAPI::GetGSMCenterNum()
{
QString result = SendAT("AT+CSCA?", 300);
QString num = "";
//如果成功会返回 AT+CSCA?+CSCA:"+8613010314500",145OK
if (result.right(2) == "OK") {
num = result.split("\"")[1];
}
return num;
}
void GSMAPI::DoTask()
{
int count = task.count();
if (count <= 0) {
return;
}
QString str = task.takeFirst();
QStringList list = str.split("|");
QString tel = list.at(0);
QString msg = list.at(1);
SendMsgOne(tel, msg);
}