Charging station Management system for electric vehicle charging stations.
Based on: OCPP-2.0.1 (Full protocol documentation: openchargealliance.org/downloads)
_ Under development _
E.g. incoming BootNotificationRequest:
==> REQUEST data flow:
charging station -> websocket-service -> GCP Pub/Sub topic "BootNotificationRequest" -> device-service
<== RESPONSE data flow:
charging station <- websocket-service <- GCP Pub/Sub topic "BootNotificationResponse" <- device-service
- Implemented OCPP messages:
Implemented OCPP Messages | Microservice name |
---|---|
BootNotificationRequest, BootNotificationResponse | device-service |
HeartbeatRequest, HeartbeatResponse | device-service |
StatusNotificationRequest, StatusNotificationResponse | device-service |
TransactionEventRequest, TransactionEventResponse | transaction-service |
AuthorizeRequest, AuthorizeResponse | user-service |
- microservice-based architecture
- GO: managing multiple websocket connections easily with goroutines
- Mutual TLS authentication
- Google Firestore for simple data persistence
- Google Cloud Pub/Sub for async messaging between services (using watermill.io)
- REST API for managing charging station information (API description: swaggerhub.com)
-
Create a Google Cloud Platform project. Follow the Google guide.
-
Create a service account and create JSON credentials for it. Follow the Google guide (see the "Service account credentials" section). When you create the service account, under "select a role" choose
Pub/Sub Admin
andFirebase Admin
(note: for production use, you may want to restrict these to lower roles, needs to be tested). -
Once you have the JSON credentials, place them in the following directories, under the name 'PRIVATE.json':
- device-service/credentials/PRIVATE.json
- websocket-service/credentials/PRIVATE.json
- user-service/credentials/PRIVATE.json
- transaction-service/credentials/PRIVATE.json
Note: you can use the same service account and the same JSON credentials file in all places, or you can create separate ones for extra security if you want
-
Create a Cloud Firestore database Follow the Google guide
-
In the docker-compose.yml file, replace
chargerevolutioncloud
name with the project id of your own GCP project. -
Install docker and docker-compose if you haven't already
If you are deploying on a remote machine or VPS, open up port
3000
and port5000
so you can access the app remotely from your own machine. Important: For actual deployment you should add a reverse proxy layer or some other security measure to protect your open port. A good place to start: How To Deploy a Go Web Application with Docker and Nginx on Ubuntu 18.04
-
Build and run the app on your machine (or VPS)
docker compose up --build
-
The device service should now be running on
localhost:5000
. Use Postman or some other tool to send a post request and create a charging station (API description: swaggerhub.com) For example, you can send something like this in the request payload:POST:
localhost:5000/chargingstations/create
{ "id": "CS123", "serialNumber": "5", "model": "CS-5500", "vendorName": "ChargerMaker Inc.", "firmwareVersion": "1.8", "modem": { "iccid": "24", "imsi": "24" }, "location": { "lat": 41.366446, "lng": -38.1854651 } }
If this is successful, a collection named "chargingstations" and a document named "CS123" should have been created in the Firestore database of your project.
-
The websocket service should be running on
localhost:3000
. Connect to port 3000 as a websocket client (use the station id you have created in the previous step):ws://{HOST}:3000/ocpp/{stationid}
Tip: Postman now supports websocket connections (beta version), but only on the Windows desktop app I believe. This could be useful for testing.
- full implementation of all basic messages (reset, getconfig etc.)