大华门禁SDK二次开发(二)

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

几种场景需求

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

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

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

image

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

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

image

  • A. 浏览器主动请求初始化门禁状态;
  • B. web服务端接收信息,并转发到doorserver组;
  • C. 门禁服务查询门禁状态,主动发送门禁状态列表;
  • D. web服务端接收消息,并根据connectId转发给指定浏览器。
//web客户端 chat.server.sendMessageByBrowser();  // 定义AddMessage供服务器调用 chat.client.AddMessage = function (result) {     for (var i = 0; i < result.length; i++) {         try {             //前端响应门禁状态变化         } catch (error) {         }     } };  //web服务端 /// <summary> /// 浏览器发送消息,向doorServer请求所有门禁状态,用于初始化门禁状态 /// </summary> /// <param name="name"></param> public void SendMessageByBrowser() {     var messageList = new List<DoorStateInfo>();     var dc = new DoorStateInfo {ConnectId = Context.ConnectionId};     messageList.Add(dc);     Clients.Group("doorserver").AddMessage(messageList); }   /// <summary> /// 门禁服务发送多条开关门消息给某个浏览器,hubserver转发给浏览器 /// 浏览器id放在messagelist[0].ConnectId /// </summary> /// <param name="name"></param> /// <param name="messageList"></param> public void SendManyMessageByDoorServer(string name, List<DoorStateInfo> messageList) {     Clients.Client(messageList[0].ConnectId).AddMessage(messageList); }  //门禁服务端 // 创建一个集线器代理对象 HubProxy = Connection.CreateHubProxy("DoorAlarmHub");  // 供服务端调用,将消息输出到消息列表框中 HubProxy.On<string, List<DoorStateInfo>>("AddMessage", (message) => {     var alarmMsg = new AlarmMsg     {         Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),         AlarmInfo = message,         AlarmType = EM_ALARM_TYPE.ALARM_SIGNALR_QUERY     };     if (message != null && message.Count > 0)      {         //无门禁状态,为门禁查询命令         if (message[0].DoorState == EM_NET_DOOR_STATUS_TYPE.EM_NET_DOOR_STATUS_UNKNOWN)         {             alarmMsg.AlarmType = EM_ALARM_TYPE.ALARM_SIGNALR_QUERY;         }         //有门禁状态,为门禁控制命令         else          {             alarmMsg.AlarmType = EM_ALARM_TYPE.ALARM_SIGNALR_CONTROL;         }         m_AlarmMsgQueue.Enqueue(alarmMsg);                         } });

Web端请求打开某个门

image

  • A. 浏览器主动请求开门;
  • B. web服务端接收信息,并转发到doorserver组;
  • C. 门禁服务发送开门命令,接收到门禁状态变化消息后,主动发送门禁状态变化信息;
  • D. web服务端接收信息,并转发到doorclient组。
//web服务端 /// <summary> 
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信