网关监控点轮询流程

      最近在学习监控点的轮询。因为网关不能一直在处理各个设备的数据,所以需要监控点上报数据,这时网关就需要隔一段时间对监控点进行轮询。(因为刚开始学,所以有错误希望能够批评指出)

 

1.监控点轮询:

1.1监控点开始轮询和一些初始判断

 

程序进行到send_broad_time_sync(),这是关于时钟控制的函数,用于定时判断的。在这个函数里面当达到500ms时就report_count++。

这样在main函数中,判断report_count不为0,就进入inquire_device_data(),这个是监控点轮询的函数。

当进入函数中,需要判断目前轮询监控点指针是否为空,若为空,则将指针指向监控点链表最前面。若为空或者上报状态上不上报就rerun。

                               网关监控点轮询流程_第1张图片

 

1.2当端口处于可发送状态

如果轮询监控点指针不为空,则去访问每个监控点看是否有需要写数据的,也就是要发送的。则将轮询监控点指针指向该监控点。

然后接着判断该监控点是否达到发送周期,若可以,则发送数据。发送有两种情况,一种是在本地,一种是不在本地,处理方式不一样。这个监控点处理完,则指向下一个监控点。如此循环,直到遍历所有监控点。

                               网关监控点轮询流程_第2张图片

1.2.1监控点在本地

若监控点是在本地,则先对要发送数据包进行整理,然后要判断要发送modbus的类型,将要发送的数据放到modbus_pdu数组。然后通过CommandMessageHandle(),对modbus数据进行解析,然后做出相应的操作,再是监控点的接收,也就是监控点下面设备的回复处理。最后对发送状态置为发送成功

网关监控点轮询流程_第3张图片

 

1.2.2监控点不在本地

   当监控点不在本地时,先解析一些关键数据,然后还是通过pack_modbus_pdu()函数组建modbus数据包,然后通过判断端口来判断是发送到哪个端口的数据接收及处理

                                      网关监控点轮询流程_第4张图片

     像485发送的话,假如485发送完之后,然后如果有数据回复就会进入串口中断,然后进入定时器2中断。定时器中断服务函数里面有读取缓存区read_Usart1_DMA_FIFO(),这个和lora里面一样的.。只是最后是调用write_rs485_232_buffer(),对数据进行上报

                                                网关监控点轮询流程_第5张图片

1.3端口为不可发送状态

直接ruturn

1.3.1端口为发送成功状态

如果之前监控点在本地的话,上次本地发送完之后,将端口置为发送完成状态,那就进入这一部分。如果是不在本地的话,发送完,在定时器中断那边有个置为发送成功。

然后对已发送完的监控点进行判断是否需要应答,还有离线监测。最后置为可发送状态

网关监控点轮询流程_第6张图片

总的来说轮询就是一应一答,就是500ms过来看一下是否发送,然后500ms回来看看监控点的状况,然后修改监控点状态。

你可能感兴趣的:(物联网,lora,智能传感器)