使用AWS IoT Core构建OCPP兼容的电动车充电点运营商解决方案
作者:Garry Galinsky 和 Bigad Soleiman,发布日期:2023年3月21日发表于 汽车,AWS IoTCore,技术指南永久链接 分享
关键要点
从化石燃料到电动车的转变是实现2050年净零排放目标的重要组成部分。美国预计到2030年需要至少50万个电动车充电器,以支持路上的电动车数量。每个充电点需要持续监控和管理,以确保符合最新行业标准。本文将介绍如何使用AWS服务构建一个可扩展、低延迟的电动车充电点运营商系统,基于电动车行业标准OCPP。电动车从化石燃料转向电力是各国政府和商业机构承诺到2050年实现净零排放的关键部分。预计到2030年,仅美国就需要至少50万个电动车EV充电器来支持日益增加的电动车数量[1][2]。全球范围内,各国政府和产业正合作建设数百万个公共充电和私人车队充电网络[3]。
安装和供电物理充电基础设施只是第一步充电器充电点或“CP”需要由其运营商充电点运营商或“CPO”进行持续监控和管理。CPO负责进行定期的远程和现场维护、收集健康指标及管理操作配置。同时,他们也需要确保CP与最新的行业标准和协议兼容,如开放充电点协议OCPP和ISO 15118。此外,所有这些必须在可支持CP规模的安全措施下实施。
本文将展示如何利用AWS服务,如AWS IoT Core、Amazon Elastic Container ServiceAmazon ECS和AWS Lambda,构建一个高度可扩展、低延迟的电动车充电点运营商系统,基于OCPP标准。
关于AWS IoT Core
AWS IoT Core允许连接数十亿个设备,并在不管理基础设施的情况下,将数万亿条消息路由到AWS服务。AWS IoT Core处理扩容和消息路由的重担,为需要支持大量远程设备如CP通过发布订阅模式进行通信的客户,简化了操作。AWS IoT Core原生实施了MQTT、HTTPS和通过WebSocket的MQTT,并可根据需求适应其他协议,如OCPP。
概述
目前大多数商用CP都使用OCPP来实现与CPO的双向发布订阅通信。在AWS上运营CPO需要引入一个OCPP WebSocket端点,与CP进行通信。该端点在这里称为OCPP网关,它充当OCPP与MQTT之间的代理,实现与AWS IoT Core及基于AWS构建的下游CPO服务的集成。
以下架构图展示了您将在本博文中构建的高层次端到端解决方案。
示意图1:通过WebSocket连接和MQTT主题之间的一对一关系,将充电点OCPP消息代理到CPO服务
架构
下图展示了本解决方案将部署到您AWS账户中的资源。
示意图2:OCPP网关解决方案架构
OCPP网关作为Amazon ECS应用程序进行部署,可运行在AWS Fargate或Amazon Elastic Compute CloudEC2上。AWS Fargate消除了对基础设施管理的需求,是本解决方案的首选选项。容器化应用可以水平扩展,允许OCPP网关根据连接的CP数量自动扩展或缩减。ECS任务的长期运行特性使WebSocket连接可以维持较长时间,减少网络流量和连接开销。
一个网络负载均衡器NLB前端多个OCPP网关容器。NLB提供一个完全合格的域名FQDN,作为CP发起连接的OCPP端点。在连接初始化时,NLB会将充电点连接路由到一个OCPP网关实例,后者会在自身与CP之间建立WebSocket连接。
当CP与OCPP网关的某个实例建立套接字连接时,该处理程序设置一个MQTT连接到AWS IoT Core,使用CP的唯一标识符作为Thing ID。该客户端订阅与该CP相关的MQTT消息主题。
OCPP网关实现的MQTT客户端具备套接字感知能力,从而在MQTT订阅和CP之间提供一对一关联。CPO发起的任何消息都将送达与目标CP相关的MQTT客户端,并通过套接字转发给该CP。AWS IoT Core具有高度弹性,并将在更多CP上线时快速扩展。

解决方案演示
本解决方案演示如何使用AWS构建可扩展的CPO,通过部署OCPP网关来集成AWS IoT Core。以下步骤将指导您在AWS账户中部署OCPP网关,演示如何模拟CP消息,并提供使用AWS资源对消息进行处理的示例。
先决条件
请验证您的环境满足以下先决条件:
您需要:
一个AWS账户授予您AWS账户AdministratorAccess策略建议在生产环境中根据需要限制访问拥有控制台和程序访问权限已安装并配置AWS CLI以用于您的AWS账户安装NodeJS 12安装Typescript 38安装AWS CDK CLI安装Docker安装Python 3准备CDK
该解决方案将使用基础设施即代码通过AWS云开发工具包CDK部署到您的AWS账户。
克隆仓库:
bashgit clone https//githubcom/awssamples/awsocppgatewaygit
使用终端导航到此项目:
bashcd awsocppgateway
通过运行以下命令安装项目依赖:
bashnpm install
快橙加速器官方网站入口将CDK的环境变量设置为您希望部署此堆栈的目标AWS账户ID和区域
注意 AWS IoT Core在这些AWS区域中可用。
bashexport CDKDEPLOYACCOUNT=targetAccountId例如12345678910export CDKDEPLOYREGION=targetRegion例如euwest1
可选在目标账户和区域上引导AWS CDK
注意 如果您之前在该账户和区域组合中从未使用过AWS CDK,则需要此步骤。(有关CDK引导的更多信息)。
bashnpx cdk bootstrap aws//{targetAccountId}/{targetRegion}
可选使用您自己的域名启用TLS的WebSockets
如果您在账户中拥有一个Amazon Route 53 托管区域,本解决方案可以自动:
创建子域A记录gatewayyourdomaincom为其创建AWS证书管理器ACMSSL证书为您的网关启用TLS wss//gatewayyourdomaincom在/bin/awsocppgatewayts中取消注释这行代码,并将yourdomaincom替换为您自己的域名例如examplecom
bash// domainName yourdomaincom
将解决方案部署到您的AWS账户
验证Docker是否正在运行,使用以下命令:
bashdocker version
注意 如果收到下面的错误消息,则说明Docker未运行,需要重新启动:
bashCannot connect to the Docker daemon at unix///var/run/dockersock Is the docker daemon running
使用以下CDK命令部署OCPP网关:
bashnpx cdk deploy
注意 此步骤可能需要约10分钟,具体取决于计算机和网络速度。
您可以在所选区域的CloudFormation控制台中查看CDK部署的进展。
屏幕截图:AWS CloudFormation堆栈资源
部署完成后,记下AwsOcppGatewayStackwebsocketURL的值
注意 此WebSocket URL是将在您CP配置中或下面描述的电动车充电点模拟器中设置的入口点。
如果您使用的是自己的域名,则输出结果如下:
OutputsAwsOcppGatewayStackloadBalancerDnsName = gatewayexamplecom AwsOcppGatewayStackwebsocketURL = wss//gatewayexamplecom
否则,如下所示:
OutputsAwsOcppGatewayStackloadBalancerDnsName = ocppgatewayxxxxxxxelbxxxxxxxamazonawscom AwsOcppGatewayStackwebsocketURL = ws//ocppgatewayxxxxxxxelbxxxxxxxamazonawscom
模拟CP连接
我们提供了simulatepy Python脚本,以帮助您测试和探索OCPP网关和AWS IoT Core的功能,而无需实际的CP。您还可以使用其他OCPP模拟器,如 OCPP20CPSimulator。
模拟设置
在AWS资源管理器中,选择您所在区域,打开AWS IoT Core,所有设备,Things。在Things选项卡下选择创建事物Create a thing。选择创建单个事物Create single thing并选择下一步Next。输入事物名称Thing name
注意 每个电动车充电点必须映射到单个IoT事物。为了测试,我们将事物名称设置为CP1。
屏幕截图:创建IoT事物
选择下一步。对于设备证书Device certificate,选择此时跳过创建证书Skip creating a certificate at this time,然后选择创建事物Create thing。屏幕截图:跳过证书创建
用终端导航到此文件夹:
bashcd evchargepointsimulator
创建虚拟Python环境并激活,运行以下命令:
bashpython3 m venv venv ampamp source venv/bin/activate
运行以下命令安装Python依赖项:
bashpip3 install r requirementstxt
模拟EV充电点启动和心跳通知
该Python脚本模拟了EV充电点的一些基本功能:
发送BootNotification,包括有关CP硬件的属性根据CPO指示的频率由BootNotification响应返回的interval参数定义发送Heartbeat消息
使用以下命令运行Python脚本,确保将url值替换为CDK部署返回的AwsOcppGatewayStackwebsocketURL:
bashpython3 simulatepy url {从AWS OCPP堆栈生成的WebSocket URL} cpid CP1
注意 我们使用cpid CP1,它必须与上面创建的IoT事物值匹配。如果cpid未与IoT事物名称匹配,OCPP网关将拒绝连接。
成功的输出应如下所示:
(venv) evchargepointsimulator python3 simulatepy url {从AWS OCPP堆栈生成的WebSocket URL} cpid CP1 INFOocppCP1 send [20678cb2aa7a242bc8037d01164e77ac6BootNotification{chargingStation{modelABC 123 XYZvendorNameAcme Electrical SystemsfirmwareVersion1098ABCserialNumberCP1234567890A01modem{iccid891004234814455936Fimsi310410123456789}}reasonPowerUp}]INFOocppCP1 receive message [30678cb2aa7a242bc8037d01164e77ac6{currentTime20230216T190018630818interval10statusAccepted}]INFOrootCP1 connected to central systemINFOrootCP1 heartbeat interval set to 10INFOocppCP1 send [29b7933a75216496d9bb0dae45014bb98Heartbeat{}]INFOocppCP1 receive message [39b7933a75216496d9bb0dae45014bb98{currentTime20230216T190019073675}]此交换表示CP的成功模拟,首先发送BootNotification,然后在指定间隔
在 AWS Glue 数据质量中以规模化方式进行数据一致性检测 大数据博客
使用 AWS Glue 执行大规模数据一致性检查以支持数据现代化重点摘要随着企业将本地数据仓库和数据湖迁移到 AWS 云,保证数据迁移质量变得尤为重要。数据一致性检测确保了将数据从源平台迁移到目标平台...
设计云卓越中心 (CCOE) 云企业战略博客
使用 AWS Glue 执行大规模数据一致性检查以支持数据现代化重点摘要随着企业将本地数据仓库和数据湖迁移到 AWS 云,保证数据迁移质量变得尤为重要。数据一致性检测确保了将数据从源平台迁移到目标平台...