SICK Ranger3源码分析——断线重连

[复制链接]
发表于 2025-10-17 00:18:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
前言

本文可在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管理:
  1. // file: Ranger.cpp
  2. EXPORT_TO_DLL CAM_STATUS
  3. Ranger3::connectCamera(CallbackEvent_HeartBeats pCallback, const uint32_t& microSecond, void * any)
  4. {
  5.         try{
  6.                 auto e = connectCamera();
  7.                 if(e == CAM_STATUS::All_OK)
  8.                 {
  9.             m_heartbeat_is_on = 1;
  10.             ...
  11.             // 开启心跳检测线程
  12.                         auto _thread = std::make_shared<std::thread>(&Ranger3::_check_HeartBeats_run, this);
  13.                         _thread->detach();
  14.                 }
  15.                 return e;
  16.         }
  17.     ...
  18. }
  19. void
  20. Ranger3::_check_HeartBeats_run()
  21. {
  22.     while (m_heartbeat_is_on==1)
  23.     {
  24.         __sleep1MS(m_heartbeat_interval);
  25.         ...
  26.         try {
  27.             Str value("");
  28.             // 设备在线,不抛异常,反之,抛出异常
  29.             m_Param.getParameter(m_deviceNodeMap, "DeviceTemperature", value);
  30.             ...
  31.         }
  32.         catch (...) {
  33.             ...
  34.         }
  35.     }
  36. }
复制代码
可以看出,断线检测机制很简朴,就是分离一个线程,循环访问相机寄存器(SICK的实现是通过定时获取装备温度访问相机寄存器),若访问不到(失败),就意味着相机已离线。
{% notel purple Paw5zx注: %}
{% endnotel %}
断线关照

断线关照机制同样内置于SICK SDK中:在检测到装备离线后,调用注册好的回调函数(注册过程将在下文先容)
  1. // file: Ranger.cpp
  2. void
  3. Ranger3::_check_HeartBeats_run()
  4. {
  5.     while (m_heartbeat_is_on==1)
  6.     {
  7.         __sleep1MS(m_heartbeat_interval);
  8.         ...
  9.         try {
  10.             Str value("");
  11.             // 设备在线,不抛异常,反之,抛出异常
  12.             m_Param.getParameter(m_deviceNodeMap, "DeviceTemperature", value);
  13.             ...
  14.         }
  15.         catch (...) {
  16.             // 一些资源释放操作
  17.             ...
  18.             // m_on_lost_function为注册好的回调函数对象
  19.             // 设备离线,访问寄存器失败,捕获异常,调用m_on_lost_function
  20.             auto _thread = std::make_shared<std::thread>(m_on_lost_function, &m_DeviceName, &m_DeviceIP, &m_on_lost_mac, &msg, m_on_lost_inputs);
  21.                         _thread->join();
  22.             return;
  23.         }
  24.     }
  25. }
复制代码
重连实现

重连机制的具体实现由用户举行。在例程Demo_R3_callback_with_heartbeat.cpp中,由用户自界说一个回调函数(在相机离线时会被调用),回调内循环对相机举行重连操纵。用户在毗连相机时注册这个回调
用户层代码:
  1. // file: Demo_R3_callback_with_heartbeat.cpp
  2. // 用户定义的回调函数,在相机断开连接时被调用
  3. void SICK_CALLBACK
  4. on_lost_device_Demo_R3_callback_with_heartbeat(std::string* name, std::string* ip, std::string* mac, std::string* msg, void * pR3)
  5. {
  6.     auto pCam = (SickCam::Ranger3*)pR3;
  7.     while (true)
  8.     {
  9.         // 根据相机对象存储的设备信息对物理相机进行重连操作,不展开说明了
  10.         auto ec = pCam->reconnectCamera();
  11.         ...
  12.         __sleep1MS(1000);
  13.     }
  14. }
  15. // 连接相机时注册回调
  16. 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
  1. // file: Ranger3.h
  2. typedef std::function<void(std::string* name, std::string* ip, std::string* mac, std::string* msg, void* any)>  CallbackEvent_HeartBeats;
  3. // file: Ranger.cpp
  4. /*
  5. [in] – pCallback 当失去心跳时,将调用由用户定义的回调函数。相应的处理可以在此函数中执行。
  6. [in] – microSecond 读取心跳的时间间隔,单位毫秒,推荐值为 10 000;
  7. [in] – any 在失去心跳的响应函数(CallbackEvent_HeartBeats)中,该指针将作为输入参数,由用户定义。
  8. */
  9. EXPORT_TO_DLL CAM_STATUS
  10. Ranger3::connectCamera(CallbackEvent_HeartBeats pCallback, const uint32_t& microSecond, void * any)
  11. {
  12.         try{
  13.                 auto e = connectCamera();
  14.                 if(e == CAM_STATUS::All_OK)
  15.                 {
  16.                         ...
  17.             m_on_lost_function = pCallback;
  18.                         m_on_lost_inputs = any;
  19.                         auto _thread = std::make_shared<std::thread>(&Ranger3::_check_HeartBeats_run, this);
  20.                         _thread->detach();
  21.                 }
  22.                 return e;
  23.         }
  24.     ...
  25. }
复制代码
注册完毕后,当相机出现离线情况,就如上文所述,SDK会调用注册的回调函数举行重连。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表