目录一、前言二、功能特点四、效果图五、相关代码一、前言 系统在运行过程中,会实时采集设备的数据,当采集到的数据发生报警后,可以将报警信息以短信的形式发送给指定的管理员(可以是多个),
系统在运行过程中,会实时采集设备的数据,当采集到的数据发生报警后,可以将报警信息以短信的形式发送给指定的管理员(可以是多个),这样管理员就算不在现场,也能第一时间知道哪里发生了报警,可以紧急赶往现场处置。很多时候软件都是放在现场电脑上运行的,未必现场有人员一直盯着看,通过短信的形式,第一时间送达关键人员那里,及时响应,不错过任何一次重大报警信息,可以在后台设定过滤哪些设备产生的报警需要第一时间送达,还可以设置短信发送的间隔,多个接收者。
发送短信在联网的环境中,可以通过各种互联网短信服务厂商来接入,在不联网的环境中,只有一个办法那就是通过插卡的短信设备来发送,有标准的AT协议,基本上硬件都提供了串口接口,所以程序上其实就是串口通信,通过收发协议数据来解析,比如发送 AT+CSCA? 命令表示查询短信中心号码,AT+CMGR=1 表示读取序号=1的短信内容。为了能够支持各个厂家的设备,特意封装的通用的短信类,支持长短信发送,支持多个收件人,多线程发送。
2.1 软件模块
2.2 基础功能
2.3 特色功能
国内站点:https://gitee.com/feiyangqingyun
国际站点:Https://GitHub.com/feiyangqingyun
体验地址:https://pan.baidu.com/s/1foas7ytSXh7gHOTDqDREjQ 提取码:axip 文件名:bin_iotsystem.zip。
void SendMsgThread::readMsg()
{
isRead = false;
QString data = com->readAll();
data.replace(" ", "");
data.replace("\r", "");
data.replace("\n", "");
if (data.length() <= 0) {
return;
}
//从SIM卡上读取短信回复 "AT+CMGR=5+CMGR:"RECREAD","+8618001797656",,"16/05/28,18:12:52+32"006:WD+05.1,ZL139.6,YL1.2,AUTO,YSJ-ONOK"
//主动收到短信 "AT+CMGR=6+CMGR:"RECUNREAD","+8618001797656",,"16/05/28,18:20:51+32"006:WD+05.1,ZL139.6,YL1.2,AUTO,YSJ-ONOK"
qDebug() << TIMEMS << "Receive:" << data;
emit receiveData(data);
if (data.endsWith(",,0OK")) {
clear();
emit readMsgFinish();
return;
}
//收到行短信后会收到 +CMTI:"SM",2 ,其中2为短信索引
//接着根据新短信的索引读取短信,读取短信成功返回 AT+CMGR=5+CMGR:0,,230891683110304105F0240D91688110978310F000004121519115322303E13919
if (data.contains("CMTI")) {
//获取新短信的索引号
msgIndex = data.split(",").at(1).toInt();
writeData(QString("AT+CMGR=%1\r").arg(msgIndex));
} else if (data.contains("CMGR")) {
//一步步解析服务中心号码,发件人号码,发送时间,短信内容
QStringList list = data.split(",");
if (list.count() < 3) {
return;
}
if (mode == 0) {
QString unicode = list.at(2);
int len = unicode.length();
//去除末尾ok两个字符
unicode = unicode.mid(0, len - 2);
if (unicode == "0") {
clear();
emit readMsgFinish();
return;
}
int index = unicode.indexOf("08");
QString centerNum = unicodeToTel(unicode.mid(index + 6, 12));
QString msgTel = unicodeToTel(unicode.mid(index + 26, 12));
QString msgType = unicode.mid(index + 40, 2);
QString msgTime = unicodeToTime(unicode.mid(index + 42, 12));
QString msGContent = unicode.mid(index + 58);
//类型为 00 则采用的是 7bit 编码,需要用 7bit 解码
//类型为 08 则采用的是 unicode 编码
if (msgType == "00") {
msgContent = unicodeToMsg7Bit(msgContent);
} else if (msgType == "08") {
msgContent = unicodeToMsg(msgContent);
}
//发送收到新短信信号
emit receiveMsg(centerNum, msgTel, msgTime, msgContent);
} else {
QString centerNum = "13800000000";
QString msgTel = list.at(1).mid(4, 11);
QString msgTime = list.at(3);
msgTime = msgTime.mid(1, msgTime.length());
msgTime.replace("/", "-");
msgTime = "20" + msgTime + " " + list.at(4).mid(0, 8);
QStringList str;
for (int i = 4; i < list.count(); ++i) {
str.append(list.at(i));
}
QString msgContent = str.join(",");
msgContent = msgContent.split("\"").at(1);
msgContent = msgContent.mid(0, msgContent.length() - 2);
//发送收到新短信信号
emit receiveMsg(centerNum, msgTel, msgTime, msgContent);
}
} else if (data.contains("NOCARRIER")) {
emit callFinsh();
} else if (data.contains("NOANSWER")) {
emit callError();
} else if (data.contains("RING")) {
QString tel;
QStringList list = data.split("\"");
if (list.count() > 1) {
tel = list.at(1);
}
emit receiveCall(tel);
} else if (data.contains("DTMF")) {
int index = data.indexOf("DTMF");
QString key = data.mid(index + 5, 1);
emit receiveKey(key);
}
}
void SendMsgThread::deleteMsg()
{
//自动删除SIM卡上的短信
if (autoDelete) {
deleteMsg(msgIndex);
}
}
QString SendMsgThread::sendAT(const QString &cmd, int sleep)
{
if (!isOpen || !isLive) {
return "";
}
//主动执行命令期间,断开收到数据信号槽连接
disconnect(com, SIGNAL(readyRead()), this, SLOT(readData()));
writeData(QString("%1\r").arg(cmd));
msleep(sleep);
QString data = com->readAll();
data.replace(" ", "");
data.replace("\r", "");
data.replace("\n", "");
if (data.length() > 0) {
qDebug() << TIMEMS << "Result:" << data;
emit receiveData(data);
}
//完成处理后,重新绑定收到数据信号槽连接
connect(com, SIGNAL(readyRead()), this, SLOT(readData()), Qt::DirectConnection);
return data;
}
bool SendMsgThread::sendMsg(const QString &tel, const QString &msg)
{
bool ok = false;
char ctrlz = 26;
int sleepTime;
QString msgContent;
QString sendMsg;
if (mode == 0) {
sleepTime = 6000;
msgContent = QString("%1%2%3%4%5").arg("0011000D91").arg(getMsgTel(tel))
.arg("000801").arg(getMsgHex(msg)).arg(ctrlz);
sendMsg = QString::number(getMsgLen(msg));
} else {
sleepTime = 1000;
msgContent = QString("%1%2").arg(msg).arg(ctrlz);
sendMsg = tel;
}
//首先进入发送短信状态
QString result = sendAT(QString("AT+CMGS=%1\r").arg(sendMsg), 300);
//返回结果最末一位为 > 后输入短信内容编码,发送短信正文
if (result.right(1) == ">") {
result = sendAT(msgContent, sleepTime);
if (mode == 0) {
if (result.right(2) == "OK") {
ok = true;
}
} else {
if (result.right(2) == "OK" || result.startsWith(msg)) {
ok = true;
}
}
}
return ok;
}
void SendMsgThread::startCall(const QString &tel)
{
sendAT(QString("ATD%1;").arg(tel), 100);
}
void SendMsgThread::stopCall()
{
sendAT(QString("ATH"), 100);
}
void SendMsgThread::answerCall()
{
sendAT(QString("ATA"), 100);
}
到此这篇关于Qt物联网管理平台之实现告警短信转发的文章就介绍到这了,更多相关Qt告警短信转发内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Qt物联网管理平台之实现告警短信转发
本文链接: https://lsjlt.com/news/164290.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0