ocpp-js
Version:
Open Charge Point Protocol Implementation in JS
316 lines (233 loc) • 8.8 kB
JavaScript
const Utils = require('../utils/utils.js');
const SOAPWrapper = require('../utils/SOAPWrapper');
const ip = require('ip');
const UUID = require('uuid-js');
class CentralSystem{
constructor(port) {
this.soapWrapper = new SOAPWrapper(port, true);
var self = this;
this.port = port;
this.ip = ip.address();
this.clients = [];
this.soapWrapper.createCentralSystemServer();
console.log(`[CentralSystem] Server IP: ${self.ip}`);
}
createChargeBoxClient(station, callback){
var self = this;
console.log(`Creating SOAP Client for ${station.endpoint}`);
this.soapWrapper.createChargePointClient(station.endpoint).then(function(client){
self.clients.push({
client: client,
endpoint: station.endpoint,
chargeBoxIdentity: station.chargeBoxIdentity
});
callback();
});
}
_getClientByEndpoint(endpoint){
var soapClient = this.clients.filter(function(client){
return client.endpoint === endpoint;
});
if(soapClient.length > 0){
return soapClient[0];
}else{
return null;
}
}
restartChargingPoint(pointId, endpoint){
this.reset(pointId, endpoint, {
type: 'Hard'
});
this.unlockConnector(pointId, endpoint);
}
clearCache(stationId, remoteAddress){
this.action = '/ClearCache';
this._updateSoapHeaders(stationId, remoteAddress);
var request = {
clearCacheRequest: {}
}
this.chargePointClient.ClearCache(request, function(result){
console.log(JSON.stringify(result));
});
}
changeAvailability(stationId, remoteAddress, data){
this.action = '/ChangeAvailability';
this._updateSoapHeaders(stationId, remoteAddress);
var request = {
changeAvailabilityRequest: data
}
this.chargePointClient.ChangeAvailability(request, function(result){
console.log(JSON.stringify(result));
});
}
changeConguration(stationId, remoteAddress, data){
this.action = '/ChangeConguration';
this._updateSoapHeaders(stationId, remoteAddress);
var request = {
changeCongurationRequest: data
}
this.chargePointClient.ChangeConguration(request, function(result){
console.log(JSON.stringify(result));
});
}
getConguration(stationId, remoteAddress){
this.action = '/GetConguration';
this._updateSoapHeaders(stationId, remoteAddress);
var request = {
getCongurationRequest: {}
}
this.chargePointClient.GetConguration(request, function(result){
console.log(JSON.stringify(result));
});
}
getDiagnostics(stationId, remoteAddress){
this.action = '/GetDiagnostics';
this._updateSoapHeaders(stationId, remoteAddress);
var request = {
getDiagnosticsRequest: {}
}
this.chargePointClient.GetDiagnostics(request, function(result){
console.log(JSON.stringify(result));
});
}
remoteStartTransaction(stationId, remoteAddress, data){
this.action = '/RemoteStartTransaction';
this._updateSoapHeaders(stationId, remoteAddress);
var request = {
remoteStartTransactionRequest: data
}
this.chargePointClient.RemoteStartTransaction(request, function(result){
console.log(JSON.stringify(result));
});
}
remoteStopTransaction(stationId, remoteAddress, data){
this.action = '/RemoteStopTransaction';
this._updateSoapHeaders(stationId);
var request = {
remoteStopTransactionRequest: data
}
this.chargePointClient.RemoteStopTransaction(request, function(result){
console.log(JSON.stringify(result));
});
}
reset(stationId, remoteAddress, data){
this.action = '/Reset';
this._updateSoapHeaders(stationId, remoteAddress);
var client = this._getClientByEndpoint(remoteAddress);
if(client){
var soapClient = client.client;
var request = {
resetRequest: data
}
soapClient.Reset(request, function(result){
console.log(JSON.stringify(result));
});
}else{
console.log(`[SOAP Request] Client for ${remoteAddress} is not found !`);
}
}
unlockConnector(stationId, remoteAddress){
this.action = '/UnlockConnector';
this._updateSoapHeaders(stationId, remoteAddress);
var client = this._getClientByEndpoint(remoteAddress);
if(client){
var soapClient = client.client;
var request = {
unlockConnectorRequest: {
connectorId: '1'
}
}
this.chargePointClient.UnlockConnector(request, function(result){
console.log(JSON.stringify(result));
});
}else{
console.log(`[SOAP Request] Client for ${remoteAddress} is not found !`);
}
}
updateFirmware(stationId, remoteAddress, data){
this.action = '/UpdateFirmware';
this._updateSoapHeaders(stationId, remoteAddress);
var request = {
updateFirmwareRequest: data
}
this.chargePointClient.UpdateFirmware(request, function(result){
console.log(JSON.stringify(result));
});
}
reserveNow(stationId, remoteAddress, data){
this.action = '/ReserveNow';
this._updateSoapHeaders(stationId, remoteAddress);
var request = {
reserveNowRequest: data
}
this.chargePointClient.ReserveNow(request, function(result){
console.log(JSON.stringify(result));
});
}
cancelReservation(stationId, remoteAddress, data){
this.action = '/CancelReservation';
this._updateSoapHeaders(stationId, remoteAddress);
var request = {
cancelReservationRequest: data
}
this.chargePointClient.CancelReservation(request, function(result){
console.log(JSON.stringify(result));
});
}
sendLocalList(stationId, remoteAddress, data){
this.action = '/SendLocalList';
this._updateSoapHeaders(stationId, remoteAddress);
var request = {
sendLocalListRequest: data
}
this.chargePointClient.SendLocalList(request, function(result){
console.log(JSON.stringify(result));
});
}
getLocalListVersion(stationId, remoteAddress){
this.action = '/GetLocalListVersion';
this._updateSoapHeaders(stationId, remoteAddress);
var request = {
getLocalListVersionRequest: {}
}
this.chargePointClient.GetLocalListVersion(request, function(result){
console.log(JSON.stringify(result));
});
}
dataTransfer(stationId, remoteAddress, data){
this.action = '/DataTransfer';
this._updateSoapHeaders(stationId, remoteAddress);
var request = {
dataTransferRequest: data
}
this.chargePointClient.DataTransfer(request, function(result){
console.log(JSON.stringify(result));
});
}
_updateSoapHeaders(clientId, remoteAddress){
var client = this._getClientByEndpoint(remoteAddress);
var soapClient;
if(client){
soapClient = client.client;
// Remove soap headers
soapClient.clearSoapHeaders();
clientId = clientId || 'Simulator';
console.log(`Remote Address: ${remoteAddress}`);
console.log(`Action: ${this.action}`);
var to = remoteAddress || 'http://192.168.0.114:8081';
//var to = 'http://127.0.0.1:8081/ChargeBox/Ocpp';
// Generate a V4 UUID
var uuid4 = UUID.create();
soapClient.addSoapHeader('<h:chargeBoxIdentity xmlns:h="urn://Ocpp/Cp/2012/06/" >'+ clientId + '</h:chargeBoxIdentity>')
soapClient.addSoapHeader('<a:MessageID>urn:uuid:' + uuid4 + '</a:MessageID>')
soapClient.addSoapHeader('<a:From><a:Address>http://localhost:9220/Ocpp/CentralSystemService</a:Address></a:From>')
soapClient.addSoapHeader('<a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo>')
soapClient.addSoapHeader('<a:To>'+ to + '</a:To>')
soapClient.addSoapHeader('<a:Action soap:mustUnderstand="1">'+ this.action +'</a:Action>')
}else{
console.log(`[SOAP Headers] Client for ${remoteAddress} is not found !`);
return;
}
}
}
module.exports = CentralSystem;