uniApp开通uniPush1.0个推,SpringBoot集成uniPush1.0个推

uniApp开通unipush1.0个推,SpringBoot程序集成

一、APP开通unipush1.0个推(商户App源码仅支持1.0个推)

1.app模块配置开通推送

在这里插入图片描述

2.应用开通推送

在这里插入图片描述

3.开通后点击消息推送菜单会看到如下页面 完成以上步骤后

在这里插入图片描述

  • 此时android 仅支持在线推送。

4.配置各厂商离线推送

  • 暂未配置

二、Java端SpringBoot集成uniPush1.0推送

1.引入依赖

		<!--	unipush 1.0个推	-->
		<dependency>
			<groupId>com.getui.push</groupId>
			<artifactId>restful-sdk</artifactId>
			<version>1.0.6.0</version>
		</dependency>

2.spring配置yaml文件添加配置

getui:  #个推推送
    appId: ************ 
    appKey: ************ 
    masterSecret: ************
    domin: https://restapi.getui.com/v2 

3.参数可从uniapp开发者中心获取

在这里插入图片描述

4.注入所有API实体类

  • UniPushConfiguration.java

    package com.joolun.cloud.common.jiguang.config;
    
    import com.getui.push.v2.sdk.ApiHelper;
    import com.getui.push.v2.sdk.api.PushApi;
    import com.getui.push.v2.sdk.api.UserApi;
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import com.getui.push.v2.sdk.GtApiConfiguration;
    
    /**
     * @author yuanDing
     * @version 1.0
     * @date 2025-01-10 9:40
     * uniPush 1.0个推推送配置类
     */
    @Data
    @RefreshScope
    @Configuration
    @ConfigurationProperties(prefix = "getui")
    public class UniPushConfiguration {
        private String appId;
    
        private String appKey;
    
        private String masterSecret;
    
        private String domin;
        @Bean
        public GtApiConfiguration apiConfiguration() {
            GtApiConfiguration apiConfiguration = new GtApiConfiguration();
            //填写应用配置,参数在“Uni Push”下的“应用配置”页面中获取
            apiConfiguration.setAppId(appId);
            apiConfiguration.setAppKey(appKey);
            apiConfiguration.setMasterSecret(masterSecret);
            apiConfiguration.setDomain(domin);
            return apiConfiguration;
        }
    
        @Bean
        public PushApi PushApi(GtApiConfiguration apiConfiguration) {
            return ApiHelper.build(apiConfiguration).creatApi(PushApi.class);
        }
    
        @Bean
        public UserApi UserApi(GtApiConfiguration apiConfiguration) {
            return ApiHelper.build(apiConfiguration).creatApi(UserApi.class);
        }
        
        // 还有其他所需API实体类自行注入...
    
    }
    

5.封装工具类

  • UniPushUtils

    package com.joolun.cloud.common.jiguang.util;
    
    import cn.hutool.core.collection.ListUtil;
    import cn.hutool.json.JSONObject;
    import com.getui.push.v2.sdk.api.PushApi;
    import com.getui.push.v2.sdk.api.UserApi;
    import com.getui.push.v2.sdk.common.ApiResult;
    import com.getui.push.v2.sdk.dto.req.Audience;
    import com.getui.push.v2.sdk.dto.req.AudienceDTO;
    import com.getui.push.v2.sdk.dto.req.CidAliasListDTO;
    import com.getui.push.v2.sdk.dto.req.Settings;
    import com.getui.push.v2.sdk.dto.req.message.PushDTO;
    import com.getui.push.v2.sdk.dto.req.message.PushMessage;
    import com.getui.push.v2.sdk.dto.res.TaskIdDTO;
    import com.joolun.cloud.common.jiguang.dto.CIdAliasDTO;
    import com.joolun.cloud.common.jiguang.dto.UniPushDTO;
    import lombok.AllArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    
    /**
     * @author yuanDing
     * @version 1.0
     * @date 2025-01-10 10:40
     * uniPush 1.0推送工具类
     */
    @Slf4j
    @Configuration
    @AllArgsConstructor
    public class UniPushUtils {
    
        private final PushApi pushApi;
    
        private final UserApi userApi;
    
        /**
         * 单解绑
         * 解除绑定cid和userId(解除绑定别名)
         *
         * @return
         */
        public boolean unBoundingUserIdAndCId(CIdAliasDTO cIdAliasDTO) {
            return this.unBoundingUserIdAndCIdList(ListUtil.toList(cIdAliasDTO));
        }
    
        /**
         * 批量解绑
         * 解除绑定cid和userId(批量解除绑定别名)
         *
         * @return
         */
        public boolean unBoundingUserIdAndCIdList(List<CIdAliasDTO> cIdAliasDTOS) {
            return userApi.batchUnbindAlias(this.getCidAliasListDTO(cIdAliasDTOS)).isSuccess();
        }
    
        /**
         * 单绑
         * 绑定cid和userId(绑定别名)
         * 注意:1个cid只能绑定一个别名 1个别名最多只能绑定10个cid 超出以最后绑定为准
         *
         * @return
         */
        public boolean boundingUserIdAndCId(CIdAliasDTO cIdAliasDTO) {
            return this.boundingUserIdAndCIdList(new ArrayList<CIdAliasDTO>() {{
                add(cIdAliasDTO);
            }}).isSuccess();
        }
    
        /**
         * 多绑
         * 绑定cid和userId(绑定别名)
         * 注意:1个cid只能绑定一个别名 1个别名最多只能绑定10个cid 超出已最后绑定为准
         *
         * @return
         */
        public ApiResult<Void> boundingUserIdAndCIdList(List<CIdAliasDTO> cIdAliasDTOS) {
            return  userApi.bindAlias(this.getCidAliasListDTO(cIdAliasDTOS));
        }
    
        /**
         * 获取cid alias DTO
         * @param cIdAliasDTOS
         * @return
         */
        private CidAliasListDTO getCidAliasListDTO(List<CIdAliasDTO> cIdAliasDTOS) {
            CidAliasListDTO cidAliasListDTO = new CidAliasListDTO();
            // 0 普通别名 1系统别名
    //        cidAliasListDTO.setAliasType("1");
            ArrayList<CidAliasListDTO.CidAlias> cidAliases = new ArrayList<>();
            cIdAliasDTOS.forEach(aliasDTO -> {
                CidAliasListDTO.CidAlias cidAlias = new CidAliasListDTO.CidAlias();
                cidAlias.setAlias(aliasDTO.getAlias());
                cidAlias.setCid(aliasDTO.getCId());
                cidAliases.add(cidAlias);
            });
            cidAliasListDTO.setDataList(cidAliases);
            return cidAliasListDTO;
        }
    
        /**
         * 根据别名单推 alias参数必填
         * @param uniPushDTO
         * @return
         */
        public boolean pushByAlias(UniPushDTO uniPushDTO) {
            return pushApi.pushToSingleByAlias(this.getPushDTO(uniPushDTO , "alias")).isSuccess();
        }
    
        /**
         * 根据CId单推 cid参数必填
         * @param uniPushDTO
         * @return
         */
        public boolean pushByCId(UniPushDTO uniPushDTO) {
            return pushApi.pushToSingleByCid(this.getPushDTO(uniPushDTO , "cid")).isSuccess();
        }
    
        /**
         * 根据别名多推送 alias参数必填
         * @param uniPushDTO
         * @return
         */
        public boolean pushByAliasList(UniPushDTO uniPushDTO) {
    
            PushDTO pushDTO = new PushDTO();
            PushMessage pushMessage = new PushMessage();
            pushMessage.setTransmission(new JSONObject(uniPushDTO.getMessage()).toString());
            pushDTO.setPushMessage(pushMessage);
            ApiResult<TaskIdDTO> msg = pushApi.createMsg(pushDTO);
            if (msg.isSuccess()) {
                AudienceDTO audienceDTO = new AudienceDTO();
                audienceDTO.setTaskid(msg.getData().getTaskId());
                audienceDTO.setAsync(false);
    
                Audience audience = new Audience();
                for (String alias : uniPushDTO.getAliasList()) {
                    audience.addAlias(alias);
                }
                audienceDTO.setAudience(audience);
    
                // 发送推送消息
                return  pushApi.pushListByAlias(audienceDTO).isSuccess();
            }
    
            return false;
        }
    
        /**
         * 获取推送实体类
         * @param uniPushDTO
         * @param type
         * @return
         */
        public PushDTO<Audience> getPushDTO(UniPushDTO uniPushDTO , String type) {
            //根据cid进行单推
            PushDTO<Audience> pushDTO = new PushDTO<Audience>();
            // 设置推送参数,requestid需要每次变化唯一
            pushDTO.setRequestId(System.currentTimeMillis() + "");
            Settings settings = new Settings();
            pushDTO.setSettings(settings);
            //消息有效期,走厂商消息必须设置该值
            settings.setTtl(uniPushDTO.getTtl());
    
            //在线走个推通道时推送的消息体
            PushMessage pushMessage = new PushMessage();
            pushDTO.setPushMessage(pushMessage);
            //此格式的透传消息由 unipush 做了特殊处理,会自动展示通知栏。开发者也可自定义其它格式,在客户端自己处理。
            pushMessage.setTransmission(new JSONObject(uniPushDTO.getMessage()).toString());
            // 设置接收人信息
            Audience audience = new Audience();
            pushDTO.setAudience(audience);
    
    
            switch (type) {
                case "cid": uniPushDTO.getCIdList().forEach(audience::addCid);break;
                case "alias": uniPushDTO.getAliasList().forEach(audience::addAlias);break;
            }
    
            /**
             * 离线推送,暂未对接
             */
            /*        //设置离线推送时的消息体
            PushChannel pushChannel = new PushChannel();
            //安卓离线厂商通道推送的消息体
            AndroidDTO androidDTO = new AndroidDTO();
            Ups ups = new Ups();
            ThirdNotification thirdNotification = new ThirdNotification();
            ups.setNotification(thirdNotification);
            thirdNotification.setTitle("安卓离线展示的标题");
            thirdNotification.setBody("安卓离线展示的内容");
            thirdNotification.setClickType("intent");
            //注意:intent参数必须按下方文档(特殊参数说明)要求的固定格式传值,intent错误会导致客户端无法收到消息
            thirdNotification.setIntent("请填写固定格式的intent");
            androidDTO.setUps(ups);
            pushChannel.setAndroid(androidDTO);*/
    
            /**
             * ios暂未对接 后续对接完放开注释
             */
            //ios离线apn通道推送的消息体
    //        Alert alert = new Alert();
    //        alert.setTitle("苹果离线通知栏标题");
    //        alert.setBody("苹果离线通知栏内容");
    //        Aps aps = new Aps();
    //        aps.setContentAvailable(0);
    //        aps.setSound("default");
    //        aps.setAlert(alert);
    //        IosDTO iosDTO = new IosDTO();
    //        iosDTO.setAps(aps);
    //        iosDTO.setType("notify");
    
    //        pushChannel.setIos(iosDTO);
    //        pushDTO.setPushChannel(pushChannel);
    
    
            return pushDTO;
        }
    
    
    
    
    }
    
    
    • UniPushDTO.java

      package com.joolun.cloud.common.jiguang.dto;
      
      import cn.hutool.json.JSONObject;
      import lombok.AllArgsConstructor;
      import lombok.Builder;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      import java.util.List;
      
      /**
       * @author yuanDing
       * @version 1.0
       * @date 2025-01-10 9:40
       * uniPush 1.0个推推送领域类
       */
      @Data
      @Builder
      @AllArgsConstructor
      @NoArgsConstructor
      public class UniPushDTO {
      
          /**
           * 单推必填
           * 推送消息体 JSON格式
           *  title:标题
           *  content:内容
           *  payload:承载数据 最好传JSON,与前端接收初一致!
           */
          private Message message;
      
          /**
      
      
          /**
           * cid或alias二选一
           * 设备cid
           */
          private List<String> cIdList;
      
          /**
           * cid或alias二选一
           * 设备别名
           */
          private List<String> aliasList;
      
      
          /**
           * 离线推送必填,在线推送非必填
           * 消息离线时间设置,单位毫秒,-1表示不设离线, -1 ~ 3 * 24 * 3600 * 1000之间
           */
          private Integer ttl;
      
          @Data
          @Builder
          @AllArgsConstructor
          @NoArgsConstructor
          public static class Message{
              /**
               *  title
               * 必传
               */
              private String title;
              /**
               *  content
               * 必传
               */
              private String content;
      
              // 必传
              private Object payload;
          }
      
      
      }
      
      
    • CIdAliasDTO.java

      package com.joolun.cloud.common.jiguang.entity;
      
      import lombok.AllArgsConstructor;
      import lombok.Builder;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      /**
       * @author yuanDing
       * @version 1.0
       * @date 2025-01-10 9:40
       * uniPush 1.0个推推送别名设备领域类
       */
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      @Builder
      public class CIdAliasDTO {
          /**
           * 设备cid
           */
          private String cId;
      
          /**
           * 别名
           */
          private String alias;
      
      }
      

6.测试推送


import cn.hutool.core.collection.ListUtil;
import cn.hutool.json.JSONObject;
import com.joolun.cloud.common.jiguang.dto.CIdAliasDTO;
import com.joolun.cloud.common.jiguang.dto.UniPushDTO;
import com.joolun.cloud.common.jiguang.util.UniPushUtils;
import com.joolun.cloud.mall.api.JooLunMallApiApplication;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;

/**
 * unipush 推送测试
 */
@SpringBootTest(classes = JooLunMallApiApplication.class)
public class UniPushTest {

    @Autowired
    private UniPushUtils uniPushUtils;

    /**
     * 绑定别名测试
     */
    @Test
    public void boundingTest() {
        boolean result = uniPushUtils.boundingUserIdAndCId(CIdAliasDTO.builder()
                .alias("15065606797")
                .cId("75328b5a6f777a1c853810340d9404ac")
                .build());
        System.out.println("voidApiResult = " + result);
    }

    /**
     * 根据cid推送测试
     */
    @Test
    public void pushByCIdTest() {
        UniPushDTO uniPushDTO = UniPushDTO
                .builder()
                .cIdList(ListUtil.toList("3d9d4ceecd51c5b147a0e3ab6edb72e0"))
//                .ttl(-1)
                .message(UniPushDTO.Message
                        .builder()
                        .content( "村里发金条了,速归!")
                        .title("速归")
                        .payload("测试")
                        .build())
                .build();
        boolean result = uniPushUtils.pushByCId(uniPushDTO);
        System.out.println("result = " + result);
    }

    /**
     * 根据别名单推推送测试
     */
    @Test
    public void pushByAliasTest() {
        UniPushDTO uniPushDTO = UniPushDTO
                .builder()
                .aliasList(ListUtil.toList("1790974474554609665"))
//                .ttl(-1)
                .message(UniPushDTO.Message
                        .builder()
                        .content( "村里发金条了,速归!")
                        .title("聚城测试")
                        .payload("测试")
                        .build())
                .build();

        boolean result = uniPushUtils.pushByAlias(uniPushDTO);
        System.out.println("result = " + result);
    }

    /**
     * 根据别名多推推送测试
     */
    @Test
    public void pushByAliasListTest() {
        UniPushDTO uniPushDTO = UniPushDTO
                .builder()
                .aliasList(ListUtil.toList("1790974474554609665" , "15065606797" , "4565456"))
//                .ttl(-1)
                .message(UniPushDTO.Message
                        .builder()
                        .content( "村里发金条了,速归!")
                        .title("聚城测试")
                        .payload("测试")
                        .build())
                .build();
        boolean result = uniPushUtils.pushByAliasList(uniPushDTO);
        System.out.println("result = " + result);
    }


    /**
     * 单解绑测试
     */
    @Test
    public void unBoundingTest() {

        boolean result = uniPushUtils.unBoundingUserIdAndCId( CIdAliasDTO.builder()
                .alias("1790974474554609665")
                .cId("3d9d4ceecd51c5b147a0e3ab6edb72e0")
                .build());
        System.out.println("result = " + result);
    }
}

三、uniapp端订阅消息事件(未配置不影响推送,用户收到消息后的后续操作)

  • App.vue

    onLaunch: function() {
          service.saveLogInfo("********************** App启动 ************************")
          //#ifdef APP-PLUS
          var info = plus.push.getClientInfo() // 获取clientId
          console.log(`info` , info)
          if (info && info.clientid) {
            Vue.prototype.$publicStore.cid = info.clientid
          }
    
          // 以下为订阅监听消息事件,如有需要放开
    
          // 使用5+App的方式进行监听消息推送 点击消息回调
          plus.push.addEventListener("click", function(msg) {
            if (msg.payload) {
              // 订单下单通知
              if (msg.payload.signature === 'order') {
                uni.navigateTo({
                  url: '/pages/mall/order/list?status=1'
                })
              }
            }
    
          }, false);
    
          // 监听在线消息事件
          plus.push.addEventListener("receive", function(msg) {
    							//业务代码
    							console.log("recevice:" + JSON.stringify(msg))
    
          }, false);
    
    
    		//#endif
    		
    
    		},
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

升级 SpringBoot3 全项目讲解 — 为什么 SpringBoot3 应该抛弃 Maven,搭配 Gradle 来使用?

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 随着 Spring Boot 3 的发布&#xff0c;许多开发者开始考虑如何将现有项目升级到最新版本。Spring Boot 3 带来了许多新特性&#xff0c;包括对 Java 17 的支持、更好的性能优化以及对 G…

Yolov8 目标检测剪枝学习记录

最近在进行YOLOv8系列的轻量化&#xff0c;目前在网络结构方面的优化已经接近极限了&#xff0c;所以想要学习一下模型剪枝是否能够进一步优化模型的性能 这里主要参考了torch-pruning的基本使用&#xff0c;v8模型剪枝&#xff0c;Jetson nano部署剪枝YOLOv8 下面只是记录一个…

【深度学习】关键技术-激活函数(Activation Functions)

激活函数&#xff08;Activation Functions&#xff09; 激活函数是神经网络的重要组成部分&#xff0c;它的作用是将神经元的输入信号映射到输出信号&#xff0c;同时引入非线性特性&#xff0c;使神经网络能够处理复杂问题。以下是常见激活函数的种类、公式、图形特点及其应…

图数据库 | 18、高可用分布式设计(中)

上文我们聊了在设计高性能、高可用图数据库的时候&#xff0c;从单实例、单节点出发&#xff0c;一般有3种架构演进选项&#xff1a;主备高可用&#xff0c;今天我们具体讲讲分布式共识&#xff0c;以及大规模水平分布式。 主备高可用、分布式共识、大规模水平分布式&#xff…

Oracle 终止正在执行的SQL

目录 一. 背景二. 操作简介三. 投入数据四. 效果展示 一. 背景 项目中要求进行性能测试&#xff0c;需要向指定的表中投入几百万条数据。 在数据投入的过程中发现投入的数据不对&#xff0c;需要紧急停止SQL的执行。 二. 操作简介 &#x1f449;需要DBA权限&#x1f448; ⏹…

Datawhale组队学习笔记task1——leetcode面试题

文章目录 写在前面刷题流程刷题技巧 Day1题目1、0003.无重复字符的最长子串解答&#xff1a;2.00004 寻找两个正序数组的中位数解答&#xff1a;3.0005.最长回文子串解答4.0008.字符串转换整数解答&#xff1a; Day2题目1.0151.反转字符串中的单词解答2.0043.字符串相乘解答3.0…

K3二开:在工业老单工具栏增加按钮,实现打印锐浪报表

在上次实现用GridRepot报表实现打印任务单后&#xff0c;在想着能不能给将生产任务单原来要通过点击菜单栏&#xff0c;打印任务单的功能&#xff0c;在工具栏上也增加按钮实现&#xff0c;这样就不需要多点了。 原本是需要点击菜单栏才能实现的 现在在工具栏上增加按钮实现同…

[计算机网络]一. 计算机网络概论第一部分

作者申明&#xff1a;作者所有文章借助了各个渠道的图片视频以及资料&#xff0c;在此致谢。作者所有文章不用于盈利&#xff0c;只是用于个人学习。 1.0推荐动画 【网络】半小时看懂<计算机网络>_哔哩哔哩_bilibili 1.1计算机网络在信息时代的作用 在当今信息时代&…

机器学习之支持向量机SVM及测试

目录 1 支持向量机SVM1.1 概念1.2 基本概念1.3 主要特点1.4 优缺点1.5 核函数1.6 常用的核函数1.7 函数导入1.8 函数参数 2 实际测试2.1 二维可视化测试代码2.2 多维测试 1 支持向量机SVM 1.1 概念 支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff…

云服务信息安全管理体系认证,守护云端安全

在数据驱动的时代&#xff0c;云计算已成为企业业务的超级引擎&#xff0c;推动着企业飞速发展。然而&#xff0c;随着云计算的广泛应用&#xff0c;信息安全问题也日益凸显&#xff0c;如同暗流涌动下的礁石&#xff0c;时刻威胁着企业的航行安全。这时&#xff0c;云服务信息…

服务器数据恢复—Zfs文件系统数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台zfs文件系统的服务器&#xff0c;管理员误操作删除了服务器上的数据。 服务器数据恢复过程&#xff1a; 1、将故障服务器中所有硬盘做好标记后取出&#xff0c;硬件工程师检测后没有发现有硬盘存在硬件故障。以只读方式将所有硬盘…

​​​​​​​​​​​​​​★3.3 事件处理

★3.3.1 ※MouseArea Item <-- MouseArea 属性 acceptedButtons : Qt::MouseButtons containsMouse : bool 【书】只读属性。表明当前鼠标光标是否在MouseArea上&#xff0c;默认只有鼠标的一个按钮处于按下状态时才可以被检测到。 containsPress : bool curs…

GIS大模型:三维重建与建模

文章目录 数据收集预处理特征提取深度估计点云生成表面重建纹理映射大模型的角色 大模型在三维重建与建模方面&#xff0c;尤其是在处理低空地图数据时&#xff0c;展现了其强大的能力。通过使用深度学习算法&#xff0c;特别是那些基于卷积神经网络&#xff08;CNNs&#xff0…

wireshark抓路由器上的包 抓包路由器数据

文字目录 抓包流程概述设置抓包配置选项 设置信道设置无线数据包加密信息设置MAC地址过滤器 抓取联网过程 抓包流程概述 使用Omnipeek软件分析网络数据包的流程大概可以分为以下几个步骤&#xff1a; 扫描路由器信息&#xff0c;确定抓包信道&#xff1b;设置连接路由器的…

阿里云无影云电脑的使用场景

阿里云无影云电脑是一种安全、高效的云上虚拟桌面服务&#xff0c;广泛应用于多种场景&#xff0c;包括教育、企业办公、设计与视频制作、客服中心等。以下是九河云总结的无影云电脑的几个典型使用场景&#xff1a; #### 1. 教育机构 - **业务痛点**&#xff1a; - 学生实践操…

力扣 查找元素的位置

二分查找经典例题。 题目 要是只是从数组中用二分查找对应的元素&#xff0c;套一下模板一下就可以得出了&#xff0c;然后这题就在于其中会有多个目标元素&#xff0c;要用不同的方式在找到第一个元素时再做偏移。 时间复杂度&#xff1a;O(log n)&#xff0c;空间复杂度&am…

Profibus DP转Modbus TCP协议转换网关模块功能详解

Profibus DP 和 Modbus TCP 是两种不同的工业现场总线协议&#xff0c;Profibus DP 常用于制造业自动化领域&#xff0c;而 Modbus TCP 则在工业自动化和楼宇自动化等领域广泛应用。实现 Profibus DP 转 Modbus TCP 功能&#xff0c;通常需要特定的网关设备&#xff0c;以下为你…

SQL Prompt 插件

SQL Prompt 插件 注&#xff1a;SQL Prompt插件提供智能代码补全、SQL格式化、代码自动提示和快捷输入等功能&#xff0c;非常方便&#xff0c;可以自行去尝试体会。 1、问题 SSMS&#xff08;SQL Server Management Studio&#xff09;是SQL Server自带的管理工具&#xff0c…

OpenCV基础:矩阵的创建、检索与赋值

本文主要是介绍如何使用numpy进行矩阵的创建&#xff0c;以及从矩阵中读取数据&#xff0c;修改矩阵数据。 创建矩阵 import numpy as npa np.array([1,2,3]) b np.array([[1,2,3],[4,5,6]]) #print(a) #print(b)# 创建全0数组 eros矩阵 c np.zeros((8,8), np.uint8) #prin…

【Flink系列】9. Flink容错机制

9. 容错机制 在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 9.1 检查点&#xff08;Checkpoint&#xff09; 9.1.1 检查点的保存 1&#xff09;周期性的触发保存 “随时存档”确实恢复起来方便&#xff0c;可是需要我…