#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 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; }