|
@@ -2,8 +2,6 @@
|
|
|
|
|
|
namespace MIVA
|
|
|
{
|
|
|
- std::shared_ptr<Inference> m_Infer = NULL;
|
|
|
-
|
|
|
std::shared_ptr<UserApp> UserApp::CreateNew(){
|
|
|
return std::make_shared<UserApp>();
|
|
|
}
|
|
@@ -70,6 +68,10 @@ namespace MIVA
|
|
|
// 链接Netty后端
|
|
|
ConnectNetty();
|
|
|
|
|
|
+ // UDP绑定端口
|
|
|
+ this->m_udpClient = Socket::createSocket();
|
|
|
+ this->m_udpClient->bindUdpSock(this->PIS_port);
|
|
|
+
|
|
|
// 查询需要播放的流
|
|
|
vector<vector<string>> sqlRet;
|
|
|
SqlWriter sqlSelect("SELECT Id,Stream FROM MIVA_DB.`Streams` WHERE Play = 1");
|
|
@@ -107,12 +109,6 @@ namespace MIVA
|
|
|
this->ListenNettyData(pBuf);
|
|
|
});
|
|
|
|
|
|
- // 监听PIS广播
|
|
|
- NoticeCenter::Instance().addListener(0, NOTICE_NETTY,
|
|
|
- [&](const Buffer::Ptr &buf, struct sockaddr *addr){
|
|
|
- this->ListenPISData(buf, addr);
|
|
|
- });
|
|
|
-
|
|
|
InfoL << "System initialization is successful!";
|
|
|
return OK;
|
|
|
}
|
|
@@ -133,6 +129,11 @@ namespace MIVA
|
|
|
if(m_Infer != NULL) m_Infer->StartTask();
|
|
|
});
|
|
|
|
|
|
+ // 挂起函数回调
|
|
|
+ this->m_udpClient->setOnRead([&](const Buffer::Ptr &buf, struct sockaddr *addr , int){
|
|
|
+ this->ListenPISData(buf, addr);
|
|
|
+ });
|
|
|
+
|
|
|
// 定时检查连接状态
|
|
|
this->m_timer0 = std::make_shared<Timer>(5.0f,[&](){
|
|
|
if(!m_tcpClient->alive()){
|
|
@@ -141,6 +142,12 @@ namespace MIVA
|
|
|
return true;
|
|
|
}, nullptr);
|
|
|
|
|
|
+ // 定时上报数据
|
|
|
+ this->m_timer1 = std::make_shared<Timer>(1.0f,[&](){
|
|
|
+ this->ReportData(); // 上报数据
|
|
|
+ return true;
|
|
|
+ }, nullptr);
|
|
|
+
|
|
|
// 启动任务
|
|
|
poolInfer.start();
|
|
|
InfoL << "Task started successfully!";
|
|
@@ -152,7 +159,7 @@ namespace MIVA
|
|
|
// 异步更新
|
|
|
SqlWriter updataSql("UPDATE MIVA_DB.Streams SET num = '?' WHERE Id = '?';");
|
|
|
updataSql << num << Source_id << endl;
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
// 连接Netty
|
|
|
void UserApp::ConnectNetty()
|
|
@@ -164,20 +171,98 @@ namespace MIVA
|
|
|
// 上报识别结果
|
|
|
void UserApp::ReportData()
|
|
|
{
|
|
|
+ vector<vector<std::string>> sqlRet;
|
|
|
+ // 查询需要上报的车厢ID
|
|
|
+ SqlWriter sqlSelect("SELECT CarId FROM MIVA_DB.`CarId`");
|
|
|
+ sqlSelect << sqlRet;
|
|
|
+ if(sqlRet.empty()){
|
|
|
+ ErrorL << "Car data not found.";
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ PIDSClientResultMsg clentResultMsg;
|
|
|
+
|
|
|
+
|
|
|
+ for(auto &line : sqlRet){
|
|
|
+ vector<vector<std::string>> sqlRet0;
|
|
|
+ SqlWriter sqlSelect0("SELECT Crowdedness,num FROM MIVA_DB.`Crowdedness` where CarId = ?");
|
|
|
+ sqlSelect0 << atoi(line[0].c_str()) << sqlRet0;
|
|
|
+ if(sqlRet0.empty()) {
|
|
|
+ ErrorL << "Crowdedness data not found.";
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ for(auto &line0 : sqlRet0){
|
|
|
+ clentResultMsg.data[atoi(line[0].c_str())].Crowdedness = atoi(line0[0].c_str());
|
|
|
+ clentResultMsg.data[atoi(line[0].c_str())].Num = atoi(line0[1].c_str());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ uint8_t data[1024];
|
|
|
+ std::string json;
|
|
|
+ memset(data, 0, sizeof(data));
|
|
|
+ // 序列化数据
|
|
|
+ clentResultMsg.Serialization(data);
|
|
|
+ clentResultMsg.ObjectToJson(json);
|
|
|
+
|
|
|
+ // 传输至PIS系统
|
|
|
+ struct sockaddr addrDst;
|
|
|
+ makeAddr(&addrDst,this->PIS_ip.c_str(),this->PIS_port);//UDP数据发送地址
|
|
|
+ this->m_udpClient->send((char *)data,&addrDst, sizeof(struct sockaddr_in));
|
|
|
|
|
|
+ // 传输至Netty端
|
|
|
+ if(this->m_tcpClient->alive()){
|
|
|
+ (*m_tcpClient) << json;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 处理Netty的数据
|
|
|
void UserApp::ListenNettyData(const Buffer::Ptr &pBuf)
|
|
|
{
|
|
|
+ // 对Netty端的接口
|
|
|
|
|
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
// 处理PIS系统的数据
|
|
|
void UserApp::ListenPISData(const Buffer::Ptr &buf, struct sockaddr *addr)
|
|
|
{
|
|
|
-
|
|
|
-
|
|
|
+ static int8_t num = 0;
|
|
|
+ vector<vector<std::string>> sqlRet;
|
|
|
+ // 接受到PIS发送的数据
|
|
|
+ PIDSServerResultMsg serverResultMag;
|
|
|
+ // 反序列化
|
|
|
+ if(serverResultMag.Deserialization((uint8_t *)(buf->data()), buf->size()) == OK)
|
|
|
+ {
|
|
|
+ // 将收到的第一条PIS系统的数据作为空载荷
|
|
|
+ // 同步
|
|
|
+ if(num == 0){
|
|
|
+ SqlWriter updataSql("UPDATE MIVA_DB.CarId SET NoLoad = '?' WHERE CarId = '?';");
|
|
|
+ for(int id=1; id <= 6 ; id ++){
|
|
|
+ updataSql << serverResultMag.DynamicLoad[id] << id << sqlRet;
|
|
|
+ }
|
|
|
+ num++;
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ // 纪律动态载荷
|
|
|
+ SqlWriter updataSql("UPDATE MIVA_DB.CarId SET DynamicLoad = '?' WHERE CarId = '?';");
|
|
|
+ for(int id=1; id <= 6 ; id ++){
|
|
|
+ updataSql << serverResultMag.DynamicLoad[id] << id << sqlRet;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 获取到关好门的信号
|
|
|
+ if((serverResultMag.DoorFlag & 0x80))
|
|
|
+ {
|
|
|
+ // 广播收到管好门的信号
|
|
|
+ NoticeCenter::Instance().emitEvent(NOTICE_CLOSED);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ //赋值struct sockaddr
|
|
|
+ void UserApp::makeAddr(struct sockaddr *out,const char *ip,uint16_t port){
|
|
|
+ struct sockaddr_in &servaddr = *((struct sockaddr_in *)out);
|
|
|
+ servaddr.sin_family = AF_INET;
|
|
|
+ servaddr.sin_port = htons(port);
|
|
|
+ servaddr.sin_addr.s_addr = inet_addr(ip);
|
|
|
+ bzero(&(servaddr.sin_zero), sizeof servaddr.sin_zero);
|
|
|
+ }
|
|
|
+
|
|
|
}
|