UNPKG

ecloudc-sdk-js

Version:

逸云智家C主机SDK

283 lines (280 loc) 12.8 kB
const DataUtil = require("../common/DataUtil"); const NetworkUtil = require("../common/NetworkUtil"); /** * APP指令处理 * @type {{Command: {HEAD: number, END: number, MAC: *, Version: {FF: number, FE: number, FD: number, FB: number}, Action: {FF_PROJECT_UPDATE: number, FF_PROJECT_BACKUP: number, FF_HOME_INFO_UPLOAD: number, FF_SYSTEM_INFO_UPLOAD: number, FF_DRIVER_UPGRADE_RESULT: number, FF_DRIVER_UPGRADE: number, FF_EVENT_NOTIFY: number, FF_SYSTEM_NOTIFY: number, FF_RUNNING_INFO_UPLOAD: number, FF_SEARCH_GATEWAY: number, FF_SEARCH_GATEWAY_RESULT: number, FF_CONNECT_AUTH: number, FF_E_CLOUD_MAIN_AUTH: number, FF_E_CLOUD_SUB_AUTH: number, FF_HEARTBEAT: number, FF_HEARTBEAT_RESULT: number, FF_QUERY: number, FF_RESPONSE: number, FF_CONTROL_DEVICE_E: number, FF_CONTROL_DEVICE_H: number, FF_ACTIVE_SCENE: number, FF_CONTROL_SCHEDULE: number, FF_NOTIFY: number, FE_MESSAGE: number, FE_LAST_MESSAGE_ID_QUERY: number, FE_LAST_MESSAGE_ID_RESULT: number, FE_HISTORY_MESSAGE_QUERY: number, FE_HISTORY_MESSAGE_RESULT: number, FE_APP_ON_LINE_QUERY: number, FE_E_CLOUD_ON_LINE_QUERY: number, FE_ON_LINE_RESULT: number, FE_DIALOG_MESSAGE_QUERY: number, FE_DIALOG_MESSAGE_RESULT: number, FD_ADD_SCENE: number, FD_UPDATE_SCENE: number, FD_DELETE_SCENE: number, FD_ADD_SCHEDULE: number, FD_UPDATE_SCHEDULE: number, FD_DELETE_SCHEDULE: number, FD_QUERY_ROOM_STATUS: number, FD_DEVICE_EVENT: number, FD_FRP_OPEN: number, FD_FRP_OPEN_RESULT: number, FD_FRP_CLOSE: number, FD_CAMERA_PICTURE: number, FD_CAMERA_SETTING: number, FD_EVENT_NOTIFY: number, FD_SMS_NOTIFY: number, FD_EMAIL_NOTIFY: number, FD_PROPERTIES_RESPONSE: number, FD_PROPERTIES_SET: number, FD_PROPERTIES_SET_RESULT: number, FD_HOST_UPGRADE_RESULT: number, FD_HOST_UPGRADE: number}, Type: {SYSTEM_SCENE: number, CUSTOM_SCENE: number, OLD_SCENE: number, SCHEDULE: number}, CMD: {OFF: number, ON: number, SET_BRIGHTNESS: number, LEVEL_UP: number, LEVEL_DOWN: number, SET_COLOR_TEMPERATURE: number, SET_COLOR: number, STOP: number, SET_SCALE: number, SET_DEGREE: number, DEGREE_UP: number, DEGREE_DOWN: number, SHAKE: number, MODE_RESULT: number, MODE_HEAT: number, MODE_COOL: number, MODE_WIND: number, MODE_DEHUMIDIFY: number, WIND_SPEED_RESULT: number, WIND_SPEED_HIGH: number, WIND_SPEED_MEDIUM: number, WIND_SPEED_LOW: number, WIND_SPEED_AUTO: number, DIRECTION_RESULT: number, DIRECTION_VERTICAL: number, DIRECTION_HORIZONTAL: number, DIRECTION_SWINGS: number, SET_TEMPERATURE: number, ROOM_TEMPERATURE_RESULT: number, MODE_ALL: number, MODE_ROOM: number, MODE_FLOOR: number, WIND_SPEED_UP: number, WIND_SPEED_DOWN: number, SET_INPUT_SOURCE: number, VOLUME_UP: number, VOLUME_DOWN: number, MUTE: number, UP: number, DOWN: number, LEFT: number, RIGHT: number, OK: number, MAIN: number, MENU: number, BACK: number, SKIP_REV: number, SKIP_FWD: number, ENABLE: number, TEMPERATURE_RESULT: number, HUMIDITY_RESULT: number, SUNSHINE_RESULT: number, NOISE_RESULT: number, PM_RESULT: number, MOTION_ALERT: number, DOOR_ALERT: number, GAS_ALERT: number, SMOKE_ALERT: number, WATER_ALERT: number, PRESSURE_ALERT: number, SHAKE_ALERT: number, ON_LINE_STATE_RESULT: number, BATTERY_VOLTAGE_RESULT: number, POWER: number, POWER_WH: number, EVENT: number}, AuthState: {FAILURE: number, SUCCESS: number}}, initValue: App.initValue, createFFCommand: (function(*=, *=, *=, *=): (T[] | string)), createFDCommand: (function(*=, *=): (T[] | string)), createFDResponseData: (function(*=, *=, *=, *=): {terminalId: *, result: *, data, errorMessage: string}), createHeadBuffer: (function(*=, *=): *), splitMessage: App.splitMessage}} */ const App = { Command: { HEAD: 0xEC, END: 0xEA, Version: { //新协议一 FF: 0xFF, //FF控制协议扩展 FB: 0xFB }, Action: { //心跳 FF_HEARTBEAT: 0x31, //心跳反馈 FF_HEARTBEAT_RESULT: 0x32, //查询 FF_QUERY: 0x9A, //控制设备 FF_CONTROL_DEVICE_E: 0x03, FF_CONTROL_DEVICE_H: 0x04, //激活场景 FF_ACTIVE_SCENE: 0x89, //定时开启 / 关闭 FF_CONTROL_SCHEDULE: 0x8A, //查询反馈 FF_RESPONSE: 0x01, //控制反馈 FF_NOTIFY: 0x02 }, Type: { //系统场景 SYSTEM_SCENE: 0x60, //自定义场景 CUSTOM_SCENE: 0X62, //原协议错误指令 OLD_SCENE: 0x89, //定时 SCHEDULE: 0x70 }, CMD: { //关 OFF: 0x00, //开 ON: 0x01, //亮度 SET_BRIGHTNESS: 0x1A, //调亮 LEVEL_UP: 0x50, //调暗 LEVEL_DOWN: 0x51, //色温 SET_COLOR_TEMPERATURE: 0x1D, //颜色 SET_COLOR: 0x1B, //停止 STOP: 0x32, //位置 SET_SCALE: 0x2A, //角度 SET_DEGREE: 0x2B, //角度+ DEGREE_UP: 0x50, //角度- DEGREE_DOWN: 0x51, //摇头 SHAKE: 0x46, //模式反馈 MODE_RESULT: 0x6D, //空调模式->制热 MODE_HEAT: 0x39, //空调模式->制冷 MODE_COOL: 0x40, //空调模式->送风 MODE_WIND: 0x41, //空调模式->除湿 MODE_DEHUMIDIFY: 0x42, //风速反馈 WIND_SPEED_RESULT: 0x6C, //风速->高 WIND_SPEED_HIGH: 0x35, //风速->中 WIND_SPEED_MEDIUM: 0x36, //风速->低 WIND_SPEED_LOW: 0x37, //风速->自动 WIND_SPEED_AUTO: 0x38, //风向反馈 DIRECTION_RESULT: 0x6E, //风向->水平 DIRECTION_VERTICAL: 0x43, //风向->垂直 DIRECTION_HORIZONTAL: 0x44, //风向->摆动 DIRECTION_SWINGS: 0x45, //设置温度 SET_TEMPERATURE: 0x6A, //当前温度反馈 ROOM_TEMPERATURE_RESULT: 0x6B, //地暖模式->双温 MODE_ALL: 0x39, //地暖模式->室温 MODE_ROOM: 0x40, //地暖模式->地温 MODE_FLOOR: 0x41, //风扇->风挡+ WIND_SPEED_UP: 0x50, //风扇->风档- WIND_SPEED_DOWN: 0x51, //选择输入源 SET_INPUT_SOURCE: 0xAB, //选择输入源 SET_OUTPUT_SOURCE: 0xAC, //音量+ VOLUME_UP: 0x02, //音量- VOLUME_DOWN: 0x03, //静音 MUTE: 0x04, //上 UP: 0x06, //下 DOWN: 0x08, //左 LEFT: 0x05, //又 RIGHT: 0x07, //OK OK: 0x09, //主页 MAIN: 0x11, //菜单 MENU: 0x22, //返回 BACK: 0x10, //上一首 SKIP_REV: 0x17, //下一首 SKIP_FWD: 0x18, //禁用 ENABLE: 0x7A, //传感器温度 TEMPERATURE_RESULT: 0x8D, //传感器湿度 HUMIDITY_RESULT: 0x8A, //传感器照度 SUNSHINE_RESULT: 0x7C, //传感器噪声 NOISE_RESULT: 0x7E, //传感器PM2.5 PM_RESULT: 0x7F, //人体移动 MOTION_ALERT: 0x7B, //门磁感应器 DOOR_ALERT: 0x7D, //燃气 GAS_ALERT: 0x8B, //烟雾监测 SMOKE_ALERT: 0x8C, //浸水监测 WATER_ALERT: 0x8E, //压力监测 PRESSURE_ALERT: 0x8F, //震动监测 SHAKE_ALERT: 0x95, //设备在线状态 ON_LINE_STATE_RESULT: 0x90, //电量 BATTERY_VOLTAGE_RESULT: 0x91, //当前负载 POWER: 0x92, //总负载 POWER_WH: 0x93, //事件 EVENT: 0x94 } }, createFFCommand: function (action, operation, deviceId, deviceType) { let headBuffer = App.createHeadBuffer(App.Command.Version.FF, action); let hostIdBuffer = Buffer.from([0, 0]); let operationBuffer = Buffer.alloc(4); if (operation) { operationBuffer = Buffer.from(operation); } if (!deviceType) { deviceType = 0; } if (!deviceId) { deviceId = 0; } let deviceIdBuffer = DataUtil.Int2Buffer(deviceId, 2); let deviceTypeBuffer = DataUtil.Int2Buffer(deviceType, 1); let contentBuffer = Buffer.concat([hostIdBuffer, operationBuffer, deviceIdBuffer, deviceTypeBuffer]); let endBuffer = DataUtil.Int2Buffer(App.Command.END, 1); return Buffer.concat([headBuffer, contentBuffer, endBuffer]); }, createHeadBuffer: function (version, action) { let headBuffer = Buffer.alloc(9); headBuffer.writeUInt8(App.Command.HEAD, 0); headBuffer.writeUInt8(version, 1); let mac = App.Command.MAC; if (!mac) { mac = NetworkUtil.getLocalMac(); if (!mac) { mac = "00:00:00:00:00:00"; } } let macArr = mac.split(":"); headBuffer.writeUInt8(DataUtil.Hex2Int(macArr[0]), 2); headBuffer.writeUInt8(DataUtil.Hex2Int(macArr[1]), 3); headBuffer.writeUInt8(DataUtil.Hex2Int(macArr[2]), 4); headBuffer.writeUInt8(DataUtil.Hex2Int(macArr[3]), 5); headBuffer.writeUInt8(DataUtil.Hex2Int(macArr[4]), 6); headBuffer.writeUInt8(DataUtil.Hex2Int(macArr[5]), 7); headBuffer.writeUInt8(action, 8); return headBuffer; }, splitMessage: function (dataBuffer) { let dataLen = dataBuffer.length; let msgLen = 0; // 缓存区数据不够解析出包头 if (dataLen < 9) { // node.log('缓存区数据长度小于包头规定长度,等待数据...'); return {message: false, dataBuffer: dataBuffer}; } // 判断帧头 let head = dataBuffer.readUInt8(0); if (head !== App.Command.HEAD) { dataBuffer = dataBuffer.slice(1); this.splitMessage(dataBuffer); } else { // 判断数据包长度 let version = dataBuffer.readUInt8(1); let action = dataBuffer.readUInt8(8); if (version === App.Command.Version.FF) { msgLen = 19; } else if (version === App.Command.Version.FB) { msgLen = 23; } else { return {message: false, dataBuffer: Buffer.alloc(0)}; } // 缓存区数据是否够解析出完整数据包 if (dataLen < msgLen) { // node.log('缓存区数据长度小于完整数据包规定长度,等待数据...'); return {message: false, dataBuffer: dataBuffer}; } else if (dataLen === msgLen) { if (dataBuffer.readUInt8(dataLen - 1) === App.Command.END) { let message = { version: version, action: action, data: dataBuffer }; return {message: message, dataBuffer: Buffer.alloc(0)}; } } else { // 判断帧尾 let command = dataBuffer.slice(0, msgLen); if (command.readUInt8(command.length - 1) !== App.Command.END) { dataBuffer = dataBuffer.slice(msgLen); this.splitMessage(dataBuffer); } else { let message = { version: version, action: action, data: command }; dataBuffer = dataBuffer.slice(msgLen); return {message: message, dataBuffer: dataBuffer}; } } } return {message: false, dataBuffer: Buffer.alloc(0)}; } }; module.exports = App;