homebridge-midea-platform 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +176 -0
- package/README.md +9 -0
- package/config.schema.json +137 -0
- package/dist/accessory/AccessoryFactory.d.ts +8 -0
- package/dist/accessory/AccessoryFactory.d.ts.map +1 -0
- package/dist/accessory/AccessoryFactory.js +17 -0
- package/dist/accessory/AccessoryFactory.js.map +1 -0
- package/dist/accessory/AirConditionerAccessory.d.ts +25 -0
- package/dist/accessory/AirConditionerAccessory.d.ts.map +1 -0
- package/dist/accessory/AirConditionerAccessory.js +182 -0
- package/dist/accessory/AirConditionerAccessory.js.map +1 -0
- package/dist/accessory/BaseAccessory.d.ts +9 -0
- package/dist/accessory/BaseAccessory.d.ts.map +1 -0
- package/dist/accessory/BaseAccessory.js +29 -0
- package/dist/accessory/BaseAccessory.js.map +1 -0
- package/dist/core/MideaCloud.d.ts +32 -0
- package/dist/core/MideaCloud.d.ts.map +1 -0
- package/dist/core/MideaCloud.js +152 -0
- package/dist/core/MideaCloud.js.map +1 -0
- package/dist/core/MideaConstants.d.ts +41 -0
- package/dist/core/MideaConstants.d.ts.map +1 -0
- package/dist/core/MideaConstants.js +56 -0
- package/dist/core/MideaConstants.js.map +1 -0
- package/dist/core/MideaDevice.d.ts +58 -0
- package/dist/core/MideaDevice.d.ts.map +1 -0
- package/dist/core/MideaDevice.js +263 -0
- package/dist/core/MideaDevice.js.map +1 -0
- package/dist/core/MideaDiscover.d.ts +17 -0
- package/dist/core/MideaDiscover.d.ts.map +1 -0
- package/dist/core/MideaDiscover.js +129 -0
- package/dist/core/MideaDiscover.js.map +1 -0
- package/dist/core/MideaMessage.d.ts +76 -0
- package/dist/core/MideaMessage.d.ts.map +1 -0
- package/dist/core/MideaMessage.js +186 -0
- package/dist/core/MideaMessage.js.map +1 -0
- package/dist/core/MideaPacketBuilder.d.ts +11 -0
- package/dist/core/MideaPacketBuilder.d.ts.map +1 -0
- package/dist/core/MideaPacketBuilder.js +60 -0
- package/dist/core/MideaPacketBuilder.js.map +1 -0
- package/dist/core/MideaSecurity.d.ts +35 -0
- package/dist/core/MideaSecurity.d.ts.map +1 -0
- package/dist/core/MideaSecurity.js +168 -0
- package/dist/core/MideaSecurity.js.map +1 -0
- package/dist/core/MideaUtils.d.ts +18 -0
- package/dist/core/MideaUtils.d.ts.map +1 -0
- package/dist/core/MideaUtils.js +187 -0
- package/dist/core/MideaUtils.js.map +1 -0
- package/dist/devices/DeviceFactory.d.ts +8 -0
- package/dist/devices/DeviceFactory.d.ts.map +1 -0
- package/dist/devices/DeviceFactory.js +17 -0
- package/dist/devices/DeviceFactory.js.map +1 -0
- package/dist/devices/ac/MideaACDevice.d.ts +80 -0
- package/dist/devices/ac/MideaACDevice.d.ts.map +1 -0
- package/dist/devices/ac/MideaACDevice.js +271 -0
- package/dist/devices/ac/MideaACDevice.js.map +1 -0
- package/dist/devices/ac/MideaACMessage.d.ts +90 -0
- package/dist/devices/ac/MideaACMessage.d.ts.map +1 -0
- package/dist/devices/ac/MideaACMessage.js +528 -0
- package/dist/devices/ac/MideaACMessage.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/platform.d.ts +20 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +110 -0
- package/dist/platform.js.map +1 -0
- package/dist/settings.d.ts +9 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +12 -0
- package/dist/settings.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Logger } from 'homebridge';
|
|
3
|
+
import EventEmitter from 'events';
|
|
4
|
+
export default class Discover extends EventEmitter {
|
|
5
|
+
private readonly logger;
|
|
6
|
+
private readonly IPV4_BROADCAST;
|
|
7
|
+
private socket;
|
|
8
|
+
private readonly xml_parser;
|
|
9
|
+
private security;
|
|
10
|
+
private ips;
|
|
11
|
+
constructor(logger: Logger);
|
|
12
|
+
discoverDeviceByIP(ip: string, retries?: number): void;
|
|
13
|
+
startDiscover(): void;
|
|
14
|
+
private getDeviceVersion;
|
|
15
|
+
private getDeviceInfo;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=MideaDiscover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MideaDiscover.d.ts","sourceRoot":"","sources":["../../src/core/MideaDiscover.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGpC,OAAO,YAAY,MAAM,QAAQ,CAAC;AAGlC,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,YAAY;IAU9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,GAAG,CAAgB;gBAGR,MAAM,EAAE,MAAM;IA6B1B,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,SAAI;IAkB1C,aAAa;IAWpB,OAAO,CAAC,gBAAgB;YAiBV,aAAa;CA8E5B"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const dgram_1 = __importDefault(require("dgram"));
|
|
7
|
+
const MideaConstants_1 = require("./MideaConstants");
|
|
8
|
+
const fast_xml_parser_1 = require("fast-xml-parser");
|
|
9
|
+
const events_1 = __importDefault(require("events"));
|
|
10
|
+
const MideaSecurity_1 = require("./MideaSecurity");
|
|
11
|
+
class Discover extends events_1.default {
|
|
12
|
+
constructor(logger) {
|
|
13
|
+
super();
|
|
14
|
+
this.logger = logger;
|
|
15
|
+
this.IPV4_BROADCAST = '255.255.255.255';
|
|
16
|
+
this.ips = [];
|
|
17
|
+
this.security = new MideaSecurity_1.LocalSecurity();
|
|
18
|
+
this.xml_parser = new fast_xml_parser_1.XMLParser();
|
|
19
|
+
this.socket = dgram_1.default.createSocket('udp4');
|
|
20
|
+
this.socket.bind(0, undefined, () => {
|
|
21
|
+
this.socket.setBroadcast(true);
|
|
22
|
+
});
|
|
23
|
+
this.socket.on('error', (err) => {
|
|
24
|
+
this.logger.debug(`server error:\n${err.stack}`);
|
|
25
|
+
});
|
|
26
|
+
this.socket.on('message', async (msg, rinfo) => {
|
|
27
|
+
this.ips.push(rinfo.address);
|
|
28
|
+
const device_version = this.getDeviceVersion(msg);
|
|
29
|
+
const device_info = await this.getDeviceInfo(rinfo.address, device_version, msg);
|
|
30
|
+
this.logger.debug(`Discovered device at ${rinfo.address} (${JSON.stringify(device_info)}).`);
|
|
31
|
+
this.emit('device', device_info);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
discoverDeviceByIP(ip, retries = 3) {
|
|
35
|
+
let tries = 0;
|
|
36
|
+
const interval = setInterval(() => {
|
|
37
|
+
if (this.ips.includes(ip) || tries++ > retries) {
|
|
38
|
+
clearInterval(interval);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this.logger.debug(`Sending discovery message to ${ip}, try ${tries}...`);
|
|
42
|
+
for (const port of [6445, 20086]) {
|
|
43
|
+
this.socket.send(Buffer.from(MideaConstants_1.DISCOVERY_MESSAGE), port, ip, (err) => {
|
|
44
|
+
if (err) {
|
|
45
|
+
this.logger.error(`Error while sending message to ${ip}: ${err}`);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}, 3000);
|
|
50
|
+
}
|
|
51
|
+
startDiscover() {
|
|
52
|
+
for (const port of [6445, 20086]) {
|
|
53
|
+
this.socket.send(Buffer.from(MideaConstants_1.DISCOVERY_MESSAGE), port, this.IPV4_BROADCAST, (err) => {
|
|
54
|
+
if (err) {
|
|
55
|
+
this.logger.error(`Error while sending message to ${this.IPV4_BROADCAST}:${port}: ${err}`);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
getDeviceVersion(data) {
|
|
61
|
+
try {
|
|
62
|
+
this.xml_parser.parse(data.toString(), true);
|
|
63
|
+
return MideaConstants_1.ProtocolVersion.V1;
|
|
64
|
+
}
|
|
65
|
+
catch (_a) {
|
|
66
|
+
const start_of_packet = data.subarray(0, 2);
|
|
67
|
+
if (start_of_packet.compare(Buffer.from([0x5a, 0x5a])) === 0) {
|
|
68
|
+
return MideaConstants_1.ProtocolVersion.V2;
|
|
69
|
+
}
|
|
70
|
+
else if (start_of_packet.compare(Buffer.from([0x83, 0x70])) === 0) {
|
|
71
|
+
return MideaConstants_1.ProtocolVersion.V3;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
throw new Error('Unknown device version.');
|
|
75
|
+
}
|
|
76
|
+
async getDeviceInfo(ip, version, data) {
|
|
77
|
+
if (version === MideaConstants_1.ProtocolVersion.V1) {
|
|
78
|
+
// const root = this.xml_parser.parse(data.toString());
|
|
79
|
+
// const device = root["body"]["device"]
|
|
80
|
+
// if (device) {
|
|
81
|
+
// const port = device["port"];
|
|
82
|
+
// }
|
|
83
|
+
// throw new Error("Could not find 'body/device' in XML.");
|
|
84
|
+
throw new Error('Version 1 not implemented.');
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
let buffer = data;
|
|
88
|
+
// Strip V3 header and hash
|
|
89
|
+
if (version === MideaConstants_1.ProtocolVersion.V3) {
|
|
90
|
+
buffer = buffer.subarray(8, -16);
|
|
91
|
+
}
|
|
92
|
+
const encrypted_data = buffer.subarray(40, -16);
|
|
93
|
+
const device_id = buffer.readUIntLE(20, 6);
|
|
94
|
+
let decrypted_buffer;
|
|
95
|
+
try {
|
|
96
|
+
decrypted_buffer = this.security.aes_decrypt(encrypted_data);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
throw new Error(`Error while decrypting data: ${err}`);
|
|
100
|
+
}
|
|
101
|
+
this.logger.debug(`Decrypted data: ${decrypted_buffer.toString('hex')}`);
|
|
102
|
+
// eslint-disable-next-line max-len
|
|
103
|
+
const ip_address = `${decrypted_buffer.readUint8(3)}.${decrypted_buffer.readUint8(2)}.${decrypted_buffer.readUint8(1)}.${decrypted_buffer.readUint8(0)}`;
|
|
104
|
+
const port = decrypted_buffer.readUIntLE(4, 2);
|
|
105
|
+
if (ip_address !== ip) {
|
|
106
|
+
this.logger.warn(`IP address mismatch: ${ip_address} != ${ip}`);
|
|
107
|
+
}
|
|
108
|
+
const model = decrypted_buffer.subarray(17, 25).toString();
|
|
109
|
+
// Serial number
|
|
110
|
+
const sn = decrypted_buffer.subarray(8, 40).toString();
|
|
111
|
+
// Extract name/SSID
|
|
112
|
+
const name_length = decrypted_buffer.readUIntLE(40, 1);
|
|
113
|
+
const name = decrypted_buffer.subarray(41, 41 + name_length).toString();
|
|
114
|
+
const device_type = Number(`0x${name.split('_')[1]}`);
|
|
115
|
+
return {
|
|
116
|
+
'ip': ip_address,
|
|
117
|
+
'port': port,
|
|
118
|
+
'id': device_id,
|
|
119
|
+
'model': model,
|
|
120
|
+
'sn': sn,
|
|
121
|
+
'name': name,
|
|
122
|
+
'type': device_type,
|
|
123
|
+
'version': version,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.default = Discover;
|
|
129
|
+
//# sourceMappingURL=MideaDiscover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MideaDiscover.js","sourceRoot":"","sources":["../../src/core/MideaDiscover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { DeviceType } from './MideaConstants';
|
|
3
|
+
export declare enum MessageType {
|
|
4
|
+
UNKNOWN = 0,
|
|
5
|
+
SET = 2,
|
|
6
|
+
QUERY = 3,
|
|
7
|
+
NOTIFY1 = 4,
|
|
8
|
+
NOTIFY2 = 5,
|
|
9
|
+
EXCEPTION = 6,
|
|
10
|
+
QUERY_SN = 7,
|
|
11
|
+
EXCEPTION2 = 10,
|
|
12
|
+
QUERY_SUBTYPE = 160
|
|
13
|
+
}
|
|
14
|
+
declare abstract class MessageBase {
|
|
15
|
+
protected readonly HEADER_LENGTH = 10;
|
|
16
|
+
protected abstract device_type: DeviceType;
|
|
17
|
+
protected abstract message_type: MessageType;
|
|
18
|
+
protected abstract body_type: number;
|
|
19
|
+
protected abstract device_protocol_version: number;
|
|
20
|
+
protected abstract body: Buffer;
|
|
21
|
+
checksum(data: Buffer): number;
|
|
22
|
+
}
|
|
23
|
+
export declare abstract class MessageRequest extends MessageBase {
|
|
24
|
+
device_type: DeviceType;
|
|
25
|
+
message_type: MessageType;
|
|
26
|
+
body_type: number;
|
|
27
|
+
device_protocol_version: number;
|
|
28
|
+
protected abstract _body: Buffer;
|
|
29
|
+
constructor(device_type: DeviceType, message_type: MessageType, body_type: number, device_protocol_version: number);
|
|
30
|
+
get body(): Buffer;
|
|
31
|
+
get header(): Buffer;
|
|
32
|
+
serialize(): Buffer;
|
|
33
|
+
}
|
|
34
|
+
export declare class MessageQuerySubtype extends MessageRequest {
|
|
35
|
+
protected _body: Buffer;
|
|
36
|
+
constructor(device_type: DeviceType);
|
|
37
|
+
}
|
|
38
|
+
export declare class MessageQuestCustom extends MessageRequest {
|
|
39
|
+
protected _body: Buffer;
|
|
40
|
+
protected cmd_body: Buffer;
|
|
41
|
+
constructor(device_type: DeviceType, message_type: MessageType, cmd_body: Buffer);
|
|
42
|
+
get body(): Buffer;
|
|
43
|
+
}
|
|
44
|
+
export declare class MessageBody {
|
|
45
|
+
readonly data: Buffer;
|
|
46
|
+
constructor(data: Buffer);
|
|
47
|
+
get body_type(): number;
|
|
48
|
+
static read_byte(data: Buffer, offset: number, default_value: number): number;
|
|
49
|
+
}
|
|
50
|
+
export declare class NewProtocolMessageBody extends MessageBody {
|
|
51
|
+
protected packet_length: number;
|
|
52
|
+
constructor(body: Buffer, body_type: number);
|
|
53
|
+
static packet(param: number, value: Buffer, packet_length?: number): Buffer;
|
|
54
|
+
parse(): {
|
|
55
|
+
[key: string]: any;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export declare class MessageResponse extends MessageBase {
|
|
59
|
+
protected header: Buffer;
|
|
60
|
+
protected device_type: DeviceType;
|
|
61
|
+
protected message_type: MessageType;
|
|
62
|
+
protected body_type: number;
|
|
63
|
+
device_protocol_version: number;
|
|
64
|
+
protected _body: MessageBody;
|
|
65
|
+
constructor(message: Buffer | null | undefined);
|
|
66
|
+
get body(): Buffer;
|
|
67
|
+
set_body(body: MessageBody): void;
|
|
68
|
+
get_body_type(): string;
|
|
69
|
+
get_body_attribute(name: string): any;
|
|
70
|
+
}
|
|
71
|
+
export declare class MessageSubtypeResponse extends MessageResponse {
|
|
72
|
+
sub_type: number;
|
|
73
|
+
constructor(message: Buffer | null | undefined);
|
|
74
|
+
}
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=MideaMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MideaMessage.d.ts","sourceRoot":"","sources":["../../src/core/MideaMessage.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,oBAAY,WAAW;IACrB,OAAO,IAAO;IACd,GAAG,IAAO;IACV,KAAK,IAAO;IACZ,OAAO,IAAO;IACd,OAAO,IAAO;IACd,SAAS,IAAO;IAChB,QAAQ,IAAO;IACf,UAAU,KAAO;IACjB,aAAa,MAAO;CACrB;AAED,uBAAe,WAAW;IACxB,SAAS,CAAC,QAAQ,CAAC,aAAa,MAAM;IAEtC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IAC3C,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC;IAC7C,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IAEnD,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,IAAI,EAAE,MAAM;CAO7B;AAED,8BAAsB,cAAe,SAAQ,WAAW;IAEtD,WAAW,EAAE,UAAU,CAAC;IACxB,YAAY,EAAE,WAAW,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB,EAAE,MAAM,CAAC;IAEhC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAG/B,WAAW,EAAE,UAAU,EACvB,YAAY,EAAE,WAAW,EACzB,SAAS,EAAE,MAAM,EACjB,uBAAuB,EAAE,MAAM;IASjC,IAAI,IAAI,WAIP;IAED,IAAI,MAAM,WAsBT;IAEM,SAAS;CAKjB;AAED,qBAAa,mBAAoB,SAAQ,cAAc;IACrD,SAAS,CAAC,KAAK,SAAoB;gBAEvB,WAAW,EAAE,UAAU;CAQpC;AAED,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,SAAS,CAAC,KAAK,SAAmB;IAClC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;gBACf,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM;IAUhF,IAAI,IAAI,WAEP;CACF;AAED,qBAAa,WAAW;aAEJ,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;IAG9B,IAAI,SAAS,WAEZ;IAED,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;CAGrE;AAED,qBAAa,sBAAuB,SAAQ,WAAW;IAErD,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;gBAG9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM;IAWnB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,SAAI;IAStD,KAAK;;;CAuBb;AAED,qBAAa,eAAgB,SAAQ,WAAW;IAE9C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC;IAClC,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,MAAM,CAAC;IAEvC,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC;gBAG3B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAepC,IAAI,IAAI,WAEP;IAED,QAAQ,CAAC,IAAI,EAAE,WAAW;IAI1B,aAAa;IAIb,kBAAkB,CAAC,IAAI,EAAE,MAAM;CAGhC;AAED,qBAAa,sBAAuB,SAAQ,eAAe;IAElD,QAAQ,EAAE,MAAM,CAAC;gBAEZ,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;CAS/C"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MessageSubtypeResponse = exports.MessageResponse = exports.NewProtocolMessageBody = exports.MessageBody = exports.MessageQuestCustom = exports.MessageQuerySubtype = exports.MessageRequest = exports.MessageType = void 0;
|
|
4
|
+
var MessageType;
|
|
5
|
+
(function (MessageType) {
|
|
6
|
+
MessageType[MessageType["UNKNOWN"] = 0] = "UNKNOWN";
|
|
7
|
+
MessageType[MessageType["SET"] = 2] = "SET";
|
|
8
|
+
MessageType[MessageType["QUERY"] = 3] = "QUERY";
|
|
9
|
+
MessageType[MessageType["NOTIFY1"] = 4] = "NOTIFY1";
|
|
10
|
+
MessageType[MessageType["NOTIFY2"] = 5] = "NOTIFY2";
|
|
11
|
+
MessageType[MessageType["EXCEPTION"] = 6] = "EXCEPTION";
|
|
12
|
+
MessageType[MessageType["QUERY_SN"] = 7] = "QUERY_SN";
|
|
13
|
+
MessageType[MessageType["EXCEPTION2"] = 10] = "EXCEPTION2";
|
|
14
|
+
MessageType[MessageType["QUERY_SUBTYPE"] = 160] = "QUERY_SUBTYPE";
|
|
15
|
+
})(MessageType = exports.MessageType || (exports.MessageType = {}));
|
|
16
|
+
class MessageBase {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.HEADER_LENGTH = 10;
|
|
19
|
+
}
|
|
20
|
+
checksum(data) {
|
|
21
|
+
let sum = 0;
|
|
22
|
+
for (let i = 0; i < data.length; i++) {
|
|
23
|
+
sum += data[i];
|
|
24
|
+
}
|
|
25
|
+
return (~sum + 1) & 0xFF;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
class MessageRequest extends MessageBase {
|
|
29
|
+
constructor(device_type, message_type, body_type, device_protocol_version) {
|
|
30
|
+
super();
|
|
31
|
+
this.device_type = device_type;
|
|
32
|
+
this.message_type = message_type;
|
|
33
|
+
this.body_type = body_type;
|
|
34
|
+
this.device_protocol_version = device_protocol_version;
|
|
35
|
+
}
|
|
36
|
+
get body() {
|
|
37
|
+
return Buffer.from(this.body_type && this._body ? [this.body_type, ...this._body] :
|
|
38
|
+
this.body_type ? [this.body_type] :
|
|
39
|
+
this._body ? this._body : []);
|
|
40
|
+
}
|
|
41
|
+
get header() {
|
|
42
|
+
const length = this.HEADER_LENGTH + this.body.length;
|
|
43
|
+
return Buffer.from([
|
|
44
|
+
// flag
|
|
45
|
+
0xAA,
|
|
46
|
+
// length
|
|
47
|
+
length,
|
|
48
|
+
// device type
|
|
49
|
+
this.device_type,
|
|
50
|
+
// frame checksum
|
|
51
|
+
0x00,
|
|
52
|
+
// unused
|
|
53
|
+
0x00, 0x00,
|
|
54
|
+
// frame ID
|
|
55
|
+
0x00,
|
|
56
|
+
// frame protocol version
|
|
57
|
+
0x00,
|
|
58
|
+
// device protocol version
|
|
59
|
+
this.device_protocol_version,
|
|
60
|
+
// frame type
|
|
61
|
+
this.message_type,
|
|
62
|
+
]);
|
|
63
|
+
}
|
|
64
|
+
serialize() {
|
|
65
|
+
let stream = Buffer.concat([this.header, this.body]);
|
|
66
|
+
stream = Buffer.concat([stream, Buffer.from([this.checksum(stream.subarray(1, stream.length))])]);
|
|
67
|
+
return stream;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.MessageRequest = MessageRequest;
|
|
71
|
+
class MessageQuerySubtype extends MessageRequest {
|
|
72
|
+
constructor(device_type) {
|
|
73
|
+
super(device_type, MessageType.QUERY_SUBTYPE, 0x00, 0);
|
|
74
|
+
this._body = Buffer.alloc(18);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.MessageQuerySubtype = MessageQuerySubtype;
|
|
78
|
+
class MessageQuestCustom extends MessageRequest {
|
|
79
|
+
constructor(device_type, message_type, cmd_body) {
|
|
80
|
+
super(device_type, message_type, 0x00, 0);
|
|
81
|
+
this._body = Buffer.alloc(0);
|
|
82
|
+
this.cmd_body = cmd_body;
|
|
83
|
+
}
|
|
84
|
+
get body() {
|
|
85
|
+
return this.cmd_body;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.MessageQuestCustom = MessageQuestCustom;
|
|
89
|
+
class MessageBody {
|
|
90
|
+
constructor(data) {
|
|
91
|
+
this.data = data;
|
|
92
|
+
}
|
|
93
|
+
get body_type() {
|
|
94
|
+
return this.data[0];
|
|
95
|
+
}
|
|
96
|
+
static read_byte(data, offset, default_value) {
|
|
97
|
+
return data.length > offset ? data[offset] : default_value;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.MessageBody = MessageBody;
|
|
101
|
+
class NewProtocolMessageBody extends MessageBody {
|
|
102
|
+
constructor(body, body_type) {
|
|
103
|
+
super(body);
|
|
104
|
+
if (body_type === 0xb5) {
|
|
105
|
+
this.packet_length = 4;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this.packet_length = 5;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
static packet(param, value, packet_length = 4) {
|
|
112
|
+
const length = value.length;
|
|
113
|
+
if (packet_length === 4) {
|
|
114
|
+
return Buffer.from([param && 0xFF, param >> 8, length, ...value]);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
return Buffer.from([param && 0xFF, param >> 8, 0x00, length, ...value]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
parse() {
|
|
121
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
122
|
+
const result = {};
|
|
123
|
+
let offset = 2;
|
|
124
|
+
try {
|
|
125
|
+
while (offset < this.data.length) {
|
|
126
|
+
const param = this.data[offset] + (this.data[offset + 1] << 8);
|
|
127
|
+
if (this.packet_length === 5) {
|
|
128
|
+
offset++;
|
|
129
|
+
}
|
|
130
|
+
const length = this.data[offset + 2];
|
|
131
|
+
if (length > 0) {
|
|
132
|
+
const value = this.data.subarray(offset + 3, offset + 3 + length);
|
|
133
|
+
result[param] = value;
|
|
134
|
+
}
|
|
135
|
+
offset += 3 + length;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
// eslint-disable-next-line no-console
|
|
140
|
+
console.error(e);
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.NewProtocolMessageBody = NewProtocolMessageBody;
|
|
146
|
+
class MessageResponse extends MessageBase {
|
|
147
|
+
constructor(message) {
|
|
148
|
+
super();
|
|
149
|
+
if (message === null || message === undefined || message.length < this.HEADER_LENGTH + 1) {
|
|
150
|
+
throw new Error('Invalid message length');
|
|
151
|
+
}
|
|
152
|
+
this.header = message.subarray(0, this.HEADER_LENGTH);
|
|
153
|
+
this.device_protocol_version = this.header[8];
|
|
154
|
+
this.message_type = this.header[this.header.length - 1];
|
|
155
|
+
this.device_type = this.header[2];
|
|
156
|
+
this._body = new MessageBody(message.subarray(this.HEADER_LENGTH, -1));
|
|
157
|
+
this.body_type = this._body.body_type;
|
|
158
|
+
}
|
|
159
|
+
get body() {
|
|
160
|
+
return this._body.data;
|
|
161
|
+
}
|
|
162
|
+
set_body(body) {
|
|
163
|
+
this._body = body;
|
|
164
|
+
}
|
|
165
|
+
get_body_type() {
|
|
166
|
+
return this._body.constructor.name;
|
|
167
|
+
}
|
|
168
|
+
get_body_attribute(name) {
|
|
169
|
+
return this._body[name];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.MessageResponse = MessageResponse;
|
|
173
|
+
class MessageSubtypeResponse extends MessageResponse {
|
|
174
|
+
constructor(message) {
|
|
175
|
+
super(message);
|
|
176
|
+
if (this.message_type === MessageType.QUERY_SUBTYPE) {
|
|
177
|
+
const body = message.subarray(this.HEADER_LENGTH, -1);
|
|
178
|
+
this.sub_type = (body.length > 2 ? body[2] : 0) + (body.length > 3 ? body[3] << 8 : 0);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
throw new Error('Invalid message type');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
exports.MessageSubtypeResponse = MessageSubtypeResponse;
|
|
186
|
+
//# sourceMappingURL=MideaMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MideaMessage.js","sourceRoot":"","sources":["../../src/core/MideaMessage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
export default class PacketBuilder {
|
|
3
|
+
private readonly command;
|
|
4
|
+
private readonly security;
|
|
5
|
+
private packet;
|
|
6
|
+
constructor(device_id: number, command: Buffer);
|
|
7
|
+
finalize(message_type?: number): Buffer;
|
|
8
|
+
static packet_time(): Buffer;
|
|
9
|
+
static checksum(data: Buffer): number;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=MideaPacketBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MideaPacketBuilder.d.ts","sourceRoot":"","sources":["../../src/core/MideaPacketBuilder.ts"],"names":[],"mappings":";AAIA,MAAM,CAAC,OAAO,OAAO,aAAa;IAO9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,MAAM,CAAS;gBAGrB,SAAS,EAAE,MAAM,EACA,OAAO,EAAE,MAAM;IAyB3B,QAAQ,CAAC,YAAY,SAAI;WAalB,WAAW;WASX,QAAQ,CAAC,IAAI,EAAE,MAAM;CAOpC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const MideaSecurity_1 = require("./MideaSecurity");
|
|
4
|
+
const luxon_1 = require("luxon");
|
|
5
|
+
const MideaUtils_1 = require("./MideaUtils");
|
|
6
|
+
class PacketBuilder {
|
|
7
|
+
constructor(device_id, command) {
|
|
8
|
+
this.command = command;
|
|
9
|
+
this.security = new MideaSecurity_1.LocalSecurity();
|
|
10
|
+
this.packet = Buffer.from([
|
|
11
|
+
// 2 bytes - StaicHeader
|
|
12
|
+
0x5a, 0x5a,
|
|
13
|
+
// 2 bytes - mMessageType
|
|
14
|
+
0x01, 0x11,
|
|
15
|
+
// 2 bytes - PacketLenght
|
|
16
|
+
0x00, 0x00,
|
|
17
|
+
// 2 bytes
|
|
18
|
+
0x20, 0x00,
|
|
19
|
+
// 4 bytes - MessageId
|
|
20
|
+
0x00, 0x00, 0x00, 0x00,
|
|
21
|
+
// 8 bytes - Date&Time
|
|
22
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
23
|
+
// 6 bytes - mDeviceID
|
|
24
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
25
|
+
// 12 bytes
|
|
26
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
27
|
+
]);
|
|
28
|
+
this.packet.subarray(12, 20).set(PacketBuilder.packet_time());
|
|
29
|
+
this.packet.subarray(20, 28).set((0, MideaUtils_1.numberToUint8Array)(device_id, 8, 'little'));
|
|
30
|
+
}
|
|
31
|
+
finalize(message_type = 1) {
|
|
32
|
+
if (message_type !== 1) {
|
|
33
|
+
this.packet[3] = 0x10;
|
|
34
|
+
this.packet[6] = 0x7b;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
this.packet = Buffer.concat([this.packet, this.security.aes_encrypt(this.command)]);
|
|
38
|
+
}
|
|
39
|
+
this.packet.subarray(4, 6).set((0, MideaUtils_1.numberToUint8Array)(this.packet.length + 16, 2, 'little'));
|
|
40
|
+
this.packet = Buffer.concat([this.packet, this.security.encode32_data(this.packet)]);
|
|
41
|
+
return this.packet;
|
|
42
|
+
}
|
|
43
|
+
static packet_time() {
|
|
44
|
+
const t = luxon_1.DateTime.utc().toFormat('yyyyMMddHHmmssuu');
|
|
45
|
+
const b = Buffer.alloc(8);
|
|
46
|
+
for (let i = 0; i < t.length; i += 2) {
|
|
47
|
+
b[8 - i - 1] = parseInt(t.substring(i, i + 2));
|
|
48
|
+
}
|
|
49
|
+
return b;
|
|
50
|
+
}
|
|
51
|
+
static checksum(data) {
|
|
52
|
+
let sum = 0;
|
|
53
|
+
for (let i = 0; i < data.length; i++) {
|
|
54
|
+
sum += data[i];
|
|
55
|
+
}
|
|
56
|
+
return (~sum + 1) & 0xFF;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.default = PacketBuilder;
|
|
60
|
+
//# sourceMappingURL=MideaPacketBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MideaPacketBuilder.js","sourceRoot":"","sources":["../../src/core/MideaPacketBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { TCPMessageType } from './MideaConstants';
|
|
3
|
+
export type KeyToken = Buffer | undefined;
|
|
4
|
+
export declare class CloudSecurity {
|
|
5
|
+
private readonly use_china_server;
|
|
6
|
+
private readonly HMAC_KEY;
|
|
7
|
+
private readonly IOT_KEY;
|
|
8
|
+
private readonly LOGIN_KEY;
|
|
9
|
+
private readonly IOT_KEY_CHINA;
|
|
10
|
+
private readonly LOGIN_KEY_CHINA;
|
|
11
|
+
private iot_key;
|
|
12
|
+
private login_key;
|
|
13
|
+
constructor(use_china_server?: boolean);
|
|
14
|
+
sign(data: string, random: string): string;
|
|
15
|
+
encrpytPassword(loginId: string, password: string): string;
|
|
16
|
+
encrpytIAMPassword(loginId: string, password: string): string;
|
|
17
|
+
static getUDPID(device_id_buf: Uint8Array): string;
|
|
18
|
+
}
|
|
19
|
+
export declare class LocalSecurity {
|
|
20
|
+
private readonly aes_key;
|
|
21
|
+
private readonly salt;
|
|
22
|
+
private readonly iv;
|
|
23
|
+
private request_count;
|
|
24
|
+
private response_count;
|
|
25
|
+
private tcp_key?;
|
|
26
|
+
private aes_cbc_encrpyt;
|
|
27
|
+
private aes_cbc_decrypt;
|
|
28
|
+
aes_encrypt(data: Buffer): Buffer;
|
|
29
|
+
aes_decrypt(data: Buffer): Buffer;
|
|
30
|
+
encode32_data(raw: Buffer): Buffer;
|
|
31
|
+
tcp_key_from_resp(response: Buffer, key: Buffer): Buffer;
|
|
32
|
+
encode_8370(data: Buffer, message_type: TCPMessageType): Buffer;
|
|
33
|
+
decode_8370(data: Buffer): any;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=MideaSecurity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MideaSecurity.d.ts","sourceRoot":"","sources":["../../src/core/MideaSecurity.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1C,qBAAa,aAAa;IAatB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAZnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IAEpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAEhE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsC;IAEtE,OAAO,CAAC,OAAO,CAA6D;IAC5E,OAAO,CAAC,SAAS,CAAiE;gBAG/D,gBAAgB,GAAE,OAAe;IAI7C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMjC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAUjD,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;WAe7C,QAAQ,CAAC,aAAa,EAAE,UAAU;CAQjD;AAED,qBAAa,aAAa;IAIxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0D;IAClF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkG;IACvH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IAEvC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAK;IAE3B,OAAO,CAAC,OAAO,CAAC,CAAS;IAEzB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAMhB,WAAW,CAAC,IAAI,EAAE,MAAM;IAKxB,WAAW,CAAC,IAAI,EAAE,MAAM;IAKxB,aAAa,CAAC,GAAG,EAAE,MAAM;IAIzB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAqB/C,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc;IA2BtD,WAAW,CAAC,IAAI,EAAE,MAAM;CAyChC"}
|