Browse Source

Merge branch 'master' of http://local.beijingyongan.com:3000/linux-dev/ya-serv

zzj 6 years ago
parent
commit
6bf1e1ff7f

+ 4 - 0
area.cpp

@@ -73,10 +73,14 @@ area::area(int id,int limit_count_person, int limit_time_person,double scale,int
      ,m_mapid(mapid)
      ,m_person_count(0)
      ,m_vehicle_count(0)
+     ,m_person_show_count(0)
+     ,m_vehicle_show_count(0)
     {
 		m_area_business_list=area_business::get_instance_list(m_area_type,id);
 		m_event_person_count = false;
 		m_event_vehicle_count = false;
+		m_event_person_show_count = false;
+		m_event_vehicle_show_count = false;
     }
 
 

+ 6 - 0
area.h

@@ -86,12 +86,14 @@ public:
     int m_limit_person_count;
     //是否人卡超员已有告警
     bool m_event_person_count;
+    bool m_event_person_show_count;
 
 	//人卡超时及超员数量(阀值)
     int m_limit_vehicle_second;
     int m_limit_vehicle_count;
     //是否人卡超员已有告警
     bool m_event_vehicle_count;
+    bool m_event_vehicle_show_count;
     double m_scale;
     int32_t m_mapid;
 
@@ -99,6 +101,10 @@ public:
     std::atomic<int> m_person_count;
     ///区域车卡数
     std::atomic<int> m_vehicle_count;
+    ///区域显示人卡数
+    std::atomic<int> m_person_show_count;
+    ///区域显示车卡数
+    std::atomic<int> m_vehicle_show_count;
 
 
     //区域速度门限

+ 11 - 15
area_business.cpp

@@ -20,8 +20,6 @@ struct area_business_factory
 {
 	void regist(int type,area_business* ab)
 	{
-		type-=1;
-
 		ab->m_business_type=type;
 
 		if(type>=(int)m_check_list.size())
@@ -70,19 +68,17 @@ struct area_business_factory
 	std::vector<std::unique_ptr<area_business>> m_check_list;
 	area_business_factory()
 	{
-		regist(1,new area_business_post_area);
-		regist(2,new area_business_person_dwell_checker);
-		regist(3,new area_business_count_checker);
-		regist(4,new area_business_speed_checker);
-		regist(5,new area_business_person_attendance);
-		regist(6,new area_business_car_attendance);
-		regist(7,new area_business_forbid);
-		//regist(8,new area_business_monkey_area);
-		regist(8,new area_business_card_enter_or_leave);
-
-		regist(9, new area_business_motionless_persion);
-		regist(10, new area_business_geofault);
-		regist(11, new area_business_work_rate);
+		regist(0, new area_business_post_area);
+		regist(1, new area_business_person_dwell_checker);
+		regist(2, new area_business_count_checker);
+		regist(3, new area_business_speed_checker);
+		regist(4, new area_business_person_attendance);
+		regist(5, new area_business_car_attendance);
+		regist(6, new area_business_forbid);
+		regist(7, new area_business_card_enter_or_leave);
+		regist(8, new area_business_motionless_persion);
+		regist(9,new area_business_geofault);
+		regist(10,new area_business_work_rate);
 	}
 
 };

+ 6 - 1
common.h

@@ -96,7 +96,12 @@ enum OBJECT_TYPE
     ///标识卡,包括人员、车辆、自组网等
     OT_CARD = 9,
 };
-
+enum EVENT_DIS_TYPE
+{
+    DT_NORMAL=1,
+    DT_SPECIAL=2,
+    DT_COMMON=3
+};
 enum EVENT_TYPE{ // 事件类型
     ET_OVER_COUNT_PERSON = 1,       // 井下人员超员
     ET_OVER_COUNT_VEHICLE = 2,      // 井下车辆超员

+ 31 - 24
event.cpp

@@ -15,8 +15,7 @@
 
 uint64_t ya_event::get_list_id()
 {
-    uint64_t car_id = tool_other::type_id_to_u64(tool_other::id64_to_type(m_obj_id), tool_other::id64_to_id(m_obj_id));
-    return  event_list::to_list_id(m_ev_type, m_obj_type,car_id);
+    return m_id;
 }
 
 
@@ -26,7 +25,7 @@ struct Event
     Event(OBJECT_TYPE oid)
         :m_oid(oid)
     {}
-    void handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,const std::string &desc="");
+    void handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,EVENT_DIS_TYPE edt,const std::string &desc);
     virtual std::shared_ptr<ya_event> on_message(EVENT_TYPE et,uint64_t id,bool f)=0;
     std::shared_ptr<ya_event> create_event(const std::string&obj_id,EVENT_TYPE ev_type);
     virtual ~Event(){}
@@ -73,9 +72,9 @@ void event_tool::make_event_object()
     m_map[OT_CARD] = std::make_shared<card_event>();
 }
 
-void event_tool::handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,const std::string &desc/*=""*/)
+void event_tool::handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,EVENT_DIS_TYPE edt/*=DT_COMMON*/,const std::string &desc/*=""*/)
 {
-    m_map[ot]->handle_alarm_event(et,id,limit_value,cur_value,f,desc);
+    m_map[ot]->handle_alarm_event(et,id,limit_value,cur_value,f,edt,desc);
 }
 
 std::shared_ptr<ya_event> Event::create_event(const std::string&obj_id,EVENT_TYPE ev_type)
@@ -87,10 +86,10 @@ std::shared_ptr<ya_event> Event::create_event(const std::string&obj_id,EVENT_TYP
     return ev_ptr;
 }
 
-void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,const std::string &desc/*=""*/)
+void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,EVENT_DIS_TYPE edt,const std::string &desc)
 {
     std::shared_ptr<ya_event> ev_ptr = nullptr;
-    uint64_t eid = event_list::to_list_id(et,m_oid,id);
+    uint64_t eid = event_list::to_list_id(et,m_oid,id,edt);
     auto event_ptr = event_list::instance()->get(eid);
     if(f)
     {
@@ -115,6 +114,7 @@ void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,doub
                 ev_ptr->m_limit_value=limit_value;
                 ev_ptr->m_desc=desc;
                 ev_ptr->m_id=eid;
+                ev_ptr->m_dis_type=edt;
                 //保存告警信息
                 event_list::instance()->add(eid,ev_ptr);
             }
@@ -205,13 +205,13 @@ std::shared_ptr<ya_event> card_event::on_message(EVENT_TYPE et,uint64_t id,bool
         std::string card_id = tool_other::get_string_cardid(id);
         if(!card_ptr)
         {
-            log_info("create_event.can not find card:%s",card_id.c_str());
+            log_error("Create_event.can not find card:%s",card_id.c_str());
             return event_ptr;
         }
         event_ptr=create_event(card_id,et);
         event_ptr->x = card_ptr->x;
         event_ptr->y = card_ptr->y;
-        event_ptr->m_is_display = card_ptr->m_display;
+        //event_ptr->m_is_display = card_ptr->m_display;
 
         auto area_info_map = card_ptr->get_area_tool()->m_area_info;
         if(!area_info_map.empty())
@@ -224,10 +224,10 @@ std::shared_ptr<ya_event> card_event::on_message(EVENT_TYPE et,uint64_t id,bool
     return event_ptr;
 }
 
-std::shared_ptr<ya_event> event_list::get_event_card(uint32_t card_id, int card_type, EVENT_TYPE ev_type)
+std::shared_ptr<ya_event> event_list::get_event_card(uint32_t card_id, int card_type, EVENT_TYPE ev_type,EVENT_DIS_TYPE edt)
 {
     uint64_t id64 = tool_other::type_id_to_u64(card_type, card_id);
-    return base::get(to_list_id(ev_type, OT_CARD, id64));
+    return base::get(to_list_id(ev_type, OT_CARD, id64,edt));
 }
 
 void event_list::save_event(std::shared_ptr<ya_event> ev_ptr)
@@ -235,10 +235,10 @@ void event_list::save_event(std::shared_ptr<ya_event> ev_ptr)
     char sql[LENGTH_SQL] = {0};
     std::string _time = tool_time::to_str_ex(ev_ptr->m_cur_time);
     sprintf(sql,
-            "INSERT IGNORE INTO his_event_data(event_id,id, stat, event_type_id, obj_type_id, obj_id, \
+            "INSERT IGNORE INTO his_event_data(event_id,id, stat, event_type_id, obj_type_id, obj_id, dis_type\
             map_id, area_id, limit_value, cur_value, x, y, cur_time, description) \
-            VALUES(%ld,%ld, %d, %d, %d, %s, %d, %d, %.2f, %.2f, %f, %f, '%s', '%s');",
-            ev_ptr->get_id(),ev_ptr->m_id,ev_ptr->m_status, ev_ptr->m_ev_type, ev_ptr->m_obj_type, ev_ptr->m_obj_id.c_str(),
+            VALUES(%ld,%ld, %d, %d, %d, %s, %d, %d, %d, %.2f, %.2f, %f, %f, '%s', '%s');",
+            ev_ptr->m_ev_id,ev_ptr->m_id,ev_ptr->m_status, ev_ptr->m_ev_type, ev_ptr->m_obj_type, ev_ptr->m_obj_id.c_str(),ev_ptr->m_dis_type,
             ev_ptr->m_map_id, ev_ptr->m_area_id, ev_ptr->m_limit_value, ev_ptr->m_cur_value, ev_ptr->x, ev_ptr->y,
             _time.c_str(), ev_ptr->m_desc.c_str());
 
@@ -248,7 +248,7 @@ void event_list::save_event(std::shared_ptr<ya_event> ev_ptr)
 void event_list::load_his_data_from_db()
 {
     std::unordered_map<uint64_t, std::shared_ptr<ya_event>> map;
-    const char *sql = "SELECT event_id, id,stat,event_type_id,obj_type_id,obj_id,map_id,area_id,\
+    const char *sql = "SELECT event_id, id,stat,event_type_id,obj_type_id,obj_id,dis_type,map_id,area_id,\
             limit_value,cur_value,x,y, cur_time FROM his_event_data \
             WHERE event_id IN (SELECT MAX(event_id) FROM his_event_data \
                                WHERE cur_time > (CASE obj_type_id \
@@ -259,8 +259,9 @@ void event_list::load_his_data_from_db()
                                                  WHEN 10 THEN DATE_SUB(NOW(),INTERVAL 2 DAY) \
                                                  END) \
                                AND cur_time < NOW()\
-                               GROUP BY event_type_id, obj_id) \
-            AND  event_id NOT IN ( SELECT event_id FROM (SELECT * FROM his_event_data WHERE  stat=100) s);";
+                               GROUP BY event_type_id, obj_id,dis_type) \
+            AND  event_id NOT IN ( SELECT event_id FROM his_event_data WHERE  stat=100)\
+            AND event_type_id NOT IN (21,22);";
     std::string Error;
     YADB::CDBResultSet DBRes;
     sDBConnPool.Query(sql,DBRes,Error);
@@ -288,6 +289,9 @@ void event_list::load_his_data_from_db()
             std::string obj_id  = "";
             DBRes.GetField( "obj_id",obj_id, Error );
 
+            int dis_type  = 0;
+            DBRes.GetField( "dis_type",dis_type, Error );
+
             int map_id  = 0;
             DBRes.GetField( "map_id",map_id, Error );
 
@@ -318,6 +322,7 @@ void event_list::load_his_data_from_db()
             ev->m_ev_type = static_cast<EVENT_TYPE>(event_type_id);
 
             ev->m_obj_type = static_cast<OBJECT_TYPE>(obj_type_id);
+            ev->m_dis_type = static_cast<EVENT_DIS_TYPE>(dis_type);
             ev->m_obj_id = tool_other::to13str(obj_id);
             ev->m_cur_time = tool_time::to_time_ex(cur_time);
 
@@ -331,8 +336,8 @@ void event_list::load_his_data_from_db()
             ev->m_id = id;
             
             map.insert(std::make_pair(id, ev));
-            log_info("event_list %lld,%lld,%d,%d,%d,%s,%d,%d,%.2f,%.2f,%.2f,%.2f,%s"
-                     , ev->get_id(),ev->m_id,ev->m_status,ev->m_ev_type,ev->m_obj_type,ev->m_obj_id.c_str()
+            log_info("event_list %lld,%lld,%d,%d,%d,%s,%d,%d,%d,%.2f,%.2f,%.2f,%.2f,%s"
+                     , ev->m_ev_id,ev->m_id,ev->m_status,ev->m_ev_type,ev->m_obj_type,ev->m_obj_id.c_str(),ev->m_dis_type
                      ,ev->m_map_id,ev->m_area_id,ev->m_limit_value,ev->m_cur_value
                      ,ev->x,ev->y
                      ,tool_time::to_str_ex(ev->m_cur_time).c_str());
@@ -351,10 +356,11 @@ std::string event_list::evs_to_json(std::vector<std::shared_ptr<ya_event>> arr)
     auto it=arr.begin();
     for(;it!=arr.end();++it)
     {
-        if((*it)->m_is_display)
-        {
-            _ev_to_node(*it, allocator, data);
-        }
+        _ev_to_node(*it, allocator, data);
+       // if((*it)->m_is_display)
+       // {
+       //     _ev_to_node(*it, allocator, data);
+       // }
     }
 
     doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_EVENT, allocator);
@@ -374,13 +380,14 @@ void event_list::_ev_to_node(std::shared_ptr<ya_event> ev_ptr,
 {
     rapidjson::Value ev(rapidjson::kObjectType);
 
-    ev.AddMember(JSON_KEY_EVENT_EVENT_ID,ev_ptr->get_id(), allocator);
+    ev.AddMember(JSON_KEY_EVENT_EVENT_ID,ev_ptr->m_ev_id, allocator);
     ev.AddMember(JSON_KEY_EVENT_STATUS,ev_ptr->m_status, allocator);
 
     ev.AddMember(JSON_KEY_EVENT_TYPE_ID,ev_ptr->m_ev_type, allocator);
     ev.AddMember(JSON_KEY_EVENT_OBJ_TYPE_ID,ev_ptr->m_obj_type, allocator);
 
     tool_json::add_member(ev, JSON_KEY_EVENT_OBJ_ID, ev_ptr->m_obj_id, allocator);
+    ev.AddMember(JSON_KEY_EVENT_DIS_TYPE_ID,ev_ptr->m_dis_type, allocator);
     ev.AddMember(JSON_KEY_EVENT_MAP_ID,ev_ptr->m_map_id, allocator);
     ev.AddMember(JSON_KEY_EVENT_AREA_ID,ev_ptr->m_area_id, allocator);
     ev.AddMember(JSON_KEY_EVENT_X,ev_ptr->x, allocator);

+ 15 - 19
event.h

@@ -12,8 +12,6 @@
 #include "common.h"
 struct ya_event
 {
-private:
-    uint64_t m_ev_id;
 public:
     ya_event(uint64_t e_id):m_cur_time(std::chrono::system_clock::now())
     {
@@ -28,12 +26,14 @@ public:
         m_desc = "";
 
         m_status=ES_START;
-        m_is_display=true;
+        //m_is_display=true;
         m_is_sent=false;
     }
     ~ya_event(){}
 public:
     //key of event_list. 
+    uint64_t m_ev_id;
+
     uint64_t m_id;
     ///告警状态,开始、结束
     EVENT_STATUS m_status;
@@ -42,6 +42,7 @@ public:
     EVENT_TYPE m_ev_type;
     ///告警对象类型
     OBJECT_TYPE m_obj_type;
+    EVENT_DIS_TYPE m_dis_type;
     /// 告警对象编号,与告警对象类型对应,如告警对象类型为分站,此字段为分站编号
     std::string m_obj_id;
     ///当前时间,为告警事件的触发时间,如果状态为开始,则表示开始时间,否则为结束时间
@@ -62,7 +63,7 @@ public:
     ///描述
     std::string m_desc;
 
-    bool m_is_display;
+    //bool m_is_display;
     //是否已经发送 ture bu发送, false推送. 推送完置为true
     bool m_is_sent;
 
@@ -73,22 +74,17 @@ public:
 
     ///作为事件map列表的id,方便查找;
     uint64_t get_list_id();
-
-    uint64_t get_id()
-    {
-        return m_ev_id;
-    }
 };
 
 class Event;
 struct event_tool
 {
 	template <class UnaryPredicate>
-	void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,UnaryPredicate p,const std::string &desc="")
+	void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,UnaryPredicate p,EVENT_DIS_TYPE edt=DT_COMMON,const std::string &desc="")
 	{
-		handle_event(ot,et,id,limit_value,cur_value,p(),desc);
+		handle_event(ot,et,id,limit_value,cur_value,p(),edt,desc);
 	}
-	void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,const std::string &desc="");
+	void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f,EVENT_DIS_TYPE edt=DT_COMMON,const std::string &desc="");
 	static event_tool * instance();
 private:
     event_tool()
@@ -102,21 +98,21 @@ private:
 struct event_list:single_base<event_list,uint64_t,std::shared_ptr<ya_event>>
 {
 public:
-    static uint64_t to_list_id(EVENT_TYPE ev_type, OBJECT_TYPE obj_type,uint64_t obj_id)
+    static uint64_t to_list_id(EVENT_TYPE ev_type, OBJECT_TYPE obj_type,uint64_t obj_id,EVENT_DIS_TYPE edt)
     {
-        return (static_cast<uint64_t>(ev_type)<<48)|(static_cast<uint64_t>(obj_type)<<40)|obj_id;
+        return (static_cast<uint64_t>(edt)<<58)|(static_cast<uint64_t>(ev_type)<<48)|(static_cast<uint64_t>(obj_type)<<40)|obj_id;
     }
 
-    std::shared_ptr<ya_event> get_event_card(uint32_t card_id, int card_type, EVENT_TYPE ev_type);
+    std::shared_ptr<ya_event> get_event_card(uint32_t card_id, int card_type, EVENT_TYPE ev_type,EVENT_DIS_TYPE edt=DT_COMMON);
 
-    std::shared_ptr<ya_event> get_event_area(int32_t area_id, EVENT_TYPE ev_type)
+    std::shared_ptr<ya_event> get_event_area(int32_t area_id, EVENT_TYPE ev_type,EVENT_DIS_TYPE edt)
     {
-        return base::get(to_list_id(ev_type, OT_AREA, static_cast<uint64_t>(area_id)));
+        return base::get(to_list_id(ev_type, OT_AREA, static_cast<uint64_t>(area_id),edt));
     }
 
-    std::shared_ptr<ya_event> get_event_reader(int32_t reader_id, EVENT_TYPE ev_type)
+    std::shared_ptr<ya_event> get_event_reader(int32_t reader_id, EVENT_TYPE ev_type,EVENT_DIS_TYPE edt=DT_COMMON)
     {
-        return base::get(to_list_id(ev_type,OT_DEVICE_READER, static_cast<uint64_t>(reader_id)));
+        return base::get(to_list_id(ev_type,OT_DEVICE_READER, static_cast<uint64_t>(reader_id),edt));
     }
 
     static void save_event(std::shared_ptr<ya_event> event_ptr);

+ 8 - 98
main.cpp

@@ -20,7 +20,7 @@
 #include "mine_business.h"
 #include "main_test.h"
 #include "ya_setting.h"
-#include<atomic>
+#include "websocket/web_connect.h"
 
 config_file config;
 void handlereader(uint32_t readerid,bool duration,uint32_t t)
@@ -39,98 +39,6 @@ void Handle_ThreeRates_Event_Callback(const int evType, const int evId, uint64_t
     event_tool::instance()->handle_event((OBJECT_TYPE)evType,(EVENT_TYPE)evId,id,limitVal,curVal,bFalg);
 }
 
-#define BEATHEART_COUNT_NUM 1000
-std::atomic<int> beatheart_count;
-void web_beatheart( int ID, std::string const& name,
-                    sio::message::ptr const& data, bool need_ack, sio::message::list &ack_resp )
-{
-    beatheart_count=BEATHEART_COUNT_NUM;
-}
-
-void web_init(const std::vector<std::string>&uri_list,int32_t st)
-{
-    std::map<std::string, YA::MSG_HANDLE_FUNC_TYPE> MsgFuncList;
-
-    module_mgr::init(config, MsgFuncList);
-
-    MsgFuncList.insert( std::make_pair( "beatheart", web_beatheart ) );
-
-    swsClientMgr.Build( uri_list, MsgFuncList );
-
-    //init thread...
-    YA::_THREAD_CONFIG_ Config;
-    Config.SendInterval = st;
-    swsTimerThrd.Init( Config );
-}
-
-bool web_connect()
-{
-    //连接服务器
-    if ( swsClientMgr.connect() != 0 )
-    {
-        log_error("web socket 连接失败....");
-        std_error("websocket 连接失败....");
-        return false;
-    }
-    //登录
-    swsClientMgr.login();
-
-    swsTimerThrd.Start();
-
-    return true;
-}
-
-void web_close()
-{
-    swsTimerThrd.Stop();
-    swsClientMgr.close();
-}
-
-void web_beatheart_thread()
-{
-    while (true)
-    {
-        std::this_thread::sleep_for(std::chrono::seconds(5));
-        if(beatheart_count==0)//一次都没收到web的心跳信号
-        {
-            log_info("没有收到web心跳信号");
-            continue;
-        }
-
-        if(beatheart_count==BEATHEART_COUNT_NUM)
-        {
-            beatheart_count++;
-            log_info("接收到web心跳信号");
-            continue;
-        }
-
-        beatheart_count=0;
-
-        web_close();
-        std::this_thread::sleep_for(std::chrono::seconds(10));
-        log_error("web连接异常中断, 开始重连web(第一次)");
-        if(web_connect())
-        {
-            log_info("重连web ok");
-            std::this_thread::sleep_for(std::chrono::seconds(10));
-            continue;
-        }
-
-        web_close();
-        std::this_thread::sleep_for(std::chrono::seconds(60));
-        log_error("web连接异常中断, 开始重连web(第二次)");
-        if(web_connect())
-        {
-            log_info("重连web ok");
-            std::this_thread::sleep_for(std::chrono::seconds(10));
-            continue;
-        }
-
-        log_error("web连接异常中断, 重连web失败,关闭采集主程序");
-        exit(0);
-    }
-}
-
 struct Init_Setting
 {
     void init()
@@ -207,9 +115,12 @@ struct Init_Setting
 
     bool wsClientMgr_init(const std::vector<std::string>&uri_list,int32_t st)
     {
-        web_init(uri_list, st);
+        std::map<std::string, YA::MSG_HANDLE_FUNC_TYPE> MsgFuncList;
+        module_mgr::init(config, MsgFuncList);
+
+        web_connect::init(uri_list, st, MsgFuncList);
 
-        return web_connect();
+        return web_connect::connect();
     }
 };
 
@@ -217,7 +128,7 @@ struct Init_Setting
 void cleanup()
 {
     module_mgr::stop();
-    swsTimerThrd.Stop();
+    web_connect::close();
 }
 
 void usage(char ** argv)
@@ -261,8 +172,7 @@ int main(int argc ,char * argv[])
 //	test_find_path(point(4600,-75),point(4727,-90));
 
     module_mgr::start();
-    auto th = std::thread(web_beatheart_thread);
-    th.detach();
+    web_connect::start_beatheart_monitor();
     atexit(&cleanup);
 
     net_service mh;

+ 3 - 3
mine_business.cpp

@@ -560,7 +560,7 @@ void rear_end_collision_prevented_business::handle_message()
         {
             log_info("vehicle_alarm_time_ %s",vvid.c_str());
             if (vinfo.is_alarm){
-                event_tool::instance()->handle_event(OT_CARD,ET_VEHICLE_REAR_END,id,0,0,false,vvid);
+                event_tool::instance()->handle_event(OT_CARD,ET_VEHICLE_REAR_END,id,0,0,false,DT_COMMON,vvid);
             }
             it_cv = m_CloserVehicle.erase(it_cv);
             continue;
@@ -581,7 +581,7 @@ void rear_end_collision_prevented_business::handle_message()
             {
                 log_info("vehicle_alarm_backfired_timeout %s",vvid.c_str());
                 if(vinfo.is_alarm){
-                    event_tool::instance()->handle_event(OT_CARD,ET_VEHICLE_REAR_END,id,CYaSetting::m_sys_setting.rear_end_d,dis,false,vvid);
+                    event_tool::instance()->handle_event(OT_CARD,ET_VEHICLE_REAR_END,id,CYaSetting::m_sys_setting.rear_end_d,dis,false,DT_COMMON,vvid);
                 }
                 it_cv = m_CloserVehicle.erase(it_cv);
                 continue;
@@ -598,7 +598,7 @@ void rear_end_collision_prevented_business::handle_message()
                 if (!vinfo.is_alarm)
                 {
                     log_info("vehicle_alarm_real_end_timeout_exec %s",vvid.c_str());
-                    event_tool::instance()->handle_event(OT_CARD,ET_VEHICLE_REAR_END,id,CYaSetting::m_sys_setting.rear_end_d,dis,true,vvid);
+                    event_tool::instance()->handle_event(OT_CARD,ET_VEHICLE_REAR_END,id,CYaSetting::m_sys_setting.rear_end_d,dis,true,DT_COMMON,vvid);
                     vinfo.is_alarm = true;
                 }
             }

+ 75 - 59
module_service/area_business_count_checker.cpp

@@ -11,31 +11,35 @@
 	整个井下的超员和某个区域的超员都使用这个代码
 */
 
+static void check_event(bool &event_flag,EVENT_TYPE et,EVENT_DIS_TYPE edt,int id)
+{
+    if(!event_flag)
+    {
+        auto ev_p = event_list::instance()->get_event_area(id,et,edt);
+        if (ev_p && !ev_p->is_end())
+            event_flag = true;
+    }
+}
+
 //服务器重启加载数据
 void area_business_count_checker::on_load_his(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
 {
     if (nullptr == a->m_area )
         return ;
-    if (c->is_person() && !a->m_area->m_event_person_count)
+    if (c->is_person())
     {
         EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
-        auto ev_ptr_temp = event_list::instance()->get_event_area(a->m_area->id(),ev);
-        if (ev_ptr_temp && !ev_ptr_temp->is_end())
-            a->m_area->m_event_person_count = true;
-
+        check_event(a->m_area->m_event_person_count,ev,DT_NORMAL,a->m_area->id());
+        check_event(a->m_area->m_event_person_show_count,ev,DT_SPECIAL,a->m_area->id());
     }
-    else if (c->is_vehicle() && !a->m_area->m_event_vehicle_count)
+    else if (c->is_vehicle())
     {
         EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
-        auto ev_ptr_temp = event_list::instance()->get_event_area(a->m_area->id(),ev);
-        if (ev_ptr_temp && !ev_ptr_temp->is_end())
-        {
-            a->m_area->m_event_vehicle_count = true;
-        }
+        check_event(a->m_area->m_event_vehicle_count,ev,DT_NORMAL,a->m_area->id());
+        check_event(a->m_area->m_event_vehicle_show_count,ev,DT_SPECIAL,a->m_area->id());
     }
     on_enter(a,c,ptr);
 }
-
 //增加计数,并进行判断
 void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
                                            const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
@@ -45,32 +49,42 @@ void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
 	if (c->is_person())
 	{
 		a->m_area->m_person_count ++ ;
+        if(c->m_display)
+		    a->m_area->m_person_show_count ++ ;
         int pc=a->m_area->m_person_count.load();
-		if (pc > a->m_area->m_limit_person_count)
-		{
-			a->m_area->m_event_person_count = true;
-			EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
-			event_tool::instance()->handle_event(OT_AREA,ev,a->m_area->id(),a->m_area->m_limit_person_count,pc,true);
-			log_info("area_business_count_checker::on_enter : Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
-					,ev,a->m_area->id(),a->m_area->m_limit_person_count,pc);
-		}
+        int pc_=a->m_area->m_person_show_count.load();
+        int limit_val=a->m_area->m_limit_person_count;
+        int aid=a->m_area->id();
+	    EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
+        if(pc>limit_val){
+		    event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc,a->m_area->m_event_person_count=true,DT_NORMAL);
+		    log_info("person_count_enter:%d,v_count:%d limit:%d",aid,pc,limit_val);
+        }
+        if(pc_>limit_val){
+		    event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc_,a->m_area->m_event_person_show_count=true,DT_SPECIAL);
+		    log_info("person_count_enter_show:%d,v_count:%d limit:%d",aid,pc,limit_val);
+        }
 	}
 	else if (c->is_vehicle())
 	{
 		a->m_area->m_vehicle_count ++ ;
+        if(c->m_display)
+		    a->m_area->m_vehicle_show_count ++ ;
         int vc=a->m_area->m_vehicle_count.load();
-		log_info("area_id:%d,v_count:%d",a->m_area->m_id,vc);
-		if (vc > a->m_area->m_limit_vehicle_count)
-		{
-			a->m_area->m_event_vehicle_count = true;
-			EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
-			event_tool::instance()->handle_event(OT_AREA,ev,a->m_area->id(),a->m_area->m_limit_vehicle_count,vc,true);
-			log_info("area_business_count_checker::on_enter : Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
-					,ev,a->m_area->id(),a->m_area->m_limit_vehicle_count,vc);
-		}
+        int vc_=a->m_area->m_vehicle_show_count.load();
+        int limit_val=a->m_area->m_limit_vehicle_count;
+        int aid=a->m_area->id();
+		EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
+        if(vc>limit_val){
+		    event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,vc,a->m_area->m_event_vehicle_count=true,DT_NORMAL);
+		    log_info("vehicle_count_enter:%d,v_count:%d limit:%d",aid,vc,limit_val);
+        }
+        if(vc_>limit_val){
+		    event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,vc_,a->m_area->m_event_vehicle_show_count=true,DT_SPECIAL);
+		    log_info("vehicle_count_enter_show:%d,v_count:%d limit:%d",aid,vc,limit_val);
+        }
 	}
 }
-
 void area_business_count_checker::on_hover(const std::shared_ptr<area_hover>&a,
                                            const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
@@ -81,42 +95,44 @@ void area_business_count_checker::on_leave(const std::shared_ptr<area_hover>&a,
                                            const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
 	if (nullptr == a->m_area )
-	{
 		return ;
-	}
-	int limitVal = 0;
-	int curVal = 0;
-	bool tmp_event = false;
-	EVENT_TYPE ev = EVENT_TYPE::ET_OVER_COUNT_PERSON;
 	if (c->is_person())
 	{
 		a->m_area->m_person_count -- ;
-		limitVal = a->m_area->m_limit_person_count;
-		curVal = a->m_area->m_person_count.load();
-		tmp_event = a->m_area->m_event_person_count;
-		ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
-		if(tmp_event && curVal <= limitVal)
-		{
-			a->m_area->m_event_person_count = false;
-			log_info("area_business_count_checker::on_leave :Cancel Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
-					,ev,a->m_area->id(),limitVal,curVal);
-			event_tool::instance()->handle_event(OT_AREA,ev,a->m_area->id(),limitVal,curVal,false);
-		}
+        if(c->m_display)
+		    a->m_area->m_person_show_count -- ;
+        int pc=a->m_area->m_person_count.load();
+        int pc_=a->m_area->m_person_show_count.load();
+        int limit_val=a->m_area->m_limit_person_count;
+        int aid=a->m_area->id();
+	    EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
+		if(a->m_area->m_event_person_count&& pc <= limit_val){
+			event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc,a->m_area->m_event_person_count=false,DT_NORMAL);
+		    log_info("person_count_leave:%d,v_count:%d limit:%d",aid,pc,limit_val);
+        }
+		if(a->m_area->m_event_person_show_count&& pc_ <= limit_val){
+			event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc_,a->m_area->m_event_person_show_count=false,DT_SPECIAL);
+		    log_info("person_count_leave_show:%d,v_count:%d limit:%d",aid,pc,limit_val);
+        }
 	}
 	else if (c->is_vehicle())
 	{
-		a->m_area->m_vehicle_count -- ;
-		limitVal = a->m_area->m_limit_vehicle_count;
-		curVal = a->m_area->m_vehicle_count.load();
-		tmp_event = a->m_area->m_event_vehicle_count;
-		ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
-		if(tmp_event && curVal <= limitVal)
-		{
-			a->m_area->m_event_vehicle_count = false;
-			log_info("area_business_count_checker::on_leave :Cancel Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
-					,ev,a->m_area->id(),limitVal,curVal);
-			event_tool::instance()->handle_event(OT_AREA,ev,a->m_area->id(),limitVal,curVal,false);
-		}
+        a->m_area->m_vehicle_count -- ;
+        if(c->m_display)
+		    a->m_area->m_vehicle_show_count -- ;
+        int pc=a->m_area->m_vehicle_count.load();
+        int pc_=a->m_area->m_vehicle_show_count.load();
+        int limit_val=a->m_area->m_limit_vehicle_count;
+        int aid=a->m_area->id();
+		EVENT_TYPE ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
+		if(a->m_area->m_event_vehicle_count&& pc <= limit_val){
+			event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc,a->m_area->m_event_vehicle_count=false,DT_NORMAL);
+		    log_info("vehicle_count_leave:%d,v_count:%d limit:%d",aid,pc,limit_val);
+        }
+		if(a->m_area->m_event_vehicle_show_count&& pc_ <= limit_val){
+			event_tool::instance()->handle_event(OT_AREA,ev,aid,limit_val,pc_,a->m_area->m_event_vehicle_show_count=false,DT_SPECIAL);
+		    log_info("vehicle_count_leave_show:%d,v_count:%d limit:%d",aid,pc,limit_val);
+        }
 	}
 }
 

+ 1 - 1
module_service/area_business_geofault.cpp

@@ -58,7 +58,7 @@ void area_business_geofault::on_enter(const std::shared_ptr<area_hover>&area_hov
         ptr_temp->m_far_geofault_count++;
     }
 
-    auto ev_ptr_temp = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ET_VEHICLE_NEAR_GEOFAULT);
+    auto ev_ptr_temp = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ET_VEHICLE_NEAR_GEOFAULT,DT_COMMON);
     ptr_temp->m_is_warning = (nullptr != ev_ptr_temp && !ev_ptr_temp->is_end());
 }
 

+ 19 - 9
module_service/area_business_motionless_persion.cpp

@@ -1,5 +1,6 @@
 #include"area_business_motionless_persion.h"
 
+#include<chrono>
 
 #include"common_tool.h"
 #include"log.h"
@@ -10,21 +11,19 @@
 #include"card.h"
 #include"config_file.h"
 
-
 struct motionless_data:business_data
 {
     motionless_data()
-        :m_acc_0count(0)
+        :m_acc_start_time(0)
+        ,m_acc_0count(0)
         ,m_is_warning(false)
     {
-        //        m_acc_0count=0;
-        //        m_acc_start_time=0;
     }
 
     ///;检测到多少次之后定位完全静止
     //   std::atomic<int> m_acc_0count;
-    //    ///检测到多久之后告警
-    //    time_t m_acc_start_time;
+    ///检测到多久之后告警
+    time_t m_acc_start_time;
 
     int m_acc_0count; //连续静止数量
     bool m_is_warning;  //
@@ -34,7 +33,7 @@ void area_business_motionless_persion::init(config_file& config)
 {
     //       sleep_ms = std::stoi(config.get("service.motionless_thread_sleep_ms","5000"));
     _acc_0count_limit = std::stoi(config.get("service.motionless_acc_0count_limit","40"));
-    //        _acc_seconds_limit = std::stoi(config.get("service.motionless_acc_seconds_limit","120"));
+    _acc_seconds_limit = std::stoi(config.get("service.motionless_acc_seconds_limit","120"));
 }
 
 void area_business_motionless_persion::on_load_his(const std::shared_ptr<area_hover>&area_hover_ptr,
@@ -54,7 +53,7 @@ void area_business_motionless_persion::on_enter(const std::shared_ptr<area_hover
     auto ptr_temp = std::make_shared<motionless_data>();
     ptr = ptr_temp;
 
-    auto ev_ptr_temp = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ET_CARD_MOTIONLESS);
+    auto ev_ptr_temp = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ET_CARD_MOTIONLESS,DT_COMMON);
     ptr_temp->m_is_warning = (nullptr != ev_ptr_temp && !ev_ptr_temp->is_end());
 }
 
@@ -81,12 +80,18 @@ void area_business_motionless_persion::on_hover(const std::shared_ptr<area_hover
     else
     {
         ptr_temp->m_acc_0count=0;
+        ptr_temp->m_acc_start_time = 0;
     }
 
     if(ptr_temp->m_acc_0count >= _acc_0count_limit)
     {
         ptr_temp->m_acc_0count = _acc_0count_limit;
-        if(!ptr_temp->m_is_warning)
+        if(ptr_temp->m_acc_start_time == 0)
+        {
+            time(&ptr_temp->m_acc_start_time);
+        }
+        if(!ptr_temp->m_is_warning
+                && tool_time::elapse_seconds(ptr_temp->m_acc_start_time) >= _acc_seconds_limit)
         {
             ptr_temp->m_is_warning = true;
             uint64_t id = tool_other::type_id_to_u64(card_ptr->m_type, card_ptr->m_id);
@@ -98,6 +103,9 @@ void area_business_motionless_persion::on_hover(const std::shared_ptr<area_hover
         if(ptr_temp->m_is_warning)
         {
             ptr_temp->m_is_warning = false;
+
+            ptr_temp->m_acc_start_time = 0;
+
             uint64_t id = tool_other::type_id_to_u64(card_ptr->m_type, card_ptr->m_id);
             event_tool::instance()->handle_event(OT_CARD, ET_CARD_MOTIONLESS, id, 0, 0, false);
         }
@@ -127,6 +135,8 @@ void area_business_motionless_persion::on_leave(const std::shared_ptr<area_hover
 }
 
 int area_business_motionless_persion::_acc_0count_limit=20;
+int area_business_motionless_persion::_acc_seconds_limit=120;
+
 
 //void module_motionless_persion::deal_alarm(std::shared_ptr<card_location_base>& card_ptr)
 //{

+ 1 - 0
module_service/area_business_motionless_persion.h

@@ -39,6 +39,7 @@ class area_business_motionless_persion : public area_business// : public i_threa
     //    void deal_alarm(std::shared_ptr<card_location_base>& card_ptr);
 private:
     static int _acc_0count_limit;
+    static int _acc_seconds_limit;
 
 public:
     static void init(config_file& config);

+ 1 - 1
module_service/area_business_person_dwell_checker.cpp

@@ -12,7 +12,7 @@ void area_business_person_dwell_checker::on_load_his(const std::shared_ptr<area_
     if(!c->is_person())
       return;
     EVENT_TYPE evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
-    auto ev_ptr_temp = event_list::instance()->get_event_card(c->m_id,c->m_type,evType);
+    auto ev_ptr_temp = event_list::instance()->get_event_card(c->m_id,c->m_type,evType,DT_COMMON);
     if (ev_ptr_temp && !ev_ptr_temp->is_end())
         c->set_event_flag(evType);
 }

+ 1 - 1
module_service/area_business_speed_checker.cpp

@@ -32,7 +32,7 @@ void area_business_speed_checker::on_load_his(const std::shared_ptr<area_hover>&
     on_enter(area_hover_ptr, card_ptr, ptr);
 
     EVENT_TYPE ev_type =area_hover_ptr->m_area->is_mine()?ET_CARD_OVER_SPEED: ET_CARD_AREA_OVER_SPEED;
-    auto ev_ptr_temp = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ev_type);
+    auto ev_ptr_temp = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ev_type,DT_COMMON);
     auto ptr_temp = std::dynamic_pointer_cast<over_speed_data>(ptr);
     ptr_temp->m_is_warning = (ev_ptr_temp && !ev_ptr_temp->is_end());
     if(ptr_temp->m_is_warning)

+ 3 - 2
module_service/module_call_help.cpp

@@ -43,7 +43,7 @@ void module_call_help::accept_web_deal_help(sio::message::ptr const& data)
     {
         log_info("处理呼救,card_id=%d, type=%d,  ev_id=%d", id, type, ev_id);
 
-        auto ev_ptr = event_list::instance()->get_event_card(id, type, ET_CARD_HELP);
+        auto ev_ptr = event_list::instance()->get_event_card(id, type, ET_CARD_HELP,DT_COMMON);
         if(ev_ptr && ES_DEAL_HELP != ev_ptr->m_status)
         {
             ev_ptr->m_status = ES_DEAL_HELP;
@@ -70,7 +70,8 @@ std::string module_call_help::get_json_help()
     auto it_ev=tmp.begin();
     for(;it_ev!=tmp.end();++it_ev)
     {
-        if(!it_ev->second->m_is_display || ET_CARD_HELP != it_ev->second->m_ev_type)
+        //if(!it_ev->second->m_is_display || ET_CARD_HELP != it_ev->second->m_ev_type)
+        if(ET_CARD_HELP != it_ev->second->m_ev_type)
         {
             continue;
         }

+ 1 - 1
websocket/Makefile.am

@@ -7,7 +7,7 @@ CXXFLAGS=-g
 AM_CPPFLAGS=-Wall -pthread -m64 -std=c++11  -I${prefix}/include -I. -I.. -I./sio
 AM_LDFLAGS =-Wall -pthread -m64 -std=c++11  -L${prefix}/lib  
 
-libwebsocket_a_SOURCES= jsonBuilder.cpp wsClient.cpp wsClientMgr.cpp wsTimerThread.cpp \
+libwebsocket_a_SOURCES= web_connect.cpp jsonBuilder.cpp wsClient.cpp wsClientMgr.cpp wsTimerThread.cpp \
 					 sio/sio_client.cpp sio/sio_socket.cpp  \
 					 sio/internal/sio_client_impl.cpp sio/internal/sio_packet.cpp
 

+ 2 - 1
websocket/constdef.h

@@ -142,6 +142,7 @@
 #define JSON_KEY_EVENT_TYPE_ID "type_id"
 #define JSON_KEY_EVENT_OBJ_TYPE_ID "obj_type_id"
 #define JSON_KEY_EVENT_OBJ_ID "obj_id"
+#define JSON_KEY_EVENT_DIS_TYPE_ID "dis_type_id"
 #define JSON_KEY_EVENT_MAP_ID "map_id"
 #define JSON_KEY_EVENT_AREA_ID "area_id"
 #define JSON_KEY_EVENT_X "x"
@@ -190,4 +191,4 @@
 #define JSON_CMD_REQ_ALL_PERSON_ON_CAR "req_all_person_on_car"
 #define JSON_CMD_RESP_ALL_PERSON_ON_CAR "resp_all_person_on_car"
 
-#endif // !_SERVER_CONST_DEF_H_
+#endif // !_SERVER_CONST_DEF_H_

+ 4 - 4
websocket/jsonBuilder.cpp

@@ -434,10 +434,10 @@ namespace YA
 		for ( mit_card = CardPosList.begin(); mit_card != CardPosList.end(); mit_card++ )
 		{
 			//不显示的卡不往前端推送
-			if ( !mit_card->second.display )
-			{
-				continue;
-			}
+			//if ( !mit_card->second.display )
+			//{
+			//	continue;
+			//}
 
 			rapidjson::Value DetailItem;
 			if ( !__BuildDetail( mit_card->second, Allocator, DetailItem ) )

+ 104 - 0
websocket/web_connect.cpp

@@ -0,0 +1,104 @@
+#include "web_connect.h"
+
+#include<thread>
+#include<chrono>
+
+#include"log.h"
+#include"wsClientMgr.h"
+#include"wsTimerThread.h"
+
+#define BEATHEART_COUNT_NUM 1000
+
+web_connect::web_connect()
+{
+}
+
+std::atomic<int> web_connect::_beatheart_count;
+
+void web_connect::init(const std::vector<std::string>&uri_list,int32_t st, std::map<std::string, YA::MSG_HANDLE_FUNC_TYPE>& MsgFuncList)
+{
+    MsgFuncList.insert( std::make_pair( "beatheart", &web_connect::_beatheart_callback ) );
+
+    swsClientMgr.Build( uri_list, MsgFuncList );
+
+    //init thread...
+    YA::_THREAD_CONFIG_ Config;
+    Config.SendInterval = st;
+    swsTimerThrd.Init( Config );
+}
+
+void web_connect::start_beatheart_monitor()
+{
+    auto th = std::thread(&web_connect::_beatheart_thread);
+    th.detach();
+}
+
+void web_connect::close()
+{
+    swsTimerThrd.Stop();
+    swsClientMgr.close();
+}
+
+bool web_connect::connect()
+{
+    //连接服务器
+    if ( swsClientMgr.connect() != 0 )
+    {
+        log_error("web socket 连接失败....");
+        std_error("websocket 连接失败....");
+        return false;
+    }
+    //登录
+    swsClientMgr.login();
+
+    swsTimerThrd.Start();
+
+    return true;
+}
+
+void web_connect::_beatheart_callback( int ID, std::string const& name,
+                    sio::message::ptr const& data, bool need_ack, sio::message::list &ack_resp )
+{
+    _beatheart_count=BEATHEART_COUNT_NUM;
+}
+
+void web_connect::_beatheart_thread()
+{
+    while (true)
+    {
+        std::this_thread::sleep_for(std::chrono::seconds(3));
+        if(_beatheart_count==0)//一次都没收到web的心跳信号
+        {
+            log_info("没有收到web心跳信号");
+            continue;
+        }
+
+        if(_beatheart_count==BEATHEART_COUNT_NUM)
+        {
+            _beatheart_count++;
+            log_info("接收到web心跳信号");
+            continue;
+        }
+
+        _beatheart_count=0;
+
+        int count=0;
+        while (true)
+        {
+            count++;
+            if(count>=10000)
+            {
+                count=10000;
+            }
+
+            close();
+            log_error("web连接异常中断, 开始重连web(第%d次)", count);
+            std::this_thread::sleep_for(std::chrono::seconds(2));
+            if(connect())
+            {
+                log_info("重连web ok");
+                break;
+            }
+        }
+    }
+}

+ 34 - 0
websocket/web_connect.h

@@ -0,0 +1,34 @@
+#ifndef WEB_CONNECT_H
+#define WEB_CONNECT_H
+
+#include<atomic>
+#include<vector>
+#include<string>
+#include<memory>
+
+#include"sio_message.h"
+#include"wsClient.h"
+
+class web_connect
+{
+public:
+    web_connect();
+
+    static void init(const std::vector<std::string>&uri_list,int32_t st, std::map<std::string, YA::MSG_HANDLE_FUNC_TYPE>& MsgFuncList);
+
+    static void start_beatheart_monitor();
+
+    static bool connect();
+
+    static void close();
+
+private:
+    static void _beatheart_callback( int ID, std::string const& name,
+                           sio::message::ptr const& data, bool need_ack, sio::message::list &ack_resp );
+
+    static void _beatheart_thread();
+
+    static std::atomic<int> _beatheart_count;
+};
+
+#endif // WEB_CONNECT_H