引言
当下万物物联的时代,各行各业对智能门禁系统的需求是越来越大,例如城市交通出行的门禁管理,企业园区的门禁管理,居民小区的智能门禁等,甚至于现在家庭的智能门锁,这些门禁系统的快速迭代正在改善大家的体验,以此可以看出`智能门禁`的重要性。

问题

那么此时需求产生了,博主也想要做一款服务于我们公司的智能门禁系统,做一套智能门禁系统都需要考虑哪些东西呢,首先要想到的是一个可以控制门开关并且具备简单计算能力的终端设备,终端设备需要具备`开门能力`和`计算能力`,我们还想让他具备`入网能力`,和`二维码扫描能力`,还有一点很重要的是需要支持我们指定的二维码格式,因为我们员工的工牌已经印发,其中工牌上印的二维码是我们私有的格式,所以需要支持我们的解码能力。

思路

博主在网上翻阅各种相关资料,也找了好几个硬件的厂商,大概了解到的信息就是,没有直接符合我们需求的门禁终端设备,只能我们找厂商定制,但是定制的成本偏高而且时间周期比较长,最终筛选出一款微光互联的设备,他们的终端设备支持需求定制(这点并不特殊),但是他们提供良好的二次开发生态(这是重点),大概了解了下他们的二次开发生态,是通过屏蔽硬件的抽象性,以比较好理解的形象化的方式暴露接口,以被应用应用调用,并且是通过Lua脚本语言进行开发,细致了解了下生态,并且考虑到微光互联做门禁方面的产品很成熟,感觉还是比较靠谱,就选择了这种方案,那么就申请采购吧。

实施

在焦急等待后,终于拿到终端设备和相关配套,设备清单(CC101控制板、M300扫码刷卡外设、门磁锁、触摸开关、485转usb线)当拿到这些设备后第一时间先按照说明接线通电,梳理了下交互流程,硬件的交互流程可以满足公司门禁的安装部署,再下一步就是给终端设备赋能,进入业务定制开发,其实微光互联这块设备自身也有一套标准的门禁控制系统可以直接使用,但考虑到工卡二维码格式问题,需要定制,不过好的是官网的文档和教程还是比较清晰的。

编码

整理应用需求,博主和行政同事沟通后,了解到其中核心的需求是想要通过识别员工工牌二维码的方式进出公司,并且可以将通行记录对接公司内部OA系统做考勤核对。拿到详细需求,开干。

分享

从多弦官网了解到微光互联的终端设备支持Lua脚本二次开发,博主之前只对js脚本语言有过了解,但在网上花半个小时简单学习了下Lua的语法,就尝试简单上手开发了,不过多弦官网提供的Demo样例还是比较全比较丰富的,提供的Demo和组件足够博主需求的使用,比如终端设备和OA系统交互使用的MQTT(类似HTTP的物联网通讯协议)网络协议,以及终端设备要存储员工二维码信息可以使用sqlite(结构化存储组件),以上硬件准备好了,软件的解决方案也准备好了,下一步就是写逻辑代码。

博主下面来分享下几个核心的逻辑点:监听扫码输入的动作:发生扫码通行时,会映射调用到[execute_cmd_06]方法,在该方法中处理验证通行逻辑,详细逻辑可参照 官方Demo

-- 解析请求通行数据
function channel_service.execute_cmd_06(pack)-- 获取请求通行类型local id_type = tonumber(string.sub(pack["data"], 1, 2), 16)-- 获取请求通行值local id_code = string.sub(pack["data"], 4, #pack["data"])-- 验证请求通行值是否允许通行logger.info("---------------------")logger.info(id_type)logger.info(id_code)return channel_service.check_passage(id_code, id_type)
end

根据扫码输入内容来验证通行:在白名单表中查询是否可以通行,允许通行的话控制门磁的开启,和上传通行记录 详细逻辑可参照 官方Demo

-- 校验通行
function channel_service.check_passage(identityCode, identityType)-- 根据申请通行类型和申请通行标识查询白名单表,校验是否可以通行local res = t_permission.queryWhiteListByCode(identityCode, identityType)local msg_obj = {}local res_data = {}if res ~= nil and res["code"] ~= nil and res["type"] ~= nil and res["id"] thenlogger.info("校验成功,允许通行")-- 控制门磁打开,开门gpio.gpio_set_value(70, 1)-- 指定开门时长(配置中取)os_util.sleep(config.get("openTime"))-- 控制门磁关闭,关门gpio.gpio_set_value(70, 0)-- 构建通行成功记录msg_obj["topic"] = "20220316/event/access"res_data["IdentityCode"] = res["code"]res_data["IdentityType"] = res["type"]-- 通行状态 0:通行成功res_data["result"] = 0msg_obj["data"] = res_datalocal queue_msg = dx_json.encode(msg_obj)queue_msg = dx_json.encode(msg_obj)-- 通行上送dx_queue.push(mqtt_queue, queue_msg, 500)return 0elselogger.info("校验失败,拒绝通行")-- 构建通行失败记录msg_obj["topic"] = "20220316/event/access"res_data["identityCode"] = identityCoderes_data["identityCode"] = identityType-- 通行状态 1:通行失败res_data["result"] = 1msg_obj["data"] = res_datalocal queue_msg = dx_json.encode(msg_obj)-- 拒绝通行状态上送dx_queue.push(mqtt_queue, queue_msg, 500)return 1end
end

通行白名单的存储:用于存储员工信息 详细逻辑可参照 官方Demo

-- 通行白名单的存储-新增
function t_permission.save_whitelists(data)local status, errorString =dx_sqlite3.execute(sqlite_client,"INSERT INTO whitelists values('" ..data.type .. ",'" .. data.code .. "','" .. data.name .. "')")if status == 0 thenlog.error(errorString)return falseendreturn true
end

通行白名单的上送:构建上送格式,通过mqtt发送请求函数上送 详细逻辑可参照 官方Demo

-- 通行记录上送
function mqtt_service.access(mqtt_msg)local de_msg = dx_json.decode(mqtt_msg)-- 构建通行记录local record = {code = de_msg.IdentityCode,type = de_msg.IdentityType,time = os.time(),result = de_msg.result}local record_array = {record}-- 构建通行记录约定格式local resp_obj = {serialNo = randomStr(10),uuid = device_addr,data = record_array,sign = ""}-- 调用通用发送mqtt请求函数callback_common(publish_topics.EVENT_TOPIC_ACCESS, resp_obj)return true
end

调试

代码初步写完了,开始调试吧,官方提供了配套的调试工具,工具可以把刚刚写完的代码,推送至终端设备,然后触发重启可以自动执行,并且代码中的logger日志还可以在工具上打印出来便于调试,这个功能太实用了,在整理帖子前,博主以上的代码就是基于调试工具快速集成出来的,当然也是有点小瑕疵的,就是不能debug,希望后边官方可以提供debug的能力,看图1-2为博主调试的日志打印。

lua开发门禁引用效果展示-20221118

总结

经过三四个小时的奋斗终于基本完成,当然以上展示的代码是几个核心点的代码,整体业务流程还是比较全面的,来吧简单展示下调试的效果,整体总结下来,多弦官网提供的这套二次开发生态还是很不错的,因为如果像我们公司这样的客户是比较友好的,提供二次开发可以有很大的扩展空间,并且采用脚本化的应用开发大大的降低了硬件定制的难度。

利用Lua开发一个门禁设备相关推荐

  1. 利用java开发一个猜数字幸运小游戏:游戏规则如下

    package com.day04.www;import java.util.Random; import java.util.Scanner;public class day04 {public s ...

  2. 利用MyEclipse开发一个调用webservice接口的程序

    上一篇文章我们已经学习了如何使用Java 工具MyEclipse开发一个webservice接口,那么接口开发好了如何调用?接下来我们就来解决这个问题. 1:首先随便创建一个Java project选 ...

  3. java 双击_利用java开发一个双击执行的小程序

    之前我们利用java写了很多东西,但是好像都没有什么实际意义. 因为有意义桌面小程序怎么都得有个界面,可是界面又不太好搞.或者 了解到这一层的人就少之又少了. 呀,是不是还得开辟一些版面来介绍awt和 ...

  4. 利用c#开发一个telnet unix服务器或者防火墙的小工具(转)

    因为工作原因,需要定期从AIX服务器和cisco防火墙统计一些信息,于是决定自己写个小程序利用telnet协议实现这个功能. 利用SOCKET建立与服务器之间的连接,之后我们就可以利用程序直接发送命令 ...

  5. 利用canvas开发一个绘图板

    [底部附有制作绘图板完整代码] 编码过程中会遇到一些原生js的技术,小编会先罗列出来. 1.在for循环中为多个元素利用索引值绑定事件,会产生异步问题. 问题所在:在事件代码内部可以进行各种操作,就是 ...

  6. 熬了三个大夜利用Python开发一个炸金花小游戏,注意别玩上瘾了~~(附完整源码)

    大家好,我是你们的好朋友王老师~ 众所周知扑克牌可谓是居家旅行.桌面交友的必备道具,今天我们用 Python 来实现一个类似炸金花的扑克牌小游戏,先来看一下基本的游戏规则. 炸(诈)金花又叫三张牌, ...

  7. mysql导出为lua配置表文件_利用lua生成一个导出数据库的bat脚本文件

    function getExportDbSql(db, index)-- 获取导出一个数据库实例的sql语句 local sql = string.format('mysqldump -u%s -p% ...

  8. python游戏最简单代码-如何利用Python开发一个简单的猜数字游戏

    前言 本文介绍如何使用Python制作一个简单的猜数字游戏. 游戏规则 玩家将猜测一个数字.如果猜测是正确的,玩家赢.如果不正确,程序会提示玩家所猜的数字与实际数字相比是"大(high)&q ...

  9. 利用python开发一个竞争情报系统_一个基于python的即时通信程序

    5月17日更新: 广播信息.用户列表.信息确认列表以及通信信息,从原来的用字符串存储改为使用字典来存储,使代码更清晰,更容易扩展,具体更改的格式如下: 广播信息(上线): {'status': 信息状 ...

最新文章

  1. 使用LaTeX排版如何方便地引用多篇参考文献(不使用插件)
  2. COM:养分平衡在塑造植物根-真菌互作中的作用:事实与猜想
  3. 微服务架构及分布式事务解决方案
  4. Android学习计划制定
  5. 13.2.6 会话跟踪技术
  6. SAP CRM产品主数据明细页面无法打开的调试步骤
  7. django之关系及查询,数据类型,约束,分页
  8. C - 查找回文质数
  9. 车辆贷款违约预测 Top1(2021科大讯飞)
  10. HDU-1255 覆盖的面积 矩形面积交
  11. button按钮提交form表单的js方法不要使用关键字login
  12. Ubuntu GCC编译器升级
  13. Taskctl安装以及简单使用
  14. AD19快速制作多管脚元件符号
  15. ubuntu18.04两台电脑ntp时间同步
  16. 名帖358 文天祥 草书《谢昌元座右自警辞》
  17. JavaWeb学习笔记(JavaScript)
  18. 微信小程序瀑布流的实现
  19. 需求分析挑战之旅(疯狂的订餐系统)(2)——需求分析的大道理
  20. MATLAB命令大全和矩阵操作大全

热门文章

  1. 勒索病毒资料(腾讯管家整理)
  2. 【推荐系统】推荐系统-基础算法 基于社交网络的算法
  3. 张萌韩墨羽——Android蓝牙
  4. 启明智显分享|WIFI蓝牙智能猫眼门铃应用方案
  5. (附源码)计算机毕业设计SSM智慧医疗系统
  6. 算法 | 输出扑克牌中的最大5连牌/6连牌/7连牌顺子 - Java实现
  7. Python_map()函数,规范英文名字
  8. 学校计算机室发生火灾自救,强化师生消防意识 筑牢学校安全堡垒
  9. java的多态和动态绑定机制
  10. RedHat6.5虚拟机架设Redis和Kafka伪集群(2018.8.21最新重要补充!)