SteVe OCPP服务器从编译到部署:避坑指南与实战技巧

电动汽车充电系统安全攻防实战:从漏洞挖掘到防御加固 在物联网和车联网领域,系统安全是保障业务连续性与用户隐私的基石。其核心原理在于对‘云-管-端’三层架构进行全面的威胁建模与攻击面分析,识别潜在风险点。这项技术的价值在于通过主动的渗透测试与攻击模拟,将抽象的安全风险转化为具体、可验证的威胁,从而驱动有效的安全加固。典型的应用场景包括对Web API、移动应用(App)及物联网设备固件的安全评估。本文聚焦于电动汽车充电生态系统,深入探讨如何利用诸如中间人攻击(MitM)和模糊测试(Fuzzing)等技术,系统性地挖掘充电云平台与配套App中的安全漏洞,并构建从 阅读详情

1. 环境准备:避开那些看不见的坑

我刚开始接触SteVe OCPP服务器搭建的时候,以为就是个普通的Java项目,结果踩了不少坑。特别是环境配置这块,很多教程都说得太简单了,实际操作起来完全不是那么回事。

先说说系统选择吧。很多人推荐用CentOS 7,但我实测下来,Ubuntu 20.04 LTS其实更友好。主要是软件包更新,依赖问题少很多。如果你非要用CentOS 7,记得先把EPEL仓库装上,不然很多工具都找不到。

Java版本是个大坑!SteVe 3.7.1要求Java 17,但系统自带的往往是Java 8。别尝试用老版本Java跑新SteVe,我试过,各种诡异错误能让你debug到怀疑人生。安装Java 17记得用OpenJDK,Oracle版还要处理许可证问题,太麻烦。

# Ubuntu安装Java 17
sudo apt update
sudo apt install openjdk-17-jdk

# 验证安装
java -version

数据库选择也很关键。官方推荐MySQL 8,但MariaDB 10.6以上也能用。不过要注意,MariaDB的时区处理方式和MySQL有点不一样,后面会详细说这个问题。

2. 数据库配置:时区问题是最常见的坑

数据库配置这块,我踩过最深的坑就是时区问题。OCPP协议要求所有时间都是UTC,但数据库默认时区可能不是UTC,这就导致时间对不上。

先安装MySQL 8。别用系统自带的MariaDB,虽然理论上兼容,但实际会遇到各种奇怪问题。我用这个脚本安装MySQL 8,一直很稳定:

#!/bin/bash
# 安装MySQL 8脚本
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm
sudo yum install mysql-community-server -y
sudo systemctl start mysqld
sudo systemctl enable mysqld

安装完成后,第一件事就是改时区配置。编辑/etc/my.cnf,在[mysqld]段添加:

default-time-zone='+00:00'

这样就把数据库时区设为UTC了。重启MySQL服务后,用mysql -u root -p登录,执行SELECT @@global.time_zone;确认时区设置生效。

创建数据库和用户时,字符集一定要用utf8mb4,不然中文显示会有问题:

CREATE DATABASE stevedb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'steve'@'localhost' IDENTIFIED BY '你的密码';
GRANT ALL PRIVILEGES ON stevedb.* TO 'steve'@'localhost';
FLUSH
STM32开发OCPP协议简单示例 实现需要参考OCPP协议的规范和各自的需求 阅读详情

相关推荐

如何快速开发OCPP1.6充电桩

随着ocpp协议的推广,现在使用ocpp充电桩的客户需求越来越多,但是ocpp入门很复杂,还要部署ocpp服务器才能测试。 在某宝上找到一款神器,可以在一天内将自己的充电桩改成ocpp1.6的。 ## 几乎支持所有的命令 **Supported commands**  Authorize  Boot Notification  Data Transfer  Diagnostics Status Notification  Firmware Stat...

oDanWang1234567891的博客 8274

充电桩OCPP1.6J协议适配

本文介绍了在充电桩固件中快速适配OCPP1.6协议的方法,通过移植开源的MicroOcpp库实现标准化通信。文章详细说明了移植的前置条件、库框架结构、业务接口适配过程,特别是针对STM32F407平台和4G模组的WebSocket通信接口改造方案。移植完成后,建议使用开源OCPP服务器SteVe进行测试验证,并提供了测试工具推荐。该方法有效解决了不同品牌充电设备与管理系统间的互操作性问题,为充电桩产品快速满足国际准入标准提供了可行方案,显著降低了开发成本和时间。

x150061的博客 714

steve:SteVe-Java中的OCPP服务器实现

介绍 SteVe是由亚琛工业大学开发的,意为Steckdosenverwaltung,即德语中的套接字管理。 SteVe的目的是支持电动汽车的部署和普及,因此易于安装和使用。 SteVe提供了用于管理充电点,用户数据和用于用户身份验证的RFID卡的基本功能,并且已经在运行中成功进行了测试。 SteVe被认为是一个开放平台,用于实施,测试和评估电动出行的新颖想法,例如身份验证协议,充电点的预留机制以及电动出行的业务模型。 SteVe是根据发行的,可以免费使用。 如果您要部署SteVe,我们很高兴在收费站上看到。 充电点支持 支持使用以下OCPP版本的充电点: OCPP1.2S OCPP1.2J OCPP1.5S OCPP1.5J OCPP1.6S OCPP1.6J 有关充电站的兼容性,请检查: : 系统要求 SteVe要求 JDK 11(同时支持Oracle JDK和Op

OCPP协议解析 代码+代码含义详解

对OCPP协议功能的详解

OCPP.Core:用.NET-Core编写的OCPP服务器和管理UI

OCPP核心 OCPP.Core是用.NET-Core编写的OCPP()服务器。 它包括一个管理Web-UI,用于管理收费点和收费令牌(RFID令牌) 地位 当前它支持OCPP1.6J和2.0(JSON / REST)。 到目前为止,OCPP.Core仅通过模拟器进行了测试。 我的Wallbox尚未安装:-) 如果它与您的充电站兼容或有问题,请发送反馈 OCPP服务器当前处理以下消息: OCPP V1.6: 开机通知 心跳 授权 StartTransaction 停止交易 仪表值 状态通知 数据传输 重启 解锁连接器 OCPP V2.0: 开机通知 心跳 授权 TransactionEvent 仪表值 状态通知 数据传输 LogStatusNotification 固件状态通知 已清除收费限额 通知收费限额 NotifyEVChargingSchedule 重启 解锁连接

VirtualChargePoint:用于通过您的项目中的GUI或我们的API测试ocpp服务器的应用程序

虚拟充电点 用于测试任何OCPP服务器软件的软件。 您可以根据使用情况使用GUI或API。 入门 图形用户界面 转到我们的版本并下载最新版本。 只需启动它即可。 原料药 转到我们的发行版并下载最新的发行版,然后将文件添加到项目的依赖项中。 一个小示例如何使用它: 建于 依赖管理 依存关系 Ocpp客户端库: 作者 Marco Villalilla -GitHub: Samuel Bauer -GitHub: Alexander Belokon -GitHub: Maria -GitHub: 另请参阅参与此项目的贡献者列表。

scriptable-ocpp-chargepoint-simulator:用于OCPP 1.6J的可编写脚本的OCPP充电点模拟器。 客户端和服务器

可编写脚本的OCPP充电点模拟器 介绍 该模拟器支持: 带有JSON的OCPP 1.6(和安全性) 带有HTML前端的REST API 基于文件的批处理模式 完全可以用JavaScript编写脚本 ftp和csr操作 ws://和wss://(带有客户端证书) 主要开发注意事项: 该工具应该可以帮助您学习和理解 ,因此它不会隐藏任何细节,但是使它们更易于掌握。 这是一个全基于的项目 具有服务器端支持的基于的服务器 + ++ +基于HTML客户端,具有超级简单的无转换器设置 待办事项:OCPP代码也应在浏览器中运行 执照 该软件已获得。 请参阅。 安装和构建 确保已安装npm。 批量操作 将使用JavaScript的逻辑放入文件(例如custom.js)。 您的文件需要使用一个参数导出异步功能。 此参数将传递connect(url: string): Chargepoi

STM32H743 ADC多通道采样实战:CubeMX配置+DMA传输避坑指南

本文详细介绍了STM32H743 ADC多通道采样的实战配置,包括CubeMX参数设置、DMA传输优化及常见问题解决方案。重点解析了ADC模块的核心特性、多通道采样序列配置、Cache一致性处理等关键技术,帮助开发者高效实现稳定可靠的模拟信号采集系统。

weixin_29175469的博客 613

设备管理器找不到蓝牙?从驱动到BIOS的系统排查指南

在Windows系统中,蓝牙功能依赖硬件、驱动、系统服务三层协同工作。设备管理器作为硬件状态的可视化窗口,当蓝牙设备消失时,往往意味着某一层链路中断。常见原因包括BIOS无线开关关闭、驱动异常、蓝牙支持服务被禁用,或系统文件损坏。排查思路应从基础概念出发,先理解蓝牙设备在设备管理器中的四种隐藏位置,再通过扫描硬件、检查BIOS、重装驱动、修复服务等步骤逐层定位。这一方法不仅适用于Windows电脑,也适用于HC-05、ESP32等嵌入式蓝牙模块,因为硬件、协议栈、应用层的故障逻辑相通。掌握这套技术价值在于减

weixin_33377602的博客 269

MagicDraw-用例图

MagicDraw-用例图

木头征的博客 3131

【信息系统项目管理师】第18章:项目绩效域详解

(3)度量绩效域与规划绩效域、项目工作绩效域和交付绩效域的相互作用:1规划构成了 交付和规划比较的基础;项目绩效域共同构成了一个统一的整体,作为一个完整系统,在项目生命周期过程中运行,系统内的每个绩效域相互作用、相互关联和相互依赖,并协调一致、共同运作,支撑项目目标和价值 的实现。(5)开发方法和生命周期绩效域与其他绩效域的相互作用:开发方法和生命周期绩效域与干系人绩效域、规划绩效域、不确定性绩效域、交付绩效域、项目工作绩效域和团队绩效域相互作用。(2)项目工作绩效域的绩效要点包括:项目过程;

数据知道的博客 7806

飞腾平台(FT2000/4 D2000/8)配置GPIO引脚

飞腾平台配置CPU的引脚为GPIO工作模式的方式有永久型和暂时型: - 永久型是通过UEFI中的MmioWrite32函数来实现的,该方法可以在UEFI阶段就对复用引脚的工作模式配置为GPIO,并且在进入操作系统后仍然不会发生便会; - 临时型是通过rw工具,在系统下手动修改复用引脚的工作模式,该方法在系统重启后会失效,所以是暂时型的。

qq_30135687的博客 5617

【数据可视化-77】中国历年GDP数据可视化分析:Python + Pyecharts 深度洞察(含完整数据、代码)

通过上述可视化分析,我们可以清晰地看到中国历年GDP的变化趋势和产业构成。玫瑰图展示了2024年的产业构成,地图和柱状图展示了GDP的时空分布,双轴折线图和雷达图则分别展示了GDP总量与人均GDP的变化以及各行业的GDP贡献。希望这篇文章能帮助您更好地理解和分析中国历年GDP数据。如果您有任何问题或建议,欢迎在评论区留言!🎉。

qq_38614074的博客 1473

2021.02.23丨Virsorter2安装使用及答疑

最近项目比较多,又在学英语,写文章的时间少了很多。最近接到一个病毒组装的项目。用之前组装工具(ABYSS、SPAdes)都没有能够组装较为完整的scafford,今天介绍一款专门用于组装病毒的工具——Virsorter。 Virsorter最早版本发布于2015年,目前已经有了第二个版本。主要用于病毒的组装的注释。详细情况可以查看文章:https://peerj.com/articles/985/ 安装流程 安装文档: https://github.com/jiarong/VirSorter2/b

4836

把 LLM 编排能力塞进 ABAP 系统里,ZLLM 仓库的工程价值与 SAP 落地场景

ZLLM项目将LLM应用开发中的常见工程问题引入ABAP原生环境,为SAP系统提供AI工作流构建能力。它类似ABAP版的LangChain,支持Chain组合、Prompt模板、状态传递等核心功能,强调纯ABAP实现、延迟执行以及与ABAP数据结构的深度集成。项目包含工厂类、LLM客户端、负载均衡器等模块,特别设计了能处理ABAP内表和结构的模板引擎,使业务数据可直接用于Prompt生成。通过Step和Flow机制支持复杂业务过程编排,并采用延迟执行和并行处理优化批量任务性能。该项目为ABAP开发者提供了在

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 61

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 从I2C到图像:MTK Camera驱动如何通过寄存器操控Sensor的视觉叙事
下一篇: 汽车总线安全实战解析:CAN(FD)渗透测试方法与应用场景
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值