UNPKG

vw-carnet

Version:

Node package to connect to VW Carnet SOAP service

496 lines (447 loc) 21.6 kB
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();