(OCPP服务器)SteVe编译搭建全过程
注意:建议使用3.6.0,我升级到3.7.1,并没有多什么新功能,反而电表的实时数据只能看到累计电能了,我回退了就正常,数据库是兼容的,java版本换位java11,其他不变就好
背景:
国外欧标充电桩开发中,服务器对接是很重要的一环,出国外的基本都是需要支持OCPP功能,基本要求是OCPP1.6,还有些客户已经开始要2.0了,OCPP测试至关重要,目前有两种测试方法,1,使用Monta服务器,去注册一个账号,然后链接调试即可,2.自己在云端搭建一个自己的OCPP平台(SteVe)。
两个平台我都有使用,用得多并且顺手的是SteVe平台。以下是简单总结一下使用后的感受。
Monta平台界面比较单一,下发的命令的应答只能看log里面找到对应的应答数据(json),优点是有认证测试功能,可以免费自己注册一个账号就能使用,免费https://ocpp-toolkit.monta.app/
SteVe平台界面丰富,可以管理ocpp tags(充电卡)或者get configration的时候预设很多系统的key使用,应答命令会帮你解析在页面显示出来,目前SteVe平台是最完善的,并且是开源免费的。
综上所述,自己搭建一个服务器就很有必要了。
SteVe平台搭建主要流程:
- 1.先准备一个云服务器,如果没有云服务器,可以考虑用虚拟机安装一个centos7,然后把这个机器映射到外网临时用也行。
- 2.下载SteVe官方源码包,我这里就用3.17.1举例。官方源码在GitHub https://github.com/steve-community/steve。
- 3.数据库MYSQL8的安装与配置,因为CentOS使用的是mariadb,但你去编译SteVe的时候你会发现提示非长期支持版,会报错。
- 4.安装Java17,Centos内置了Java工具,但查看版本发现是1.8的,SteVe3.7.1要求是Java17,删除Java1.8再安装Java17.
- 5.编译SteVe源码。
- 6.运行,测试
- 7.制作开机自启。
详细步骤:
1.下载SteVe源码。并阅读README.md,了解这个平台需要用到的环境,先配置好这些环境,然后了解编译工具和编译运行。经过阅读发现需要使用mysql8,java17,Maven
2.首先来安装数据库,数据库MYSQL8的安装与配置,查看当前mariadb版本信息。
rpm -e --nodeps
上一条命令列出的文件名。
rpm -qa|grep mariadb
用于检查是否卸载干净。
让AI帮忙写了一个centos7安装mysql8的脚步,这样比传统的下载安装更省事
#!/bin/bash# Exit script on any error
set -e# Fixed password to be used
fixed_password="Msb666666"# 1. Add the MySQL Yum repository
echo "Adding the MySQL Yum repository..."
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpmecho "Checking the integrity of the downloaded package..."
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysqlecho "Installing the MySQL Yum repository..."
yum localinstall mysql80-community-release-el7-3.noarch.rpm -y# 2. Install the MySQL server
echo "Installing the MySQL server..."
yum install mysql-community-server -y# 3. Start the MySQL service
echo "Starting the MySQL service..."
systemctl start mysqld
systemctl enable mysqld# 4. Get the temporary password generated for the root user
echo "Retrieving the temporary password..."
temp_password=$(grep 'temporary password' /var/log/mysqld.log | tail -1 | rev | cut -d" " -f1 | rev)echo "The temporary MySQL root password is: $temp_password"# 5. Change the root user's password to the desired fixed password
echo "Changing the root user's password..."mysql --connect-expired-password -uroot -p"$temp_password" <<-EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '$fixed_password';
FLUSH PRIVILEGES;
EOFecho "The root password has been successfully changed to the fixed password."# Optionally, you can run the mysql_secure_installation steps here if you want to automate it further.echo "MySQL 8 installation is complete."
还有mysql运行脚本
#!/bin/bash# This script starts the MySQL service and sets it to launch on boot# Exit script on any error
set -e# Start the MySQL service
echo "Starting the MySQL service..."
systemctl start mysqld# Enable the MySQL service to start on boot
echo "Setting the MySQL service to start on boot..."
systemctl enable mysqld# Confirmation message
echo "MySQL service has been started and set to launch on boot."
安装好了之后通过ssh命令行登陆数据库
mysql -u root
接下来为steve创建相关数据
steve 数据库mysql8
用户名:root
密码:Msb666666@,
Steve数据库用户名:steve
密码:changeme
脚本安装后需要更新默认的随机密码,密码不能太简单,需要带点符合,否则会失败
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Msb666666@,';
FLUSH PRIVILEGES;
创建SteVe需要用到的数据库stevedb
CREATE DATABASE stevedb CHARACTER SET utf8 COLLATE utf8_unicode_ci;
创建完毕后可以使用命令查看一下,可以看到Stevedb
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| stevedb |
| sys |
+--------------------+
5 rows in set (0.00 sec)
再为这个数据创建一个数据库用户steve,这个和SteVe平台README.md默认用户名和密码保持一致,否则两边一起改。
CREATE USER 'steve'@'localhost' IDENTIFIED BY 'changeme';
GRANT ALL PRIVILEGES ON stevedb.* TO 'steve'@'localhost';
GRANT SUPER ON *.* TO 'steve'@'localhost';
然后退出数据库尝试使用新数据库用户登陆
mysql -u steve -p
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| stevedb |
+--------------------+
3 rows in set (0.00 sec)mysql>
这样就完成了,不需要建表,这个SteVe在打包编译和运行的时候都会自动建表。
编译之前还需要改一下数据库默认时区,解决java编译的时候时区问题。
vi /etc/my.cnf
增加default-time-zone=‘+08:00’
重启数据库
systemctl restart mysqld
数据库好了,还需要Java运行环境
yum install java-17-openjdk-devel
如果系统里有多个java版本可以使用alternatives来切换
CentOS 支持通过 alternatives 命令来管理多个版本的 Java。您可以按照以下步骤进行设置:
alternatives --install /usr/bin/javac java /usr/lib/jvm/temurin-17-jdk/bin/java 1
alternatives --install /usr/bin/javac javac /usr/lib/jvm/temurin-17-jdk/bin/javac 1
sudo alternatives --config java
选择Java17即可
修改Steve代码
修改Java代码,改到上海时区东八区,方便测试使用
public class Application implements ApplicationStarter, AutoCloseable {private final ApplicationStarter delegate;public Application() {// For Hibernate validatorSystem.setProperty("org.jboss.logging.provider", "slf4j");SteveConfiguration sc = SteveConfiguration.CONFIG;log.info("Loaded the properties. Starting with the '{}' profile", sc.getProfile());// 设置java.util.TimeZone的默认时区为东八区TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); DateTimeZone.setDefault(DateTimeZone.forID("Asia/Shanghai"));//TimeZone.setDefault(TimeZone.getTimeZone(sc.getTimeZoneId()));//DateTimeZone.setDefault(DateTimeZone.forID(sc.getTimeZoneId()));log.info("Date/time zone of the application is set to {}. Current date/time: {}", sc.getTimeZoneId(), DateTime.now());switch (sc.getProfile()) {case DEV:
默认的配置部署到服务器是无法正常访问的,需要修改一下配置,数据库部分一定要和前面配置的数据库的鞥冷信息和端口一样,网页登录信息建议改为自己的密码,最好还是随机密码,修改的java配置文件在src\main\resources\config\prod\main.properties
# Just to be backwards compatible with previous versions, this is set to "steve",
# since there might be already configured chargepoints expecting the older path.
# Otherwise, might as well be changed to something else or be left empty.
#
context.path = steve# Database configuration
#
db.ip = 127.0.0.1
db.port = 3306
db.schema = stevedb
db.user = steve
db.password = changeme# Credentials for Web interface access
#
auth.user = admin
auth.password = 写上你的密码# The header key and value for Web API access using API key authorization.
# Both must be set for Web APIs to be enabled. Otherwise, we will block all calls.
#
webapi.key = STEVE-API-KEY
webapi.value =# Jetty configuration
#
server.host = 0.0.0.0
server.gzip.enabled = true# Jetty HTTP configuration
#
http.enabled = true
http.port = 8080# Jetty HTTPS configuration
#
https.enabled = false
https.port = 8443
keystore.path =
keystore.password =# When the WebSocket/Json charge point opens more than one WebSocket connection,
# we need a mechanism/strategy to select one of them for outgoing requests.
# For allowed values see de.rwth.idsg.steve.ocpp.ws.custom.WsSessionSelectStrategyEnum.
#
ws.session.select.strategy = ALWAYS_LAST# if BootNotification messages arrive (SOAP) or WebSocket connection attempts are made (JSON) from unknown charging
# stations, we reject these charging stations, because stations with these chargeBoxIds were NOT inserted into database
# beforehand. by setting this property to true, this behaviour can be modified to automatically insert unknown
# stations into database and accept their requests.
#
# CAUTION: setting this property to true is very dangerous, because we will accept EVERY BootNotification or WebSocket
# connection attempt from ANY sender as long as the sender knows the URL and sends a valid message.
#
auto.register.unknown.stations = false# if this field is set, it will take precedence over the default regex we are using in
# de.rwth.idsg.steve.web.validation.ChargeBoxIdValidator.REGEX to validate the format of the chargeBoxId values
#
charge-box-id.validation.regex =### DO NOT MODIFY ###
steve.version = ${project.version}
git.describe = ${git.commit.id.describe}
db.sql.logging = false
profile = prod
安装Maven工具,这个是编译这个项目必不可少的工具,
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
yum install -y apache-maven
[root@iZj6cagyhi0qjy83boeqcyZ ~]# mvn -version
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
Maven home: /usr/share/maven
Java version: 17.0.13, vendor: Eclipse Adoptium
Java home: /usr/lib/jvm/temurin-17-jdk
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.114.2.el7.x86_64", arch: "amd64", family: "unix"
编译代码,生成Java应用程序
./mvnw package
执行并测试
/usr/bin/java -jar /home/steve3.7.1/target/steve.jar
打开网页
能打开基本就成功了,登陆用户名和密码是src\main\resources\config\prod\main.properties里面的
# Credentials for Web interface access
#
auth.user = admin
auth.password = 写上你的密码
手工执行通过后,可以制作自启动Steve服务器
vi /etc/systemd/system/steve.service
[Unit]
Description=Steve Java Application[Service]
User=root# 替换为实际运行该服务的系统用户名
ExecStart=/usr/bin/java -jar /home/steve3.7.1/target/steve.jar
WorkingDirectory=/home/steve3.7.1/target # 确保这是jar文件所在的目录
SuccessExitStatus=143 # java进程退出码为143表示正常退出
TimeoutStopSec=10
Restart=on-failure # 服务失败时进行重启
RestartSec=5 # 重启间隔时间[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable steve.service
systemctl start steve.service
systemctl status steve.service
//重启服务,用户修改了服务源码,重启服务生效。
systemctl restart steve.service
相关文章:

(OCPP服务器)SteVe编译搭建全过程
注意:建议使用3.6.0,我升级到3.7.1,并没有多什么新功能,反而电表的实时数据只能看到累计电能了,我回退了就正常,数据库是兼容的,java版本换位java11,其他不变就好 背景:…...

Mybatis分页插件的使用问题记录
项目中配置的分页插件依赖为 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.7</version></dependency>之前的项目代码编写分页的方式为,通过传入的条件…...

36. Three.js案例-创建带光照和阴影的球体与平面
36. Three.js案例-创建带光照和阴影的球体与平面 实现效果 知识点 Three.js基础 WebGLRenderer WebGLRenderer 是Three.js中最常用的渲染器,用于将场景渲染到网页上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersobject可选参数&#…...

CentOS 7 安装、测试和部署FastDFS
目录 FastDFS环境搭建 安装 libfastcommon 库 安装FastDFS 查看编译后的文件 FastDFS配置 FastDFS启动 启动tracker服务 启动storage服务 查看storage是否已经注册到了tracker下 查看存储文件的目录 FastDFS重启 FastDFS关闭 使用fdfs_test进行测试 修改client.co…...

全志H618 Android12修改doucmentsui选中图片资源详情信息
背景: 由于当前的文件管理器在我们的产品定义当中,某些界面有改动的需求,所以需要在Android12 rom中进行定制以符合当前产品定义。 需求: 进入file文件管理器后,点击选中图片资源,选中功能按钮,获取信息,不显示“调试信息(仅开发者)”;现状是,获取信息,显示“调试信…...

【083】基于51单片机智能烘手器【Proteus仿真+Keil程序+报告+原理图】
☆、设计硬件组成:51单片机最小系统LCD1602液晶显示DS18B20温度传感器TCRT5000红外感应传感器AT24C02存储芯片风扇加热片继电器LED灯按键设置。 1、设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片; 2、系统采用DS18B20温度传感器感应当前环…...

uniApp使用腾讯地图提示未添加maps模块
uniApp使用腾讯地图,打包提示未添加maps模块解决方案 这是报错信息,在标准基座运行的时候是没问题的,但是打包后会提示未添加,可以通过在mainfest里面把地图插件上腾讯地图的key更换高德地图的key,定位服务可以继续用腾…...

未来趋势系列 篇五:自主可控科技题材解析和股票梳理
文章目录 系列文章自主可控科技题材分析国产算力信创(信息技术应用创新)华为鸿蒙军工信息化半导体芯片卫星互联网工业软件股票梳理系列文章 未来趋势系列 篇一:AI题材解析和股票梳理 未来趋势系列 篇一(加更):AI医疗题材解析和股票梳理 未来趋势系列 篇二:HBM题材解析和…...

Springboot 学习 之 logback-spring.xml 日志压缩 .tmp 临时文件问题
文章目录 前言功能简述1. 自定义日志文件名2. 归档规则 && 压缩2.1. 归档配置2.2. 归档压缩2.3. 日志格式 && 编码 现象原因解决办法 前言 在 Springboot 应用中,默认使用 logback-spring.xml 配置日志相关 功能简述 1. 自定义日志文件名 <fi…...

maven-resources-production:ratel-fast: java.lang.IndexOutOfBoundsException
Maven生产环境中遇到java.lang.IndexOutOfBoundsException的问题,尝试了重启电脑、重启IDEA等常规方法无效,最终通过直接重建工程解决了问题。 Rebuild Project 再启动OK...

K8s docker-compose的入门
一、Docker Compose 简介 什么是 Docker Compose? 用于定义和运行多容器 Docker 应用的工具。Docker Compose 的主要功能 使用 docker-compose.yml 文件定义服务。一键启动和管理多容器环境。安装与环境准备 安装 Docker 和 Docker Compose。检查版本:d…...

去雾Cycle-GAN损失函数
文章目录 GAN-LossIdentity-LossDP-lossCycle-Loss G和F都是生成器 G是hazy → \to → gt F是gt → \to → hazy D y D_y Dy判别无雾图是真实还是生成的? D x D_x Dx判别有雾图是真实还是生成的? GAN-Loss 在 DAM-CCGAN 中存在两个判别器 D x D_x D…...

word实现两栏格式公式居中,编号右对齐
1、确定分栏的宽度 选定一段文字 点击分栏:如本文的宽度为22.08字符 2、将公式设置为 两端对齐,首行无缩进。 将光标放在 公式前面 点击 格式-->段落-->制表位 在“制表位位置”输入-->11.04字符(22.08/211.04字符)&…...

vtie项目中使用到了TailwindCSS,如何打包成一个单独的CSS文件(优化、压缩)
在不依赖 Vite 或其他构建工具的情况下,使用 TailwindCSS CLI 快速生成独立的 CSS 文件是一种简单高效的方法,适合需要纯样式文件的场景。 这个项目中,使用到了tailwindCss, 需要把里面的样式打包出来,给其他项目用。 使用命令生…...

shell脚本案例
脚本一:打印当前系统登录用户列表 #!/bin/bash # 使用 who 命令获取当前登录用户信息并输出 who解释:who 命令用于显示当前登录系统的用户信息,包括用户名、登录终端、登录时间等。此脚本直接执行 who 命令并将结果输出到终端。 脚本二&…...

完整微服务设计 功能实现
我们将以一个简单的电商系统为例,实现微服务架构,逐步用Java代码详细实现每个模块,并配合注释帮助小白理解。在这个实现中,我们使用以下工具和框架: Spring Boot:用于构建微服务。Spring Cloud:…...

JWT令牌与微服务
1. 什么是JWT JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于作为JSON对象在各方之间安全地传输信息。JWT通常用于身份验证和信息交换。 以下是JWT的一些关键特性: 紧凑ÿ…...

C# WinForm移除非法字符的输入框
C# WinForm移除非法字符的输入框 文章目录 namespace System.Windows.Forms {using System.ComponentModel;/// <summary>/// 支持移除 非法字符 的输入框。/// </summary>public class RemoveInvalidCharTextBox : TextBox{/// <summary>/// 测试代码&#…...

智慧商城:基于请求数据动态渲染购物车列表
进入购物车列表页面,当即触发请求,打印出解构出来的data.list 查看数据是否添加到 vuex 中。 将物品加入购物车,点击购物车进入购物车列表页,点击 vue 调试工具,可以看到 cart 模块state中新增添加的几个物品信息 渲染…...

医疗信息化浪潮下 SSM+Vue 医院预约挂号系统的崛起
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

QScreen在Qt5.15与Qt6.8版本下的区别
简述 QScreen主要用于提供与屏幕相关的信息。它可以获取有关显示设备的分辨率、尺寸、DPI(每英寸点数)等信息。本文主要是介绍Qt5.15与Qt6环境下,QScreen的差异,以及如何判断高DPI设备。 属性说明 logicalDotsPerInch࿱…...

模具生产过程中的标签使用流程图
①NFC芯片嵌入周转筐,通过读卡器读取CK_Label_v3的数据,并将这些信息上传至服务器进行存储; ②服务器随后与客户的WMS(仓库管理系统)进行交互,记录和同步注塑机的原始数据; ③当周转筐内的模具…...

Unity-URP设置单独渲染UI相机
Unity-URP设置单独渲染UI相机 1、设置主相机层级,剔除UI层 2、新建UICamera,设置RenderType为Overiay;显示层级只选择UI层 3、选择主相机,Stack参数添加UICamera 4、Canvas设置成ScreenSpace-Camera,并指定UICamera渲…...

如何使用java来解析一个pdf文件呢?
最近搞到一个任务是要解析一套雅思题目并提取其中的高频单词。那如何使用java来解析一个pdf文件呢? 首先我们要知道这需要springboot框架来进行创建,需要的PDFTextStripper是一个用于PDF文档中提取文本的类,它是Apache PDFBox的一个类用于处…...

asp.net core发布配置端口号,支持linux
方式一,修改配置文件 appsettings.json 找到文件 appsettings.json, 添加如下节点配置,在linux环境需要设置0.0.0.0才可以正常代表本机,然后被其他机器访问,此处设置端口8000, "Kestrel": {&quo…...

M3D: 基于多模态大模型的新型3D医学影像分析框架,将3D医学图像分析从“看图片“提升到“理解空间“的层次,支持检索、报告生成、问答、定位和分割等8类任务
M3D: 基于多模态大模型的新型3D医学影像分析框架,将3D医学图像分析从“看图片“提升到“理解空间“的层次,支持检索、报告生成、问答、定位和分割等8类任务 论文大纲理解1. 确认目标2. 分析过程(目标-手段分析)核心问题拆解 3. 实…...

JavaScript中,常用crypto模块进行rsa加密,crypto-js模块进行md5算法
Node.js 的 crypto 模块 Node.js 内置的 crypto 模块提供了基本的加密功能,可以用于生成 RSA 密钥对和执行加密、解密操作。 代码案例: const crypto require(crypto);const { publicKey, privateKey } crypto.generateKeyPairSync(rsa, {modulusLen…...

机器学习04-为什么Relu函数
机器学习0-为什么Relu函数 文章目录 机器学习0-为什么Relu函数 [toc]1-手搓神经网络步骤总结2-为什么要用Relu函数3-进行L1正则化修改后的代码解释 4-进行L2正则化解释注意事项 5-Relu激活函数多有夸张1-细数Relu函数的5宗罪2-Relu函数5宗罪详述 6-那为什么要用这个Relu函数7-文…...

基于Arduino的自动开瓶系统
自动瓶盖开启器:结合Arduino和线性运动系统的创新解决方案 展示视频: 基于Arduino的自动开瓶器 引言 在日常生活中,开启瓶盖看似是一件简单的事情,但对于某些人来说,这可能是一个挑战。特别是对于患有类风湿性关节炎…...

通过使用 contenteditable=“true“,我们彻底防止了 iOS 系统键盘的弹出
明白了,对于苹果手机(iOS),即使使用了 bindtap 和 e.preventDefault() 来阻止默认行为,系统键盘仍然可能会弹出。这是因为 iOS 对输入框的处理方式与 Android 不同,尤其是在处理 input 元素时,iOS 会更加积极地弹出键盘。 解决方案 为了彻底防止 iOS 系统键盘弹出,我…...