前言

本文可在https://paw5zx.github.io/SICK-Ranger3-source-code-analysis-01/中阅读,体验更加

简单分析一下SICK Ranger3源码中断线重连的实现,这一块算是比较容易的,先择出来分析一下。

代码示例仅贴出关键部分以便分析

使用SDK版本为3.4.2.6

断线重连官方例程:Demo_R3_callback_with_heartbeat.cpp

断线检测

断线重连可以划分为两步,首先检测相机断线并通知,然后用户在收到通知后进行重连操作。我们先看SICK如何实现断线检测。

断线检测机制内置于SICK SDK中,由SICK SDK管理:

// file: Ranger.cpp
EXPORT_TO_DLL CAM_STATUS
Ranger3::connectCamera(CallbackEvent_HeartBeats pCallback, const uint32_t& microSecond, void * any)
{
try{
auto e = connectCamera();
if(e == CAM_STATUS::All_OK)
{
m_heartbeat_is_on = 1;
...
// 开启心跳检测线程
auto _thread = std::make_shared<std::thread>(&Ranger3::_check_HeartBeats_run, this);
_thread->detach();
}
return e;
}
...
} void
Ranger3::_check_HeartBeats_run()
{
while (m_heartbeat_is_on==1)
{
__sleep1MS(m_heartbeat_interval);
...
try {
Str value("");
// 设备在线,不抛异常,反之,抛出异常
m_Param.getParameter(m_deviceNodeMap, "DeviceTemperature", value);
...
}
catch (...) {
...
}
}
}

可以看出,断线检测机制很简单,就是分离一个线程,循环访问相机寄存器(SICK的实现是通过定时获取设备温度访问相机寄存器),若访问不到(失败),就意味着相机已离线。

{% notel purple Paw5zx注: %}

{% endnotel %}

断线通知

断线通知机制同样内置于SICK SDK中:在检测到设备离线后,调用注册好的回调函数(注册过程将在下文介绍)

// file: Ranger.cpp
void
Ranger3::_check_HeartBeats_run()
{
while (m_heartbeat_is_on==1)
{
__sleep1MS(m_heartbeat_interval);
...
try {
Str value("");
// 设备在线,不抛异常,反之,抛出异常
m_Param.getParameter(m_deviceNodeMap, "DeviceTemperature", value);
...
}
catch (...) {
// 一些资源释放操作
...
// m_on_lost_function为注册好的回调函数对象
// 设备离线,访问寄存器失败,捕获异常,调用m_on_lost_function
auto _thread = std::make_shared<std::thread>(m_on_lost_function, &m_DeviceName, &m_DeviceIP, &m_on_lost_mac, &msg, m_on_lost_inputs);
_thread->join();
return;
}
}
}

重连实现

重连机制的具体实现由用户进行。在例程Demo_R3_callback_with_heartbeat.cpp中,由用户自定义一个回调函数(在相机离线时会被调用),回调内循环对相机进行重连操作。用户在连接相机时注册这个回调

用户层代码:

// file: Demo_R3_callback_with_heartbeat.cpp

// 用户定义的回调函数,在相机断开连接时被调用
void SICK_CALLBACK
on_lost_device_Demo_R3_callback_with_heartbeat(std::string* name, std::string* ip, std::string* mac, std::string* msg, void * pR3)
{
auto pCam = (SickCam::Ranger3*)pR3;
while (true)
{
// 根据相机对象存储的设备信息对物理相机进行重连操作,不展开说明了
auto ec = pCam->reconnectCamera();
...
__sleep1MS(1000);
}
}
// 连接相机时注册回调
auto err = pCam1->connectCamera(on_lost_device_Demo_R3_callback_with_heartbeat, 1000, pCam1.get());

在SICK SDK中,注册过程会:

  • 将用户注册的on_lost_device_Demo_R3_callback_with_heartbeat赋值给m_on_lost_function
  • 将用户传递上下文信息any赋值给m_on_lost_inputs
// file: Ranger3.h
typedef std::function<void(std::string* name, std::string* ip, std::string* mac, std::string* msg, void* any)> CallbackEvent_HeartBeats; // file: Ranger.cpp
/*
[in] – pCallback 当失去心跳时,将调用由用户定义的回调函数。相应的处理可以在此函数中执行。
[in] – microSecond 读取心跳的时间间隔,单位毫秒,推荐值为 10 000;
[in] – any 在失去心跳的响应函数(CallbackEvent_HeartBeats)中,该指针将作为输入参数,由用户定义。
*/
EXPORT_TO_DLL CAM_STATUS
Ranger3::connectCamera(CallbackEvent_HeartBeats pCallback, const uint32_t& microSecond, void * any)
{
try{
auto e = connectCamera();
if(e == CAM_STATUS::All_OK)
{
...
m_on_lost_function = pCallback;
m_on_lost_inputs = any;
auto _thread = std::make_shared<std::thread>(&Ranger3::_check_HeartBeats_run, this);
_thread->detach();
}
return e;
}
...
}

注册完毕后,当相机出现离线情况,就如上文所述,SDK会调用注册的回调函数进行重连。

SICK Ranger3源码分析——断线重连的更多相关文章

  1. 源码分析——迁移学习Inception V3网络重训练实现图片分类

    1. 前言 近些年来,随着以卷积神经网络(CNN)为代表的深度学习在图像识别领域的突破,越来越多的图像识别算法不断涌现.在去年,我们初步成功尝试了图像识别在测试领域的应用:将网站样式错乱问题.无线领域 ...

  2. 鸿蒙内核源码分析(重定位篇) | 与国际接轨的对外部发言人 | 百篇博客分析OpenHarmony源码 | v55.01

    百篇博客系列篇.本篇为: v55.xx 鸿蒙内核源码分析(重定位篇) | 与国际接轨的对外部发言人 | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应用程 ...

  3. Redisson分布式锁学习总结:可重入锁 RedissonLock#lock 获取锁源码分析

    原文:Redisson分布式锁学习总结:可重入锁 RedissonLock#lock 获取锁源码分析 一.RedissonLock#lock 源码分析 1.根据锁key计算出 slot,一个slot对 ...

  4. Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】

    一.前言 我们在实现使用Redis实现分布式锁,最开始一般使用SET resource-name anystring NX EX max-lock-time进行加锁,使用Lua脚本保证原子性进行实现释 ...

  5. [源码分析]读写锁ReentrantReadWriteLock

    一.简介 读写锁. 读锁之间是共享的. 写锁是独占的. 首先声明一点: 我在分析源码的时候, 把jdk源码复制出来进行中文的注释, 有时还进行编译调试什么的, 为了避免和jdk原生的类混淆, 我在类前 ...

  6. ABP源码分析四十二:ZERO的身份认证

    ABP Zero模块通过自定义实现Asp.Net Identity完成身份认证功能, 对Asp.Net Identity做了较大幅度的扩展.同时重写了ABP核心模块中的permission功能,以实现 ...

  7. ABP源码分析四十五:ABP ZERO中的EntityFramework模块

    AbpZeroDbContext:配置ABP.Zero中定义的entity的Dbset EntityFrameworkModelBuilderExtensions:给PrimitiveProperty ...

  8. JDK1.8 HashMap 源码分析

    一.概述 以键值对的形式存储,是基于Map接口的实现,可以接收null的键值,不保证有序(比如插入顺序),存储着Entry(hash, key, value, next)对象. 二.示例 public ...

  9. MyBatis源码分析(5)——内置DataSource实现

    @(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...

  10. Duilib源码分析(六)整体流程

    在<Duilib源码分析(一)整体框架>.<Duilib源码分析(二)控件构造器—CDialogBuilder>以及<Duilib源码分析(三)XML解析器—CMarku ...

随机推荐

  1. shell之变量默认值

    {var:-default_value}当var 不存在,或者值为空时,返回default_value name不存在,返回了一个默认值,但是name并没有改变, 后续不可访问 $ set -u # ...

  2. Error: Application Server not specified

    在IDEA中tomcat不能运行,点开Edit Configuration发现如下图情况:tomcat图标猫上有个红叉,且下面有警告提示:Error: Application Server not s ...

  3. Windows10 Linux子系统安装图形化界面的两种方法及其对比

    理论上讲,所有Win10的Linux子系统都可以通过Windows10本机远程桌面和Xming的方法来安装使用图形化界面,笔者目前只接触了Debian系的Linux系统,故以Debian GNU/Li ...

  4. Qt编写的项目作品33-斗图神器(雨田哥作品)

    一.功能特点 支持HTTP,HTTPS网络表情图片下载,本地缓存. 采用MV模式,支持大量图片表情预览查看. 采用多线程异步下载图片刷新. 图片搜索功能(因网络提供API无信息字段提供,占搜索不了.但 ...

  5. 9.4classtest rewrite(仓库管理系统)

    第一部分,设计界面以及类的定义. import java.util.Scanner; public class viovo { static int number = 5;//五个商品信息 stati ...

  6. Python 潮流周刊#83:uv 的使用技巧(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  7. [转]OpenCV_Find Basis F-Matrix and computeCorrespondEpilines(获取一对图像的基础矩阵及对应极线)

    代码如下: // BasisMatrixCalculate.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <ios ...

  8. [转]vue项目中app.vue 、main.js和 index.html的关系

    参考链接: 1.vue项目中app.vue .main.js和 index.html的关联 2.Vue中index.html.main.js.App.vue,之间关系 3.关于Vue中main.js, ...

  9. C# 设置label(标签)控件的背景颜色为透明

    有时候,我们需要将控件的背景颜色设定为透明,比如说label(标签)控件.那么,如何将控件的背景颜色设定为透明?是不是只要将控件的BackColor属性设为Transparent(透明)就可以了呢?答 ...

  10. 即时通讯技术文集(第39期):推送技术合集(Part1) [共18篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第 39 期. [- 1 -] iOS的推送服务APNs详解:设计思路.技术原理及缺陷等 [链接 ...