物联网海量设备心跳注册,脱网清除——多线程高并发互斥锁落地

1.应用背景

在物联网应用场景中,需要维护很多个设备的连接,比如基于TCP socket通信的长连接,目的是为了获取设备采集的信息,反向控制设备的数字开关或者模拟量。我们把这些TCP长连接都放入了基于线程安全的ConcurrentDictionary激活字典表中,IP地址作为key,设备箱领域模型作为value。我们需要把激活设备箱的字典表维护好,需要将超时没有心跳的设备,我们可以称之为脱网设备,给清理出激活字典表,写入到脱网告警字典表中去。当脱网设备下次再有心跳时,可以再次移入到激活字典表中,从而再产生恢复告警,进行一系列其他动作。

2.整体框架

2.1.心跳注册框架

2.1.1.海量设备

因为要模拟海量设备的TCP场景,我们利用模拟器生成了12000台模拟设备。8台真实设备。

2.1.2.心跳上报Handler流程

详细心跳上报流程详见上述框架图

  • 第一次建立TCP长连接,并且上报心跳报文;
  • socket缓存会先处理TCP中存在的粘包,具体方法可参见此篇博文 TCP粘包处理现象及其解决方案——基于NewLife.Net网络库的管道式帧长粘包处理方法
  • 然后会触发OnReceive中的e事件,从而传入粘包处理后的message;
  • 判断包有效性,因为这方面比较简单,根据不同协议写一个类来处理即可,这里不再展开;
  • 包有效载荷的CRC判断,具体实现可参见此篇博文 基于Modbus三种CRC16校验方法的性能对比;
  • 包类型解析(这里特指解析出心跳包);
  • 心跳包解析,具体可参见这两篇博文。深入浅出C#结构体——封装以太网心跳包的结构为例, 类与结构体性能对比测试——以封装网络心跳包为例
  • 最终将设备新增激活字典表(第一次心跳)或者在激活字典表刷新心跳时间(非第一次心跳)。

突然发现我可以写一个物联网的采集系统的系列了,组织一个目录。希望自己坚持下去吧。

2.2.脱网清理框架

2.2.1.激活字典表清理脱网设备方法

原理很简单,遍历字典表中超过设置的检测周期,筛选到一个字典的IEnumerable中去,然后在激活字典表中删除对应超时key(这里就是指IP地址)即可。当然这里的_internal周期可以*N,多个周期,自行在配置文件中设置即可,配置文件如下:

 "ipboxNumStaticInternal": 12
    public static void DeleteDeadBoxFromActiveBox(in _internal)
    {
        {
            var outTime = DateTime.Now.AddSeconds(-_internal);
            var 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值