jeremyarnoux / jeedom_alexaapi

Plugin Jeedom pour Alexa via API
6 stars 11 forks source link

Master #148

Closed neuralldev closed 1 year ago

neuralldev commented 1 year ago

en cours de rédaction...

neuralldev commented 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;
    }