设备接入服务组件->微服务and容器化改造说明文档

news2024/11/28 8:47:54

SVN路径

https://192.0.0.241/USTA-dac/branches/dev/V1.10.500/dac

目录结构

在这里插入图片描述

  • das为设备接入服务,负责驱动管理,资源同步,订阅下发。下面有两个文件夹分别对应了openssl1.0的版本和后面更换接口后openssl1.1的版本。
  • das_proxy为设备信令下发代理服务,主要控制云台等下发信令的转发。
  • dms为设备管理服务,负责数据持久化。
  • 微服务打包工具,负责将驱动成果物和das壳子打包成驱动微服务版本。

驱动微服务如何部署

在这里插入图片描述

  1. 编译

在das目录用源码编译出来libConfigMgr.so(配置管理),libDevResMgr.so(设备管理),libDriverMgr.so(驱动管理),libProtocolProxy.so(协议代理)这四个库之后。将这几个库放入servicepackage文件夹。

  1. 放入驱动成果物

将驱动包放到driverpackage文件夹里面

  1. 运行脚本

运行脚本
./package.sh
打包出来的微服务成果物在output文件夹下面

  1. 修改配置文件

把包放到安装环境
在驱动包的META-INF文件夹下driver.xml的加上event能力

(重要!不然会导致订阅下发不下去)

  1. 安装微服务

执行包下面的install.sh脚本
systemclt restart 程序名启动程序

ok,执行完这五部,驱动微服务版本部署完成。

驱动das改动

相对于基线设备接入服务有一些改动点

  1. 加入了新的注册接口
    主要改动在数据管理这个定时器里面
    CDataSrcMgr::OnTimer
    接口为,向dms注册。
//RegisterDrvToDMS
//驱动注册DMS的格式.
POST /dac/driverManager/v1/driverRegister HTTP/1.1 
Host: 10.14.69.25:8080 
TOKEN: SElLIFRvdVBhWFFmd0xkdVNKRTI6bFFTY1ZUYTlpcEFkTjEyblZhYmVYTU5uQlN4TnVxS0VyVlhlbnVtWGdEOD0= 
Cache-Control: no-cache 
Postman-Token: 99498a85-4ff7-6e2a-24af-d4d78c4694fc 
{ 
   "indexCode":"test1", 
   "deviceKey":"drv_vss_hiksdk_general_1.10.100", 
   "addr":"10.19.133.74", 
   "port":8000
   "ehomePort":15000
}
  1. 服务标识生成的方式。与dms的地址读取方式
    基线das组件的服务标识与dms的地址ip信息,是运管生成,从配置文件中读取。
    而微服务版本的服务标识是驱动微服务第一次启动的时候随机生成,以文件的形式保存在本地,同时要向注册中心去注册。dms的地址从cousal注册中心中读取。
//CConfigWrapper::Initialize
//服务标识生成代码

std::fstream fstr;
const char* fileName = "dasIndexCode.txt";
std::ios_base::openmode openMode = (std::ios::in | std::ios::out | std::ios::app);
fstr.open(fileName, openMode);
string dasIndexCode("");
if(fstr)
{
    std::ostringstream oStrStrDicCata;
    oStrStrDicCata << fstr.rdbuf();
    dasIndexCode = oStrStrDicCata.str();
    if(dasIndexCode.empty())
    {
        dasIndexCode=GetUUIDStr(8)+"-"+GetUUIDStr(4)+"-"+GetUUIDStr(4)+"-"+GetUUIDStr(4)+"-"+GetUUIDStr(12);
        fstr << dasIndexCode;
    }
    fstr.close();
}
else
{
    DAF_ERROR("open file dasIndexCode.txt error.");
    nRet = CONFIGMGR_ERR_CSF_INIT;
    break;
}

//向注册中心注册
char* config[] = {"dms", "bic"};
//驱动直接向dms注册,此处所有不同类型驱动的名称相同,不能用于服务发现
HPR_Strncpy(CsfParam.serverName,"dac-dasdvr",MAX_SERVER_NAME_LEN - 1);
HPR_Strncpy(CsfParam.serverID,m_strIndexcode.c_str(),m_strIndexcode.size());
CsfParam.nEnableFunctions = kAddress | kRegister;//向consul注册后所有类型驱动的名字都是dac-dasdvr
CsfParam.extraConfigSize = 2;
CsfParam.extraConfigArray = config;


//在CConfigWrapper::OnTimer这个定时器中UpdateDmsHostInfo这个函数定时去获取dms的信息。
//从注册中心获取dms地址。如果获取不到则用默认地址
if (true != CsfDocker::instance()->GetSvrAddrArray("dac-dms", addarr, &chDmsIpSize))
{
	strIp = "127.0.0.1";
	strPort = "8081";
	DAF_ERROR("CsfDocker::instance()->GetSvrAddr dmsinfo from cfs error[err=%d]", Csf::GetLastError());
}
else
{
	for (int i = 0; i < chDmsIpSize; i++) {
		string straddr = to_string(addarr[i].serverIP) + ":" + to_string(addarr[i].serverPort);
		strIp = to_string(addarr[i].serverIP);
		strPort = to_string(addarr[i].serverPort);
		//如果地址没有变则退出
		if (straddr == m_strDmsInfo) {
			break;
		}
	}

	DAF_INFO("CsfDocker::instance()->GetSvrAddr dmsinfo [ip=%s][port=%s]", strIp.c_str(), strPort.c_str());
}
  1. 支持event能力
    支持全能力下发
 //CDriverMgr_SyncDevSubEventInfo
 if (events.size() == 1 && ((events[0].asString() == "0") || events[0].asString() == "*")) {
	listEvents.push_back(0);
}
else {
	for (unsigned int j = 0; j < events.size(); ++j)
	{
		int iEvent = HPR_Atoi32(events[j].asString().c_str());
		if (iEvent != 0)
		{
			listEvents.push_back(iEvent);
		}
	}
}
  1. 设备信息修改之后的订阅
    设备信息修改了之后迁移之后会额外的去一个个单独获取一下设备的订阅信息。因为基线是das管理所有驱动所以并没有这个逻辑。而微服务是一个das对应一个驱动所以需要再获取一下,防止订阅信息丢失。
//CDeviceMgr::ModifyDeviceInUserThread
if (cListDevice.size()>0)
 {
      DEVRESMGR_INFO("SubDevEventInUserThread start");
      CDataSrcMgrSingleton::Instance()->SubDevEventInUserThread(cListDevice);
  }
  1. 其他
    其他还有一些小的改动,比如接口转换啥的,就一一列举了。

问题排查

目前遇到的问题最多的就是订阅问题。所以说解决了订阅下发的问题就解决了90%的问题。
我改了很多bug之后,das壳子本身的问题应该是没有了。
日志打的很多很详细。可以配合pluginframe的同事一起看下。如果没有发送到pluginframe就可以排查下das的问题。
可以从下面几个方向切入

  1. 下发订阅的时间点。
    订阅在这几个时间点会下发:1.微服务重启的时候会全量像dms拉订阅信息 2.添加设备的时候dms会调/daf/v1/subEvent接口下发订阅。3.设备迁移的时候会去单个单个拉设备信息。
    如果是情况1.可以搜索GetDevEventInfoData和GetEventInfoData来确定有没有从dms拉到订阅信息。
    如果是情况2.可以搜索/daf/v1/subEvent来确定dms有无下发。如果有下发可以搜索subscribe查看对应的设备编号和下发的订阅信息。
    如果是情况3.可以搜索GetSingleDevEventInfoData begin,看下有无去获取单个设备订阅信息。如果有,则可以dms抓包看这个/dms/v1/device/indexCodes/eventInfo接口获取的订阅信息来排查
  2. 加解密。
    有时候获取到了订阅信息,驱动那边却说没有下发。可以根据日志报错看下有没有解密失败。如果是解密失败了的话,可以从密钥交互方向切入。
  3. 日志信息
    所有订阅下发都会经过Subscribe这个函数。可以搜索日志中一段时间Subscribe begin的打印来确定下发订阅的数量。下发前会把订阅地址解密后打印出来确保加密是没有问题的。
  4. 设备数量
    驱动有最大设备数量的限制,如果超过了最大设备数量,则超出的设备就直接不下发了,同样订阅也发不下来。

补充

其他还有啥需要补充的可以说下我再补充下。

在这里插入代码片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1166552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win10 + vs2017 + cmake3.17 编译 curl-7.48

1. 下载curl-7.48并解压 解压到“D:\Depend_3rd_party\curl748”文件夹 2. 创建build和install文件夹 1&#xff09;build文件夹创建在“D:\Depend_3rd_party\curl748”文件夹内部 2&#xff09;install文件夹&#xff0c;创建在“D:\Depend_3rd_party\curl748”外部 3. 打开…

【23真题】慎选!很难!超纲到四门课!

今天更新的比较晚&#xff0c;实在抱歉&#xff01;因为想做好解析&#xff0c;每一套真题实在花费我大量的时间于精力&#xff01;如果大家觉得有帮助&#xff0c;希望帮我点个赞&#xff0c;我们继续坚持每日一套&#xff01;你们是我唯一坚持下去的动力&#xff01; 今天分…

u20.04安装slam库

git clone https://github.com/strasdat/Sophus.git // 下载的最新版是模板类的 git checkout a621ff // 切换为非模板类的历史版本 模板类Sophus的依赖库是Eigen(版本为3.3.X)和fmt&#xff0c;需提前安装好Eigen库和fmt库 git clone https://github.c…

上线项目问题——无法加载响应数据

目录 无法加载响应数据解决 无法加载响应数据 上线项目时 改用服务器上的redis和MySQL 出现请求能请求到后端&#xff0c;后端也能正常返回数据&#xff0c;但是在前端页面会显示 以为是跨域问题&#xff0c;但是环境还在本地&#xff0c;排除跨域问题以为是服务器问题&#…

嵌入式web boa配置流程详解

boa配置流程详解 前期准备boa介绍操作目的下载boa 配置流程1.解压boa服务器2.配置Makefile3.编译boa服务器4.修改boa配置文件5.增加权限并编译cgi6.测试demo7.错误示例 附录A history附录B boa.conf 前期准备 boa介绍 Boa服务器是一个小巧高效的web服务器&#xff0c;是一个运…

利用GEE对季节性地物进行分类的代码实现

采样点的选取 如果你采用监督学习的话&#xff0c;那就手动打标签 或者可以了解一下非监督学习 合成多季节多波段影像 首先&#xff0c;制作一个包含多波段的影像&#xff0c;每个波段作为随机森林分类器的一个feature输入&#xff0c;提升feature的丰富度以保证分类精度。…

虚拟机保护工具:Zerto Virtual Replication 10.0 U1 Crack

Zerto虚拟复制是为需要保护虚拟机和应用程序的企业设计的产品。通过通过连接到广域网或云到远程站点的复制来保护虚拟机。Zerto VR 2.0还可以与vCloud Director一起将虚拟机或虚拟机组复制到云端&#xff08;或从云端&#xff09;。 事实上&#xff0c;Zerto与33家云提供商合作…

map的operator[]原理

目录 一.map的insert函数 二.map的operator[]实现 三.operator[]的多重功能 一.map的insert函数 要想了解operator[]的实现原理&#xff0c;就要先看看insert。我们关注的是第一个insert的返回值&#xff0c;即pair<iterator, bool> 大意就是&#xff0c;返回一个pair对…

操作系统学习笔记(学习中)

计算机系统概述 1.操作系统概念 管理系统软/硬件资源&#xff0c;为程序提供服务 2.发展与分类 3.操作系统的运行环境 运行机制 指令&#xff1a;&#xff08;二进制机器指令&#xff09;&#xff0c;CPU能识别&#xff0c;执行的最基本命令 应用程序&#xff1a;程序员写…

qt6-error: invalid use of incomplete type ‘class Ui::Widget‘

背景 昨晚刚建立qt工程&#xff0c;点击运行&#xff0c;工作可以直接使用&#xff0c;但是早上点开工作&#xff0c;就出现type类型错误。有点奇怪。问题页面显示&#xff0c;问题主要就是ui::widget的类型错误。 这篇文章提醒我&#xff0c;昨晚因为在尝试修改一些参数时&a…

Flutter 手把手国际化

1.导入依赖 flutter:sdk: flutterflutter_localizations:sdk: flutterintl: any2.安装插件Flutter Intl Android Studio > File > Settings > Plugins 搜索Flutter Intl 并安装和重启Android Studio生效 3.通过插件初始化并配置语言 Android Studio > Tools >…

【已解决】在linux部署出现java文件操作报错:java.io.FileNotFoundException

1.报错场景&#xff1a; 其中的 ip2region.xdb 文件是放在 resources 文件夹中的&#xff0c;然后在一个工具类里面读取这个文件&#xff0c;在开发环境中的是这样读取的&#xff1a; ClassPathResource resource new ClassPathResource("ip2region.xdb");//获取真…

NI-9505 嵌入式行业领先的流量校准测量算法

NI-9505 嵌入式行业领先的流量校准测量算法 基岩自动化公司&#xff0c;基岩OSA自动化平台的制造商&#xff0c;已经将流量计算机功能集成到OSA平台中。奥萨流程系列嵌入流量校准基岩自动化平台中的测量应用。Flow-Cal的软件是流量测量和生产核算数据的选择。 奥萨所有基岩控…

基于Python的豆瓣电影排行榜,可视化系统

1 简介 基于Python flask 的豆瓣电影数据获取&#xff0c;数据可视化系统&#xff0c;本系统朱亚奥包括了影视系统的爬虫与分析。影视是人们娱乐、放松心情的重要方式之一&#xff0c;因此对影视的分析具有重要的现实意义。通过采用Python编程语言&#xff0c;使用flask框架搭…

内部福利!双11百度文心一言底层的千帆大模型免费试用!

内部福利&#xff0c;现在可以免费试用&#xff0c;而且额度超高。双11福利 个人大模型平台新用户&#xff1a;50元&#xff1b;限量1000张&#xff1b;限时一个月使用 企业大模型平台新用户&#xff1a;200元&#xff1b;限量200张&#xff1b;限时一个月使用 EB4对标GPT4 …

GoLong的学习之路(十七)基础工具之GORM(操作数据库)(更新Update)

书接上回&#xff0c;上回写道&#xff0c;GORM的查询和创建&#xff08;插入数据&#xff09;&#xff0c;这回继续些增删改查的改和删的操作。 文章目录 更新update修改单个列修改多个列修改选定字段批量更新新阻止全局更新 使用 SQL 表达式更新注意 根据子查询进行更新不使用…

Spring boot 整合 JWT

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

【WinForm详细教程六】WinForm中的GroupBox和Panel 、TabControl 、SplitContainer控件

文章目录 1.GroupBox和Panel2.TabControl3.SplitContainer 1.GroupBox和Panel GroupBox&#xff1a;是一个分组容器&#xff0c;提供一个框架将相关的控件组织在一起&#xff0c;它有标题、边框&#xff0c;但没有滚动条。 Panel&#xff1a;也是一个容器控件&#xff0c;用来…

Git GitHub同步失败

文章目录 错误解决方案第一步第二步第三步第四步第六步第七步 错误 昨天晚上提交代码到GitHub时遇到了这个错误。 remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.字面大体意思就是你原先的密码凭…

预约按摩小程序开发优势;

在快节奏和高压社会中&#xff0c;按摩已成为许多人缓解压力和保持健康的重要方式&#xff0c;各地的按摩店也是随处可见&#xff0c;而为了能够更好地提供服务&#xff0c;很多按摩店都引入了小程序应用。今天我们就主要了解一下按摩店小程序具体有什么用&#xff0c;能够提供…