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

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

几种场景需求

根据SignalR的设计规则,Client端可以主动调用服务端Hub的多个方法,但是客户端被动接收消息的方法只能有一个

根据门禁功能需求,我们将Client分为两组:

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

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

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

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

  • 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端请求打开某个门

  • A. 浏览器主动请求开门;
  • B. web服务端接收信息,并转发到doorserver组;
  • C. 门禁服务发送开门命令,接收到门禁状态变化消息后,主动发送门禁状态变化信息;
  • D. web服务端接收信息,并转发到doorclient组。
//web服务端
/// <summary>
/// 浏览器端调用,请求开门
/// </summary>
public void SendOpenDoorByBrowser(/*业务参数用于标识门禁*/)
{

    var messageList = new List<DoorStateInfo>();

    //业务处理
    ...

    Clients.Group("doorserver").AddMessage("doorserver", messageList);
}

/// <summary>
/// 门禁服务发送开关门消息,hubserver转发给浏览器
/// </summary>
/// <param name="name"></param>
/// <param name="message"></param>
public void SendOneMessageByDoorServer(string name, DoorStateInfo message)
{

    //业务处理
    Clients.Group("doorclient").AddMessage(message);
}

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

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

几个问题说明

AddMessage方法

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

门禁服务程序的事件机制

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

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

原文地址:https://www.cnblogs.com/zhangdk/p/SignalR.html

时间: 2024-10-06 21:28:53

大华门禁SDK二次开发(二)的相关文章

浏览器低延时播放RTSP安防摄像头/海康大华硬盘录像机/NVR/流媒体服务器硬件开发机设备失去授权如何解决?

EasyNVR开发机是通过定制的硬件机器来运行对应的流媒体软件,因此硬件的授权是和开发机内部的软件相互绑定的,因此失去授权实际是软件授权出现了问题. 解决问题: 之前版本的授权方式是通过绑定机器的机器码来,设置对应的激活码来给对应的硬件设备上的软件进行授权,软件读取到对应的成功的激活码就进行成功授权. EasyNVR3.3.1版本正对软件版本授权有了优化,将之前的单纯的激活方式改为了Pem文件授权,更加方便了客户的授权,也提高了授权的安全性和稳定性.因此对应出现硬件授权不稳定的,可以联系相关技术

day58——Saltstack二次开发(二)

Saltstack的httpapi 1.在官网跟新yum源信息: 2.yum安装 yum install -y gcc make python-devel libffi-devel salt-api openssl pip install cherrypy 生成证书: #cd /etc/salt #mkdir keycrt #cd keycrt #openssl genrsa –out key.pem 4098 #openssl req –new –x 509 –key key.pem –out

灵敏便捷人脸门禁

人脸辨认智能门禁,打破需求刷卡.暗码.指纹的传统门禁边界,更优于二维码扫码开门的防盗办法,经过对人脸的辨认作为门禁敞开的钥匙,它不仅免去了忘带钥匙或卡的烦恼,一起由于人脸辨认门禁体系无需任何介质开门,而节省了不少本钱,如人员变化不需求替换门锁.钥匙.IC卡等,只需求从头对人脸进行注册即可:别的人脸辨认门禁体系还可依据收支人员状况设置门禁权限,包含不一起间段,不同的门禁点等.真实做到出门带张脸,进出自在心.目前我公司隆重推出由杭州观隐科技有限公司研制的人脸辨认智能门禁,结合手机端微信小程序.电脑端

海康门禁-开,关,常开,常关,授权,清权

using System; using System.Collections.Generic; using System.Linq; using System.Text; using AccessBusiness.Common; using System.Runtime.InteropServices; namespace AccessBusiness { public class HIV { /// <summary> /// 初始化门禁SDK /// </summary> //

什么是php二次开发,怎么做php二次开发?

什么是php二次开发 所谓的二次开发,简单的说就是修改别人的东西,变成你想要的东西,插件基本属于高端了,根据现有的程序的不足,加以改进修饰,然后达到自己想要实现的功能和效果. 怎么做php二次开发 二次开发和一次开发不同的地方在于你是要先看懂别人的代码再去做,二次开发,首先你需要知道自己对什么程序进行二次开发,比如一些招聘信息上会写Discuz二次开发,ShopEX二次开发.这些都是对已经成型的程序进行的功能性扩展开发. 第一,你要有这个开 源 产 品的所用语言的语言基础,就是能看懂代码是最基本

http服务器二次开发SDK

1. 概述 http协议能够将可见协议与二进制协议有效融合,并且其结构良好,分头域与实体两部分,而且头域的结构一致,并能够随意扩展.我们可以基于头域结构的形式,模拟MFC消息结构,设计一个高效,易扩展的解析架构. 本程序的设计初衷就是模拟MFC的消息机制来实现http头域的解析,并使得能够基于该结构实现私有协议的解析,实现http协议的基本框架,使得二次开发时能够基于该框架快速实现开发.使用C++开发网站,完全实现界面与数据分开,使得C++的程序员们也能够快速开发基于网页的程序. 如果需要基于本

数据层交换和高性能并发处理(开源ETL大数据治理工具--KETTLE使用及二次开发 )

ETL是什么?为什么要使用ETL?KETTLE是什么?为什么要学KETTLE? ETL是数据的抽取清洗转换加载的过程,是数据进入数据仓库进行大数据分析的载入过程,目前流行的数据进入仓库的过程有两种形式,一种是进入数据库后再进行清洗和转换,另外一条路线是首先进行清洗转换再进入数据库,我们的ETL属于后者. 大数据的利器大家可能普遍说是hadoop,但是大家要知道如果我们不做预先的清洗和转换处理,我们进入hadoop后仅通过mapreduce进行数据清洗转换再进行分析,垃圾数据会导致我们的磁盘占用量

Tiptop二次开发两大宝典

易拓GP 4gl二次开发两大宝典,深度开发使用文档工具,打包分享. 内含文件: Genero BDL HB 2.0 简体中文版.pdf Genero Studio 4GL官方开发手册.pdf 下载地址:http://download.csdn.net/detail/wahaa591/8770791

如何通过二维码门禁实现微信开门

如何通过二维码门禁实现微信开门是现下许多客户关心的问题,塞伯罗斯对此进行多番研究,如何让二维码门禁与微信二维码相互作用,微信小程序的诞生便是链接其中的奥秘了,二维码门禁中的二维码读头通过扫描微信小程序生成的微信二维码,来对二维码门禁发送指令,从而实现二维码门禁使用微信开门.或许会有人觉得,这样安全性能是否降低了?答案是:不会的.首先,微信小程序是需要通过手机注册后,方可进行使用,与二维码门禁的后台管理相配合,比起APP开门,节省了不少手机空间的同时还能实现快速开门: 其次,微信小程序生成的二维码