随着中国制造2025计划的推进,工厂自动化程度进一步提高,智能制造逐渐实现。由此带来了对智慧仓储的需求。无人化是智慧工厂发展的趋势所在,用机器人替代人力进行仓储管理会进一步提高制造的效率。于是,AGV小车机器人应运而生并受到广泛关注。本文将从以下几个方面简单介绍AGV小车的组成并重点讲解其实现通讯的基本技术。 一. AGV介绍 AGV硬件组成 :AGV的硬件组成主要包括以下几部分。 (1) 动力系统 :车载电源、驱动装置(伺服电机、驱动器、车轮、制动装置、控制卡) (2) 传感系统 (包含安全系统、定位导航系统):各种传感器、数据采集装置(采集卡) (3) 通信系统 :工业无线客户端(无线网卡) (4) 控制系统 :转向装置、车载计算机 (5) 车体支架:AGV的车体主要包括了机械结构,并预留部分空间用于电气控制 (6) 其他装置:另外还包含人机界面、操作面板、控制面板等辅助装置 AGV导航方式 (1) 磁感应导航:通过在行进路线上埋线等方式形成磁场,AGV上的电磁传感器再根据电磁 感应原理,检测接收到的电磁信号强度差异,从而控制车体行进路线。特点是经济实惠,安装便利,但是灵活.... AGV小车通讯原理简介 agv
1、什么是浏览器隔离? 浏览器隔离是一项技术,它通过将加载网页的过程与显示网页的用户设备分开以此来保持浏览活动的安全。这样,潜在的恶意网页代码就不会在用户的设备上运行,可防止恶意软件和其他网络攻击对用户设备和内部网络的影响。 从安全角度来看,访问网站和使用 Web 应用程序都涉及到 Web 浏览器需要加载不受信任的远程来源(如遥远的 Web 服务器)的内容和代码,然后在用户的设备上执行这些代码,这使得浏览 Web 成为一种相当危险的活动。与之相反,浏览器隔离在远离用户的地方加载和执行代码,使用户设备和所连接的网络免受风险的影响——这类似于在工厂内使用机器人来执行某些危险任务可以使工厂工人更安全。 浏览器隔离是零信任安全模型的重要组成部分,在该模型中,默认不信任任何用户、应用程序或网站。零信任是一种信息安全方法,默认情况下不信任任何用户、Web 流量、应用程序或设备。零信任安全模型假设即使用户已安全加载网站 99 次,该网站也可能在第 100 次被入侵。浏览器隔离是在实践中实现这一假设的一种方式。 1.1、浏览器隔离的作用 浏览器隔离的作用: 删除危险的下载内容 恶意脚本不会在设备上或.... 远程浏览器隔离技术 浏览器
网上大部分国密教程都是基于国密SSL实验室(www.gmssl.cn)提供的国密版OpenSSL,可以与Nginx集成。 但是其声明了 https://gmssl.cn/gmssl/index.jsp 每年年底会自动退出,因此采用Tengine+BabaSSl(https://www.babassl.cn/2022/01/11/BabaSSL-plus-Tengine.html),阿里系来构建国密应用,均为开源,没有限制。(Tengine是阿里维护的nginx,完全兼容nginx语法) 限制 免费版本每年年底失效,程序会自动退出,需更新库,重新链接。请勿用于正式/生产环境,后果自负。 需要正式版本请与我们联系。 软件版本,可实现国密/RSA自适应 debian 11.3 tengine:2.3.3 babassl8.3.1 arm64 架构 构建镜像 拉取debian镜像 root@arm-64:~# docker pull debian:11.3 准备容器 root@arm-64:~# docker run -itd --name tengine -p 81.... 有更新! 国密docker容器实战 gmssl
https://www.fosstechnix.com/install-oracle-java-8-on-ubuntu-20-04/ 下载 jdk-8u251-linux-x64.tar.gz 解压 sudo mkdir -p /opt/jdk # 解压后放到/opt/jdk Install Oracle Java 8 on Ubuntu 20.04 LTS with Alternatives sudo update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_251/bin/java 100 如果有多个版本可以这么切换 sudo update-alternatives --config java 配置环境变量 # 编辑 /etc/environment ,填入以下内容 JAVA_HOME=/opt/jdk/jdk1.8.0_251 JRE_HOME=/opt/jdk/jdk1.8.0_251/jre # 使生效 source /etc/environment Ubuntu:安装 Oracle JDK8 ubuntu
前言 不正确的日志打印不但会降低程序运行性能,还会占用大量IO资源和硬盘存储空间。 本文主要总结一些能提高日志打印性能的手段。 一、通过AsyncAppender异步输出日志 我们通常使用的ConsoleAppender 和 RollingFileAppender都是同步输出日志,会阻塞程序运行。只有当日志打印完毕程序才会继续执行。 而通过AsyncAppender实现异步日志输出,会启用单独日志线程去记录日志,并且不会阻塞程序运行,可以极大的增加日志打印的吞吐量。 具体实现可以查看:logback异步输出日志详解 配置示例: 添加一个基于异步写日志的 appender,并指向原先配置的 appender即可。 <configuration> <!-- 同步输出 --> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>myapp.log</file> <encoder> <pattern>%logger{35} .... logback性能优化详解 java
什么是 MQTT 主题? MQTT 主题本质上是一个 UTF-8 编码的字符串,是 MQTT 协议进行消息路由的基础。MQTT 主题类似 URL 路径,使用斜杠 / 进行分层: chat/room/1 sensor/10/temperature sensor/+/temperature sensor/# 为了避免歧义且易于理解,通常不建议主题以 / 开头或结尾,例如 /chat 或 chat/。 不同于消息队列中的主题(比如 Kafka 和 Pulsar),MQTT 主题不需要提前创建。MQTT 客户端在订阅或发布时即创建了主题,并且也不需要手动删除主题。 下图是一个简单的 MQTT 订阅与发布流程, APP 1 订阅了sensor/2/temperature 主题后,将能接收到 Sensor 2 发布到该主题的消息。 MQTT 主题通配符 MQTT 主题通配符包含单层通配符 + 及多层通配符 #,主要用于客户端一次订阅多个主题。 注意 :通配符只能用于订阅,不能用于发布。 单层通配符 加号 (“+” U+002B) 是用于单个主题层级匹配的通配符。在使用单层通配符时,单层通配.... 通过案例理解 MQTT 主题与通配符 mqtt
前言 之前看了一些关于Mqtt协议的文章,看完了没有去做笔记,过了这么久忘了很多。最近刚好在做相关的东西,需要用到,就顺便记下来了。 正文 cleansession 清除会话 在客户端连接服务端时设置。 值为:true/false 作用:服务器必须在客户端断开之后继续存储/保持客户端的订阅状态,包括以下状态 存储订阅的消息Qos1和Qos2消息,当客户端重新订阅时发送 服务端正在发送消息给客户端期间连接丢失导致发送失败的消息 retain 持久消息。 想一下以下场景,你有个温湿度传感器,每隔几个钟向主题发送一次消息,此时你有个新的客户端订阅了这个主题,那它难道要等上几个钟才能获得消息吗?可不可以一订阅就获取上一次发送的消息呢? 答案是可以的 值为: true/false 作用:表示发送的消息需要一直持久保存(不受服务器重启影响),不但要发送给当前的订阅者,并且以后新来的订阅了此Topic name的订阅者会马上得到推送。 注意:新来的订阅了此topic name的订阅者指的是新的clientID用户,也就是说假如你是叫12345的用户在同一次的连接中多次重复订阅的话是和订阅一次一样的;.... Mqtt协议——cleansession、retain、will、Shared Subscription mqtt
遗嘱消息是 MQTT 为那些可能出现 意外断线 的设备提供的将 遗嘱 优雅地发送给第三方的能力。意外断线包括但不限于: 因网络故障或网络波动,设备在保持连接周期内未能通讯,连接被服务端关闭 设备意外掉电 设备尝试进行不被允许的操作而被服务端关闭连接,例如订阅自身权限以外的主题等 遗嘱消息可以看作是一个简化版的 PUBLISH 消息,他也包含 Topic, Payload, QoS 等字段。遗嘱消息会在设备与服务端连接时,通过 CONNECT 报文指定,然后在设备意外断线时由服务端将该遗嘱消息发布到连接时指定的遗嘱主题(Will Topic)上。这也意味着服务端必须在回复 CONNACK 之前完成遗嘱消息的存储,以确保之后任一时刻发生意外断线的情况,服务端都能保证遗嘱消息被发布。 以下为遗嘱消息在 MQTT 5.0 和 MQTT 3.1 & 3.1.1 的差异: MQTT 5.0 MQTT 3.1 & 3.1.1 Will Retain Yes Yes Will QoS Yes Yes Will Flag Yes Yes Will Properties Yes No Wi.... MQTT 遗嘱消息(Will Message)的使用 emqx
基于MQTT 3.1版本,标准MQTT发布遗嘱消息的几种情况。 如果想设置遗嘱消息,那么客户端请求和代理服务器链接之前,必须把遗嘱消息提前填写好,在请求连接时,把遗嘱消息发给代理服务器。 MQTT遗嘱消息,什么时候订阅者会收到代理服务器发布的遗嘱消息?以下四种情况: 服务端发生了I/O 错误或者网络失败; 客户端在定义的心跳时期失联; 客户端在发送下线包之前关闭网络连接; 服务端在收到下线包之前关闭网络连接。 遗嘱标志 Will Flag 位置: 连接标志的第2位。 遗嘱标志( Will Flag) 被设置为1, 表示如果连接请求被接受了, 遗嘱( Will Message) 消息必须被存储在服务端并且与这个网络连接关联。 之后网络连接关闭时, 服务端必须发布这个遗嘱消息, 除非服务端收到DISCONNECT报文时删除了这个遗嘱消息。 遗嘱消息发布的条件, 包括但不限于: 服务端检测到了一个I/O错误或者网络故障。 客户端在保持连接( Keep Alive) 的时间内未能通讯。 客户端没有先发送DISCONNECT报文直接关闭了网络连接。 由于协议错误服务端关闭了网络连接。 如果遗嘱.... MQTT 遗嘱消息(Will Message)发布 mqtt
背景 症状 排查 修复 背景 最近在陆续做机房升级相关工作,配合DBA对产线数据库链接方式做个调整,将原来直接链接读库的地址切换到统一的读负载均衡的代理 haproxy 上,方便机柜和服务器的搬迁。 切换之后线上时不时的会发生 discard connection 错误,导致程序报 500 错误,但不是每次都必现的。 开发框架: spring boot+mybatis+druid+shardingJDBC 网络架构: appserver->mysql(master) 写 appserver->haproxy->mysql(slave)/n 读 第一反应肯定是因为这次的读库地址的变动引起的问题,觉得问题应该是 druid 链接池中的 connection 保活策略没起作用,只要做下配置修改应该就可以了。结果这个问题让我们排查了好几天,我们竟然踩到了千年难遇的深坑。 这个问题排查的很坎坷,一次次的吐血,最终我们定位到问题并且优雅的修复了,我们一起来体验下这个一次一次让你绝望一次一次打脸的过程。 症状 先说故障症状,经常出现如下错误: discard connect.... 诡异的druid链接池链接断开故障经验总结 druid
Python flask设置favicon.ico图标,如图: import os from flask import Flask from flask import send_from_directory from flask import request app = Flask(__name__) @app.route('/favicon.ico')#设置icon def favicon(): return send_from_directory(os.path.join(app.root_path, 'static'),#对于当前文件所在路径,比如这里是static下的favicon.ico 'favicon.ico', mimetype='image/vnd.microsoft.icon') @app.route('/') def hello_world(): name=request.args.get("name")#获取参数对应值 return name if __name__ == '__main__': app.run(host='127.0.0.1',port=50.... Python flask设置favicon.ico图标 python
concurrent.futures的作用: ** 管理并发任务池** 。concurrent.futures模块提供了使用工作线程或进程池运行任务的接口。线程和进程池API都是一样,所以应用只做最小的修改就可以在线程和进程之间地切换 1、基于线程池使用map() #!/usr/bin/env python # -*- coding: utf-8 -*- from concurrent import futures import threading import time def task(n): print('{}: 睡眠 {}'.format(threading.current_thread().name,n)) time.sleep(n / 10) print('{}: 执行完成 {}'.format(threading.current_thread().name,n)) return n / 10 ex = futures.ThreadPoolExecutor(max_workers=2) print('main: 开始运行') results = ex.map(task, r.... Python之concurrent.futures模块的使用 python
实例 FROM java:8 VOLUME /tmp ADD app.jar app.jar RUN bash -c 'touch /app.jar' EXPOSE 9001 ENV JAVA_OPTS=" -server -Xmx4g -Xms4g -Xmn2g -XX:SurvivorRatio=8 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseParallelGC -XX:ParallelGCThreads=4 -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/ -Xloggc:/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileS.... dockerfile指定jvm参数 Docker java jvm OOM内存溢出问题排查 诊断监控 java
在linux下编写shell脚本,赋予权限即可运行。如果是在windows下编写,比如在idea编辑器中编写,编写完毕后传到服务器上执行,有时候会出现坏的解释器: 原因: 由于windows系统下换行符为 \r\n,linux下换行符为 \n,所以导致在windows下编写的文件会比linux下多回车符号 \r。 解决方法: 只需要去掉多余的 \r 回车符 即可。操作办法可以用sed命令进行全局替换 sed 's/\r//' -i gen_cert.sh 也可以用 vim 来重新编辑脚本,使用vim首先查看文件格式: 在底行模式下输入 set ff,回车可以看到文件格式为dos。 修改文件格式为 unix即可。 底行模式下输入 set ff=unix 保存退出即可。 idea设置: 由于在windows下的换行符多一个回车符,所以会出现这种问题,那么在idea中进行编辑的时候,是可以指定换行符形式的: 将换行符指定为linux形式就可以避免这种问题。 /bin/bash^M: 坏的解释器: 没有那个文件或目录 的解决方法 linux
选择安装版本 INSTALLING PREVIOUS VERSIONS OF PYTORCH 之后执行如下命令安装完整驱动 conda install -c conda-forge cudatoolkit-dev [CUDA_HOME environment variable is not set. Please set it to your CUDA install root for pytorch cpp extensions](https://github.com/conda/conda/issues/7757) 有更新! CUDA_HOME environment variable is not set. Please set it to your CUDA install root for pytorch cpp extensions pytorch
在 webflux + druid 中使用druid的监控页面 使用tomcat作为web容器(druid版本1.2.8) 1.1 添加依赖 1.2 将filter赋值到tomcat的context 中 使用netty作为web容器. //TODO 2.1 添加依赖 避免报错 2.2 添加路由 使用tomcat作为web容器(druid版本1.2.8) 如果能选择tomcat作为容器的话, 就非常好解决了. 只要配置一下filter就行 注意: druid版本必须 大于1.2.5 1.1 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <exclusions> <!-- Exclude the reactor-netty dependency --> <exclusion> <groupId>or.... 在webflux+druid中 使用druid的监控页面 webflux
目前,很多的网站或网络服务中,用户可能会注册多个账号来满足不同的需求,但是困于浏览器的Cookie问题,一次只能同时登录一个账号,而多个账号的切换或者使用隐私模式,又比较费时费力,切换浏览器又会有个浏览习惯的问题,造成了不少的困扰。 现在Chrome实现多开的方式一般有三种: 通过Chrome本身自带的用户管理功能,添加多个用户,其相互之间独立存在,所有的浏览记录、密码、扩展、Cookie等都完全隔离,互不影响。 通过启动参数chrome.exe --profile-directory=[path]来启动chrome,本质是方法 1 相同,不同的目录会创建一个新的用户,可用于编程或自动化操作。 通过启动参数手动指定不同的用户数据存储路径来进行功能实现,可以手动建立多个快捷方式,使用chrome.exe --user-data-dir=[path]的启动,相当于一套独立的Chrome,不会创建新用户,可用于编程或自动化操作。 三种方法各有优劣,可根据自身的需求进行选择使用。 如何实现Chrome多开/启动多个独立的Chrome实例 chrome
^\s*([a-z]+)[\.]* 删除a-z开头的行 ^\s*(?=\r?$)\n 删除空行 ^(.+)((?:\r?\n.*)*)(?:\r?\n\1)$ 替换$1$2 删除重复行 ^[A-Za-z0-9]+$ 删除英文和带数字的英文行 ^[!]+$ 删除一个!的行 ^[a-zA-Z0-9’!"]+$ 删除里面带,!"的英文行 ^[A-Za-z0-9’!";_+=()?…“”%/‘<>&,$*#^@]+$ 删除几乎所有的英文行 VS Code常见正则表达式,如删除空行、删除重复行等等 vscode
最近,一直运行在tomcat6上的一个项目,因为集成别人控件(控件要在tomcat8上运行)的缘故,发现系统中js文件出现中文乱码的情况。 解决办法: 1、找到apache-tomcat-8.5.68\conf\server.xml文件 <Connector port="8088" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URLEncoding="UTF-8" /> 添加 URLEncoding=“UTF-8” 2、找到apache-tomcat-8.5.68\bin\catalina.bat文件 set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS% -Dfile.encoding=UTF8 " 添加 -Dfile.encoding=UTF8 网上还有人说同时加上 -Dsun.jnu.encoding=UTF8 这个我倒是没有添加。重启tomcat之后,JS中文乱码还是存在,于是我又找到了第三种。 3、找到apache-tomcat-8.5.68\conf.... tomcat启动项目后,js文件内容出现中文乱码的解决办法 tomcat
在某些应用场景中,需要特定的gcc版本支持,但是轻易不要去编译gcc、不要去编译gcc、不要去编译gcc,我这里推荐使用红帽提供的开发工具包来管理gcc版本,这样做的好处是随时切换版本,并且可以并存多个版本,不破坏原有gcc环境。 本文基于CentOS7验证通过,不适用于CentOS8版本,CentOS8升级gcc见:https://blog.whsir.com/post-6114.html 红帽官方Developer Toolset文档地址:https://access.redhat.com/documentation/en-us/red_hat_developer_toolset/8/ devtoolset对应gcc的版本 1devtoolset-3对应gcc4****.x.****x版本 2devtoolset-4对应gcc5****.x.****x版本 3devtoolset-6对应gcc6****.x.****x版本 4devtoolset-7对应gcc7****.x.****x版本 5devtoolset-8对应gcc8****.x.****x版本 6devtoolse.... CentOS完美升级gcc版本方法 openssl