|
@@ -21,8 +21,8 @@ SPAServer::SPAServer()
|
|
|
m_threadRunning = true;
|
|
|
/* 初始化WebAPI */
|
|
|
m_toEQMDataBase.initWebApi("http://192.1.3.133:31000/v6/", "", "4c2f9fc91c22dd98331e47af2e2964f4");
|
|
|
-
|
|
|
-
|
|
|
+ /* 模拟违禁品算法ID,后续需要动态调整 */
|
|
|
+ m_contrabandKey = "OD210_026_005246_001-IZRTKyEx";
|
|
|
|
|
|
}
|
|
|
|
|
@@ -35,7 +35,17 @@ SPAServer::~SPAServer()
|
|
|
void SPAServer::startServer()
|
|
|
{
|
|
|
/* 添加获取基础信息的线程 */
|
|
|
- CPPTP.add_task(&SPAServer::fromSuperBrainThread, this);
|
|
|
+ // CPPTP.add_task(&SPAServer::threadFromSuperBrain, this);
|
|
|
+
|
|
|
+ /* 测试Redis读取并解析数据线程 */
|
|
|
+ CameraThreadInfo info;
|
|
|
+ info.RedisIP = "172.16.36.80";
|
|
|
+ info.RedisPort = 32222;
|
|
|
+ info.RedisPWD = "Ff1z@TOFr^iwd%Ra";
|
|
|
+ info.DeviceID = 117;
|
|
|
+ info.vecAction.push_back("OD210_026_005246_001-IZRTKyEx");
|
|
|
+ CPPTP.add_task(&SPAServer::threadFromRedis, this, info);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
@@ -43,36 +53,12 @@ void SPAServer::startServer()
|
|
|
* @brief 从基础平台获取算法信息和设备信息的线程函数
|
|
|
*
|
|
|
*/
|
|
|
-void SPAServer::fromSuperBrainThread()
|
|
|
+void SPAServer::threadFromSuperBrain()
|
|
|
{
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "开启 fromSuperBrainThread 线程");
|
|
|
/* 创建变量 */
|
|
|
std::vector<AlgorithmInfo> vecAlgNewInfo;
|
|
|
std::vector<DeviceInfo> vecDevNewInfo;
|
|
|
-
|
|
|
- /* 测试读取Redis信息 */
|
|
|
- m_fromRedis.setRedisIPAndPort("172.16.36.80", 32222);
|
|
|
- m_fromRedis.setRedisPassword("Ff1z@TOFr^iwd%Ra");
|
|
|
- if(m_fromRedis.connectRedis())
|
|
|
- {
|
|
|
- SPDLOG_LOGGER_INFO(m_logger, "连接Redis成功");
|
|
|
- }else {
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "连接Redis失败");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- std::string strKey = "117:OD210_026_005246_001-IZRTKyEx";
|
|
|
- std::string strRetValue;
|
|
|
- while (m_threadRunning)
|
|
|
- {
|
|
|
- SPDLOG_LOGGER_INFO(m_logger, "读取Redis信息");
|
|
|
- m_fromRedis.getRedisString(strKey, strRetValue);
|
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "Redis Value:\n{}", strRetValue);
|
|
|
-
|
|
|
- std::this_thread::sleep_for(std::chrono::seconds(1));
|
|
|
- }
|
|
|
-
|
|
|
- return;
|
|
|
|
|
|
/* 获取一次token,后续失效了再获取 */
|
|
|
m_fromSuperBrain.getToken();
|
|
@@ -365,3 +351,114 @@ void SPAServer::compareDeviceAlgorithmInfo(const std::vector<DeviceInfo>& vecNew
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief 从Redis获取数据线程函数,这个是摄像机线程
|
|
|
+ * 一个设备一个线程,这个线程的相关变量只在这个线程中使用
|
|
|
+ *
|
|
|
+ * @param info
|
|
|
+ */
|
|
|
+void SPAServer::threadFromRedis(const CameraThreadInfo& info)
|
|
|
+{
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "开启 fromRedisThread 线程,设备ID:{}", info.DeviceID);
|
|
|
+ FromRedis fromRedis;
|
|
|
+ fromRedis.setRedisIPAndPort(info.RedisIP, info.RedisPort);
|
|
|
+ fromRedis.setRedisPassword(info.RedisPWD);
|
|
|
+ if(fromRedis.connectRedis())
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "连接Redis成功");
|
|
|
+ }else {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "连接Redis失败");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // std::string strKey = "117:OD210_026_005246_001-IZRTKyEx";
|
|
|
+ /* 取出该设备的Key */
|
|
|
+ std::vector<std::string> vecKey;
|
|
|
+ for(const auto& it : info.vecAction)
|
|
|
+ {
|
|
|
+ std::string strKey = std::to_string(info.DeviceID) + ":" + it;
|
|
|
+ vecKey.push_back(strKey);
|
|
|
+ }
|
|
|
+ std::string strRetValue;
|
|
|
+ while (m_threadRunning)
|
|
|
+ {
|
|
|
+ /* 循环读取这个设备关联的算法信息 */
|
|
|
+ for(const auto& it : vecKey)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "读取Redis信息, Key: {}", it);
|
|
|
+ fromRedis.getRedisString(it, strRetValue);
|
|
|
+ SPDLOG_LOGGER_TRACE(m_logger, "Redis Value:\n{}", strRetValue);
|
|
|
+ /* 解析数据 */
|
|
|
+ AlarmInfo alarmInfo;
|
|
|
+ alarmInfo.ActionID = it;
|
|
|
+ parseRedisData(strRetValue, alarmInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ std::this_thread::sleep_for(std::chrono::seconds(1));
|
|
|
+ }
|
|
|
+
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
+/* 解析Redis基础数据 */
|
|
|
+void SPAServer::parseRedisData(const std::string& strData, AlarmInfo& alarmInfo)
|
|
|
+{
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ nJson json0;
|
|
|
+ json0 = nJson::parse(strData);
|
|
|
+ alarmInfo.AlarmID = json0["alarmId"].get<int>();
|
|
|
+ alarmInfo.ActionDes = json0["actionDes"].get<std::string>();
|
|
|
+ alarmInfo.ChannelID = json0["channel"].get<int>();
|
|
|
+ alarmInfo.PicUrl = json0["picUrl"].get<std::string>();
|
|
|
+
|
|
|
+ /* 解析时间,需要将时间中的“T”换成空格 */
|
|
|
+ alarmInfo.StartTime = json0["beginTime"].get<std::string>();
|
|
|
+ std::replace(alarmInfo.StartTime.begin(), alarmInfo.StartTime.end(), 'T', ' ');
|
|
|
+ alarmInfo.EndTime = json0["endTime"].get<std::string>();
|
|
|
+ std::replace(alarmInfo.EndTime.begin(), alarmInfo.EndTime.end(), 'T', ' ');
|
|
|
+ alarmInfo.EventTime = json0["eventTime"].get<std::string>();
|
|
|
+ std::replace(alarmInfo.EventTime.begin(), alarmInfo.EventTime.end(), 'T', ' ');
|
|
|
+ /* 判断bBoxes有无数据,有数据就解析,没数据就直接返回了 */
|
|
|
+ nJson json1 = json0["bBoxes"];
|
|
|
+ if(!json1.empty())
|
|
|
+ {
|
|
|
+ for(auto& it0 : json1)
|
|
|
+ {
|
|
|
+ /* 如果status是true,就不是报警,直接跳过 */
|
|
|
+ bool status = it0["status"].get<bool>();
|
|
|
+ if(alarmInfo.State)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ /* 判断这个是不是违禁品检测的算法ID */
|
|
|
+ if(alarmInfo.ActionID == m_contrabandKey)
|
|
|
+ {
|
|
|
+ /* 解析报警 */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ alarmInfo.ActionDes = json0["actionDes"].get<std::string>();
|
|
|
+ if(alarmInfo.ActionDes.empty())
|
|
|
+ {
|
|
|
+ alarmInfo.ActionDes = "出现违禁品";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (const nJson::parse_error& e)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "解析Redis数据失败:{}, 错误ID:{}", e.what(), e.id);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ catch (const nJson::type_error& e)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "解析Redis数据失败:{}, 错误ID:{}", e.what(), e.id);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|