Ver Fonte

隔爆电源交流电掉电告警功能---分站消息处理

chensongchao há 6 anos atrás
pai
commit
1145c1a794
11 ficheiros alterados com 131 adições e 92 exclusões
  1. 4 2
      Makefile.am
  2. 1 1
      area.cpp
  3. 3 3
      main.cpp
  4. 25 0
      message.cpp
  5. 28 0
      message.h
  6. 26 8
      net-service.cpp
  7. 26 56
      site_message_handle.cpp
  8. 5 18
      site_message_handle.h
  9. 6 2
      worker.cpp
  10. 1 0
      worker.h
  11. 6 2
      ya_setting.cpp

+ 4 - 2
Makefile.am

@@ -9,13 +9,15 @@ SRC_MAIN= ant.cpp area.cpp base64.cpp bindmorecard.cpp card_area.cpp card_base.c
     	  card.cpp card_message_handle.cpp cardMgr.cpp card_path.cpp card_person.cpp crc.cpp geo_hash.cpp \
 		  landmark.cpp line_fit.cpp loc_point.cpp loc_tool.cpp message.cpp message_file.cpp mine.cpp \
 		  net-service.cpp point.cpp select_tool.cpp site_area.cpp special_area.cpp tdoa_sync.cpp visit.cpp \
-		  web-client.cpp worker.cpp ya_event.cpp znet.cpp ya_setting.cpp area_business.cpp
+		  web-client.cpp worker.cpp ya_event.cpp znet.cpp ya_setting.cpp area_business.cpp site_message_handle.cpp
 
 SRC_MAIN_EVENT= mine_module/MineCardManager.cpp
 
+SRC_SYSTEM_BASIC= system_basic_info/SystemAnalysis.cpp
+
 CXXFLAGS=-g
 
-AM_SOURCES=$(SRC_MONKEYCAR) $(SRC_MODULE_SERVICE) $(SRC_MAIN) $(SRC_MAIN_EVENT)
+AM_SOURCES=$(SRC_MONKEYCAR) $(SRC_MODULE_SERVICE) $(SRC_MAIN) $(SRC_MAIN_EVENT) $(SRC_SYSTEM_BASIC)
 
 AM_CPPFLAGS=-Wall -pthread -m64 -g -O0 -std=c++11  -I${prefix}/include -I/usr/local/mysql/include -Iwebsocket -Iwebsocket/sio -I./db -I../dist/include -I../rapidjson/include
 

+ 1 - 1
area.cpp

@@ -51,7 +51,7 @@ void area::on_enter(std::shared_ptr<area_hover>&a,std::shared_ptr<card_location_
 	log_info("on_enter..%d  areaId:%d",c->m_id,m_id);
  	for(auto i:m_area_business_list)
 	{
-		i->on_enter(a,c,a->get_business_data(i->business_type()));
+		i->on_enter(a,c,*(a->get_business_data(i->business_type())));
 	}
 }
 

+ 3 - 3
main.cpp

@@ -59,9 +59,9 @@ struct Init_Setting
         area_list::instance()->init_from_db();
         std_info("here....");
         //test
-        point pt(3348,100);
-        int id = area_list::instance()->get_area(pt)->id();
-        std_info("test area:%d",id);
+        //point pt(3348,100);
+        //int id = area_list::instance()->get_area(pt)->id();
+        //std_info("test area:%d",id);
 
         Landmark_list::instance()->init_from_db();
         //auto a = Landmark_list::instance()->get(5,id,pt);

+ 25 - 0
message.cpp

@@ -2,6 +2,31 @@
 #include "zstream.h"
 #include "message.h"
 #include "log.h"
+void message_siteinfo::zero_this()
+{
+	memset(this,0,sizeof(*this));
+}
+
+void message_siteinfo::load(zistream&is,bool bAdhoc)
+{
+	zero_this();
+	is>>m_site_id>>m_time_stamp>>m_sec>>m_min>>m_hour>>m_day>>m_week>>m_mon;
+	is>>m_year>>m_site_relation;
+	if (bAdhoc)
+	{
+		uint16_t state = 0;
+		is>>state;
+		m_site_state = state;
+	}
+	else
+	{
+		uint8_t site_state = 0;
+		uint8_t powerType = 0;
+		is>>site_state>>powerType;
+		m_site_state = site_state;
+		m_site_power = powerType;
+	}
+}
 
 void message_locinfo::zero_this()
 {

+ 28 - 0
message.h

@@ -5,6 +5,34 @@
 
 struct zistream;
 
+#define CHAR_LOCATEDATA_TOF_EXTEND 0x843b			// TOF实时定位数据,请求、应答
+#define CHAR_LOCATEDATAHIS_TOF_EXTEND 0x853b		// TOF历史定位数据,请求、应答
+#define CHAR_LOCATEDATA_TDOA_EXTEND 0x863b			// TDOA实时定位数据,请求、应答
+#define CHAR_LOCATEDATAHIS_TDOA_EXTEND 0x873b		// TDOA历史定位数据,请求、应答
+#define CHAR_TDOA_READER_SYNC_TIME 0xa78d			// TDOA分站时间同步
+#define CHAR_ADHOC	0x803b							// 上传自组网数据
+#define CHAR_CTRL_READER_CMD 0x804c					// 向分站发送控制指令,控制分站向上位机发送数据
+
+// 分站上传上来的分站数据
+struct message_siteinfo
+{
+	uint32_t m_site_id;       //分站ID
+	uint16_t m_time_stamp;  //时间戳(0-65535)
+	uint8_t m_sec;
+	uint8_t m_min;
+	uint8_t m_hour;
+	uint8_t m_day;
+	uint8_t m_week;
+	uint8_t m_mon;
+	uint8_t m_year;
+	uint8_t m_site_relation;    //分站类型  -- 自组网数据=温度
+	int m_site_state;      //分站状态char
+	int m_site_power;      //分站电源类型
+	void zero_this();
+	void load(zistream&is,bool bAdhoc);
+};
+
+
 //	分站传上来的卡定位数据,包括tof,tdoa
 struct message_locinfo
 {

+ 26 - 8
net-service.cpp

@@ -41,10 +41,19 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 	is>>skip(2)>>cmd;
 	switch(cmd)
 	{
-		case 0x843b://tof
+		case CHAR_LOCATEDATA_TOF_EXTEND://tof-扩展
 			{
 				uint32_t site_id;
-				is>>site_id>>skip(12);
+				message_siteinfo msgSiteInfo;
+				msgSiteInfo.load(is,false);
+				site_id = msgSiteInfo.m_site_id;
+				task* t_site=task::alloc<message_locinfo>();
+				t_site->m_cmd_code=cmd;
+				t_site->m_hash_id=site_id;
+				t_site->m_site_data = 1;
+				m_loc_worker->request(t_site);
+				//is>>site_id>>skip(12);
+
                 auto site_ptr = sit_list::instance()->get(static_cast<int32_t>(site_id));
                 if(!site_ptr)
                 {
@@ -73,10 +82,17 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 				}
 			}
 			break;
-		case 0x863b://tdoa
+		case CHAR_LOCATEDATA_TDOA_EXTEND://tdoa
 			{
 				uint32_t site_id;
-				is>>site_id>>skip(12);
+				message_siteinfo msgSiteInfo;
+				msgSiteInfo.load(is,false);
+				site_id = msgSiteInfo.m_site_id;
+				task*t_site=task::alloc<message_locinfo>();
+				t_site->m_cmd_code=cmd;
+				t_site->m_hash_id=site_id;
+				t_site->m_site_data = 1;
+				m_loc_worker->request(t_site);
 				while(!is.eof())
 				{
 					task*t=task::alloc<message_locinfo>();
@@ -90,7 +106,7 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 				}
 			}
 			break;
-		case 0xa78d://time sync
+		case CHAR_TDOA_READER_SYNC_TIME://time sync
 			{
 				message_tdoasync m;
 				m.load(is);
@@ -98,10 +114,12 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 			}
 			//site_message::on_sync(this,t.m_param1);
 			break;
-		case 0x853b://tof his
-		case 0x873b://tdoa his
+		case CHAR_LOCATEDATAHIS_TOF_EXTEND://tof his
+		case CHAR_LOCATEDATAHIS_TDOA_EXTEND://tdoa his
+			break;
+		case CHAR_CTRL_READER_CMD://ctrl site message
 			break;
-		case 0x804c://ctrl site message
+		case CHAR_ADHOC://自组网数据
 			break;
 	}
 }

+ 26 - 56
site_message_handle.cpp

@@ -8,47 +8,23 @@
 #include "ant.h"
 #include "ya_event.h"
 
+site_message_handle::site_message_handle()
+{
+    m_time_last_rec = 0;
+}
 /** 解析 分站发送过来的数据中(分站的信息数据)*/
-void site_message_handle::parse_data_locate_reader(char * DataBuffer, int nLen, int dwConnID,int& nCurPos
-        ,  int& reader_id )
+void site_message_handle::parse_data_locate_reader(int msgId,const message_siteinfo &loc ,bool bHistroy)
 {
     LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_15);
-#pragma pack(1)
-    // 7字节 从第一个字节开始,分别表示秒、分、时、天、周、月、年
-    struct _LocateInfo
-    {
-        unsigned int site_id;       //分站ID
-        unsigned short time_stamp;  //时间戳(0-65535)
-        unsigned char sec;
-        unsigned char min;
-        unsigned char hour;
-        unsigned char day;
-        unsigned char week;
-        unsigned char mon;
-        unsigned char year;
-        unsigned char site_relation;    //分站类型
-        unsigned char site_state;      //分站状态char
-        unsigned char site_power;      //分站电源类型
-    };
-#pragma pack()
-    _LocateInfo *_pLocateInfo = (_LocateInfo *)(DataBuffer + nCurPos);
-    if (tool_other::IsBigEnd())  //大端
-    {
-        _pLocateInfo->site_id = ntohl(_pLocateInfo->site_id);
-        _pLocateInfo->time_stamp = ntohs(_pLocateInfo->time_stamp);
-    }
-    nCurPos += sizeof(_LocateInfo);
-
-    reader_id = _pLocateInfo->site_id;
-    std::shared_ptr<site> pSite = sit_list::instance()->get(_pLocateInfo->site_id);
-    bool isErrorReader = false;
 
+    std::shared_ptr<site> pSite = sit_list::instance()->get(loc.m_site_id);
+    //bool isErrorReader = false;
     if(pSite){
         //add_socket_to_list(dwConnID, reader_id, DEVICE_TYPE::DT_CARD_READER);
         LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_16);
     }else{
         pSite = std::make_shared<site>();
-        pSite->m_id = reader_id;
+        pSite->m_id = loc.m_site_id;
         LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_17);
     }
 
@@ -56,45 +32,39 @@ void site_message_handle::parse_data_locate_reader(char * DataBuffer, int nLen,
     pSite->m_rec_time = time(NULL);
     m_time_last_rec = pSite->m_rec_time; // 更新最后信号时间
     // 分站时间戳
-    pSite->m_tick_count = _pLocateInfo->time_stamp;
+    pSite->m_tick_count = loc.m_time_stamp;
     // 分站时间
     // 7字节 从第一个字节开始,分别表示秒、分、时、天、周、月、年
     struct tm reader_time;
-    reader_time.tm_sec = _pLocateInfo->sec;
-    reader_time.tm_min = _pLocateInfo->min;
-    reader_time.tm_hour = _pLocateInfo->hour;
-    reader_time.tm_mday = _pLocateInfo->day;
-    reader_time.tm_wday = _pLocateInfo->week;
-    reader_time.tm_mon = _pLocateInfo->mon - 1;
-    reader_time.tm_year = _pLocateInfo->year + 100;  // + 2000 - 1900
+    reader_time.tm_sec = loc.m_sec;
+    reader_time.tm_min = loc.m_min;
+    reader_time.tm_hour = loc.m_hour;
+    reader_time.tm_mday = loc.m_day;
+    reader_time.tm_wday = loc.m_week;
+    reader_time.tm_mon = loc.m_mon - 1;
+    reader_time.tm_year = loc.m_year + 100;  // + 2000 - 1900
     pSite->m_time = mktime(&reader_time);
 
     //改为大小分站信息,最高位第7位表示大小分站,1表示大分站,0表示小分站
     //高6位表示分站(大或小)在大分站的左侧或右侧,1代表在大分站的左侧,0表示在大分站的右侧
     //高5位预留位,用于区分是读卡分站还是大小分站
-    uint8_t reader_type = _pLocateInfo->site_relation >>7;			//大小分站的区别
-    uint8_t reader_dir = (_pLocateInfo->site_relation >>6)&0x01;
-    uint8_t reader_type_locate = (_pLocateInfo->site_relation >>5)&0x01;	//大小分站与读卡分站的区别
-    uint8_t relay_counts = _pLocateInfo->site_relation&0x0F;
+    uint8_t reader_type = loc.m_site_relation >>7;			//大小分站的区别
+    uint8_t reader_dir = (loc.m_site_relation >>6)&0x01;
+    uint8_t reader_type_locate = (loc.m_site_relation >>5)&0x01;	//大小分站与读卡分站的区别
+    uint8_t relay_counts = loc.m_site_relation&0x0F;
     pSite->m_reader_dir = reader_dir;
     pSite->m_relay_counts = relay_counts;
 
-    reader_power_battery_alarm(_pLocateInfo->site_id,_pLocateInfo->site_power);
+    reader_power_battery_alarm(loc.m_site_id,loc.m_site_power);
 
     log_info("id:%d, n:%d, %.2d-%.2d-%.2d %.2d:%.2d:%.2d, sta: %d,reader_power: %d"
              ",reader_type: %d,is_big_reader: %d,is_left: %d, counts: %d",
-                  _pLocateInfo->site_id, _pLocateInfo->time_stamp, _pLocateInfo->year, _pLocateInfo->mon, _pLocateInfo->day\
-                  , _pLocateInfo->hour, _pLocateInfo->min,_pLocateInfo->sec\
-                  , _pLocateInfo->site_state,_pLocateInfo->site_power,reader_type_locate,reader_type,reader_dir,relay_counts);/*tep:%d,*/
+                  loc.m_site_id, loc.m_time_stamp, loc.m_year, loc.m_mon, loc.m_day\
+                  , loc.m_hour, loc.m_min,loc.m_sec\
+                  , loc.m_site_state,loc.m_site_power,reader_type_locate,reader_type,reader_dir,relay_counts);/*tep:%d,*/
 
 
 }
-/**   解析单个卡数据 */
-int  site_message_handle::parse_data_locate_card(char * DataBuffer,  int reader_id
-        , unsigned short wChr,int& nCurPos, unsigned long long ct_time/* = 0*/,int pos/* = 0*/)
-{
-    return  0;
-}
 
 void site_message_handle::reader_power_battery_alarm(unsigned int site_id, int powerType)
 {
@@ -103,7 +73,7 @@ void site_message_handle::reader_power_battery_alarm(unsigned int site_id, int p
     {
         return ;
     }
-    std::shared_ptr<ya_event> ev_ptr = event_list::get_event_reader(site_id,ET_READER_POWER_BY_BATTERY);
+    std::shared_ptr<ya_event> ev_ptr = event_list::instance()->get_event_reader(site_id,ET_READER_POWER_BY_BATTERY);
     int oldEvState = -1;
     int usePowerType = powerType;
     if (!pSite->m_needpower_alarm)
@@ -148,7 +118,7 @@ void site_message_handle::reader_power_battery_alarm(unsigned int site_id, int p
                 event_list::copy_event(pSite,ev_ptr);
                 event_list::instance()->add(ev_ptr->get_list_id(),ev_ptr);
             }
-            ev_ptr->status = ES_START;
+            ev_ptr->m_status = ES_START;
             ev_ptr->m_limit_value = 0;
             ev_ptr->m_cur_value = usePowerType;
             event_list::save_event(ev_ptr);

+ 5 - 18
site_message_handle.h

@@ -6,6 +6,7 @@
 #define WORKSPACE_SITE_MESSAGE_HANDLE_H
 
 #include "module_service/module_const.h"
+#include "message.h"
 
 class site_message_handle : public singleton_base<site_message_handle>
 {
@@ -19,27 +20,13 @@ public:
     time_t m_time_last_rec;
 
 public:
-
-private:
     /** 解析 分站发送过来的数据中(分站的信息数据)
-     * @param DataBuffer 接收数据
-     * @param nLen       接收数据长度
-     * @param dwConnID   连接关键字
-     * @param nCurPos    从接收数据的那个位置开始读取数据
-     * @param reader_id  分站ID
+     * @param msgId      接收消息ID
+     * @param loc        接收数据
+     * @param bHistroy   是否历史数据
      * @return
      */
-    void parse_data_locate_reader(char * DataBuffer, int nLen, int dwConnID,int& nCurPos,  int& reader_id );
-    /**   解析单个卡数据
-     * @param DataBuffer
-     * @param nCurPos
-     * @param reader_id 分站ID
-     * @param wChr      消息ID
-     * @param ct_time
-     * @param pos
-     * @return 0: 成功
-     */
-    int  parse_data_locate_card(char * DataBuffer,  int reader_id, unsigned short wChr,int& nCurPos, unsigned long long ct_time = 0,int pos = 0);
+    void parse_data_locate_reader(int msgId,const message_siteinfo &loc ,bool bHistroy);
     /**
      * 分站电源是否已切换直流电,发送警告
      * @param site_id

+ 6 - 2
worker.cpp

@@ -12,6 +12,7 @@
 #include "message.h"
 #include "card.h"
 #include "zloop.h"
+#include "site_message_handle.h"
 
 struct worker_thread: zloop<task*>
 {
@@ -44,14 +45,17 @@ struct worker_thread: zloop<task*>
 			case 0x843b://tof
 			case 0x863b://tdoa
 				log_info("card loc message%04X",t.m_cmd_code);
+				if (t.m_site_data == 1)
+					site_message_handle::instance()->parse_data_locate_reader(t.m_cmd_code,t.body<message_siteinfo>(),false);
+				else
+					card_list::instance()->on_message(this,t.body<message_locinfo>(),false);
 
-				card_list::instance()->on_message(this,t.body<message_locinfo>(),false);
 				//card_message::on_loc_message(this,t.m_param1);
 			break;
 			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);
 			break;
 

+ 1 - 0
worker.h

@@ -6,6 +6,7 @@ struct task
 {
 	uint32_t m_cmd_code;
 	uint32_t m_hash_id;
+	int      m_site_data = 0;
 	char     m_d[1];
 
 	void destroy()

+ 6 - 2
ya_setting.cpp

@@ -18,9 +18,13 @@ bool CYaSetting::Init_sys_setting()
 		while ( DBRes.GetNextRecod(Error) )
 		{
 			std::string strVal = "";
+			std::string name = "";
+			DBRes.GetField( "name",name, Error );
 #define D_GetValue(K,N,X,PS) \
-			if (DBRes.GetField( N,strVal, Error ))\
-				{K = atoi(strVal.c_str()) * X;}\
+			if(name == N){\
+            	DBRes.GetField( "value",strVal, Error );\
+            	K = atoi(strVal.c_str()) * X;\
+            }\
 
 			D_GetValue(m_sys_setting.over_count_person,"over_count_person",1,"人员井下超员")
 			D_GetValue(m_sys_setting.over_count_vehicle,"over_count_vehicle",1,"车辆井下超员")