GB28181系统设计(脚本化流程高级技巧)
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GB28181系统设计(脚本化流程高级技巧)相关的知识,希望对你有一定的参考价值。
GB28181系统设计 一 事件设计
GB28181系统设计 二 kdtree 算法
GB28181系统设计 三 于python通信
GB28181系统设计 四 横向扩展和纵向扩展
脚本化
我们想把一些流程设计进脚本,以避免后期的一些修改程序,所以我们必须把一些程序模块化以后一部分注册到脚本里面,一部分调用脚本的函数。这可以做到吗?完全可以。
使用lua
我们把前面的一些事件来脚本化,除了python,我们使用lua语言来做脚本,还有一种选择是AngelScript,这是一种最大化近似c语言调用得脚本,这是我们依然选用lua来做这个工作。是因为lua在这方面非常成熟。
static int emit(lua_State* L)
int n = lua_gettop(L);
for (int i =1; i <= n; i++)
const char * s = lua_tostring(L, i);
printf("this is emit %d:%s\\n", i,s);
printf("this is emit event!\\n");
//这里实际上我们会调用我们第一节的emit真实函数
return 0;
static int emit2(lua_State* L)
printf("this is emit2 event\\n");
return 0;
lua_register(L, "emit", emit);
lua_register(L, "emit2", emit2);
以上是将函数注册进入系统,使用lua_register 来把函数emit,emit2 函数注册进入lua脚本,lua脚本将可以调用事件发射函数,因为我们无法预测在某些事件中需要怎样来放入事件,所以我们把流程脚本化了,我们随时可以修改test.lua文件来发射不同的事件。
lua脚本
下面是lua得脚本,lua脚本使用–来进行注释
-- 发送包
function sendPacket()
--avg, sum = average(10, 20, 30, 40, 50)
emit("qianbo","qianbo2");
print("emit is ok\\n")
emit2()
print("emit2 is ok\\n")
end
--日志记录
function log(str)
print("the log is " .. str)
end
--其他函数
function add(x,y)
return x+y;
end
在sendPacket中我们将调用c++里面的函数 emit,emit2,而在c++中将调用sendPacket,这个技巧非常有用,下面是源码调用:
int main(int argc, char* argv[])
lua_State* L = luafileload("test.lua");
bool funcStatus = false;
if (NULL == L)
printf("error of test.lua\\n");
exit(1);
lua_register(L, "emit", emit);
lua_register(L, "emit2", emit2);
funcStatus = Call(L, "sendPacket");
if (false == funcStatus)
printf("call failer!\\n");
exit(1);
//调用log
funcStatus = Call(L, "log", "test");
if (false == funcStatus)
printf("call failer!\\n");
exit(1);
list<string> parm_datas;
parm_datas.push_back("1");
parm_datas.push_back("2");
string func_ret = CallFunc(L, "add", parm_datas);
cout << atoi(func_ret.c_str()) << endl;
CloseHandle(L);
return 0;
结果
从以上可以看出,我们使用c++ 调用了lua,lua里面也调用了c++注册进来的函数,这样可以将很多流程脚本化,设计得好一些,将会避免很多修改源码得困扰。GB28181得事件系统里面,我们将使用脚本化来做一些工作,包括数据库,辅助协议,lua本身就是有这些能力得
以上是关于GB28181系统设计(脚本化流程高级技巧)的主要内容,如果未能解决你的问题,请参考以下文章