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;
}

结果

调用lua文件
从以上可以看出,我们使用c++ 调用了lua,lua里面也调用了c++注册进来的函数,这样可以将很多流程脚本化,设计得好一些,将会避免很多修改源码得困扰。GB28181得事件系统里面,我们将使用脚本化来做一些工作,包括数据库,辅助协议,lua本身就是有这些能力得

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐