|
|
#include "global.h"
|
|
|
|
|
|
global::global() {}
|
|
|
|
|
|
QString g_SoftwareVersion = "版本号:V1.1.0.7_20250218";
|
|
|
|
|
|
NotifyManager *g_notifyManager = nullptr;
|
|
|
|
|
|
QColor g_themeColor(51, 51, 51);
|
|
|
QString g_PushBtnStyle = /**正常情况下样式**/
|
|
|
"QPushButton{"
|
|
|
"font: 12pt '微软雅黑';"
|
|
|
"color: #2f3640;"
|
|
|
"background-color: #f5f6fa;"
|
|
|
"border-color: #2f3640;"
|
|
|
"border-radius: 15px;"
|
|
|
"border-style: solid;"
|
|
|
"border-width: 2px;"
|
|
|
"padding: 5px;"
|
|
|
"}"
|
|
|
|
|
|
/**鼠标停留在按钮上的样式**/
|
|
|
"QPushButton::hover{"
|
|
|
"color: #FFFFFF;"
|
|
|
"background-color: #718093;"
|
|
|
"border-color: #2f3640;"
|
|
|
"}"
|
|
|
|
|
|
/**鼠标按压下去的样式**/
|
|
|
"QPushButton::pressed,QPushButton::checked{"
|
|
|
"color: #FFFFFF;"
|
|
|
"background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, "
|
|
|
"stop:0 #273c75, stop:1 #487eb0);"
|
|
|
"}"
|
|
|
|
|
|
/**按钮失能情况下样式**/
|
|
|
"QPushButton::disabled{"
|
|
|
"color: #FFFFFF;"
|
|
|
"background-color: #dcdde1;"
|
|
|
"border-color: #dcdde1;"
|
|
|
"}";
|
|
|
|
|
|
QString g_PushBtnSelStyle = /**选中情况下样式**/
|
|
|
"QPushButton{"
|
|
|
"font: 12pt '微软雅黑';"
|
|
|
"color: #2f3640;"
|
|
|
"background-color: #619acd;"
|
|
|
"border-color: #2f3640;"
|
|
|
"border-radius: 15px;"
|
|
|
"border-style: solid;"
|
|
|
"border-width: 2px;"
|
|
|
"padding: 5px;"
|
|
|
"}"
|
|
|
|
|
|
/**鼠标停留在按钮上的样式**/
|
|
|
"QPushButton::hover{"
|
|
|
"color: #FFFFFF;"
|
|
|
"background-color: #718093;"
|
|
|
"border-color: #2f3640;"
|
|
|
"}"
|
|
|
|
|
|
/**鼠标按压下去的样式**/
|
|
|
"QPushButton::pressed,QPushButton::checked{"
|
|
|
"color: #FFFFFF;"
|
|
|
"background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, "
|
|
|
"stop:0 #273c75, stop:1 #487eb0);"
|
|
|
"}"
|
|
|
|
|
|
/**按钮失能情况下样式**/
|
|
|
"QPushButton::disabled{"
|
|
|
"color: #FFFFFF;"
|
|
|
"background-color: #dcdde1;"
|
|
|
"border-color: #dcdde1;"
|
|
|
"}";
|
|
|
|
|
|
QString g_ToolBtnStyle = /**正常情况下样式**/
|
|
|
"QToolButton{"
|
|
|
"font: 10pt '微软雅黑';"
|
|
|
"color: rgba(0,0,0,200);" /*#2f3640*/
|
|
|
"background-color: #f5f6fa;"
|
|
|
"border-color: #2f3640;"
|
|
|
"border-radius: 15px;"
|
|
|
"border-style: solid;"
|
|
|
"border-width: 2px;"
|
|
|
"padding: 5px;"
|
|
|
"}"
|
|
|
|
|
|
/**鼠标停留在按钮上的样式**/
|
|
|
"QToolButton::hover{"
|
|
|
"color: #FFFFFF;"
|
|
|
"background-color: #718093;"
|
|
|
"border-color: #2f3640;"
|
|
|
"}"
|
|
|
|
|
|
/**鼠标按压下去的样式**/
|
|
|
"QToolButton::pressed,QToolButton::checked{"
|
|
|
"color: #FFFFFF;"
|
|
|
"background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, "
|
|
|
"stop:0 #273c75, stop:1 #487eb0);"
|
|
|
"}"
|
|
|
|
|
|
/**按钮失能情况下样式**/
|
|
|
"QToolButton::disabled{"
|
|
|
"color: #FFFFFF;"
|
|
|
"background-color: #dcdde1;"
|
|
|
"border-color: #dcdde1;"
|
|
|
"}";
|
|
|
QString g_ToolBtnSelStyle = /**选中情况下样式**/
|
|
|
"QToolButton{"
|
|
|
"font: 10pt '微软雅黑';"
|
|
|
"color: #2f3640;"
|
|
|
"background-color: #619acd;"
|
|
|
"border-color: #2f3640;"
|
|
|
"border-radius: 15px;"
|
|
|
"border-style: solid;"
|
|
|
"border-width: 2px;"
|
|
|
"padding: 5px;"
|
|
|
"}"
|
|
|
|
|
|
/**鼠标停留在按钮上的样式**/
|
|
|
"QToolButton::hover{"
|
|
|
"color: #FFFFFF;"
|
|
|
"background-color: #718093;"
|
|
|
"border-color: #2f3640;"
|
|
|
"}"
|
|
|
|
|
|
/**鼠标按压下去的样式**/
|
|
|
"QToolButton::pressed,QToolButton::checked{"
|
|
|
"color: #FFFFFF;"
|
|
|
"background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, "
|
|
|
"stop:0 #273c75, stop:1 #487eb0);"
|
|
|
"}"
|
|
|
|
|
|
/**按钮失能情况下样式**/
|
|
|
"QToolButton::disabled{"
|
|
|
"color: #FFFFFF;"
|
|
|
"background-color: #dcdde1;"
|
|
|
"border-color: #dcdde1;"
|
|
|
"}";
|
|
|
|
|
|
/**
|
|
|
* @brief calCRC16
|
|
|
* @param cpu8Data
|
|
|
* @param u16Len
|
|
|
* @return
|
|
|
*/
|
|
|
uint16_t calCRC16(const uint8_t *cpu8Data, uint16_t u16Len) {
|
|
|
uint8_t u8X;
|
|
|
uint16_t u16CRC = 0X8848;
|
|
|
|
|
|
while (u16Len--) {
|
|
|
u8X = u16CRC >> 8 ^ *cpu8Data++;
|
|
|
u8X ^= u8X >> 4;
|
|
|
u16CRC = (u16CRC << 8) ^ ((uint16_t)(u8X << 12)) ^
|
|
|
((uint16_t)(u8X << 5)) ^ ((uint16_t)u8X);
|
|
|
}
|
|
|
return u16CRC;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief 计算字符串MD5值
|
|
|
* @param str:字符串
|
|
|
* @return 字符串MD5值
|
|
|
*/
|
|
|
QString calculateMD5(const QString &str) {
|
|
|
QByteArray hash =
|
|
|
QCryptographicHash::hash(str.toUtf8(), QCryptographicHash::Md5);
|
|
|
return hash.toHex();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief 生成推流地址
|
|
|
* @param uavID: 飞控ID
|
|
|
* @param uavName: 飞机型号,默认981cs
|
|
|
* @param clientID: 客户端ID,0为地面端,1为载荷端。
|
|
|
* @param pushDomain: 推流域名
|
|
|
* @param appName: app名称
|
|
|
* @param expireTime: 过期时间(单位是秒),默认1h。
|
|
|
* @return 返回推流地址
|
|
|
*/
|
|
|
QString generatePushURL(int uavID, QString appName, QString pushKey,
|
|
|
QString uavName, int clientID, QString pushDomain,
|
|
|
long expireTime) {
|
|
|
QString clientName = "";
|
|
|
if (0 == clientID) {
|
|
|
clientName = "gcs"; // 地面端
|
|
|
} else {
|
|
|
clientName = "uav"; // 载荷端
|
|
|
}
|
|
|
QString streamName =
|
|
|
uavName + "_" + QString::number(uavID) + "_" + clientName;
|
|
|
QString pushURL = "";
|
|
|
if (pushKey == "") {
|
|
|
pushURL = "rtmp://" + pushDomain + "/" + appName + "/" + streamName;
|
|
|
} else {
|
|
|
// 计算鉴权串
|
|
|
long timeStamp =
|
|
|
QDateTime::currentMSecsSinceEpoch() / 1000 + expireTime;
|
|
|
QString stringToMd5 = "/" + appName + "/" + streamName + "-" +
|
|
|
QString::number(timeStamp) + "-0-0-" + pushKey;
|
|
|
QString authKey = calculateMD5(stringToMd5);
|
|
|
pushURL = "rtmp://" + pushDomain + "/" + appName + "/" + streamName +
|
|
|
"?auth_key=" + QString::number(timeStamp) + "-0-0-" + authKey;
|
|
|
}
|
|
|
return pushURL;
|
|
|
}
|
|
|
|
|
|
std::map<int, std::string> g_mapAppName;
|
|
|
|
|
|
/**
|
|
|
* @brief 生成拉流地址
|
|
|
* @param uavID: 飞控ID
|
|
|
* @param appName: app名称
|
|
|
* @param uavName: 飞机型号,默认981cs
|
|
|
* @param clientID: 数据推流端ID,0为地面端,1为载荷端。
|
|
|
* @param pullDomain: 拉流域名
|
|
|
* @param expireTime: 过期时间(单位是秒),默认1h。
|
|
|
* @param pullKey: 拉流域名配置的鉴权Key
|
|
|
* @return 返回拉流地址
|
|
|
*/
|
|
|
QString generatePullURL(int uavID, QString appName, QString pullKey,
|
|
|
QString uavName, int clientID, QString pullDomain,
|
|
|
long expireTime) {
|
|
|
QString rtmpUrl = "";
|
|
|
QString clientName = "";
|
|
|
if (0 == clientID) {
|
|
|
clientName = "gcs"; // 地面端
|
|
|
} else {
|
|
|
clientName = "uav"; // 载荷端
|
|
|
}
|
|
|
QString streamName =
|
|
|
uavName + "_" + QString::number(uavID) + "_" + clientName;
|
|
|
if (pullKey == "") {
|
|
|
rtmpUrl = "rtmp://" + pullDomain + "/" + appName + "/" + streamName;
|
|
|
} else {
|
|
|
// 计算鉴权串
|
|
|
long timeStamp =
|
|
|
QDateTime::currentMSecsSinceEpoch() / 1000 + expireTime;
|
|
|
QString stringToMd5 = "/" + appName + "/" + streamName + "-" +
|
|
|
QString::number(timeStamp) + "-0-0-" + pullKey;
|
|
|
QString authKey = calculateMD5(stringToMd5);
|
|
|
rtmpUrl = "rtmp://" + pullDomain + "/" + appName + "/" + streamName +
|
|
|
"?auth_key=" + QString::number(timeStamp) + "-0-0-" + authKey;
|
|
|
}
|
|
|
return rtmpUrl;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief 非阻塞延时
|
|
|
* @param msec 延时毫秒
|
|
|
*/
|
|
|
void sleepMsec(int msec) {
|
|
|
if (msec <= 0) return;
|
|
|
QEventLoop loop; // 定义一个新的事件循环
|
|
|
QTimer::singleShot(
|
|
|
msec, &loop,
|
|
|
SLOT(quit())); // 创建单次定时器,槽函数为事件循环的退出函数
|
|
|
loop.exec(); // 事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief 生成公司推流平台地址
|
|
|
* @param uavID:飞控ID
|
|
|
* @param appName:
|
|
|
* @param uavName:飞机型号,默认981cs
|
|
|
* @return
|
|
|
*/
|
|
|
QString generatePushURL2(int uavID, QString appName, QString uavName,
|
|
|
int clientID, QString pushDomain) {
|
|
|
QString rtmpUrl = "";
|
|
|
QString clientName = "";
|
|
|
if (0 == clientID) {
|
|
|
clientName = "gcs"; // 地面端
|
|
|
} else {
|
|
|
clientName = "uav"; // 载荷端
|
|
|
}
|
|
|
QString streamName =
|
|
|
uavName + "_" + QString::number(uavID) + "_" + clientName;
|
|
|
rtmpUrl = "rtmp://" + pushDomain + "/" + appName + "/" + streamName;
|
|
|
return rtmpUrl;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief 生成拉流地址,应急厅铁塔平台
|
|
|
* @param uavID: 飞控ID
|
|
|
* @param appName: app名称
|
|
|
* @param uavName: 飞机型号,默认981cs
|
|
|
* @param clientID: 数据推流端ID,0为地面端,1为载荷端。
|
|
|
* @param pullDomain: 拉流域名
|
|
|
* @return 返回拉流地址
|
|
|
*/
|
|
|
QString generatePullURL2(int uavID, QString appName, QString uavName,
|
|
|
int clientID, QString pullDomain) {
|
|
|
QString clientName = "";
|
|
|
if (0 == clientID) {
|
|
|
clientName = "gcs"; // 地面端
|
|
|
} else {
|
|
|
clientName = "uav"; // 载荷端
|
|
|
}
|
|
|
QString streamName =
|
|
|
uavName + "_" + QString::number(uavID) + "_" + clientName;
|
|
|
QString pushURL = "";
|
|
|
pushURL = "rtsp://" + pullDomain + "/" + appName + "/" + streamName;
|
|
|
|
|
|
return pushURL;
|
|
|
}
|