视图库对接系列(GA-T 1400)四、视图库对接系列(本级)注册

news2025/1/4 17:10:37

视图库对接系列(本级)注册

在之前的步骤中,我们已经把项目大体的架构已经写出来了。那我们就来实现注册接口。

GA-T 1400中的步骤如下:

在这里插入图片描述
这里的话,我们实现的简单点, 我们不进去鉴权,也就是设备或平台找我们注册的话,我们直接返回成功,不进行验证。
如果需要鉴权的话可看我的另外一篇文档。
视图库对接系列(GA-T 1400)七、视图库对接系列(本级)注册(包含鉴权)

注册前准备

因为视图库对接 主要是解析、验证解析。 所以我们先暂时把对应的文件创建好,这里的话我就直接先放截图,到时候有需要的直接加群拿,我把项目放在群里把。
在这里插入图片描述

注册

service层

我把注册、注销、保活、校时的接口一起写好,后续我们直接实现就可以了。

在common中添加ViewLibCommonRequestService

public interface ViewLibCommonRequestService {

    //注册
    ResponseStatusObject register(DeviceViewBaseParam param);


    //注销
    ResponseStatusObject unregister(DeviceViewBaseParam param);

    //保活
    ResponseStatusObject keepalive(DeviceViewBaseParam param);

    //校时
    ResponseStatusObject time(DeviceViewBaseParam param);
}

在server中添加PlatformService继承ViewLibCommonRequestService就可以了

public interface PlatformService extends ViewLibCommonRequestService {
}

service层实现

@Service
public class PlatformServiceImpl implements PlatformService, TaskService {

    @Resource
    private IViewLibraryDomainDeviceService viewLibraryDomainDeviceService;

    /**
     * 心跳key
     */
    public static final String TASK_CASCADE_KEEP_KEY = "platform_keep_alive";

    /**
     * 默认心跳周期
     */
    public static final Integer DEFAULT_HEARTBEAT_CYCLE = 3;
    /**
     * 默认最大心跳超时时间
     */
    public static final Integer DEFAULT_MAX_HEARTBEAT_TIMEOUT_NUM = 60;

    @Override
    public ResponseStatusObject register(DeviceViewBaseParam param, String url) {
        int heartbeatCycle = DEFAULT_HEARTBEAT_CYCLE;
        int maxHeartbeatTimeoutNum = DEFAULT_MAX_HEARTBEAT_TIMEOUT_NUM;
        // 保存到domain_platform 中 设备id,状态(注册默认在线,保活时间取最新时间)
        ViewLibraryDomainDevice domainPlatform = viewLibraryDomainDeviceService.selectByDomainDeviceId(param.getDeviceId());
        if (domainPlatform == null) {
            viewLibraryDomainDeviceService.save(new ViewLibraryDomainDevice(param.getDeviceId(), PlatformStatus.ONLINE.getValue(), LocalDateTime.now(), DEFAULT_HEARTBEAT_CYCLE, DEFAULT_MAX_HEARTBEAT_TIMEOUT_NUM));
        } else {
            viewLibraryDomainDeviceService.updateRegisterStatus(param.getDeviceId(), PlatformStatus.ONLINE.getValue());
            heartbeatCycle = domainPlatform.getHeartbeatCycle();
            maxHeartbeatTimeoutNum = domainPlatform.getMaxHeartbeatTimeoutNum();
        }
        ScheduleUtil.start(
                new ScheduleTask(TASK_CASCADE_KEEP_KEY + param.getDeviceId(), this, ""),
                new Date(System.currentTimeMillis() + heartbeatCycle * maxHeartbeatTimeoutNum * 1000 * 1000)
        );
        return ResponseStatusObject.initSuccess(url, param, "注册成功");
    }

    @Override
    public ResponseStatusObject unregister(DeviceViewBaseParam param, String url) {
        return null;
    }

    @Override
    public ResponseStatusObject keepalive(DeviceViewBaseParam param, String url) {
        return null;
    }

    @Override
    public ResponseStatusObject time(DeviceViewBaseParam param, String url) {
        return null;
    }

    @Override
    public void work(String id, String keyword) {
        String platformId = id.replace(TASK_CASCADE_KEEP_KEY, "");
        ViewLibraryDomainDevice viewLibraryDomainPlatform = viewLibraryDomainDeviceService.selectByDomainDeviceId(platformId);
        if (viewLibraryDomainPlatform != null) {
            LocalDateTime latestKeepAliveTime = viewLibraryDomainPlatform.getLatestKeepAliveTime();
            if (latestKeepAliveTime == null) {
                viewLibraryDomainDeviceService.updateRegisterStatus(viewLibraryDomainPlatform.getDeviceId(), PlatformStatus.LOGGED_OUT.getValue());
                return;
            }
            if (DateUtil.isAfterAddingSeconds(LocalDateTime.now(), latestKeepAliveTime, viewLibraryDomainPlatform.getMaxHeartbeatTimeoutNum() * viewLibraryDomainPlatform.getHeartbeatCycle())) {
                viewLibraryDomainDeviceService.updateRegisterStatus(viewLibraryDomainPlatform.getDeviceId(), PlatformStatus.LOGGED_OUT.getValue());
            }


        }
    }

这里有个TaskService实现, 我稍微说一下。 因为设备需要每隔一段时间给我们一个心跳,所以我们封装了一个定时器回调,回调方法是work。每隔多久对比一下时间,将状态进行更改。

设备层service

public interface IViewLibraryDomainDeviceService extends IService<ViewLibraryDomainDevice> {
    void updateRegisterStatus(String deviceId,Integer status);

    ViewLibraryDomainDevice selectByDomainDeviceId(String deviceId);
}

设备层service实现

@Service
public class ViewLibraryDomainDeviceServiceImpl extends ServiceImpl<ViewLibraryDomainDeviceMapper, ViewLibraryDomainDevice> implements IViewLibraryDomainDeviceService {

    @Override
    public void updateRegisterStatus(String deviceId, Integer status) {
        LambdaUpdateWrapper<ViewLibraryDomainDevice> queryWrapper = Wrappers.lambdaUpdate();
        queryWrapper.eq(ViewLibraryDomainDevice::getDeviceId,deviceId);
        ViewLibraryDomainDevice domainPlatform = new ViewLibraryDomainDevice();
        domainPlatform.setDeviceStatus(status);
        domainPlatform.setLatestKeepAliveTime(LocalDateTime.now());
        this.baseMapper.update(domainPlatform,queryWrapper);
    }

    @Override
    public ViewLibraryDomainDevice selectByDomainDeviceId(String deviceId) {
        LambdaQueryWrapper<ViewLibraryDomainDevice> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(ViewLibraryDomainDevice::getDeviceId, deviceId);
        return  this.baseMapper.selectOne(queryWrapper);
    }
}

##Controller层

@RestController
@CrossOrigin(value = "*", maxAge = 3600)
@RequestMapping("/VIID")
@RequestLog(logReturn = true)
public class PlatformController {
    

    @Resource
    private PlatformService platformService;

    //-------------------------------------------------设备或平台请求------------------------------------------

    @PostMapping("/System/Register")
    public ResponseStatusObject register(@RequestBody RegisterObjectRequest param, HttpServletRequest request, HttpServletResponse response) {
        String userIdentify = CommonUtlis.getUserIdentify(request);
        //{"RegisterObject":{"RequestURL":"/VIID/System/Register","StatusCode":0,"StatusString":"注册成功","Id":"33048300005030000237","LocalTime":"20220826085911"}}
        if(param == null || param.getDeviceBaseParam()== null || StringUtils.isEmpty(param.getDeviceBaseParam().getId())) {
            return ResponseStatusObject.initFailCode(request.getRequestURI(),userIdentify,String.valueOf( StatusCodeEnum.PLATFORM_PARAMETER_FAIL.getCode()));
        }
        return platformService.register(param.getDeviceBaseParam(),request.getRequestURI());

    }

    



}

这里的话我使用了自定义的注解来打日志
具体可以看我的这一章
java实现日志aop切面 和业务功能进行解耦

测试

我们在设备后台,配置好对应的参数,然后看抓包是否ok

设备配置

我们视图库的ip和端口,也就是我们目前写的server项目的ip和端口
在这里插入图片描述

抓包

本机抓包

如果是本机抓包的话 需要添加路由。

route add 你的ip mask 255.255.255.255 对应网卡

如: route add 192.168.6.16 mask 255.255.255.255 192.168.6.1
在这里插入图片描述

使用Wireshark抓包查看

抓包数据如下:

在这里插入图片描述

在这里插入图片描述

数据库数据也已成功 添加

在这里插入图片描述

视图库对接系列(本级)注册完成。

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

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

相关文章

在SpringBoot 3.0环境下创建一个SpringBoot 项目

一、环境配置 1.专业版的IDEA 版本号&#xff1a;尽量选择不要太老&#xff0c;不要太早 这里以2023.3.1为例。 官网&#xff1a;Download IntelliJ IDEA – The Leading Java and Kotlin IDE (jetbrains.com) 破解版&#xff1a;网上找资料哦&#xff01;&#xff01;&#…

【Python】基于动态规划和K聚类的彩色图片压缩算法

引言 当想要压缩一张彩色图像时&#xff0c;彩色图像通常由数百万个颜色值组成&#xff0c;每个颜色值都由红、绿、蓝三个分量组成。因此&#xff0c;如果我们直接对图像的每个像素进行编码&#xff0c;会导致非常大的数据量。为了减少数据量&#xff0c;我们可以尝试减少颜色…

thinkphp6/8 验证码

html和后台验证代码按官方来操作 ThinkPHP官方手册 注意&#xff1a; 如果验证一直失败&#xff0c;看看Session是否开启&#xff0c; 打印dump(session_status());结果2为正确的&#xff0c; PHP_SESSION_DISABLED: Session功能被禁用&#xff08;返回值为0&#xff09;。…

awtk-web 增加模拟器外壳

界面效果 方法 将 data/simulator.html 拷贝到 app目录下&#xff0c;覆盖index.html将 data/simulator_bg.png 拷贝到 app目录下 动态效果

互联网盲盒小程序的市场发展前景如何?

近几年来&#xff0c;盲盒成为了大众热衷的消费市场。盲盒是一个具有随机性和惊喜感&#xff0c;它能够激发消费者的好奇心&#xff0c;在拆盲盒的过程中给消费者带来巨大的愉悦感&#xff0c;在各种的吸引力下&#xff0c;消费者也愿意为各类盲盒买单。如今&#xff0c;随着盲…

传输线阻抗匹配电阻端接的方式

电路为什么需要端接&#xff1f; 众所周知&#xff0c;电路中如果阻抗不连续&#xff0c;就会造成信号的反射&#xff0c;引起上冲下冲、振铃等信号失真&#xff0c;严重影响信号质量。所以在进行电路设计的时候阻抗匹配是很重要的考虑因素。 对我们的PCB走线进行阻抗控制已经…

Python创建异步任务队列库之Huey使用详解

概要 Huey 是一个简单的 Python 库,用于创建异步任务队列。它的设计目标是简单易用,同时具备强大的功能。Huey 可以轻松地将任务添加到队列中,然后在后台线程中处理这些任务,从而避免阻塞主线程。这使得 Huey 非常适合处理 I/O 密集型或长时间运行的任务。此外,Huey 还支…

Rhino 犀牛三维建模工具下载安装,Rhino适用于机械设计广泛领域

Rhinoceros&#xff0c;这款软件小巧而强大&#xff0c;无论是机械设计、科学工业还是三维动画等多元化领域&#xff0c;它都能展现出其惊人的建模能力。 Rhinoceros所包含的NURBS建模功能&#xff0c;堪称业界翘楚。NURBS&#xff0c;即非均匀有理B样条&#xff0c;是计算机图…

JDK1.8下载、安装与配置完整图文2024最新教程

一、报错 运行Pycharm时&#xff0c;报错No JVM installation found. Please install a JDK.If you already have a JDK installed, define a JAVA_HOME variable in Computer >System Properties > System Settings > Environment Variables. 首先可以检查是否已安装…

如何将 Apifox 的自动化测试与 Jenkins 集成?

CI/CD &#xff08;持续集成/持续交付&#xff09; 在 API 测试 中的主要目的是为了自动化 API 的验证流程&#xff0c;确保 API 发布到生产环境前的可用性。通过持续集成&#xff0c;我们可以在 API 定义变更时自动执行功能测试&#xff0c;以及时发现潜在问题。 Apifox 支持…

PMP报考条件是什么?很多人都没读懂...

最近正值8月份考试报名期&#xff0c;想计划考8月份考试的宝子可以准备起来了&#xff0c;下面是报名时间和考试安排 8月考试时间安排&#xff1a; &#x1f449;报名时间在7.9日—12日 &#x1f449;考试时间在8.31日&#xff08;周六&#xff09; 一、PMP报名条件是什么&am…

vscode插件的开发过程记录(一)

前言 本文是关于visual studio code软件上自定义插件的开发记录&#xff0c;将从头记录本人开发的过程&#xff0c;虽然网上也有很多文章&#xff0c;但个人在实践的过程还是会遇到不一样的问题&#xff0c;所以记录下来&#xff0c;以便于后期参考。 前期准备&#xff1a; 1、…

基于SpringCloud的智慧养老平台的设计与实现

您好&#xff01;我是专注于计算机技术研究的码农小野。如果您对CSGO赛事管理系统感兴趣或有相关开发需求&#xff0c;欢迎随时联系我。 Java 数据库 MySQL 技术 SpringCloud, B/S架构 工具 Eclipse, MySQL Workbench, SpringBoot 系统展示 首页 老人管理界面 活动信息…

VBA使用ActiveWindow.Zoom调整页面显示百分比

前言 本节会通过VBA实现自动调整Excel页面显示的百分比功能 Zoom属性 1.调整当前工作表 示例&#xff1a;调整当前sheet显示比例为90% Sub AvtivwWindowZoom() ActiveWindow.Zoom 90 End Sub2.调整其他工作表 当一个Excel文件存在多张工作表Sheet时&#xff0c;又需要调…

这所985院校不保护一志愿,18人不合格被刷!西北农林科技大学计算机考研考情分析!

西北农林科技大学(Northwest A&F University)&#xff0c;简称“西农”或“西北农林”&#xff0c;始创于1934年&#xff0c;位于中华人民共和国陕西省杨凌示范区。1999年9月11日由同处杨凌的原西北农业大学、西北林学院、中国科学院水利部水土保持研究所、水利部西北水利科…

Springboot 校园安全通事件报告小程序系统-计算机毕业设计源码02445

Springboot 校园安全通事件报告小程序系统 摘 要 随着中国经济的飞速增长&#xff0c;消费者的智能化水平不断提高&#xff0c;许多智能手机和相关的软件正在得到更多的关注和支持。其中&#xff0c;校园安全通事件报告小程序系统更是深得消费者的喜爱&#xff0c;它的出现极大…

MES系统如何进行数据采集?

在现代化制造业中&#xff0c;MES系统扮演着至关重要的角色。其中&#xff0c;对生产设备进行数据采集是MES系统不可或缺的一部分。数据采集不仅能够实时监控设备的运行状态&#xff0c;还能提供准确的生产数据&#xff0c;帮助企业实现精细化管理和优化生产流程。 通过实时采…

动态规划精品课 2024.6.26-24.7.3

一、斐波那契数列模型 0、第N个泰波那契数 class Solution {public int tribonacci(int n) {// 1. 创建 dp 表// 2. 初始化// 3. 填表// 4. 返回结果// 处理边界情况if (n 0)return 0;if (n 1 || n 2)return 1;int[] dp new int[n 1];dp[0] 0;dp[1] dp[2] 1;for (int i…

GPU云渲染平台到底怎么选?这六点要注意!

随着对高效计算和图像处理需求的增加&#xff0c;GPU云渲染平台成为许多行业的关键工具。尤其是对影视动画制作领域来说&#xff0c;选择一个合适的GPU云渲染平台可以大大提升工作效率。然而&#xff0c;面对市场上众多的选择&#xff0c;如何找到适合自己的GPU云渲染平台呢&am…

【信即是功夫】人皆有良知在心中

良知就是做人、做事的准则&#xff0c;良知就是天理&#xff1b;实实在在地自信 每个人心中都有一个圣人&#xff0c;只因自己不能真的相信&#xff0c;把这个圣人埋没了 良知在每个人心中&#xff0c;无论你如何做&#xff0c;也无法泯灭它。即使身为盗贼的人&#xff0c;他…