ecloudc-sdk-js
Version:
逸云智家C主机SDK
283 lines (280 loc) • 12.8 kB
JavaScript
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;