소스 검색

大小分站TOF协议优化后的相关代码调整,message.cpp未改完。

zzj 5 년 전
부모
커밋
f8a7010db8
6개의 변경된 파일165개의 추가작업 그리고 8개의 파일을 삭제
  1. 1 1
      Makefile.am
  2. 5 2
      area.cpp
  3. 67 0
      message.cpp
  4. 3 0
      message.h
  5. 88 4
      net-service.cpp
  6. 1 1
      worker.cpp

+ 1 - 1
Makefile.am

@@ -31,7 +31,7 @@ AM_CPPFLAGS=-Wall -pthread -m64 -g  -std=c++11 -I${prefix}/include -I/usr/local/
 AM_LDFLAGS=-Wall -pthread -m64 -g  -std=c++11  -L${prefix}/lib  -L/usr/local/mysql/lib
 
 yals_SOURCES=${AM_SOURCES} main.cpp
-yals_CPPFLAGS=${AM_CPPFLAGS} 
+yals_CPPFLAGS=${AM_CPPFLAGS} -DSITE_AREA
 yals_LDFLAGS=${AM_LDFLAGS}  -lev -lzlog -lrt -lboost_chrono -lboost_system -lboost_thread -lmysqlclient -lthree_rates
 
 yals_LDADD=db/libyadb.a websocket/libwebsocket.a

+ 5 - 2
area.cpp

@@ -533,17 +533,20 @@ std::vector<std::shared_ptr<area>> area_list::get_area(const std::shared_ptr<sit
 	if(tool_other::is_person(c->type_())&&s&&s->is_up_site())
 	    return std::move(ret);
 
-	auto map = area_list::instance()->m_map;
+	auto&map = area_list::instance()->m_map;
 
 	for(const auto &a:map)
+	{
 		if(a.second->in_area(s,c,pt,sarid))
 			ret.push_back(a.second);
+	}
+
     if(s){
         ret.push_back(s->get_area());
 #ifdef SITE_AREA
         int area_id=s->m_area_id;
         if(auto area_=area_list::instance()->get(area_id))
-        ret.push_back(area_);
+	        ret.push_back(area_);
 #endif
     }
 	//区域覆盖不完全地图,很多车辆人行驶在地图外,如何确认.

+ 67 - 0
message.cpp

@@ -21,6 +21,13 @@ void message_locinfo::zero_this()
 	m_rssi=0;
 }
 
+message_locinfo*message_locinfo::clone()
+{
+
+
+	return nullptr;
+}
+
 void message_locinfo::load(zistream&is,bool tdoa)
 {
 	zero_this();
@@ -71,6 +78,66 @@ void message_locinfo::load(zistream&is,bool tdoa)
 			m_time_stamp,m_card_type,m_card_id,m_site_id,m_card_ct,m_batty_status,m_acc,m_tof,m_ant_id,m_rssi);
 }
 
+std::vector<task*> message_locinfo::load_753C(zistream&is)
+{
+	std::vector<task*> rc;
+	task*t=task::alloc<message_locinfo>();
+
+	message_locinfo&m=t->body<message_locinfo>();
+	m.zero_this();
+
+	uint8_t  b;
+	uint16_t card_id;
+	//卡类型、卡号、CT、电池状态
+	is>>b>>card_id>>m.m_card_ct;
+	m.m_card_type=b&0xF;
+	m.m_batty_status=b>>4;
+
+	is>>b;
+	if(m.m_card_type==1)
+	{
+		m.m_callinfo=b;
+	}
+	else
+	{
+		m.m_rav=((b&0x80)?-1.:1.)*(b&0x7f)*3;
+	}
+
+	//加速度
+	is>>b;
+	if(m.m_card_type==1 || m.m_card_type==4 || m.m_card_type==5)
+		m.m_acc=b;
+	else
+		m.m_acc=((b&0x80)?-1.:1.)*(b&0x7f)*0.01;
+
+#if 0
+	//TOF
+	is>>b>>i; 	
+	m_tof=b;
+	m_tof=(m_tof<<32)|i;
+
+	//天线号
+	is>>m_ant_id;
+	--m_ant_id;
+
+	if(tdoa)
+	{
+		//同步序号,冲击响应丢弃
+		is>>m_sync_ct>>skip(2);
+	}
+
+	//信号电平值
+	uint16_t sp1=0,sp2=0;
+	is>>sp1>>sp2;
+	m_rssi=10*log10(1.*sp1*(1<<17)/pow(sp2-64.,2))-121.74;
+	log_info("timestamp=%llu,type:%d,card_id:%d,site:%d,ct:%d,status:%d,acc=%d,tof=%llu,ant_id:%d,spq=%d",
+			m_time_stamp,m_card_type,m_card_id,m_site_id,m_card_ct,m_batty_status,m_acc,m_tof,m_ant_id,m_rssi);
+#endif
+	rc.push_back(t);
+
+	return std::move(rc);
+}
+
 void message_tdoasync::zero_this()
 {
 	m_local_site_id=

+ 3 - 0
message.h

@@ -38,6 +38,9 @@ struct message_locinfo:task
 	void zero_this();
     void load(zistream&is,bool tdoa);
 
+    static std::vector<task*> load_753C(zistream&is);
+	static message_locinfo*clone();
+
 	int64_t long_id()const 
 	{
 		return (((int64_t)m_card_type)<<32)|m_card_id;

+ 88 - 4
net-service.cpp

@@ -123,6 +123,88 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
 					}
 				}
 				break;
+			case 0x753C://tof-优化,大小分站
+				{
+					uint16_t site_id=-1;
+					uint16_t site_ct=-1;
+					uint32_t site_time_s=0;
+					uint8_t  power=-1;
+
+					is>>site_id>>site_ct >>site_time_s >>power;
+					power=power>>6;
+
+					time_t site_time=site_time_s;
+
+					auto site_ptr = sit_list::instance()->get(static_cast<int32_t>(site_id));
+					if(!site_ptr)
+					{
+						logn_error(1,"在全局分站列表中找不到分站:%s,%d", clt->name().c_str(), site_id);
+						break;
+					}
+
+                    if(site_ptr->is_abnormal_site())
+                    {
+						logn_error(1,"分站[%d]天线异常", site_id);
+                        break;
+                    }
+
+					{
+						char timebuf[64]{0};
+						struct tm site_tm={0};
+						localtime_r(&site_time, &site_tm);
+
+						strftime(timebuf,64,"%F %T",&site_tm);
+						const char*power_flag="??";
+						if(site_ptr->m_power_check_enable)
+						{
+							if(power==1)
+								power_flag="dc";
+							if(power==2)
+								power_flag="ac";
+						}
+
+						logn_info(1,"分站数据信息:net=%s,sid=%d,tm=%s,sct=%d,power=%s", clt->name().c_str(), site_id,timebuf, site_ct, power_flag);
+
+						double diff=difftime(site_time, site_ptr->last_site_time());
+						if(diff<-3) //允许2秒的时间抖动
+						{
+							logn_error(1,"分站时间回退,数据将被丢弃:%s,diff=%d",clt->name().c_str(),(int)diff);
+						}
+
+						site_ptr->set_site_time(site_time);
+					}
+
+                    if(clt->type()!=2){
+					    site_ptr->set_client(clt);
+					    site_ptr->on_power_status((power&1)==0);
+                        //clt->set_site_id(site_id);
+                    }
+
+					struct timeval tv;
+					gettimeofday(&tv,NULL);
+					uint64_t t = tv.tv_sec*1000 + tv.tv_usec/1000;
+					int index=0;
+					while(!is.eof())
+					{
+						uint64_t tstamp = t -1000 + 50 + index* 45;
+						index++;
+
+						for(auto&tk:message_locinfo::load_753C(is))//未写完
+						{
+							message_locinfo&m=tk->body<message_locinfo>();
+							m.m_site_id=site_id;
+							m.m_time_stamp=tstamp;
+
+							tk->m_hash_id=m.m_card_id;
+							tk->m_cmd_code=cmd;
+							if(m.m_card_type==5)
+								mine_business::inst()->make_reverse_condition(m.m_card_type,m.m_card_id,m.m_ant_id,m.m_card_ct,m.m_tof,m.m_site_id);
+
+							m_loc_worker->request(tk);
+						}
+					}
+				}
+				break;
 			case 0x783A://tof 分站时间同步
 				{
 
@@ -184,16 +266,18 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
 				}
 				//site_message::on_sync(this,t.m_param1);
 				break;
-			case CHAR_LOCATEDATAHIS_TOF_EXTEND://tof his
-			case CHAR_LOCATEDATAHIS_TDOA_EXTEND://tdoa his
-			case CHAR_CTRL_READER_CMD://ctrl site message
-			case CHAR_ADHOC://自组网数据
             case CHAR_VIRTUAL_DATA_PUSH_CMD://虚拟数据链接
                 {
                     logn_info(1,"接收到虚拟链接:%s",clt->name().c_str());
                     clt->set_conn_type(2);
                 }
                 break;
+
+
+			case CHAR_LOCATEDATAHIS_TOF_EXTEND://tof his
+			case CHAR_LOCATEDATAHIS_TDOA_EXTEND://tdoa his
+			case CHAR_CTRL_READER_CMD://ctrl site message
+			case CHAR_ADHOC://自组网数据
 			default:
 				message_handled=false;
 		}

+ 1 - 1
worker.cpp

@@ -206,7 +206,7 @@ struct worker_thread: loop_thread ,visitor<std::shared_ptr<card_location_base>>
 			case 0x853b://tof his
 			case 0x873b://tdoa his
 				log_info("site history message%04X",t.m_cmd_code);
-					card_list::instance()->on_message(this,t.body<message_locinfo>(),true);
+				card_list::instance()->on_message(this,t.body<message_locinfo>(),true);
 				//site_message::on_sync(this,t.m_param1);
 				t.destroy();
 			break;