经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
大华门禁SDK二次开发(二)
来源:cnblogs  作者:我打农村来  时间:2018/11/23 10:20:51  对本文有异议

经过与大华技术支持的沟通,门禁服务程序已经开发好了,可以正常接收门禁开关事件,可以发送开门命令。基于项目实时性要求,这里使用SignalR实现门禁状态、控制命令的实时传送。

几种场景需求

根据SignalR的设计规则,Client端可以主动调用服务端Hub的多个方法,但是客户端被动接收消息的方法只能有一个
根据门禁功能需求,我们将Client分为两组:

  • doorclient:指Web客户端
  • doorserver:指门禁服务端

这样便于服务端区分Web客户端和门禁服务端这两类client。

image

项目中主要实现以下几个场景:

Web客户端初始加载,刷新全部门禁状态

image

  • A. 浏览器主动请求初始化门禁状态;
  • B. web服务端接收信息,并转发到doorserver组;
  • C. 门禁服务查询门禁状态,主动发送门禁状态列表;
  • D. web服务端接收消息,并根据connectId转发给指定浏览器。
  1. //web客户端
  2. chat.server.sendMessageByBrowser();
  3. // 定义AddMessage供服务器调用
  4. chat.client.AddMessage = function (result) {
  5. for (var i = 0; i < result.length; i++) {
  6. try {
  7. //前端响应门禁状态变化
  8. } catch (error) {
  9. }
  10. }
  11. };
  12. //web服务端
  13. /// <summary>
  14. /// 浏览器发送消息,向doorServer请求所有门禁状态,用于初始化门禁状态
  15. /// </summary>
  16. /// <param name="name"></param>
  17. public void SendMessageByBrowser()
  18. {
  19. var messageList = new List<DoorStateInfo>();
  20. var dc = new DoorStateInfo {ConnectId = Context.ConnectionId};
  21. messageList.Add(dc);
  22. Clients.Group("doorserver").AddMessage(messageList);
  23. }
  24. /// <summary>
  25. /// 门禁服务发送多条开关门消息给某个浏览器,hubserver转发给浏览器
  26. /// 浏览器id放在messagelist[0].ConnectId
  27. /// </summary>
  28. /// <param name="name"></param>
  29. /// <param name="messageList"></param>
  30. public void SendManyMessageByDoorServer(string name, List<DoorStateInfo> messageList)
  31. {
  32. Clients.Client(messageList[0].ConnectId).AddMessage(messageList);
  33. }
  34. //门禁服务端
  35. // 创建一个集线器代理对象
  36. HubProxy = Connection.CreateHubProxy("DoorAlarmHub");
  37. // 供服务端调用,将消息输出到消息列表框中
  38. HubProxy.On<string, List<DoorStateInfo>>("AddMessage", (message) =>
  39. {
  40. var alarmMsg = new AlarmMsg
  41. {
  42. Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  43. AlarmInfo = message,
  44. AlarmType = EM_ALARM_TYPE.ALARM_SIGNALR_QUERY
  45. };
  46. if (message != null && message.Count > 0)
  47. {
  48. //无门禁状态,为门禁查询命令
  49. if (message[0].DoorState == EM_NET_DOOR_STATUS_TYPE.EM_NET_DOOR_STATUS_UNKNOWN)
  50. {
  51. alarmMsg.AlarmType = EM_ALARM_TYPE.ALARM_SIGNALR_QUERY;
  52. }
  53. //有门禁状态,为门禁控制命令
  54. else
  55. {
  56. alarmMsg.AlarmType = EM_ALARM_TYPE.ALARM_SIGNALR_CONTROL;
  57. }
  58. m_AlarmMsgQueue.Enqueue(alarmMsg);
  59. }
  60. });

Web端请求打开某个门

image

  • A. 浏览器主动请求开门;
  • B. web服务端接收信息,并转发到doorserver组;
  • C. 门禁服务发送开门命令,接收到门禁状态变化消息后,主动发送门禁状态变化信息;
  • D. web服务端接收信息,并转发到doorclient组。
  1. //web服务端
  2. /// <summary>
  3. /// 浏览器端调用,请求开门
  4. /// </summary>
  5. public void SendOpenDoorByBrowser(/*业务参数用于标识门禁*/)
  6. {
  7. var messageList = new List<DoorStateInfo>();
  8. //业务处理
  9. ...
  10. Clients.Group("doorserver").AddMessage("doorserver", messageList);
  11. }
  12. /// <summary>
  13. /// 门禁服务发送开关门消息,hubserver转发给浏览器
  14. /// </summary>
  15. /// <param name="name"></param>
  16. /// <param name="message"></param>
  17. public void SendOneMessageByDoorServer(string name, DoorStateInfo message)
  18. {
  19. //业务处理
  20. Clients.Group("doorclient").AddMessage(message);
  21. }

门禁服务发送门禁状态变化

image

  • A.这种情况主要发生在门禁刷卡等开门操作,引起的门禁状态变化,门禁服务接收到消息后,主动发送门禁状态变化信息;
  • B.web服务端接收信息,并转发到doorclient组。

几个问题说明

AddMessage方法

客户端使用AddMessage接收server转发来的消息,由于client监听接收消息只能有一个方法,但是存在单个门禁状态变化消息和多个两种情况。因此AddMessage的消息参数统一使用List<Message>,然后在server端转发时相应加入业务标记,便于client端处理。

门禁服务程序的事件机制

门禁服务程序采用事件机制

  • 刷卡等开发事件接收到后,门禁服务会主动进行消息发送,通知所有浏览器更新相应门禁状态;
  • 浏览器初始化请求所有门禁状态时,由于消息通信是不能直接返回的,因此信息传递时携带connectId,用于下一条消息确认发送对象;
  • 与初始化请求一样,浏览器发送开门命令后,门禁服务接收到开门命令发送给大华门禁服务器后,会在收到门禁状态变化事件时,向doorclient组发送消息。两条消息是相对独立的。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号