2025-06-27 16:33:41 +08:00
|
|
|
|
#ifndef CLIENT_H
|
|
|
|
|
|
#define CLIENT_H
|
|
|
|
|
|
|
2025-06-13 11:29:59 +08:00
|
|
|
|
#include <uv.h>
|
2025-06-24 10:33:31 +08:00
|
|
|
|
#include <string>
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
#include <memory>
|
2025-06-24 18:40:10 +08:00
|
|
|
|
#include <unordered_map>
|
|
|
|
|
|
#include <mutex>
|
2025-07-03 11:13:16 +08:00
|
|
|
|
#include <queue>
|
|
|
|
|
|
#include "dealMsg.h"
|
|
|
|
|
|
#include "PQSMsg.h"
|
2025-06-24 10:33:31 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ṹ
|
|
|
|
|
|
struct PointInfo {
|
|
|
|
|
|
std::string point_id; // <20><><EFBFBD><EFBFBD>ID
|
|
|
|
|
|
std::string name; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::string device_id; // <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>ID
|
2025-07-03 11:13:16 +08:00
|
|
|
|
ushort nCpuNo; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1-6
|
2025-06-24 10:33:31 +08:00
|
|
|
|
double PT1; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>1
|
|
|
|
|
|
double PT2; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>2
|
|
|
|
|
|
double CT1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
|
|
|
|
|
|
double CT2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2
|
2025-07-25 10:47:50 +08:00
|
|
|
|
std::string strScale; // <20><>ѹ<EFBFBD>ȼ<EFBFBD>
|
|
|
|
|
|
int nPTType; // <20><><EFBFBD>߷<EFBFBD>ʽ 0-<2D><><EFBFBD><EFBFBD> 1-<2D><><EFBFBD><EFBFBD>
|
2025-06-24 10:33:31 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// װ<><D7B0><EFBFBD><EFBFBD>Ϣ<EFBFBD>ṹ
|
|
|
|
|
|
struct DeviceInfo {
|
|
|
|
|
|
std::string device_id; // װ<><D7B0>ID
|
|
|
|
|
|
std::string name; // װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::string model; // װ<><D7B0><EFBFBD>ͺ<EFBFBD>
|
|
|
|
|
|
std::string mac; // װ<><D7B0>MAC<41><43>ַ
|
|
|
|
|
|
int status; // <20><><EFBFBD><EFBFBD>״̬ (0: <20><><EFBFBD><EFBFBD>, 1: <20><><EFBFBD><EFBFBD>)
|
|
|
|
|
|
std::vector<PointInfo> points; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-09-03 08:49:38 +08:00
|
|
|
|
bool righttime; //<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
2025-06-24 10:33:31 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
enum class ConnectionState {
|
|
|
|
|
|
DISCONNECTED,
|
|
|
|
|
|
CONNECTING,
|
|
|
|
|
|
CONNECTED
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
// <20><><EFBFBD>ӵ<EFBFBD>״̬ö<CCAC><C3B6>
|
|
|
|
|
|
enum class DeviceState {
|
2025-08-05 15:41:04 +08:00
|
|
|
|
IDLE, // <20><><EFBFBD><EFBFBD>״̬
|
|
|
|
|
|
READING_STATS, // <20><>ȡͳ<C8A1><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
READING_STATS_TIME, // <20><>ȡͳ<C8A1><CDB3>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
READING_REALSTAT, // <20><>ȡʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
|
|
|
|
|
READING_EVENTFILE, // <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
READING_FILEMENU, // <20><>ȡ<EFBFBD>ļ<EFBFBD>Ŀ¼
|
|
|
|
|
|
READING_FILEDATA, // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
READING_FIXEDVALUE, // <20><>ȡ<EFBFBD><C8A1><EFBFBD>㶨ֵ
|
|
|
|
|
|
READING_FIXEDVALUEDES, // <20><>ȡ<EFBFBD><C8A1><EFBFBD>㶨ֵ<E3B6A8><D6B5><EFBFBD><EFBFBD>
|
|
|
|
|
|
SET_FIXEDVALUE, // <20><><EFBFBD>ò<EFBFBD><C3B2>㶨ֵ
|
|
|
|
|
|
READING_INTERFIXEDVALUE, // <20><>ȡ<EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ
|
|
|
|
|
|
READING_INTERFIXEDVALUEDES, // <20><>ȡ<EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
|
|
|
|
|
|
READING_CONTROLWORD, // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
SET_INTERFIXEDVALUE, // <20><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ
|
2025-09-03 08:49:38 +08:00
|
|
|
|
READING_RUNNINGINFORMATION_1,// <20><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
READING_RUNNINGINFORMATION_2,// <20><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(<28><>ʱִ<CAB1><D6B4>)
|
|
|
|
|
|
READING_DEVVERSION, // <20><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
2025-09-04 15:37:26 +08:00
|
|
|
|
SET_RIGHTTIME, // <20><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD>ʱ
|
2025-09-08 14:37:39 +08:00
|
|
|
|
READING_EVENTLOG, // <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
|
2025-07-03 11:13:16 +08:00
|
|
|
|
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD>״̬
|
|
|
|
|
|
CUSTOM_ACTION // <20>Զ<EFBFBD><D4B6>嶯<EFBFBD><E5B6AF>
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9>
|
|
|
|
|
|
struct StateAction {
|
|
|
|
|
|
DeviceState state;
|
|
|
|
|
|
std::vector<unsigned char> packet; // <20><>״̬<D7B4><CCAC>Ҫ<EFBFBD><D2AA><EFBFBD>͵ı<CDB5><C4B1><EFBFBD>
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2025-06-24 10:33:31 +08:00
|
|
|
|
class ClientContext {
|
|
|
|
|
|
public:
|
|
|
|
|
|
uv_loop_t* loop;
|
|
|
|
|
|
uv_tcp_t client;
|
|
|
|
|
|
uv_timer_t timer;
|
|
|
|
|
|
uv_timer_t reconnect_timer;
|
|
|
|
|
|
ConnectionState state;
|
|
|
|
|
|
int reconnect_attempts;
|
|
|
|
|
|
volatile bool shutdown;
|
2025-07-09 10:03:37 +08:00
|
|
|
|
uint64_t last_state_query_time_ = 0; // ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD>
|
|
|
|
|
|
uint64_t real_state_query_time_ = 0; // ʵʱ<CAB5><CAB1><EFBFBD>ݼ<EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::atomic<int> real_state_count{ 0 };//ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD> ԭ<>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD>̰߳<DFB3>ȫ
|
|
|
|
|
|
std::atomic<ushort> real_point_id_{ 1 }; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>ԭ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>
|
2025-09-03 08:49:38 +08:00
|
|
|
|
uint64_t read_runninginformationMsg = 0; // װ<>ö<EFBFBD>ʱ<EFBFBD><CAB1>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣʱ<CFA2><CAB1><EFBFBD><EFBFBD>
|
2025-09-04 15:37:26 +08:00
|
|
|
|
uint64_t right_time = 0; // װ<>ö<EFBFBD>ʱ<EFBFBD><CAB1>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD>
|
2025-07-10 10:32:29 +08:00
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
DeviceInfo device_info; // װ<><D7B0><EFBFBD><EFBFBD>Ϣ
|
2025-09-04 15:37:26 +08:00
|
|
|
|
int cloudstatus = 0; // <20><>ǰ<EFBFBD>õ<EFBFBD>¼״̬<D7B4><CCAC>0<EFBFBD><30>δ<EFBFBD><CEB4>¼ 1<><31><EFBFBD>ѵ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ĭ<EFBFBD><C4AC>Ϊ0
|
|
|
|
|
|
uint64_t get_cloudmessage_time = 0;//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
uint64_t login_cloud_time = 0;//װ<>õ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ij<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
std::string dev_CloudProtocolVer = "V1.0";//װ<><D7B0><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD>汾<EFBFBD><E6B1BE> <20><><EFBFBD><EFBFBD>V1.5<EFBFBD><EFBFBD>װ<EFBFBD>õ<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡһ<EFBFBD>Σ<EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж϶<EFBFBD>ʱ<EFBFBD>汾<EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ΪV1.0
|
2025-07-03 11:13:16 +08:00
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա
|
|
|
|
|
|
DeviceState current_state_; // <20><>ǰװ<C7B0><D7B0>״̬
|
|
|
|
|
|
uint64_t state_start_time_; // ״̬<D7B4><CCAC>ʼʱ<CABC><CAB1>(ms)
|
|
|
|
|
|
std::queue<StateAction> action_queue_; // ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::mutex state_mutex_; // ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<unsigned char> current_packet_; // <20><>ǰ״̬<D7B4><CCAC>Ҫ<EFBFBD><D2AA><EFBFBD>͵ı<CDB5><C4B1><EFBFBD>
|
2025-06-24 10:33:31 +08:00
|
|
|
|
|
|
|
|
|
|
ClientContext(uv_loop_t* loop, const DeviceInfo& device, int index);
|
|
|
|
|
|
~ClientContext();
|
|
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
void init_tcp();//<2F><>ʼ<EFBFBD><CABC><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void start_timer();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧװ<D3A6>ü<EFBFBD>ʱ<EFBFBD><CAB1> 5<><35>ִ<EFBFBD><D6B4>һ<EFBFBD><D2BB>
|
|
|
|
|
|
void start_reconnect_timer(int delay);//<2F><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
|
|
|
|
|
|
void stop_timers();//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
void close_handles();//<2F>رտͻ<D5BF><CDBB>˸<EFBFBD><CBB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>붨ʱ<EBB6A8><CAB1>
|
|
|
|
|
|
void append_and_process_data(const char* data, size_t len);//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>뻺<EFBFBD><EBBBBA>
|
|
|
|
|
|
void put_packet_into_queue(const std::vector<unsigned char>& packet);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
void change_state(DeviceState new_state, const std::vector<unsigned char>& packet = {});//<2F>ı<EFBFBD>װ<EFBFBD><D7B0>״̬<D7B4>͵<EFBFBD>ǰ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD>
|
|
|
|
|
|
void add_action(DeviceState state, const std::vector<unsigned char>& packet = {});//<2F><><EFBFBD>Ӻ<EFBFBD><D3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void check_state_timeout();//װ<><D7B0>״̬<D7B4><CCAC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
|
|
|
|
|
void process_next_action();//װ<><D7B0>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>
|
|
|
|
|
|
void send_current_packet();//<2F><><EFBFBD>͵<EFBFBD>ǰ״̬<D7B4>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>: <20><>֡<EFBFBD><D6A1><EFBFBD>ݱ<EFBFBD><DDB1>Ļ<EFBFBD><C4BB><EFBFBD>
|
|
|
|
|
|
struct StatPacket {
|
|
|
|
|
|
int packet_index;
|
|
|
|
|
|
std::vector<unsigned char> data;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2025-09-08 14:37:39 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>------------------------------------------------------------------------
|
2025-07-03 11:13:16 +08:00
|
|
|
|
std::vector<StatPacket> stat_packets_cache_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
|
|
|
|
|
|
int expected_total_packets_ = 0; // Ԥ<><D4A4><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>
|
|
|
|
|
|
std::mutex stat_cache_mutex_; // <20><><EFBFBD>滥<EFBFBD><E6BBA5><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool add_stat_packet(const std::vector<unsigned char>& packet, int current_packet, int total_packets);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<StatPacket> get_and_clear_stat_packets();//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
|
|
|
|
|
void clear_stat_cache();//<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
2025-09-08 14:37:39 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-----------------------------------------------------------------
|
|
|
|
|
|
ushort event_lineNo = 1; // <20>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>
|
|
|
|
|
|
std::vector<StatPacket> event_stat_packets_cache_; // <20>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
|
|
|
|
|
|
int event_expected_total_packets_ = 0; // <20>¼<EFBFBD><C2BC><EFBFBD>־Ԥ<D6BE><D4A4><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>
|
|
|
|
|
|
std::mutex event_stat_cache_mutex_; // <20>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD>滥<EFBFBD><E6BBA5><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool event_add_stat_packet(const std::vector<unsigned char>& packet, int current_packet, int total_packets);//<2F>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<StatPacket> event_get_and_clear_stat_packets();//<2F>¼<EFBFBD><C2BC><EFBFBD>־ȡ<D6BE><C8A1><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
|
|
|
|
|
void event_clear_stat_cache();//<2F>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
2025-07-03 11:13:16 +08:00
|
|
|
|
|
|
|
|
|
|
// ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
|
|
|
|
|
|
struct PointFloatCache {
|
|
|
|
|
|
std::array<tagPqData_Float, 4> data; // <20>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(0-3)
|
|
|
|
|
|
std::array<bool, 4> received = { false }; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ѽ<EFBFBD><D1BD><EFBFBD>
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͳ<EFBFBD>Ƹ<EFBFBD><C6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
std::unordered_map<ushort, PointFloatCache> point_float_cache_;
|
|
|
|
|
|
std::mutex float_cache_mutex_; // <20><><EFBFBD>㻺<EFBFBD>滥<EFBFBD><E6BBA5><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool add_float_data(ushort point_id, int data_type, const tagPqData_Float& float_data);
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::array<tagPqData_Float, 4> get_and_clear_float_data(ushort point_id);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
|
|
|
|
|
|
void clear_float_cache();
|
2025-06-24 10:33:31 +08:00
|
|
|
|
|
2025-07-10 10:32:29 +08:00
|
|
|
|
// ʵʱ<CAB5><CAB1><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
struct RealtimePacket {
|
|
|
|
|
|
unsigned char packet_type;
|
|
|
|
|
|
std::vector<unsigned char> data;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<RealtimePacket> realtime_packets_cache_; // <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݰ<EFBFBD>
|
|
|
|
|
|
std::mutex realtime_cache_mutex_; // <20><><EFBFBD>滥<EFBFBD><E6BBA5><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void add_realtime_packet(unsigned char packet_type,
|
|
|
|
|
|
const unsigned char* data,
|
|
|
|
|
|
size_t size) {
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(realtime_cache_mutex_);
|
|
|
|
|
|
realtime_packets_cache_.push_back({
|
|
|
|
|
|
packet_type,
|
|
|
|
|
|
std::vector<unsigned char>(data, data + size)
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
|
|
|
|
|
|
std::vector<RealtimePacket> get_and_clear_realtime_packets() {
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(realtime_cache_mutex_);
|
|
|
|
|
|
auto packets = std::move(realtime_packets_cache_);
|
|
|
|
|
|
realtime_packets_cache_.clear();
|
|
|
|
|
|
return packets;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>棩
|
|
|
|
|
|
void reset_realtime_data() {
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(realtime_cache_mutex_);
|
|
|
|
|
|
realtime_packets_cache_.clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-25 10:47:50 +08:00
|
|
|
|
//<2F><>̬<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
struct FileDownloadPacket {
|
|
|
|
|
|
int frame_index;
|
|
|
|
|
|
std::vector<unsigned char> data;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<FileDownloadPacket> file_download_cache_; // <20>ļ<EFBFBD><C4BC><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::string current_filename_; // <20><>ǰ<EFBFBD><C7B0><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD>
|
|
|
|
|
|
std::mutex file_cache_mutex_; // <20><><EFBFBD>滥<EFBFBD><E6BBA5><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void add_file_packet(int frame_index, const unsigned char* data, size_t size) {
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(file_cache_mutex_);
|
|
|
|
|
|
file_download_cache_.push_back({ frame_index, std::vector<unsigned char>(data, data + size) });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>з<EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<std::vector<unsigned char>> get_and_clear_file_packets() {
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(file_cache_mutex_);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::sort(file_download_cache_.begin(), file_download_cache_.end(),
|
|
|
|
|
|
[](const FileDownloadPacket& a, const FileDownloadPacket& b) {
|
|
|
|
|
|
return a.frame_index < b.frame_index;
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<std::vector<unsigned char>> packets;
|
|
|
|
|
|
for (const auto& pkt : file_download_cache_) {
|
|
|
|
|
|
packets.push_back(pkt.data);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
|
|
|
|
|
file_download_cache_.clear();
|
|
|
|
|
|
return packets;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void clear_file_cache() {
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(file_cache_mutex_);
|
|
|
|
|
|
file_download_cache_.clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>õ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD>
|
|
|
|
|
|
void set_current_filename(const std::string& filename) {
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(file_cache_mutex_);
|
|
|
|
|
|
current_filename_ = filename;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD>
|
|
|
|
|
|
std::string get_current_filename() {
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(file_cache_mutex_);
|
|
|
|
|
|
return current_filename_;
|
|
|
|
|
|
}
|
2025-06-24 10:33:31 +08:00
|
|
|
|
private:
|
|
|
|
|
|
int index_;
|
2025-06-25 10:54:09 +08:00
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
std::vector<unsigned char> recv_buffer_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::mutex buffer_mutex_; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void process_buffer();
|
2025-06-24 10:33:31 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
2025-06-24 18:40:10 +08:00
|
|
|
|
class ClientManager {
|
|
|
|
|
|
public:
|
|
|
|
|
|
static ClientManager& instance() {
|
|
|
|
|
|
static ClientManager inst;
|
|
|
|
|
|
return inst;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>ѭ<EFBFBD><D1AD>
|
|
|
|
|
|
void set_loop(uv_loop_t* loop) {
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(mutex_);
|
|
|
|
|
|
loop_ = loop;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
void add_device(const DeviceInfo& device);//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void remove_device(const std::string& device_id);//ɾ<><C9BE>һ<EFBFBD><D2BB>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void restart_device(const std::string& device_id);//<2F>ر<EFBFBD>ָ<EFBFBD><D6B8>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void stop_all();//ֹͣ<CDA3><D6B9><EFBFBD>пͻ<D0BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool set_cloud_status(const std::string& identifier, int status);//<2F><EFBFBD><DEB8><EFBFBD>ǰ<EFBFBD>õ<EFBFBD>¼״̬
|
|
|
|
|
|
bool post_message_processing(const std::string& identifier);// <20><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<C9BA>״̬<D7B4><CCAC><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>
|
|
|
|
|
|
bool add_action_to_device(const std::string& identifier,
|
|
|
|
|
|
DeviceState state,
|
|
|
|
|
|
const std::vector<unsigned char>& packet = {});
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ı<EFBFBD>װ<EFBFBD>õ<EFBFBD>ǰ״̬
|
|
|
|
|
|
bool change_device_state(const std::string& identifier,
|
|
|
|
|
|
DeviceState new_state,
|
|
|
|
|
|
const std::vector<unsigned char>& packet = {});
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>װ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool clear_action_queue(const std::string& identifier);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡװ<C8A1>õ<EFBFBD>ǰ״̬
|
|
|
|
|
|
bool get_device_state(const std::string& identifier, DeviceState& out_state);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD>ȡװ<C8A1>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
|
bool get_device_points(const std::string& identifier,std::vector<PointInfo>& out_points);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ͻ<EFBFBD><CDBB>˵Ķ<CBB5>֡<EFBFBD><D6A1><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>뻺<EFBFBD><EBBBBA><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool add_stat_packet_to_device(const std::string& identifier,
|
|
|
|
|
|
const std::vector<unsigned char>& packet,
|
|
|
|
|
|
int current_packet,
|
|
|
|
|
|
int total_packets);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡָ<C8A1><D6B8><EFBFBD>ͻ<EFBFBD><CDBB>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>л<EFBFBD><D0BB>汨<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::vector<ClientContext::StatPacket> get_and_clear_stat_packets(const std::string& identifier);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>ն<EFBFBD>֡<EFBFBD><D6A1><EFBFBD>ı<EFBFBD><C4B1>滺<EFBFBD><E6BBBA><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool clear_stat_cache(const std::string& identifier);
|
|
|
|
|
|
|
2025-09-08 14:37:39 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ȫ
|
|
|
|
|
|
bool add_eventlog_packet_to_device(const std::string& identifier,
|
|
|
|
|
|
const std::vector<unsigned char>& packet,
|
|
|
|
|
|
int current_packet,
|
|
|
|
|
|
int total_packets);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>֡<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
|
|
|
|
|
std::vector<ClientContext::StatPacket> get_and_clear_event_packets(const std::string& identifier);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool clear_event_cache(const std::string& identifier);
|
|
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
// <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PT<50><54>CT<43><54><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
|
bool get_pt_ct_ratio(const std::string& identifier,
|
|
|
|
|
|
int16_t nCpuNo,
|
|
|
|
|
|
float& pt_ratio,
|
|
|
|
|
|
float& ct_ratio);
|
|
|
|
|
|
|
2025-09-08 14:37:39 +08:00
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool get_event_lineid(const std::string& identifier, int& nCpuNo);
|
|
|
|
|
|
|
2025-06-24 18:40:10 +08:00
|
|
|
|
// <20><>ȡ<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
size_t client_count() {
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(mutex_);
|
|
|
|
|
|
return clients_.size();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-03 11:13:16 +08:00
|
|
|
|
// <20><><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>豸<EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>
|
|
|
|
|
|
bool add_float_data_to_device(const std::string& identifier,
|
|
|
|
|
|
ushort point_id,
|
|
|
|
|
|
int data_type,
|
|
|
|
|
|
const tagPqData_Float& float_data);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::array<tagPqData_Float, 4> get_and_clear_float_data(
|
|
|
|
|
|
const std::string& identifier, ushort point_id);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8>㻺<EFBFBD><E3BBBA>
|
|
|
|
|
|
bool clear_float_cache(const std::string& identifier);
|
|
|
|
|
|
|
2025-07-10 10:32:29 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool add_realtime_packet_to_device(const std::string& identifier,
|
|
|
|
|
|
unsigned char packet_type,
|
|
|
|
|
|
const unsigned char* data,
|
|
|
|
|
|
size_t size) {
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(mutex_);
|
|
|
|
|
|
for (auto& pair : clients_) {
|
|
|
|
|
|
auto& ctx = pair.second;
|
|
|
|
|
|
if (ctx->device_info.device_id == identifier ||
|
|
|
|
|
|
ctx->device_info.mac == identifier) {
|
|
|
|
|
|
ctx->add_realtime_packet(packet_type, data, size);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
|
|
|
|
|
|
std::vector<ClientContext::RealtimePacket>
|
|
|
|
|
|
get_and_clear_realtime_packets(const std::string& identifier) {
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(mutex_);
|
|
|
|
|
|
for (auto& pair : clients_) {
|
|
|
|
|
|
auto& ctx = pair.second;
|
|
|
|
|
|
if (ctx->device_info.device_id == identifier ||
|
|
|
|
|
|
ctx->device_info.mac == identifier) {
|
|
|
|
|
|
return ctx->get_and_clear_realtime_packets();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return {};
|
|
|
|
|
|
}
|
2025-07-25 10:47:50 +08:00
|
|
|
|
|
|
|
|
|
|
// <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ѹ<EFBFBD>ȼ<EFBFBD><C8BC>ͽ<EFBFBD><CDBD>߷<EFBFBD>ʽ
|
|
|
|
|
|
bool get_point_scale_and_pttype(const std::string& identifier,
|
|
|
|
|
|
ushort nCpuNo,
|
|
|
|
|
|
std::string& out_scale,
|
|
|
|
|
|
int& out_pttype);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><EFBFBD><DEB8><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ĵ<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool update_current_packet_frame(const std::string& identifier, int next_frame);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1>̬<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>Ϣ
|
|
|
|
|
|
struct DownloadInfo {
|
|
|
|
|
|
std::string filename;
|
|
|
|
|
|
int current_frame;
|
|
|
|
|
|
};
|
|
|
|
|
|
bool parse_download_packet(const std::string& identifier, DownloadInfo& out_info);
|
|
|
|
|
|
|
|
|
|
|
|
bool add_file_packet_to_device(const std::string& identifier,
|
|
|
|
|
|
int frame_index,
|
|
|
|
|
|
const unsigned char* data,
|
|
|
|
|
|
size_t size);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<std::vector<unsigned char>> get_and_clear_file_packets(const std::string& identifier);
|
|
|
|
|
|
|
|
|
|
|
|
bool update_current_filename(const std::string& identifier, const std::string& filename);
|
|
|
|
|
|
|
|
|
|
|
|
std::string get_current_filename(const std::string& identifier);
|
2025-07-30 13:52:52 +08:00
|
|
|
|
|
2025-09-04 15:37:26 +08:00
|
|
|
|
//ˢ<>¿ͻ<C2BF><CDBB><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
bool set_cloudmessage_time(const std::string& identifier);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>Ŀͻ<C4BF><CDBB>˵<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>ά<EFBFBD><CEAC>Ϣ<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0B9A6>ʹ<EFBFBD><CAB9>
|
|
|
|
|
|
bool set_versioninformation(const std::string& identifier, string cloud_version);
|
|
|
|
|
|
|
2025-07-30 13:52:52 +08:00
|
|
|
|
//<2F><>ȡ<EFBFBD>ļ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>mac/id + <20>ļ<EFBFBD>·<EFBFBD><C2B7>
|
|
|
|
|
|
bool add_file_menu_action_to_device(const std::string& identifier, const std::string& file_path);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD> ʵʱ<CAB5><CAB1><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD> <20><><EFBFBD><EFBFBD>mac/id + ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool set_real_state_count(const std::string& identifier, int count, ushort point_id);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD> <20><><EFBFBD><EFBFBD>mac/id + <20>ļ<EFBFBD>λ<EFBFBD><CEBB>
|
|
|
|
|
|
bool add_file_download_action_to_device(const std::string& identifier, const std::string& file_path);
|
2025-08-05 15:41:04 +08:00
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡָ<C8A1><D6B8>װ<EFBFBD><D7B0>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µĶ<C2B5>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>mac/id + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool get_fixedvalue_action_to_device(const std::string& identifier, ushort point_id);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡָ<C8A1><D6B8>װ<EFBFBD>ö<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>mac/id
|
|
|
|
|
|
bool get_fixedvaluedes_action_to_device(const std::string& identifier);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>mac/id + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool set_fixedvalue_action_to_device(const std::string& identifier, ushort point_id, const std::vector<float>& value);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡװ<C8A1><D7B0><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ <20><><EFBFBD><EFBFBD>mac/id
|
|
|
|
|
|
bool get_interfixedvalue_action_to_device(const std::string& identifier);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡװ<C8A1><D7B0><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>or<6F>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> 1-<2D>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool get_fixedvalucontrolword_action_to_device(const std::string& identifier, unsigned char nDesCW);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ֵ <20><><EFBFBD><EFBFBD>mac/id + <20>ڲ<EFBFBD><DAB2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
|
|
|
|
|
|
bool set_interfixedvalue_action_to_device(const std::string& identifier, const std::vector<uint16_t>& values);
|
2025-09-03 08:49:38 +08:00
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡװ<C8A1><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
|
bool read_runninginformation_action_to_device(const std::string& identifier);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><>ȡװ<C8A1>ð汾<C3B0><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
|
bool read_devversion_action_to_device(const std::string& identifier);
|
2025-09-08 14:37:39 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param Time1 <EFBFBD><EFBFBD>ʼʱ<EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param Time2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param eventType <EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>Ĭ<EFBFBD><EFBFBD>2-<EFBFBD><EFBFBD>̬<EFBFBD>¼<EFBFBD> 4-<EFBFBD>澯ʱ<EFBFBD><EFBFBD>
|
|
|
|
|
|
* @param monitorPoint <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㣬Ĭ<EFBFBD><EFBFBD>1-<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 1-6 <EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @return <EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܵĽ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*/
|
|
|
|
|
|
bool read_eventlog_action_to_device(const std::string& identifier, const std::tm& Time1, const std::tm& Time2,uint8_t eventType = 2, uint8_t monitorPoint = 1);
|
2025-06-24 18:40:10 +08:00
|
|
|
|
private:
|
|
|
|
|
|
ClientManager() : loop_(nullptr) {}
|
|
|
|
|
|
std::unordered_map<std::string, std::unique_ptr<ClientContext>> clients_;
|
|
|
|
|
|
std::mutex mutex_;
|
|
|
|
|
|
uv_loop_t* loop_; // <20>¼<EFBFBD>ѭ<EFBFBD><D1AD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2025-06-24 10:33:31 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void start_client_connect(const std::vector<DeviceInfo>& devices);
|
|
|
|
|
|
void send_binary_data(ClientContext* ctx, const unsigned char* data, size_t data_size);
|
2025-07-25 10:47:50 +08:00
|
|
|
|
void safe_send_binary_data(ClientContext* ctx, std::vector<unsigned char> data);
|
2025-06-24 18:40:10 +08:00
|
|
|
|
void on_timer(uv_timer_t* handle);
|
|
|
|
|
|
void try_reconnect(uv_timer_t* timer);
|
|
|
|
|
|
void on_connect(uv_connect_t* req, int status);
|
|
|
|
|
|
void on_close(uv_handle_t* handle);
|
|
|
|
|
|
void init_clients(uv_loop_t* loop, const std::vector<DeviceInfo>& devices);
|
2025-06-27 16:33:41 +08:00
|
|
|
|
void stop_all_clients();
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|