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系统设计(脚本化流程高级技巧)的主要内容,如果未能解决你的问题,请参考以下文章

公安三所标准 跟GB28181标准 有啥 区别?

GB28181之国标编码

lua 脚本在智能逻辑面板中实际应用

GB28181协议中的事件系统设计

gb28181协议常见流程简析

GB28181国标平台资料整理