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