|
|
|
|
#include "global.h"
|
|
|
|
|
|
|
|
|
|
global::global() {}
|
|
|
|
|
|
|
|
|
|
QString g_SoftwareVersion = "版本号:V1.0.0.1010";
|
|
|
|
|
|
|
|
|
|
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 uavName,
|
|
|
|
|
int clientID, QString pushDomain, long expireTime,
|
|
|
|
|
QString pushKey) {
|
|
|
|
|
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 uavName,
|
|
|
|
|
int clientID, QString pullDomain, long expireTime,
|
|
|
|
|
QString pullKey) {
|
|
|
|
|
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;
|
|
|
|
|
}
|