wangrong
2025-03-19 291afb9c81aae1d15d9e3edcea618d0a2e1fc5a6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
 
 
#include "vp_ba_socket_broker_node.h"
 
 
namespace vp_nodes {
        
    vp_ba_socket_broker_node::vp_ba_socket_broker_node(std::string node_name,
                                                        std::string des_ip,
                                                        int des_port,
                                                        vp_broke_for broke_for, 
                                                        int broking_cache_warn_threshold, 
                                                        int broking_cache_ignore_threshold):
                                                        vp_msg_broker_node(node_name, broke_for, broking_cache_warn_threshold, broking_cache_ignore_threshold),
                                                        des_ip(des_ip),
                                                        des_port(des_port) {
        // only for vp_frame_target since BA logic ONLY works on vp_frame_target                                                   
        assert(broke_for == vp_broke_for::NORMAL);
        udp_writer = kissnet::udp_socket(kissnet::endpoint(des_ip, des_port));
        VP_INFO(vp_utils::string_format("[%s] [message broker] set des_ip as `%s` and des_port as [%d]", node_name.c_str(), des_ip.c_str(), des_port));
        this->initialized();
    }
    
    vp_ba_socket_broker_node::~vp_ba_socket_broker_node() {
        deinitialized();
        stop_broking();
    }
 
    void vp_ba_socket_broker_node::format_msg(const std::shared_ptr<vp_objects::vp_frame_meta>& meta, std::string& msg) {
        /* format:
        line 0, <--
        line 1, time
        line 2, channel_index, frame_index
        line 3, ba_type, ba_label
        line 4, ids of involve targets (target_id_1, target_id_2,...)
        line 5, vertexs of involve region (x1,y1,x2,y2,...) 
        line 6, property labels split by '|' and split by ','  between different involve targets
        line 7, record image path
        line 8, record video path
        line 9, -->
        line 10, <--
        line 11, time
        line 12, channel_index, frame_index
        line 13, ba_type, ba_label
        line 14, ids of involve targets (target_id_1, target_id_2,...)
        line 15, vertexs of involve region (x1,y1,x2,y2,...) 
        line 16, property labels split by '|' and split by ','  between different involve targets
        line 17, record image path
        linr 18, record video path
        line 19, -->
        line 20, ...
        */
 
        std::stringstream msg_stream;
        auto format_basic_info = [&](int channel_index, int frame_index) {
            msg_stream << vp_utils::time_format(NOW) << std::endl;           // line1
            msg_stream << channel_index << "," << frame_index << std::endl;  // line2
        };
        auto format_ba_info = [&](vp_objects::vp_ba_type ba_type,
                                std::string ba_label,
                                const std::vector<int>& involve_target_ids, 
                                const std::vector<vp_objects::vp_point>& involve_region_vertexs) {
            msg_stream << int(ba_type) << "," << ba_label << std::endl;     // line3
            for (int i = 0; i < involve_target_ids.size(); i++) {
                msg_stream << involve_target_ids[i];  // line 4
                if (i != involve_target_ids.size() - 1) {
                    msg_stream << ",";
                }
            }
            msg_stream << std::endl;
            
            for (int i = 0; i < involve_region_vertexs.size(); i++) {
                msg_stream << involve_region_vertexs[i].x << "," << involve_region_vertexs[i].y;  // line 5
                if (i != involve_region_vertexs.size() - 1) {
                    msg_stream << ",";
                }
            }
            msg_stream << std::endl;
 
            auto targets = meta->get_targets_by_ids(involve_target_ids);
            for (int i = 0; i < targets.size(); i++) {
                auto t = targets[i];
                for (int j = 0; j < t->secondary_labels.size(); j++) {
                    msg_stream << t->secondary_labels[j];  // line 6
                    if (j != t->secondary_labels.size() - 1) {
                        msg_stream << "|";
                    }
                }
                if (i != targets.size() - 1) {
                    msg_stream << ",";
                }
            }
            msg_stream << std::endl;
        };
        auto format_record_info = [&](const std::string& record_image_name, const std::string& record_video_name) {
            msg_stream << record_image_name << std::endl;  // line7
            msg_stream << record_video_name << std::endl;  // line8
        };
 
        if (broke_for == vp_broke_for::NORMAL) {
            for (int i = 0; i < meta->ba_results.size(); i++) {
                auto& ba = meta->ba_results[i];
                
                // start flag
                msg_stream << "<--" << std::endl;
                // basic info
                format_basic_info(meta->channel_index, meta->frame_index);
                //ba info
                format_ba_info(ba->type, ba->ba_label, ba->involve_target_ids_in_frame, ba->involve_region_in_frame);
                // record info
                format_record_info(ba->record_image_name, ba->record_video_name);
                // end flag
                msg_stream << "-->";
                
                if (i != meta->ba_results.size() - 1) {
                    msg_stream << std::endl;  // not the last one
                }
            }
        }
        
        msg = msg_stream.str();   
    }
 
    void vp_ba_socket_broker_node::broke_msg(const std::string& msg) {
        // broke msg to socket by udp
        auto bytes_2_send = reinterpret_cast<const std::byte*>(msg.c_str());
        auto bytes_2_send_len = msg.size();
        udp_writer.send(bytes_2_send, bytes_2_send_len);
    }
}