当前位置: 首页 > news >正文

网站开发多久完成莞城微网站建设

网站开发多久完成,莞城微网站建设,平山做网站优化,动易网站首页制作安防领域中的联动规则 有安防领域相关的开发经历的人知道#xff0c;IPCamera可以配置使能“侦测”功能#xff0c;并且指定仅针对图像传感器的某个区载进行侦测。除了基本的“移动侦测外#xff0c;侦测的功能点还有细化的类别#xff0c;如人员侦测、车辆侦测、烟…安防领域中的联动规则 有安防领域相关的开发经历的人知道IPCamera可以配置使能“侦测”功能并且指定仅针对图像传感器的某个区载进行侦测。除了基本的“移动侦测外侦测的功能点还有细化的类别如人员侦测、车辆侦测、烟雾侦测等。这些侦测配置后若被触发会在IPCamera内部产生一些事件这事件发生时IPC内部会有相应的动作例如邮件报告、图片上传、视频上传等还可以配置IPC蜂鸣器报警、外置LED灯闪烁等若有相应的硬件外设。在IPC的Web界面用户可以方便地配置这些选项 如何实现这一功能呢笔者咨询过相关在安防产业工作的朋友得到的方案有两种 IPC内部产生的事件种类是固定的能够做出动作也是有限的那么直接使用C/C编码实现这些逻辑将事件与动作分别独立为应用中的子模块使用“胶水”语言Lua将二者联动起来 朋友也坦言第一种方案在代码库中存在很久了代码逻辑错踪复杂尤其是一些定制类的IPCamera项目需求不同会造成开发人员花费不少的时间在动态联动的代码修改上。而第二种方案虽然在项目开发上可以缩短时间但只有少部分项目中有接口也不一样帮助不大第一种方案仍是团队内部项目开发的主要方法。 动态联动的问题抽象 本文中笔者将此类动态联动的问题抽象化并提供上面提到的第二种方法的演示实现。假设IPCamera内部的图像处理会产生五个维度的状态量名称分别为 ex_var1/ex_var2/ex_var3/ex_var4/ex_var5 这五个状态量与三个联动规则相关即事件当判定条件为真时会触发也可能会产生另外三个联动规则不为真时的动作。也就是说三个联动规则需要这五个变量来决定是否为真。笔者将这些信息写入到配置文件中由演示应用读取 {linked-vars: {ex_var1: 1,ex_var2: 2,ex_var3: 3,ex_var4: 4.2,ex_var5: 5},linked-action: [{rule: (ex_var1 ex_var2 * 2 ex_var3 * 3) 14,true: echo The planet Earth is freaking too hot,false: echo The planet Earth is freaking too cold},{rule: math.floor(ex_var4 * 5 / 4) ex_var5,true: echo Note that floor(ex_var4 * 5 / 4) ex_var5,false: echo Note that floor(ex_var4 * 5 / 4) ex_var5},{rule: (ex_var1 ex_var2 ex_var3 ex_var4 ex_var4) 16,true: echo All example values summed up greater or equal to 16.,false: echo All example values summed up less than 16}] }注意上面的rule即一个动态联动规则是否判定为真的条件。它是一个Lua语句这里只一行语句在具体的实践层面上可以是多行的计算这里只支持一个语句。上面还给出当事件联动为真时要执行的动作例如当全球平均温度大于14度时就会触发事件 echo The planet Earth is freaking too hot也就是简单地调用/bin/sh输出一行信息。当该条件为假时则会触发另一个动作可选。 动态联动规则的实现 上面的JSON配置文件描述了我们抽象化的动态联动问题。笔者编写的演示例子会根据上面的信息构造一个Lua脚本用于计算三个联动规则是否成立 local ex_var1 1 local ex_var3 3 local ex_var5 5 local ex_var2 2 local ex_var4 4.2 function rulefunc_1()return (ex_var1 ex_var2 * 2 ex_var3 * 3) 14 end function rulefunc_2()return math.floor(ex_var4 * 5 / 4) ex_var5 end function rulefunc_3()return (ex_var1 ex_var2 ex_var3 ex_var4 ex_var4) 16 end function rulefunc_all()local link_tval_ 0link_tval_ link_tval_ ex_var1link_tval_ link_tval_ ex_var3link_tval_ link_tval_ ex_var5link_tval_ link_tval_ ex_var2link_tval_ link_tval_ ex_var4return link_tval_ end根据Lua的引用规则说明五个演示变量都是上面构造的四个函数的上级变量upvalue。注意上面的Lua函数rulefunc_2只引用了两个变量也就是说一些联动规则并不需要全部的状态量。当上面的代码编译为Lua字节码后如何通一个函数的上级变量索引来更新所有的上级变量呢这正是rulefunc_all函数的用处它引用了全部五个变量它的名称是固定的虽然它不会被调用但我们可以通过它来更新该构造脚本的全部上级变量。之后这个脚本会使用luaL_dostring API预编译为一个Lua状态机 rext_any_t rext_lua_new(const struct rext_var * lvar, int * errp) {...luaL_openlibs(L); /* load standard library */if (script ! NULL script[0] ! \0) {int ret;ret luaL_dostring(L, script);if (ret ! 0) {*errp EINVAL;lua_close(L);L NULL;}}注意到上面的配置信息给出了五个演示变量的初始值。这些值在判定一个联动规则是否被触发前需要被更新。笔者采用的方法正是上面提到的通过函数rulefunc_all来更新 int rext_upval_set(rext_any_t anyt, const struct rext_var * rfunc,int upindex, const struct rext_var * rval) {...ret rext_pushval(anyt, rval);if (ret 0) {lua_settop(L, oldtop);return -7;}valp lua_setupvalue(L, ntop, upindex);if (valp NULL) {lua_settop(L, oldtop);return -8;} 之后笔者简单编了5个变量的值来测试演示动态联动 let t_map: HashMapstr, f64 HashMap::from([(ex_var1, 1f64),(ex_var2, 2f64),(ex_var3, 3f64),(ex_var4, 4f64),(ex_var5, 5f64),]);linked.act(t_map);let t_map: HashMapstr, f64 HashMap::from([(ex_var1, 2f64),(ex_var2, 3f64),(ex_var3, 4f64),(ex_var4, 5f64),(ex_var5, 6f64),]);linked.act(t_map);动态联动的演示代码与结果 笔者提供了联动规则的演示代码感兴趣的可以从此处获取。它的正常运行需要Ubuntu系统下安装Lua5.1开发库及Rust编译器。以下是代码的下载、编译操作 sudo apt install lua5.1 liblua5.1-0-dev rust-full bindgen git clone https://github.com/jaqchen/linked-action.git cd linked-action ; rm -rf ./rustex/rustex.rs cargo build --release笔者运行的结果如下 Created Lua-state machine: 0x562e74aecfc0 Inserting ex_var5 1 Inserting ex_var4 2 Inserting ex_var3 3 Inserting ex_var1 4 Inserting ex_var2 5 Lua upvalues found: 5 The planet Earth is freaking too cold false: 0 (ex_var1 ex_var2 * 2 ex_var3 * 3) 14 Note that floor(ex_var4 * 5 / 4) ex_var5 false: 0 math.floor(ex_var4 * 5 / 4) ex_var5 All example values summed up less than 16 false: 0 (ex_var1 ex_var2 ex_var3 ex_var4 ex_var4) 16The planet Earth is freaking too hot true : 0 (ex_var1 ex_var2 * 2 ex_var3 * 3) 14 Note that floor(ex_var4 * 5 / 4) ex_var5 false: 0 math.floor(ex_var4 * 5 / 4) ex_var5 All example values summed up greater or equal to 16. true : 0 (ex_var1 ex_var2 ex_var3 ex_var4 ex_var4) 16至此我们就可以避免使用C/C实现复杂的联动规则是否为真的判断逻辑了。这不仅仅是提高了开发效率而且还避免过多的编码可能会引入的缺陷。
http://www.hkea.cn/news/14270955/

相关文章:

  • 河南省建设监理协会新网站学校部门网站建设
  • 建设一个房产网站赚钱吗应不应该购买老域名建设新网站
  • 建设一个人才网站需要的人才企业网站建设太原网站建设
  • 电子商务网站开发费用入账长安响应式网站建设
  • 自助建网站不需要域名关于书店网站开发实例的书
  • 海南省建设培训与执业资格注册中心网站做最精彩的绳艺网站
  • 营销型网站功能网站建设渠道员
  • 哪里长沙网站开发专业的微网站公司
  • 在iis上部署的网站本机无法浏览解决方法上海网站建设公
  • 郑州网站制作汉狮做网站属于什么技术
  • 橱柜手机网站模板微信分销网站建设比较好
  • 做文库类网站佛山专业做淘宝网站
  • 网站备案主体变更德阳建设银行招聘网站
  • 青岛市建设局网站停工专业制作存单
  • 招商网站建设哪家好做全屏网站图片显示不全
  • 如何做美食网站城乡建设网站证件查询
  • 网站微博代码深圳网络推广代理
  • ps国外教程网站创建外卖平台
  • 返利网站程序云南省地图
  • 杭州企业建站模板百度k了网站怎么办
  • 最新章节 62.一起来做网站吧wordpress 付费模板
  • 济南企业建站哪家做的好百度域名查询官网
  • 企业手机网站建设教程有哪些做h5的网站
  • 长沙推广网站自助模板网站建设做seo
  • 网站备案IP与空间网站开发需要投入多少时间
  • 可以下载新闻视频的网站南平建设局网站
  • 网站建设丶金手指下拉12游戏优化大师下载安装
  • 如何给自己开发的网站加域名夜间正能量不良网站
  • 代码命名 网站营销策划公司介绍
  • 潮州企业网站建设红杏直播