O blog da AWS

Construindo uma solução de operador de ponto de carregamento de veículos elétricos compatível com OCPP usando o AWS IoT Core

Por Garry Galinsky, Principal Solutions Achitect na AWS e Bigad Soleiman, Engenheiro Sênior Líder na equipe de prototipação da AWS. 

A mudança de veículos movidos a combustíveis fósseis para veículos eletrificados é um componente essencial dos compromissos governamentais e comerciais para alcançar emissões líquidas zero até 2050. Prevê-se que somente os Estados Unidos exigirão uma rede nacional de pelo menos 500.000 carregadores de veículos elétricos (EV – “Electric Vehicle”) até 2030 para suportar o número projetado de EVs na estrada [1] [2]. Globalmente, governos e indústrias estão se unindo para construir milhões de redes públicas e privadas de carregamento de frotas [3].

Instalar e alimentar a infraestrutura física de carregamento é apenas o primeiro passo, uma vez que os carregadores (Pontos de Carga ou CP – “Charge Points”) precisam ser continuamente monitorados e gerenciados por seus operadores (Operadores de Pontos de Carga ou CPO – “Charge Point Operators”). Os CPOs são responsáveis pela manutenção regular, remota ou local, através da coleta de métricas de integridade e a gestão das configurações operacionais. Os CPOs também são responsáveis por garantir que os CPs sejam compatíveis com os mais recentes padrões e protocolos do setor, como o Open Charge Point Protocol (OCPP) e o ISO 15118. E tudo isso deve ser implementado com medidas de segurança que possam suportar os CPs em escala.

Este post demonstra como serviços da AWS, como o AWS IoT Core, o Amazon Elastic Container Service (Amazon ECS) e o AWS Lambda, podem ser usados para criar um sistema de operação de pontos de carregamento de veículos elétricos altamente escalável e de baixa latência com base no padrão OCPP do setor de veículos elétricos.

AWS IoT Core

O AWS IoT Core permite conectar bilhões de dispositivos e rotear trilhões de mensagens de/para os serviços da AWS sem necessidade de provisionamento e gestão de infraestrutura. O AWS IoT Core lida com a escalabilidade e roteamento de mensagens, permitindo que os clientes possam suportar mais facilmente grandes frotas de dispositivos remotos, como CPs, que se comunicam por meio de padrões publish-and-subscribe. O AWS IoT Core implementa nativamente MQTT, HTTPS e MQTT sobre WebSockets e pode ser adaptado para oferecer suporte a outros protocolos, como o OCPP.

Visão geral

A maioria dos CPs disponíveis comercialmente implementa o protocolo OCPP como um meio de comunicação bidirecional com os CPOs baseado em publish-and-subscribe. Operar um CPO na AWS exige a introdução de um endpoint WebSocket OCPP, com o qual os CPs se comunicam. Esse endpoint, descrito aqui como Gateway OCPP, atua como um proxy entre os protocolos OCPP e MQTT, permitindo a integração com o AWS IoT Core e os serviços de CPO criados na AWS.

O diagrama de arquitetura a seguir ilustra a solução de alto nível que você vai criar neste blog post.

Figura 1. Mensagem OCPP do Ponto de Carregamento enviada por proxy para o serviço CPO
por meio de relacionamento um-para-um entre a conexão WebSocket e o tópico MQTT.

Arquitetura

O diagrama de arquitetura abaixo mostra os recursos que esta solução implantará em sua conta.

Figura 2. Arquitetura da solução de Gateway OCPP.

O Gateway OCPP é implantado como uma aplicação Amazon ECS que pode ser executado no AWS Fargate ou no Amazon Elastic Compute Cloud (EC2). O AWS Fargate elimina a necessidade de gerenciamento de infraestrutura e, por isso, é a opção preferida para essa solução. As aplicações em conteiners podem ser escaladas horizontalmente, permitindo que a infraestrutura do Gateway OCPP aumente ou diminua automaticamente conforme o número de CPs conectados muda. A natureza do tempo ilimitado de execução das tarefas do ECS permite que as conexões WebSockets sejam mantidas por longos períodos, reduzindo o tráfego de rede e as despesas gerais de conexão.

Um Network Load Balancer (NLB) é o ponto de entrada das conexões que são, por sua vez, distribuídas para os conteiners do Gateway OCPP. O NLB fornece um nome de domínio único (FQDN) que serve como o endpoint do OCPP com o qual os CPs iniciam a conexão. Após o início da conexão, o NLB faz o roteamento da conexão do ponto de carga para uma das instâncias do Gateway OCPP, que, por sua vez, estabelece a conexão WebSocket entre o Gateway e o CP.

Quando um CP estabelece uma conexão WebSocket com uma instância de aplicação do Gateway OCPP, esta instância configura uma conexão MQTT com o AWS IoT Core usando o identificador único do CP como Thing ID. Este cliente faz subscrição nos tópicos de mensagens MQTT associados ao CP em questão.

O cliente MQTT implementado pelo Gateway OCPP reconhece conexões WebSocket e fornece uma associação única entre a subscrição MQTT e o CP. Todas as mensagens iniciadas pelo CPO são entregues ao cliente MQTT associado ao CP de destino e encaminhadas via WebSocket a este CP. Por ser altamente elástico, o AWS IoT Core será facilmente escalado à medida que mais CPs forem integrados.

Passo a passo da solução

Esta solução demonstra como você pode usar a AWS para criar um CPO escalável implantando o Gateway OCPP para integração com o AWS IoT Core. As etapas abaixo são uma orientação para que você possa implantar um gateway OCPP na sua conta da AWS. Elas também demonstram como você pode simular mensagens CP, além de fornecer exemplos de como você pode agir de acordo com essas mensagens usando os recursos da AWS.

Pré-requisitos

Verifique se seu ambiente atende aos seguintes pré-requisitos.

Você deverá ter:

  1. Uma conta da AWS.
  2. Política de acesso de administrador AdministratorAccess concedida à sua conta da AWS (para produção, recomendamos restringir o acesso conforme necessário).
  3. Acesso programático e via Console.
  4. AWS CLI instalada e configurada para uso com sua conta da AWS.
  5. NodeJS 12+ instalado.
  6. Typescript 3.8+ instalado.
  7. AWS CDK CLI instalada.
  8. Docker instalado.
  9. Python 3+ instalado.

Preparando o AWS CDK

A solução será implantada em sua conta da AWS usando infraestrutura como código com o AWS Cloud Development Kit (CDK). Nesta fase, as etapas são:

  1. Clone o repositório:
    git clone https://github.com/aws-samples/aws-ocpp-gateway.git
  2. Navegue até a pasta do projeto em seu computador usando seu terminal:
    cd aws-ocpp-gateway
  3. Instale as dependências do projeto executando o comando:
    npm install
  4. Utilize uma região onde o AWS IoT Core esteja disponível. A lista de regiões disponíveis pode ser encontrada aqui.
  5. Defina variáveis de ambiente para o CDK, como o ID da conta da AWS destino e a região em que você deseja implantar esta stack:
    export CDK_DEPLOY_ACCOUNT=targetAccountId (e.g. 12345678910)
    export CDK_DEPLOY_REGION=targetRegion (e.g. eu-west-1)
  6. Caso você nunca tenha usado o AWS CDK na conta e região selecionadas, faça sua inicialização (bootstrap).
    (Mais informações sobre a inicialização do AWS CDK).

    npx cdk bootstrap aws://{targetAccountId}/{targetRegion}

(Opcional) Habilitando o uso de WebSockets usando TLS com seu próprio nome de domínio

Se você tiver uma zona hospedada (hosted zone) do Amazon Route 53 em sua conta, essa solução poderá realizar algumas configurações automaticamente, tais como:

  • Criar subdomínio (registro A) gateway.yourdomain.com.
  • Criar um certificado SSL do AWS Certificate Manager (ACM) para este subdomínio.
  • Habilitar o TLS para seu gateway wss: //gateway.yourdomain.com.

Para utilizar essas configurações automaticamente, remova o comentário desta linha no arquivo bin/aws-ocpp-gateway.ts e substitua yourdomain.compelo seu nome de domínio (por exemplo, exemplo.com).

Implantando a solução em sua conta da AWS

  1. Verifique se o Docker está sendo executado com o seguinte comando:
    docker version

    Observação: se você receber um erro como o abaixo, o Docker não está em execução e precisa ser reiniciapo:

    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
  2. Implante o OCPP Gateway usando o seguinte comando CDK:
    npx cdk deploy

    Observação: esta etapa pode levar cerca de 10 minutos, dependendo do desempenho do computador e da rede.

  3. Você pode ver o progresso da implantação do CDK na console do CloudFormation na região selecionada.

    Figura 3. Recursos implantados pela solução na console do AWS CloudFormation

  4. Depois de implantado, anote o valor AWSOCPPGatewayStack.WebSocketUrl.
    Observação: Esta URL do WebSocket é o endpoint que deve ser definido nas configurações do seu CP ou no simulador de ponto de carga EV descrito abaixo.

Se você usou seu próprio domínio, sua saída será semelhante a:

..
Outputs:
AwsOcppGatewayStack.loadBalancerDnsName = gateway.example.com
👉 AwsOcppGatewayStack.websocketURL = wss://gateway.example.com
...

Caso contrário, a saída será semelhante a:

...
Outputs:
AwsOcppGatewayStack.loadBalancerDnsName = ocpp-gateway-xxxxxxx.elb.xx-xxxx-x.amazonaws.com
👉 AwsOcppGatewayStack.websocketURL = ws://ocpp-gateway-xxxxxxx.elb.xx-xxxx-x.amazonaws.com
...

Simulando a conectividade do CP

Para facilitar os testes, fornecemos o script Python simulate.py que ajuda você a testar e explorar a capacidade do Gateway OCPP e do AWS IoT Core sem a necessidade de um CP físico. Outros simuladores OCPP, como o OCPP-2.0-CP-simulator, também podem ser usados.

Configurando a simulação

  1. No AWS Explorer, selecione sua região e abra AWS IoT Core, All devices, Things. Na aba Things, escolha Create things.
  2. Selecione Create single thing e escolha Next.
  3. Insira o Thing Name desejado.
    Observação: Cada ponto de carga de EV deve ser mapeado para uma única coisa (IoT Thing). Para nosso teste, definiremos o Thing Name como CP1.

    Figura 4. Criando uma coisa (IoT Thing).

  4. Escolha Next.
  5. Para o Certificado de dispositivo, selecione Skip creating a certificate at this time (Ignorar a criação de um certificado neste momento) e escolha Create thing.

    Figura 5. Ignore a criação de certificado.

  6. Navegue até esta pasta em seu terminal:
    cd ev-charge-point-simulator
  7. Crie um ambiente virtual Python e ative-o executando o seguinte comando:
    python3 -m venv venv && source venv/bin/activate
  8. Instale as dependências do Python executando:
    pip3 install -r requirements.txt

Simulando a inicialização de um ponto de carregamento de EV e uma notificação de heartbeat

O script Python simula algumas funcionalidades básicas de um ponto de carga EV, tais como:

  • Envio uma notificação de inicializaçãoBootNotification, que inclui atributos sobre o hardware do CP.
  • Envio de mensagens de Heartbeat com base em uma frequência instruída pelo CPO (definido pelo parâmetro de intervalo interval retornado na resposta à notificação BootNotification)
  1. Para iniciar as simulações, execute o script Python usando o comando a seguir, certificando-se de substituir o valor --url pelo AWSOCPPGatewayStack.websocketURL retornado da implantação do cdk.
    python3 simulate.py --url {URL do websocket gerado a partir do AWS OCPP Stack} --cp-id CP1

    Observação: estamos usando --cp-id CP1, que deve corresponder ao valor do Thing Name criado acima. Se o --cp-id não corresponder a este nome, a conexão será rejeitada pelo Gateway OCPP.
    Caso o script seja executado com sucesso, uma mensagem semelhante à esta será apresentada:

    (venv) ev-charge-point-simulator % python3 simulate.py --url {websocket URL generated from the AWS OCPP Stack} --cp-id CP1 
    INFO:ocpp:CP1: send [2,"0678cb2a-a7a2-42bc-8037-d01164e77ac6","BootNotification",{"chargingStation":{"model":"ABC 123 XYZ","vendorName":"Acme Electrical Systems","firmwareVersion":"10.9.8.ABC","serialNumber":"CP1234567890A01","modem":{"iccid":"891004234814455936F","imsi":"310410123456789"}},"reason":"PowerUp"}]
    INFO:ocpp:CP1: receive message [3,"0678cb2a-a7a2-42bc-8037-d01164e77ac6",{"currentTime":"2023-02-16T19:00:18.630818","interval":10,"status":"Accepted"}]
    INFO:root:CP1: connected to central system
    INFO:root:CP1: heartbeat interval set to 10
    INFO:ocpp:CP1: send [2,"9b7933a7-5216-496d-9bb0-dae45014bb98","Heartbeat",{}]
    INFO:ocpp:CP1: receive message [3,"9b7933a7-5216-496d-9bb0-dae45014bb98",{"currentTime":"2023-02-16T19:00:19.073675"}]

    Esta troca de mensagens representa uma simulação de sucesso onde um CP primeiramente envia um BootNotification, seguido por um Heartbeat no intervalo especificado. A saída inclui ambas mensagens, a mensagem OCPP enviada do CP para o AWS IoT (prefixo send) e a resposta recebida da AWS (prefixo received message).

  2. Para simular um CP diferente, defina um valor diferente para o argumento --cp-id.
    Observação: se o valor --cp-id não tiver um IoT Thing correspondente, o Gateway OCPP rejeitará a conexão. Aqui está um exemplo de insucesso passando --cp-id CP2, onde CP2 não está registrado como uma Thing no AWS IoT:

    (venv) ev-charge-point-simulator % python3 simulate.py --url {websocket URL generated from the AWS OCPP Stack} --cp-id CP2 
    INFO:ocpp:CP2: send [2,"32dc5b6e-77b0-4105-b217-28e20b579ecc","BootNotification",{"chargingStation":{"model":"ABC 123 XYZ","vendorName":"Acme Electrical Systems","firmwareVersion":"10.9.8.ABC","serialNumber":"CP1234567890A01","modem":{"iccid":"891004234814455936F","imsi":"310410123456789"}},"reason":"PowerUp"}]
    ERROR:root:CP2: received 1008 (policy violation) Charge Point CP2 not registered as an IoT Thing; then sent 1008 (policy violation) Charge Point CP2 not registered as an IoT Thing

Monitorando a atividade do OCPP no console da AWS

Tanto as mensagens originadas pelo CP, quanto as destinadas ao CP são intermediadas por meio do AWS IoT Core. Essas mensagens utilizam o protocolo publish-and-subscribe MQTT. Você pode ver essas mensagens na console.

  1. No AWS Explorer, selecione sua região e abra o AWS IoT Core, MQTT test client.
  2. No cliente de teste, selecione a aba Subscribe to a topic e assine a esses dois tópicos inserindo os seguintes valores como Topic filter:
    a. Para visualizar todas as mensagens do CP para a AWS:

    +/in

    b.Para visualizar todas as mensagens da AWS para o CP:

    +/out

    Figura 6. Subscrição a tópicos MQTT usando o cliente da console.

  3. Execute o script Python para simular um CP e observe as mensagens no cliente de teste MQTT.

Rastreando os atributos de hardware do Ponto de Carregamento utilizando device shadows

Quando um CP envia uma notificação de inicialização BootNotification, seus atributos de hardware são armazenados em um Device Shadow associado ao IoT Thing. Você pode ver esses atributos na console.

  1. No AWS Explorer, selecione sua região e abra AWS IoT Core, All Devices, Things.
  2. Marque a caixa de seleção do IoT Thing criado anteriormente.
  3. Selecione a aba Device Shadows.
  4. Selecione Classic Shadow com o hiperlink do nome do dispositivo para ver o documento Device Shadow e os atributos de hardware relatados pelo Ponto de Carregamento EV:
    {
      "state": {
        "reported": {
          "chargingStation": {
            "model": "ABC 123 XYZ",
            "vendorName": "Acme Electrical Systems",
            "firmwareVersion": "10.9.8.ABC",
            "serialNumber": "CP1234567890A01",
            "modem": {
              "iccid": "891004234814455936F",
              "imsi": "310410123456789"
            }
          },
          "reason": "PowerUp"
        }
      }
    }

    Figura 7. Documento de shadow de um IoT Thing.

  5. Simule diferentes atributos de hardware do CP passando esses argumentos para o script simulate.py e verifique seu efeito no Device Shadow:
  • --cp-serial — para definir o número de série
  • --cp-model — para definir a identificação do modelo
  • --cp-version — para definir a versão do firmware
  • --cp-vendor — para definir o nome do fornecedor

Conclusão

Neste post, você aprendeu como os serviços da AWS podem ser usados para criar um CPO altamente escalável e de baixa latência. Usando o AWS Fargate, você implantou o Gateway OCPP, um proxy OCPP para MQTT, permitindo que você aproveitasse a funcionalidade gerenciada de roteamento e escalabilidade do AWS IoT Core para implantar e operar sua solução de Operador de Ponto de Carregamento na AWS. Você também aprendeu como as regras do AWS IoT podem ser usadas para filtrar e rotear mensagens do ponto de carregamento de veículos elétricos para serviços da AWS, como Amazon DynamoDB e AWS Lambda, para criar relatórios personalizados e fluxos de trabalho automatizados.

A solução e os códigos utilizados neste tutorial estão disponibilizados como código aberto e podem ser facilmente adaptados às suas necessidades de negócio específicas.

Esperamos que você tenha achado esta postagem informativa e este tutorial útil. Como sempre, a AWS agradece o feedback. Sinta-se à vontade para conectar/enviar mensagens aos autores por meio de seus perfis no LinkedIn, mencionados abaixo.

(Opcional) Mais coisas para experimentar

Para experimentar outras possibilidades de simulações e testes que você mesmo pode experimentar para apreciar melhor a arte do possível no que se refere à criação de um CPO compatível com OCPP na AWS, esta seção fornece algumas sugestões.

Teste de carga

Por ser um serviço totalmente gerenciado e altamente elástico, o AWS IoT Core irá escalar para suportar milhões de conexões e coisas (Things). O Gateway OCPP, por sua vez, utiliza auto-scaling para escalar automaticamente e aumentar o número de tasks à medida que sua frota de CPs cresce.

  1. Usando uma ferramenta de teste de carga ou a configuração incluída do Apache JMeter, é possível simular uma carga de milhares de CPs.
  2. No AWS Explorer, selecione sua região e abra o Elastic Container Service.
  3. Em Clusters, abra o hiperlink do cluster criado pela Stack do Gateway OCPP (estará prefixada com AWSOCPPGatewayStack).
  4. Selecione a aba Metrics.
  5. Observe como o número de tasks aumenta de uma para duas, etc. à medida que sua carga aumenta.O escalonamento automático é configurado para ser acionado quando a utilização média da CPU excede 60% — você pode aumentar a carga ou diminuir esse limite para testar o efeito [4].
    Se você estiver usando o JMeter ou um testador de carga similar, tenha cuidado com o número de threads (Things) que você cria e com a duração da execução do teste. A solução será facilmente escalada para milhares de coisas e funcionará por períodos indefinidos, o que pode resultar em cobranças inesperadas em sua conta da AWS. Sugerimos usar o teste de carga para testar a escalabilidade, mas interromper o teste rapidamente para reduzir custos.

Regras no AWS IoT

As regras do AWS IoT podem ser usadas para filtrar mensagens MQTT e roteá-las para outros serviços na AWS. Você pode criar uma regra para, por exemplo, capturar mensagens de Heartbeat e registrá-las em uma tabela do DynamoDB para registrar o último evento ocorrido.

  1. No AWS Explorer, selecione sua região e abra o DynamoDB.
  2. Selecione Create table.
  3. Forneça o nome da tabela chargePointHeartbeat e defina a chave de partição (partition key) como chargePointId.
  4. Escolha Create table.
  5. No AWS Explorer, selecione sua região e abra o AWS IoT Core, Message routing, Rules.
  6. Selecione Create Rule.
  7. Forneça o nome da regra chargePointHeartbeate escolha Next.
  8. Digite a seguinte query no SQL statement e escolha Next.
    SELECT 
      topic(1) AS chargePointId,
      timestamp() AS lastTimestamp
    FROM '+/in'
    WHERE get(*, 2) = 'Heartbeat'
  9. Para a Action 1, escolha DynamoDBv2.Figura 8. Query SQL da regra IoT.
  10. Selecione o nome da tabela Amazon DynamoDB criada acima.

    Figura 9. Ação da regra IoT.

  11. Selecione Create new role, forneça o nome da role chargePointHeartbeat, escolha Create.
  12. Escolha Next e Create.
  13. Volte para o DynamoBD e selecione Tables, Explore Items.
  14. Para Tables, escolha a tabela do DynamoDB criada anteriormente
  15. Execute o script Python para simular um CP e observe como as notificações heartbeat são adicionadas e atualizadas na tabela do DynamoDB.

Tratamento da conexão

Um único CP deve manter somente uma conexão com um Gateway OCPP, caso contrário, o roteamento das respostas do CPO para a conexão correta poderá ser afetado. Você pode simular uma tentativa de reconexão.

  1. Se você ainda não o tiver, baixe e instale o utilitário wscat.
  2. Abra uma janela de terminal e estabeleça uma conexão WebSocket:
    wscat -c {AwsOcppGatewayStack.websocketURL}/CP1 -s ocpp2.0.1
    Connected (press CTRL+C to quit)
    >
  3. Em uma segunda janela do terminal, execute o mesmo comando, tentando criar outra conexão usando o mesmo CP, por exemplo, CP1.
  4. Depois que essa nova conexão for estabelecida, você verá que a conexão anterior é fechada automaticamente:
    Disconnected (code: 1000, reason: "")
  5. Testar uma conexão com um CP que não está configurado como um IoT Thing resultará na rejeição da tentativa de conexão:
    wscat -c {AwsOcppGatewayStack.websocketURL}/CPX -s ocpp2.0.1
    Connected (press CTRL+C to quit)
    Disconnected (code: 1008, reason: "Charge Point CPX not registered as an IoT Thing")

Clean up

Quando terminar de executar as simulações, desative o ambiente virtual Python (venv) executando este comando em seu terminal:

deactivate

Você pode remover a Stack OCPP Gateway e todos os recursos associados criados na sua conta da AWS executando o seguinte comando:

npx cdk destroy

Sobre os Autores

Garry Galinsky é Principal Solutions Achitect e suporta a Amazon na AWS.
Bigad Soleiman é Engenheiro Sênior Líder na equipe de prototipação da AWS. Ele ajuda clientes estratégicos da AWS a tratar problemas complexos de negócios, do conceito à produção, em vários domínios.

Tradução e Adaptação

Dr. Antonio Maia é Arquiteto de Soluções na AWS com mais de 15 anos de experiência em TI. Tem contribuições de pesquisa e desenvolvimento nas áreas de Segurança e Internet das Coisas, envolvendo principalmente protocolos criptográficos para autenticação e autorização de dispositivos em IoT. Hoje, atua com as indústrias Automotiva e de Manufatura em suas jornadas de transformação e inovação através da nuvem AWS.

Revisor

Lucas Henrique Garcia é Arquiteto de Soluções do time de Enterprise e trabalhou previamente no time de Premium Support da AWS em Dublin. Seu foco está em ajudar clientes da AWS a resolverem seus problemas e a desenhar arquiteturas para seus negócios.