Closed neuralldev closed 1 year ago
mise à jour du fichier /resources/lib/alexa-wsmqtt.js
parseIncomingMessageAF(data) {
function readHex(index, length) {
let str = data.toString('ascii', index, index + length);
if (str.startsWith('0x')) str = str.substr(2);
return parseInt(str, 16);
}
function readString(index, length) {
return data.toString('ascii', index, index + length);
}
let idx = 0;
const message = {};
message.service = readString(data.length - 4, 4);
this._options.logger && this._options.logger('{Alexa-Remote} WS-MQTT: Incoming message Service: ' + message.service,'DEBUG');
if (message.service === 'TUNE') {
message.checksum = readHex(idx, 10);
idx += 11; // 10 + delimiter;
let contentLength = readHex(idx, 10);
idx += 11; // 10 + delimiter;
message.content = readString(idx, contentLength - 4 - idx);
if (message.content.startsWith('{') && message.content.endsWith('}')) {
try {
message.content = JSON.parse(message.content);
}
catch (e) {}
}
}
else if (message.service === 'FABE') {
message.messageType = readString(0, 3);
message.channel = data.readUInt32BE(3);
message.messageId = data.readUInt32BE(7);
message.moreFlag = data.readUInt32BE(11);
message.seq = data.readUInt32BE(12);
message.checksum = data.readUInt32BE(16);
let contentLength = data.readUInt32BE(20);
message.content = {};
message.content.messageType = readString(24, 3);
idx = 28;
this._options.logger && this._options.logger('{Alexa-Remote} WS-MQTT: Incoming message Service Channel: ' + message.channel,'DEBUG');
if (message.channel === 0x361) { // GW_HANDSHAKE_CHANNEL
if (message.content.messageType === 'ACK') {
let length = readHex(idx, 10);
idx += 11; // 10 + delimiter;
message.content.protocolVersion = readString(idx, length);
idx += length + 1;
length = readHex(idx, 10);
idx += 11; // 10 + delimiter;
message.content.connectionUUID = readString(idx, length);
idx += length + 1;
message.content.established = readHex(idx, 10);
idx += 11; // 10 + delimiter;
message.content.timestampINI = readHex(idx, 18);
idx += 19; // 18 + delimiter;
message.content.timestampACK = readHex(idx, 18);
idx += 19; // 18 + delimiter;
}
}
else if (message.channel === 0x362) { // GW_CHANNEL
if (message.content.messageType === 'GWM') {
message.content.subMessageType = readString(idx, 3);
idx += 4;
message.content.channel = readHex(idx, 10);
idx += 11; // 10 + delimiter;
if (message.content.channel === 0xb479) { // DEE_WEBSITE_MESSAGING
let length = readHex(idx, 10);
idx += 11; // 10 + delimiter;
message.content.destinationIdentityUrn = readString(idx, length);
idx += length + 1;
length = readHex(idx, 10);
idx += 11; // 10 + delimiter;
let idData = readString(idx, length);
idx += length + 1;
idData = idData.split(' ');
message.content.deviceIdentityUrn = idData[0];
message.content.payload = idData[1];
if (!message.content.payload) {
message.content.payload = readString(idx, data.length - 4 - idx);
}
if (message.content.payload.startsWith('{') && message.content.payload.endsWith('}')) {
try {
message.content.payload = JSON.parse(message.content.payload);
if (message.content.payload && message.content.payload.payload && typeof message.content.payload.payload === 'string') {
message.content.payload.payload = JSON.parse(message.content.payload.payload);
}
}
catch (e) {}
}
}
}
}
else if (message.channel === 0x65) { // CHANNEL_FOR_HEARTBEAT
message.content.payloadData = data.slice(idx, data.length - 4);
}
}
//console.log(JSON.stringify(message, null, 4));
this._options.logger && this._options.logger('{Alexa-Remote} WS-MQTT: Parsed Message: ' + JSON.stringify(message),'INFO');
return message;
}
en cours de rédaction...