vw-carnet
Version:
Node package to connect to VW Carnet SOAP service
496 lines (447 loc) • 21.6 kB
JavaScript
const _sourceName = "MAPP";
const _targetName = "TOSS";
const _organization = "VW";
const _region = "EU";
const _applicationName = "iPhone";
function _newTranactionID() {
var crypto = require('crypto');
var tID = new Date().toISOString() + process.pid;
return crypto.createHash('md5').update(tID).digest('hex');
};
function _newTimestamp() {
var now = new Date();
var shortTime = [
("0" + now.getHours()).slice(-2),
':',
("0" + now.getMinutes()).slice(-2),
':',
("0" + now.getSeconds()).slice(-2)
].join('');
return shortTime;
};
function _formatTemplate(template) {
var format = require("string-template");
return format(template, { sourceName: _sourceName, targetName: _targetName, transactionID: _newTranactionID(), timestamp: _newTimestamp(), organization: _organization, region: _region, applicationName: _applicationName });
};
function _getTemplate(templateName){
var fs = require('fs');
var path = require('path');
var p = path.join(path.dirname(fs.realpathSync(__filename)), './soap_templates');
var file = "";
file = fs.readFileSync(p+ "/" + templateName + ".xml","utf-8");
return file;
}
var CarNet = function () { };
CarNet.prototype.login = function (userID, pin, callback) {
var url = 'https://wsb.htigermany.com/HTIWebGateway/EnterpriseGatewayServices/SecurityServiceV2_1';
var test = _getTemplate("login");
var postTemplate = _formatTemplate(_getTemplate("login"));
var request = require('request');
var format = require("string-template");
request.post({ url: url, headers: {'Content-Type': 'text/xml;charset=utf-8'},body: format(postTemplate, { userID: userID, pin: pin }) }, function (error, response, body, v) {
//console.log("Recieved");
var r = { Response: {}, Data: {} }
//console.log(JSON.stringify(response));
var parseString = require('xml2js').parseString;
if (error) {
r.Response.ResponseCode = -1;
r.Response.ResponseStatus = error.name;
r.Response.ResponseDescription = error.message;
//console.log("Responce login: " + r.Response.ResponseCode + ": " + r.Response.ResponseStatus + "/" + r.Response.ResponseDescription);
callback(r);
} else if (response.statusCode != 200) {
r.Response.ResponseCode = parseInt(response.statusCode);
r.Response.ResponseStatus = "Fail";
r.Response.ResponseDescription = response.body;
//console.log("Responce login: " + r.Response.ResponseCode + ": " + r.Response.ResponseStatus + "/" + r.Response.ResponseDescription);
callback(r);
} else parseString(body, {
explicitArray: false, tagNameProcessors: [
function (str) {
return str.replace(/(?!xmlns)^.*:/, '')
}]
, valueProcessors: [
function (str) {
if (!isNaN(str)) {
str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str);
}
return str;
},
function (str) {
if (/^(?:true|false)$/i.test(str)) {
str = str.toLowerCase() === 'true';
}
return str;
}]
}, function (err, result) {
//Parse results
var r = {};
r.Response = result.Envelope.Body.AuthenticateV2Response.AuthenticateV2_0.Response;
if (result.Envelope.Body.AuthenticateV2Response.AuthenticateV2_0.DataArea) {
r.Data = result.Envelope.Body.AuthenticateV2Response.AuthenticateV2_0.DataArea;
r.Data.SessionKey = result.Envelope.Header.Security.SecurityTokenReference.KeyIdentifier._;
}
callback(r);
});
});
};
CarNet.prototype.getUserVehicles = function (userID, callback) {
var url = 'https://wsb.htigermany.com/HTIWebGateway/EnterpriseGatewayServices/SecurityServiceV2_1';
var postTemplate = _formatTemplate(_getTemplate("getUserVehicles"));
var format = require("string-template");
var b = format(postTemplate, { userID: userID });
var request = require('request');
request.post({ url: url, headers: { 'Content-Type': 'text/xml;charset=UTF-8' }, body: b }, function (error, response, body, v) {
var parseString = require('xml2js').parseString;
var r = {}
if (error) {
r.ResponseCode = -1;
r.ResponseStatus = error.name;
r.ResponseDescription = error.message;
callback({ Responce: r });
} else if (response.statusCode != 200) {
r.ResponseCode = parseInt(response.statusCode);
r.ResponseStatus = "Fail";
r.ResponseDescription = "Error in CarNet";
callback({ Responce: r });
} else parseString(body, {
explicitArray: false, tagNameProcessors: [
function (str) {
return str.replace(/(?!xmlns)^.*:/, '')
}]
, valueProcessors: [
function (str) {
if (!isNaN(str)) {
str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str);
}
return str;
},
function (str) {
if (/^(?:true|false)$/i.test(str)) {
str = str.toLowerCase() === 'true';
}
return str;
}]
}, function (err, result) {
//Parse results
var r = {};
r.Response = result.Envelope.Body.GetUserVehiclesResponse.getUserVehiclesV2_1.Response;
if (result.Envelope.Body.GetUserVehiclesResponse.getUserVehiclesV2_1.Data) {
var d = result.Envelope.Body.GetUserVehiclesResponse.getUserVehiclesV2_1.Data;
if (Array.isArray(d)) r.Data = d;
else r.Data = [d];
}
callback(r);
});
});
};
CarNet.prototype.getUnifiedVehicleStatusDetails = function (VIN, AccountID, TCUID, sessionKey, callback) {
var url = 'https://wsb.htigermany.com/HTIWebGateway/GateWay/VehicleStatusServiceV3_0';
var postTemplate = _formatTemplate(_getTemplate("getUnifiedVehicleStatusDetails"));
var request = require('request');
var format = require("string-template");
var b = format(postTemplate, { VIN: VIN, TCUID: TCUID, AccountID: AccountID, sessionKey: sessionKey });
request.post({ url: url, headers: { 'Content-Type': 'text/xml;charset=UTF-8' }, body: b }, function (error, response, body, v) {
//console.log("Recieved");
var parseString = require('xml2js').parseString;
var r = {}
//console.log(JSON.stringify(response));
if (error) {
r.ResponseCode = -1;
r.ResponseStatus = error.name;
r.ResponseDescription = error.message;
callback({ Responce: r });
res.status(500).send({ Responce: r }).end;
} else if (response.statusCode != 200) {
r.ResponseCode = parseInt(response.statusCode);
r.ResponseStatus = "Fail";
r.ResponseDescription = "Error in CarNet";
callback({ Responce: r });
} else parseString(body, {
explicitArray: false, tagNameProcessors: [
function (str) {
return str.replace(/(?!xmlns)^.*:/, '')
}]
, valueProcessors: [
function (str) {
if (!isNaN(str)) {
str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str);
}
return str;
},
function (str) {
if (/^(?:true|false)$/i.test(str)) {
str = str.toLowerCase() === 'true';
}
return str;
}]
}, function (err, result) {
//Parse results
var r = {};
r.Response = result.Envelope.Body.GetUnifiedVehicleStatusDataResponse.VehicleStatusType.Response;
if (result.Envelope.Body.GetUnifiedVehicleStatusDataResponse.VehicleStatusType.Data) r.Data = result.Envelope.Body.GetUnifiedVehicleStatusDataResponse.VehicleStatusType.Data;
callback(r);
});
});
};
CarNet.prototype.getTripReport = function (VIN, AccountID, TCUID, sessionKey, callback) {
var url = 'https://wsb.htigermany.com/HTIWebGateway/GateWay/TripStatisticsService';
var postTemplate = _formatTemplate(_getTemplate("getTripReport"));
var request = require('request');
var format = require("string-template");
var b = format(postTemplate, { VIN: VIN, TCUID: TCUID, AccountID: AccountID, sessionKey: sessionKey });
request.post({ url: url, headers: { 'Content-Type': 'text/xml;charset=UTF-8' }, body: b }, function (error, response, body, v) {
//console.log("Recieved");
var parseString = require('xml2js').parseString;
var r = {}
//console.log(JSON.stringify(response));
if (error) {
r.ResponseCode = -1;
r.ResponseStatus = error.name;
r.ResponseDescription = error.message;
callback({ Responce: r });
res.status(500).send({ Responce: r }).end;
} else if (response.statusCode != 200) {
r.ResponseCode = parseInt(response.statusCode);
r.ResponseStatus = "Fail";
r.ResponseDescription = "Error in CarNet";
callback({ Responce: r });
} else parseString(body, {
explicitArray: false, tagNameProcessors: [
function (str) {
return str.replace(/(?!xmlns)^.*:/, '')
}]
, valueProcessors: [
function (str) {
if (!isNaN(str)) {
str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str);
}
return str;
},
function (str) {
if (/^(?:true|false)$/i.test(str)) {
str = str.toLowerCase() === 'true';
}
return str;
}]
}, function (err, result) {
//Parse results
var r = {};
r.Response = result.Envelope.Body.GetLastTripReportResponse.GetTripStatisticsResponse.Response;
if (result.Envelope.Body.GetLastTripReportResponse.GetTripStatisticsResponse.Data) r.Data = result.Envelope.Body.GetLastTripReportResponse.GetTripStatisticsResponse.Data;
callback(r);
});
});
};
CarNet.prototype.getRemoteDepartureTime = function (VIN, AccountID, TCUID, sessionKey, callback) {
var url = 'https://wsb.htigermany.com/HTIWebGateway/GateWay/RemoteDepartureTimeServiceV2_0';
var postTemplate = _formatTemplate(_getTemplate("getRemoteDepartureTime"));
var request = require('request');
var format = require("string-template");
var b = format(postTemplate, { VIN: VIN, TCUID: TCUID, AccountID: AccountID, sessionKey: sessionKey });
request.post({ url: url, headers: { 'Content-Type': 'text/xml;charset=UTF-8' }, body: b }, function (error, response, body, v) {
//console.log("Recieved");
var parseString = require('xml2js').parseString;
var r = {}
//console.log(JSON.stringify(response));
if (error) {
r.ResponseCode = -1;
r.ResponseStatus = error.name;
r.ResponseDescription = error.message;
callback({ Responce: r });
res.status(500).send({ Responce: r }).end;
} else if (response.statusCode != 200) {
r.ResponseCode = parseInt(response.statusCode);
r.ResponseStatus = "Fail";
r.ResponseDescription = "Error in CarNet";
callback({ Responce: r });
} else parseString(body, {
explicitArray: false, tagNameProcessors: [
function (str) {
return str.replace(/(?!xmlns)^.*:/, '')
}]
, valueProcessors: [
function (str) {
if (!isNaN(str)) {
str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str);
}
return str;
},
function (str) {
if (/^(?:true|false)$/i.test(str)) {
str = str.toLowerCase() === 'true';
}
return str;
}]
}, function (err, result) {
//Parse results
var r = {};
r.Response = result.Envelope.Body.GetRemoteDepartureTimeResponse.GetRemoteDepartureTimeResponse.Response;
if (result.Envelope.Body.GetRemoteDepartureTimeResponse.GetRemoteDepartureTimeResponse.Data.rdtProfilesReport) r.Data = result.Envelope.Body.GetRemoteDepartureTimeResponse.GetRemoteDepartureTimeResponse.Data.rdtProfilesReport;
callback(r);
});
});
};
CarNet.prototype.getMinBatteryCharging = function (VIN, AccountID, TCUID, sessionKey, callback) {
var url = 'https://wsb.htigermany.com/HTIWebGateway/GateWay/RemoteDepartureTimeServiceV2_0';
var postTemplate = _formatTemplate(_getTemplate("getMinBatteryCharging"));
var request = require('request');
var format = require("string-template");
var b = format(postTemplate, { VIN: VIN, TCUID: TCUID, AccountID: AccountID, sessionKey: sessionKey });
request.post({ url: url, headers: { 'Content-Type': 'text/xml;charset=UTF-8' }, body: b }, function (error, response, body, v) {
//console.log("Recieved");
var parseString = require('xml2js').parseString;
var r = {}
//console.log(JSON.stringify(response));
if (error) {
r.ResponseCode = -1;
r.ResponseStatus = error.name;
r.ResponseDescription = error.message;
callback({ Responce: r });
res.status(500).send({ Responce: r }).end;
} else if (response.statusCode != 200) {
r.ResponseCode = parseInt(response.statusCode);
r.ResponseStatus = "Fail";
r.ResponseDescription = "Error in CarNet";
callback({ Responce: r });
} else parseString(body, {
explicitArray: false, tagNameProcessors: [
function (str) {
return str.replace(/(?!xmlns)^.*:/, '')
}]
, valueProcessors: [
function (str) {
if (!isNaN(str)) {
str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str);
}
return str;
},
function (str) {
if (/^(?:true|false)$/i.test(str)) {
str = str.toLowerCase() === 'true';
}
return str;
}]
}, function (err, result) {
//Parse results
var r = {};
r.Response = result.Envelope.Body.GetMinBatteryChargingResponse.GetMinBatteryChargingResponseV2.Response;
if (result.Envelope.Body.GetMinBatteryChargingResponse.GetMinBatteryChargingResponseV2.Data) r.Data = result.Envelope.Body.GetMinBatteryChargingResponse.GetMinBatteryChargingResponseV2.Data;
callback(r);
});
});
};
CarNet.prototype.invokeBatteryChargingJob = function (VIN, AccountID, TCUID, sessionKey, requestType,chargeMaxCurrent, callback) {
var url = 'https://wsb.htigermany.com/HTIWebGateway/GateWay/BatteryChargingService';
var postTemplate = _formatTemplate(_getTemplate("invokeBatteryChargingJob"));
var request = require('request');
var format = require("string-template");
var b = format(postTemplate, { VIN: VIN, TCUID: TCUID, AccountID: AccountID, sessionKey: sessionKey,requestType:requestType,chargeMaxCurrent:chargeMaxCurrent });
request.post({ url: url, headers: { 'Content-Type': 'text/xml;charset=UTF-8' }, body: b }, function (error, response, body, v) {
//console.log("Recieved");
var parseString = require('xml2js').parseString;
var r = {}
//console.log(JSON.stringify(response));
if (error) {
r.ResponseCode = -1;
r.ResponseStatus = error.name;
r.ResponseDescription = error.message;
callback({ Responce: r });
res.status(500).send({ Responce: r }).end;
} else if (response.statusCode != 200) {
r.ResponseCode = parseInt(response.statusCode);
r.ResponseStatus = "Fail";
r.ResponseDescription = "Error in CarNet";
callback({ Responce: r });
} else parseString(body, {
explicitArray: false, tagNameProcessors: [
function (str) {
return str.replace(/(?!xmlns)^.*:/, '')
}]
, valueProcessors: [
function (str) {
if (!isNaN(str)) {
str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str);
}
return str;
},
function (str) {
if (/^(?:true|false)$/i.test(str)) {
str = str.toLowerCase() === 'true';
}
return str;
}]
}, function (err, result) {
//Parse results
if (requestType == "unlockChargePlug") {
var r = {};
r.Response = result.Envelope.Body.InvokeBatteryChargingJobResponse.BatteryChargingJobResponse.Response;
callback(r);
} else {
setTimeout(function () { _getBatteryJobStatus(VIN, AccountID, TCUID, sessionKey, requestType, result.Envelope.Body.InvokeBatteryChargingJobResponse.BatteryChargingJobResponse.Header.TransactionId, 1, callback); }, 3000);
}
});
});
};
function _getBatteryJobStatus(VIN, AccountID, TCUID, sessionKey, requestType, originalTransactionID, counter, callback) {
var url = 'https://wsb.htigermany.com/HTIWebGateway/GateWay/BatteryChargingService';
var postTemplate = _formatTemplate(_getTemplate("getBatteryJobStatus"));
var request = require('request');
var format = require("string-template");
var b = format(postTemplate, { VIN: VIN, TCUID: TCUID, AccountID: AccountID, sessionKey: sessionKey, requestType: requestType, originalTransactionID: originalTransactionID });
request.post({ url: url, headers: { 'Content-Type': 'text/xml;charset=UTF-8' }, body: b }, function (error, response, body, v) {
//console.log("Recieved");
var parseString = require('xml2js').parseString;
var r = {}
//console.log(JSON.stringify(response));
if (error) {
r.ResponseCode = -1;
r.ResponseStatus = error.name;
r.ResponseDescription = error.message;
callback({ Responce: r });
res.status(500).send({ Responce: r }).end;
} else if (response.statusCode != 200) {
r.ResponseCode = parseInt(response.statusCode);
r.ResponseStatus = "Fail";
r.ResponseDescription = "Error in CarNet";
callback({ Responce: r });
} else parseString(body, {
explicitArray: false, tagNameProcessors: [
function (str) {
return str.replace(/(?!xmlns)^.*:/, '')
}]
, valueProcessors: [
function (str) {
if (!isNaN(str)) {
str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str);
}
return str;
},
function (str) {
if (/^(?:true|false)$/i.test(str)) {
str = str.toLowerCase() === 'true';
}
return str;
}]
}, function (err, result) {
//Parse results
if (result.Envelope.Body.GetJobStatusResponse.GetJobStatusRespons.Response.ResponseCode == 2000) {
var r = {};
r.Response = result.Envelope.Body.GetJobStatusResponse.GetJobStatusRespons.Response;
r.Data = result.Envelope.Body.GetJobStatusResponse.GetJobStatusRespons.Data;
callback(r);
} else {
if (counter < 10) {
setTimeout(function () { _getBatteryJobStatus(VIN, AccountID, TCUID, sessionKey, requestType, originalTransactionID, counter + 1, callback); }, 3000);
} else {
var r = {}
r.ResponseCode = 3000;
r.ResponseStatus = "Timeout";
r.ResponseDescription = "Timeout communicating with vehicle";
callback({ Responce: r });
}
}
});
});
};
module.exports = new CarNet();