#ifndef _c_bus_client_message_h_ #define _c_bus_client_message_h_ #include /* 注册进程的proc信息,包括进程名[name], 进程[id],等 */ typedef struct cproc cproc; /* 进程注册信息, 包括进程的proc信息 cproc 待注册的本进程提供请求响应的主题 topics[s], char** rep, 主题数量 repcnt 待注册的本进程发布的主题 topics[s], char** pub, 主题数量 pubcnt 待注册的本进程订阅的主题 topics[s], char** sub, 主题数量 subcnt 待注册的本进程订阅的[网络、远程主机]主题 topics[s], char** subnet, 主题数量 subnetcnt */ typedef struct creg creg; //TableChanged enum pollcontrol 接收到的订阅消息,数据库的变化 enum TableChanged { T_Camera = 0, //摄像机变化 T_CameraRule = 1, //摄像机任务参数变化 T_Sdk = 2, //sdk变化 T_CameraPolygon = 3, //摄像机多边形变化 T_TimeRule = 4, //时间规则变化 T_Server = 5, //服务器信息变化 T_PollConfig = 6, //轮询配置变化 T_File = 7, //本地文件变化 T_FileSetting = 8, //本地文件分析设置 T_SdkChanSet = 9, //算法通道设置变化 T_FileStack = 10, //数据栈变化 T_ResourceConfig = 11, //对外服务配置变化 T_CalculationPower = 12, //需要重新计算算力占用情况 T_EventPush = 13, //事件推送有变化 T_Cluster = 14, //集群创建、加入或退出 T_CameraPolygonRelation = 15, //摄像机区域的关联关系 T_Voice = 16, //报警声音发生变化 }; // pollcontrol 接收到的订阅消息,数据库的操作 enum DbAction { Insert = 0, //Insert db Update = 1, //Update db Delete = 2, //Delete db }; // 数据库变化信息 struct DbChangeMsg{ TableChanged table; //变化的表 char* id; //变化数据id size_t idl; // id len DbAction action; //action/ DbAction[Insert/Update/Delete] char* info; //变化内容 size_t infol; }; // 订阅消息, 包括数据库消息和其他进程的消息 struct csubmsg{ char* topic; // 收到的订阅消息的主题,区分那种订阅消息 size_t topicl; // private // enum MsgT {NONE=0, DB, PROCLIST} type; char* msg; // 收到的订阅消息的body size_t msgl; }; // 其他进程信息, pollcontrol可能依赖其他进程的服务,可能需要等其他进程启动再开始工作 struct cclient{ creg* rinfo; // 代表其他进程的进程信息 int replykey; // 没用,上一个版本用共享内存,此为key int hbcnt; // 心跳次数?可能没用 int dcnt; // deadcount,可能没用? int status; // 进程状态,可能没用? }; // 其他注册进程列表,如数据库进程需要启动再运行pollcontrol逻辑 struct cproclist{ struct cclient* cli; // 其他进程的列表 size_t count; // 其他进程的列表的count }; ////////////////////////////////////////// // request msg /* 此消息既作为接收的request msg的结构,也作为发送request 消息的结构 接收request消息会带有发出request消息的进程的id,procid */ struct creqmsg{ char* procid; // 发送request消息的进程id size_t procidl; char* msg; // request消息体 size_t msgl; }; // decode stack err msg /* pollcontrol会接收数据栈解码发送的解码失败消息,用于置网页状态 */ struct cstackmsgerr{ char* stackid; // 解码失败的数据栈id size_t stackidl; char* fileid; // 解码失败的文件id size_t fileidl; }; // stack file /* 数据栈的文件列表,对应 protomsg.FileAnalysis 但是此结构体非常长 看代码应该只需要解析出的几个 */ struct cstackfile{ char* id; // 文件id size_t idl; char* name; // 文件name size_t namel; char* path; // 文件路径 size_t pathl; int type; // 文件类型 1:video,2:picture void* noused; // 未使用 }; // decode stack success msg /* pollcontrol会接收数据栈解码完成的消息,然后下发新的数据栈任务 */ struct cstackmsg{ int procnum; // decoder 启动的进程号,数据栈可能会有数个decoder同时运行 char* stackid; // 数据栈 id size_t stackidl; char* stackname; // 数据栈 name size_t stacknamel; int type; // 数据栈类型 video picture int shmkey; // 数据栈使用的共享内存key int width; // 分辨率 int height; int fps; // fps 采样 fps/s struct cstackfile* files; // 数据栈文件列表 size_t filescnt; }; // reply msg // 对应 bhome_msg.MsgRequestTopicReply struct crepmsg{ int errcode; // 相应request请求的消息,错误码 char* errmsg; // 错误消息 size_t errmsgl; char* data; // 消息体 size_t datal; }; /* 对应 bhome_msg.MsgQueryProcReply_Info query procs 返回值 */ struct cqueryprocs{ char* id; size_t idl; int online; }; #ifdef __cplusplus extern "C"{ #endif /* 内部使用,深拷贝 cproc */ cproc* internal_clone_cproc(const cproc* proc); void internal_cproc_free(cproc* proc); /* 返回一个 cproc 结构,仅拷贝输入参数 生命周期 cproc < name[id] */ cproc* make_cproc(const char* name, const char* id); /* 从已存在的 cproc 中获取 name 和 id,仅仅是 cproc 内部的引用,无需释放 生命周期 name[id] < cproc */ char* cproc_name(const cproc* proc); char* cproc_id(const cproc* proc); /* 释放 cproc 指针 */ void cproc_free(cproc* proc); /* 返回一个 creg 结构,仅拷贝输入参数 输入参数生命周期需覆盖返回值生命周期 */ creg* make_creg(const cproc* proc, const char** rep, const size_t repcnt, const char** pub, const size_t pubcnt, const char** sub, const size_t subcnt, const char** subnet, const size_t subnetcnt); creg* make_creg_from_cproc(const cproc* proc); void creg_add_topic_reply(creg* reg, const char** topic, const size_t count); void creg_add_topic_pub(creg* reg, const char** topic, const size_t count); void creg_add_topic_sub(creg* reg, const char** topic, const size_t count); void creg_add_topic_subnet(creg* reg, const char** topic, const size_t count); /* 获取已存在的 creg 中的 cproc 或者注册的主题,无需释放 生命周期 < creg */ const cproc* creg_proc(const creg* reg); char** creg_reply_topic(const creg* reg, size_t* count); char** creg_pub_topic(const creg* reg, size_t* count); char** creg_sub_topic(const creg* reg, size_t* count); char** creg_subnet_topic(const creg* reg, size_t* count); /* 释放 creg 指针 */ void creg_free(creg* reg); // 订阅消息相关,订阅数据库db消息和进程列表proclist消息 /* cbhomeclient.cpp中使用,将接收到的submsg解包成csubmsg 包括topic和msg数据,msg数据并未反序列化 必须使用free_submsg释放 */ struct csubmsg* to_submsg(const char* data, const size_t size); void free_submsg(struct csubmsg* msg); // db msg /* 接收到的submsg在pollcontrol中可能为数据库更新的通知 将csubmsg中未反序列化的数据解包成db的数据格式 必须用free_submsg_db释放 */ struct DbChangeMsg* get_submsg_db(struct csubmsg* msg); void free_submsg_db(struct DbChangeMsg* msg); // proclist msg /* 接收到的submsg在pollcontrol中可能为关心的其他进程的列表 将csubmsg中未反序列化的数据解包成进程的列表 必须用free_submsg_proclist释放 */ struct cproclist* get_submsg_proclist(struct csubmsg* msg); void free_submsg_proclist(struct cproclist* ppl); // request msg /* cbhomeclient.cpp中使用,将接收到的request请求数据解包成creqmsg 包括request进程的procid和msg数据,msg数据并未反序列化 必须使用free_reqmsg释放 */ struct creqmsg* to_reqmsg(const char* pid,const size_t pids,const char* data,const size_t size); void free_reqmsg(struct creqmsg* msg); /* 本进程向其他进程请求数据构建 包括请求的主题topic和请求的数据body[data] 必须使用free_reqmsg释放 */ struct creqmsg* make_req_msg(const char* topic, const size_t topicl, const char* data, const size_t datal); // decode err msg /* 接收到的creqmsg在pollcontrol中可能为数据栈解码错误信息 将creqmsg中未反序列化的数据解包成cstackmsgerr,包括数据栈id stackid和文件id fileid 必须用free_reqmsg_stackerr释放 */ struct cstackmsgerr* get_reqmsg_stackerr(struct creqmsg* msg); void free_reqmsg_stackerr(struct cstackmsgerr* msg); // decode success msg /* 接收到的creqmsg在pollcontrol中可能为数据栈解码完成信息 将creqmsg中未反序列化的数据解包成cstackmsg 包括 int procnum; // 启动的decoder进程num struct cstr stackid; struct cstr stackname; int type; // video picture int shmkey; int width; int height; int fps; struct cstackfile* files; // 文件列表 size_t filescnt; // 文件数量 必须用free_reqmsg_stackerr释放 */ struct cstackmsg* get_reqmsg_stack(struct creqmsg* msg); void free_reqmsg_stack(struct cstackmsg* msg); // reply msg /* 创建 creqmsg 包括errcode、errmsg和消息体data 必须使用 free_reply_msg 释放 */ struct crepmsg* make_reply_msg(const int errcode, const char* errmsg, const size_t emsgl, const char* data, const size_t datal); void free_reply_msg(struct crepmsg* msg); /* 释放 query procs 从center获取所有的procs信息 */ void free_query_procs(struct cqueryprocs* procs, const size_t count); #ifdef __cplusplus } #endif #endif