@ray-js/robot-data-stream 0.0.17-beta.8 → 0.1.0-beta.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/README.md +23 -1
- package/lib/api/index.d.ts +1 -0
- package/lib/api/p2pApi.d.ts +30 -7
- package/lib/api/p2pApi.js +59 -23
- package/lib/api/sweeperP2p.d.ts +18 -1
- package/lib/api/sweeperP2p.js +177 -25
- package/lib/index.d.ts +15 -9
- package/lib/index.js +60 -3
- package/lib/mqtt/createCommonOptions.d.ts +2 -20
- package/lib/mqtt/createCommonOptions.js +17 -5
- package/lib/mqtt/cruise.d.ts +2 -0
- package/lib/mqtt/cruise.js +9 -0
- package/lib/mqtt/defineRobotCommand.d.ts +52 -0
- package/lib/mqtt/defineRobotCommand.js +71 -0
- package/lib/mqtt/hooks/useStructuredMessage.d.ts +5 -1
- package/lib/mqtt/hooks/useStructuredMessage.js +22 -10
- package/lib/mqtt/index.d.ts +8 -1
- package/lib/mqtt/index.js +12 -1
- package/lib/mqtt/promise.d.ts +21 -6
- package/lib/mqtt/promise.js +47 -12
- package/lib/mqtt/spotPolygons.d.ts +7 -0
- package/lib/mqtt/spotPolygons.js +18 -0
- package/lib/mqtt/type/protocols/carpetProtocol.d.ts +2 -0
- package/lib/mqtt/type/protocols/cruiseProtocol.d.ts +6 -3
- package/lib/mqtt/type/protocols/index.d.ts +3 -0
- package/lib/mqtt/type/protocols/index.js +4 -1
- package/lib/mqtt/type/protocols/spotPolygonsProtocol.d.ts +21 -0
- package/lib/mqtt/type/protocols/spotPolygonsProtocol.js +1 -0
- package/lib/mqtt/type/protocols/thresholdProtocol.d.ts +22 -0
- package/lib/mqtt/type/protocols/thresholdProtocol.js +1 -0
- package/lib/mqtt/type/requestType.d.ts +8 -0
- package/lib/mqtt/type/requestType.js +14 -0
- package/lib/mqtt/useCarpet.js +12 -4
- package/lib/mqtt/useCarpetClean.js +6 -2
- package/lib/mqtt/useCruise.js +4 -1
- package/lib/mqtt/useCustomCommand.d.ts +39 -0
- package/lib/mqtt/useCustomCommand.js +45 -0
- package/lib/mqtt/useDeviceModel.js +3 -1
- package/lib/mqtt/useFurnitureModel.js +3 -1
- package/lib/mqtt/useHistoryMap.js +9 -3
- package/lib/mqtt/usePartDivision.js +3 -1
- package/lib/mqtt/usePartMerge.js +3 -1
- package/lib/mqtt/usePassword.js +6 -2
- package/lib/mqtt/usePurifierSchedule.js +3 -1
- package/lib/mqtt/useQuiteHours.js +3 -1
- package/lib/mqtt/useResetMap.js +3 -1
- package/lib/mqtt/useRoomProperty.js +3 -1
- package/lib/mqtt/useSchedule.js +3 -1
- package/lib/mqtt/useSelectRoomClean.js +3 -1
- package/lib/mqtt/useSpotClean.js +3 -1
- package/lib/mqtt/useSpotPolygons.d.ts +9 -0
- package/lib/mqtt/useSpotPolygons.js +50 -0
- package/lib/mqtt/useThreshold.d.ts +10 -0
- package/lib/mqtt/useThreshold.js +90 -0
- package/lib/mqtt/useVirtualArea.js +3 -1
- package/lib/mqtt/useVirtualWall.js +3 -1
- package/lib/mqtt/useVoice.js +3 -1
- package/lib/mqtt/useWifiMap.js +3 -1
- package/lib/mqtt/useZoneClean.js +3 -1
- package/lib/utils/index.d.ts +7 -7
- package/package.json +5 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './base';
|
|
1
2
|
export * from './scheduleProtocol';
|
|
2
3
|
export * from './carpetProtocol';
|
|
3
4
|
export * from './zoneCleanProtocol';
|
|
@@ -20,4 +21,6 @@ export * from './devInfoProtocol';
|
|
|
20
21
|
export * from './roomPropertyProtocol';
|
|
21
22
|
export * from './purifierScheduleProtocol';
|
|
22
23
|
export * from './cruiseProtocol';
|
|
23
|
-
export * from './
|
|
24
|
+
export * from './spotPolygonsProtocol';
|
|
25
|
+
export * from './mcsRoomInfoProtocol';
|
|
26
|
+
export * from './thresholdProtocol';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BaseResponse } from './base';
|
|
2
|
+
export interface SetSpotPolygonsData {
|
|
3
|
+
/** 定点位置坐标,格式为 "x,y" */
|
|
4
|
+
polygons: string[];
|
|
5
|
+
/** 定点位置名称,与 polygons 一一对应 */
|
|
6
|
+
spotNames: string[];
|
|
7
|
+
version?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface RequestSpotPolygonsData {
|
|
10
|
+
version?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface SpotPolygonsResponse extends BaseResponse {
|
|
13
|
+
/** 定点位置数量 */
|
|
14
|
+
num: number;
|
|
15
|
+
/** 定点位置坐标,格式为 "x,y" */
|
|
16
|
+
polygons: string[];
|
|
17
|
+
/** 定点位置名称,与 polygons 一一对应 */
|
|
18
|
+
spotNames: string[];
|
|
19
|
+
}
|
|
20
|
+
export type TRequestSpotPolygons = (message?: RequestSpotPolygonsData) => Promise<SpotPolygonsResponse>;
|
|
21
|
+
export type TSetSpotPolygons = (message: SetSpotPolygonsData) => Promise<SpotPolygonsResponse>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { BaseResponse, Point } from './base';
|
|
2
|
+
export interface ThresholdItem {
|
|
3
|
+
/** 门槛的 4 个顶点,面板坐标系(未减地图原点) */
|
|
4
|
+
points: Point[];
|
|
5
|
+
/** 门槛类型:0 可通过门槛,1 不可通过门槛,2 坡道 */
|
|
6
|
+
type: number;
|
|
7
|
+
/** 门槛名称,协议预留字段,不传按空字符串下发 */
|
|
8
|
+
name?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SetThresholdData {
|
|
11
|
+
data: ThresholdItem[];
|
|
12
|
+
origin: Point;
|
|
13
|
+
}
|
|
14
|
+
export interface ThresholdResponse extends BaseResponse {
|
|
15
|
+
num: number;
|
|
16
|
+
polygons: string[];
|
|
17
|
+
types: number[];
|
|
18
|
+
names: string[];
|
|
19
|
+
mapId: number;
|
|
20
|
+
}
|
|
21
|
+
export type TRequestThreshold = () => Promise<ThresholdResponse>;
|
|
22
|
+
export type TSetThreshold = (data: SetThresholdData) => Promise<ThresholdResponse>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -46,6 +46,10 @@ export declare enum VirtualAreaEnum {
|
|
|
46
46
|
query = "restrictedAreaQry",
|
|
47
47
|
set = "restrictedAreaSet"
|
|
48
48
|
}
|
|
49
|
+
export declare enum ThresholdEnum {
|
|
50
|
+
query = "thresholdQry",
|
|
51
|
+
set = "thresholdSet"
|
|
52
|
+
}
|
|
49
53
|
export declare enum VoiceLanguageEnum {
|
|
50
54
|
query = "voiceLanguageQry",
|
|
51
55
|
set = "voiceLanguageSet"
|
|
@@ -100,6 +104,10 @@ export declare enum CruiseEnum {
|
|
|
100
104
|
query = "purifierCruiseQry",
|
|
101
105
|
set = "purifierCruiseSet"
|
|
102
106
|
}
|
|
107
|
+
export declare enum SpotPolygonsEnum {
|
|
108
|
+
query = "spotPolygonsQry",
|
|
109
|
+
set = "spotPolygonsSet"
|
|
110
|
+
}
|
|
103
111
|
export declare enum McsRoomInfoEnum {
|
|
104
112
|
query = "McsRoomInfoQry"
|
|
105
113
|
}
|
|
@@ -66,6 +66,13 @@ export let VirtualAreaEnum = /*#__PURE__*/function (VirtualAreaEnum) {
|
|
|
66
66
|
return VirtualAreaEnum;
|
|
67
67
|
}({});
|
|
68
68
|
|
|
69
|
+
// 门槛
|
|
70
|
+
export let ThresholdEnum = /*#__PURE__*/function (ThresholdEnum) {
|
|
71
|
+
ThresholdEnum["query"] = "thresholdQry";
|
|
72
|
+
ThresholdEnum["set"] = "thresholdSet";
|
|
73
|
+
return ThresholdEnum;
|
|
74
|
+
}({});
|
|
75
|
+
|
|
69
76
|
// 语音语言枚举
|
|
70
77
|
export let VoiceLanguageEnum = /*#__PURE__*/function (VoiceLanguageEnum) {
|
|
71
78
|
VoiceLanguageEnum["query"] = "voiceLanguageQry";
|
|
@@ -153,6 +160,13 @@ export let CruiseEnum = /*#__PURE__*/function (CruiseEnum) {
|
|
|
153
160
|
return CruiseEnum;
|
|
154
161
|
}({});
|
|
155
162
|
|
|
163
|
+
// 定点位置
|
|
164
|
+
export let SpotPolygonsEnum = /*#__PURE__*/function (SpotPolygonsEnum) {
|
|
165
|
+
SpotPolygonsEnum["query"] = "spotPolygonsQry";
|
|
166
|
+
SpotPolygonsEnum["set"] = "spotPolygonsSet";
|
|
167
|
+
return SpotPolygonsEnum;
|
|
168
|
+
}({});
|
|
169
|
+
|
|
156
170
|
// 设备当前所在房间(MCS 房间信息;RVC SDK Alexa 语音方案协议,通常仅在任务中查询)
|
|
157
171
|
export let McsRoomInfoEnum = /*#__PURE__*/function (McsRoomInfoEnum) {
|
|
158
172
|
McsRoomInfoEnum["query"] = "McsRoomInfoQry";
|
package/lib/mqtt/useCarpet.js
CHANGED
|
@@ -78,7 +78,9 @@ export const useCarpet = () => {
|
|
|
78
78
|
const sendData = pickBy(processedData, value => value !== undefined);
|
|
79
79
|
sendStructuredMessage(CarpetEnum.update, {
|
|
80
80
|
carpetInfo: sendData
|
|
81
|
-
}, resolve, error => reject(handleMqttError(error, 'Failed to update carpet')),
|
|
81
|
+
}, resolve, error => reject(handleMqttError(error, 'Failed to update carpet')), {
|
|
82
|
+
responseType: CarpetEnum.update
|
|
83
|
+
});
|
|
82
84
|
} catch (error) {
|
|
83
85
|
reject(handleMqttError(error, 'Failed to update carpet'));
|
|
84
86
|
}
|
|
@@ -91,7 +93,9 @@ export const useCarpet = () => {
|
|
|
91
93
|
carpetInfo: {
|
|
92
94
|
ids: data.ids
|
|
93
95
|
}
|
|
94
|
-
}, resolve, error => reject(handleMqttError(error, 'Failed to delete carpet')),
|
|
96
|
+
}, resolve, error => reject(handleMqttError(error, 'Failed to delete carpet')), {
|
|
97
|
+
responseType: CarpetEnum.delete
|
|
98
|
+
});
|
|
95
99
|
} catch (error) {
|
|
96
100
|
reject(handleMqttError(error, 'Failed to delete carpet'));
|
|
97
101
|
}
|
|
@@ -101,7 +105,9 @@ export const useCarpet = () => {
|
|
|
101
105
|
let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
102
106
|
return new Promise((resolve, reject) => {
|
|
103
107
|
try {
|
|
104
|
-
sendStructuredMessage(CarpetEnum.query, data, resolve, error => reject(handleMqttError(error, 'Failed to query carpet')),
|
|
108
|
+
sendStructuredMessage(CarpetEnum.query, data, resolve, error => reject(handleMqttError(error, 'Failed to query carpet')), {
|
|
109
|
+
responseType: CarpetEnum.query
|
|
110
|
+
});
|
|
105
111
|
} catch (error) {
|
|
106
112
|
reject(handleMqttError(error, 'Failed to query carpet'));
|
|
107
113
|
}
|
|
@@ -121,7 +127,9 @@ export const useCarpet = () => {
|
|
|
121
127
|
ids: carpetInfo.ids,
|
|
122
128
|
type: carpetInfo.type
|
|
123
129
|
};
|
|
124
|
-
sendStructuredMessage(CarpetEnum.set, sendData, resolve, error => reject(handleMqttError(error, 'Failed to set carpet')),
|
|
130
|
+
sendStructuredMessage(CarpetEnum.set, sendData, resolve, error => reject(handleMqttError(error, 'Failed to set carpet')), {
|
|
131
|
+
responseType: CarpetEnum.query
|
|
132
|
+
});
|
|
125
133
|
} catch (error) {
|
|
126
134
|
reject(handleMqttError(error, 'Failed to set carpet'));
|
|
127
135
|
}
|
|
@@ -27,7 +27,9 @@ export const useCarpetClean = () => {
|
|
|
27
27
|
requestCarpetClean: () => {
|
|
28
28
|
return new Promise((resolve, reject) => {
|
|
29
29
|
try {
|
|
30
|
-
sendStructuredMessage(CarpetCleanEnum.query, {}, resolve, error => reject(handleMqttError(error, 'Failed to request carpet clean')),
|
|
30
|
+
sendStructuredMessage(CarpetCleanEnum.query, {}, resolve, error => reject(handleMqttError(error, 'Failed to request carpet clean')), {
|
|
31
|
+
responseType: CarpetCleanEnum.query
|
|
32
|
+
});
|
|
31
33
|
} catch (error) {
|
|
32
34
|
reject(handleMqttError(error, 'Failed to request carpet clean'));
|
|
33
35
|
}
|
|
@@ -38,7 +40,9 @@ export const useCarpetClean = () => {
|
|
|
38
40
|
try {
|
|
39
41
|
sendStructuredMessage(CarpetCleanEnum.set, {
|
|
40
42
|
ids: data
|
|
41
|
-
}, resolve, error => reject(handleMqttError(error, 'Failed to set carpet clean')),
|
|
43
|
+
}, resolve, error => reject(handleMqttError(error, 'Failed to set carpet clean')), {
|
|
44
|
+
responseType: CarpetCleanEnum.set
|
|
45
|
+
});
|
|
42
46
|
} catch (error) {
|
|
43
47
|
reject(handleMqttError(error, 'Failed to set carpet clean'));
|
|
44
48
|
}
|
package/lib/mqtt/useCruise.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { useContext } from 'react';
|
|
3
3
|
import { handleMqttError, useStructuredMessage } from './hooks/useStructuredMessage';
|
|
4
4
|
import { SingletonContext } from './mqttProvider';
|
|
5
|
+
import { createCruisePayload } from './cruise';
|
|
5
6
|
import { CruiseEnum } from './type';
|
|
6
7
|
/**
|
|
7
8
|
* 自定义 Hook,用于移动设备巡航状态查询与控制(如移动空气净化器、移动垃圾桶)
|
|
@@ -55,7 +56,9 @@ export const useCruise = () => {
|
|
|
55
56
|
reject(new Error('cruiseType is required when cmd is "start"'));
|
|
56
57
|
return;
|
|
57
58
|
}
|
|
58
|
-
sendStructuredMessage(CruiseEnum.set, message, resolve, error => reject(handleMqttError(error, 'Failed to set cruise')),
|
|
59
|
+
sendStructuredMessage(CruiseEnum.set, createCruisePayload(message), resolve, error => reject(handleMqttError(error, 'Failed to set cruise')), {
|
|
60
|
+
responseType: CruiseEnum.query
|
|
61
|
+
} // 响应类型是 query,不是 set
|
|
59
62
|
);
|
|
60
63
|
} catch (error) {
|
|
61
64
|
reject(handleMqttError(error, 'Failed to set cruise'));
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { BaseResponse } from './type/protocols/base';
|
|
2
|
+
/**
|
|
3
|
+
* 自定义指令选项
|
|
4
|
+
*/
|
|
5
|
+
export interface CustomCommandOptions {
|
|
6
|
+
/**
|
|
7
|
+
* 响应匹配的事件名(reqType)。
|
|
8
|
+
* 缺省与下发 reqType 同名;set 类指令的回复走 qry 事件名、
|
|
9
|
+
* 或回复 reqType 与下发不同名(如 aiObjectIgnoreSet → aiObjectIgnoreRst)时必填。
|
|
10
|
+
*/
|
|
11
|
+
responseType?: string;
|
|
12
|
+
/** 超时时间(毫秒),默认 10000 */
|
|
13
|
+
timeout?: number;
|
|
14
|
+
/** 协议版本号,默认 '1.0.0' */
|
|
15
|
+
version?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 自定义指令发送函数类型
|
|
19
|
+
*/
|
|
20
|
+
export type TSendCustomCommand = <TRes extends BaseResponse = BaseResponse>(reqType: string, data?: Record<string, any>, options?: CustomCommandOptions) => Promise<TRes>;
|
|
21
|
+
/**
|
|
22
|
+
* 自定义指令 Hook:在 MqttProvider 内任意组件使用,获得 sendCustomCommand。
|
|
23
|
+
*
|
|
24
|
+
* 与内置 hook 同一契约:返回 Promise 命令函数,loading / 重试 / toast 由业务侧自理。
|
|
25
|
+
* 走 MQTT + LAN JSON socket 双通道(复用 preferredChannel 策略);
|
|
26
|
+
* DP command_trans 二进制路线不支持(useMqtt=false 时直接 reject)。
|
|
27
|
+
* 响应按 reqType + taskId 双匹配,同 reqType 并发下发不会互相串包。
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const { sendCustomCommand } = useCustomCommand();
|
|
32
|
+
*
|
|
33
|
+
* // 下发查询并等待回复
|
|
34
|
+
* const res = await sendCustomCommand<PeakValleyResponse>('peakValleyChargeQry');
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare const useCustomCommand: () => {
|
|
38
|
+
sendCustomCommand: TSendCustomCommand;
|
|
39
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// 自定义指令:不经过内置 hook 的任意 reqType 下发出口
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import { handleMqttError, useStructuredMessage } from './hooks/useStructuredMessage';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 自定义指令选项
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 自定义指令发送函数类型
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 自定义指令 Hook:在 MqttProvider 内任意组件使用,获得 sendCustomCommand。
|
|
15
|
+
*
|
|
16
|
+
* 与内置 hook 同一契约:返回 Promise 命令函数,loading / 重试 / toast 由业务侧自理。
|
|
17
|
+
* 走 MQTT + LAN JSON socket 双通道(复用 preferredChannel 策略);
|
|
18
|
+
* DP command_trans 二进制路线不支持(useMqtt=false 时直接 reject)。
|
|
19
|
+
* 响应按 reqType + taskId 双匹配,同 reqType 并发下发不会互相串包。
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const { sendCustomCommand } = useCustomCommand();
|
|
24
|
+
*
|
|
25
|
+
* // 下发查询并等待回复
|
|
26
|
+
* const res = await sendCustomCommand<PeakValleyResponse>('peakValleyChargeQry');
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export const useCustomCommand = () => {
|
|
30
|
+
const {
|
|
31
|
+
sendStructuredMessage
|
|
32
|
+
} = useStructuredMessage();
|
|
33
|
+
const sendCustomCommand = useCallback(function (reqType) {
|
|
34
|
+
let data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
35
|
+
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
sendStructuredMessage(reqType, data,
|
|
38
|
+
// Promise 的 resolve 入参是 TRes 的超集(含 PromiseLike),收窄传给发送层
|
|
39
|
+
resolve, error => reject(handleMqttError(error, `Failed to send custom command ${reqType}`)), options);
|
|
40
|
+
});
|
|
41
|
+
}, [sendStructuredMessage]);
|
|
42
|
+
return {
|
|
43
|
+
sendCustomCommand
|
|
44
|
+
};
|
|
45
|
+
};
|
|
@@ -36,7 +36,9 @@ export const useDeviceModel = () => {
|
|
|
36
36
|
try {
|
|
37
37
|
sendStructuredMessage(DeviceModelEnum.set, {
|
|
38
38
|
modelInfos: data
|
|
39
|
-
}, resolve, error => reject(handleMqttError(error, 'Failed to set device model')),
|
|
39
|
+
}, resolve, error => reject(handleMqttError(error, 'Failed to set device model')), {
|
|
40
|
+
responseType: DeviceModelEnum.query
|
|
41
|
+
});
|
|
40
42
|
} catch (error) {
|
|
41
43
|
reject(handleMqttError(error, 'Failed to set device model'));
|
|
42
44
|
}
|
|
@@ -36,7 +36,9 @@ export const useFurnitureModel = () => {
|
|
|
36
36
|
try {
|
|
37
37
|
sendStructuredMessage(FurnitureModelEnum.set, {
|
|
38
38
|
modelInfos: data
|
|
39
|
-
}, resolve, error => reject(handleMqttError(error, 'Failed to set furniture model')),
|
|
39
|
+
}, resolve, error => reject(handleMqttError(error, 'Failed to set furniture model')), {
|
|
40
|
+
responseType: FurnitureModelEnum.query
|
|
41
|
+
});
|
|
40
42
|
} catch (error) {
|
|
41
43
|
reject(handleMqttError(error, 'Failed to set furniture model'));
|
|
42
44
|
}
|
|
@@ -48,7 +48,9 @@ export const useHistoryMap = () => {
|
|
|
48
48
|
if (useMqtt) {
|
|
49
49
|
sendStructuredMessage(DeleteMapEnum.set, {
|
|
50
50
|
mapId
|
|
51
|
-
}, resolve, error => reject(handleMqttError(error, 'Failed to delete history map')),
|
|
51
|
+
}, resolve, error => reject(handleMqttError(error, 'Failed to delete history map')), {
|
|
52
|
+
responseType: DeleteMapEnum.rst
|
|
53
|
+
} // 响应类型是 rst,不是 set
|
|
52
54
|
);
|
|
53
55
|
return;
|
|
54
56
|
}
|
|
@@ -81,7 +83,9 @@ export const useHistoryMap = () => {
|
|
|
81
83
|
urlLen: url.length
|
|
82
84
|
};
|
|
83
85
|
if (useMqtt) {
|
|
84
|
-
sendStructuredMessage(UseMapEnum.set, mapData, resolve, error => reject(handleMqttError(error, 'Failed to change current map')),
|
|
86
|
+
sendStructuredMessage(UseMapEnum.set, mapData, resolve, error => reject(handleMqttError(error, 'Failed to change current map')), {
|
|
87
|
+
responseType: UseMapEnum.query
|
|
88
|
+
} // 响应类型是 query,不是 set
|
|
85
89
|
);
|
|
86
90
|
return;
|
|
87
91
|
}
|
|
@@ -113,7 +117,9 @@ export const useHistoryMap = () => {
|
|
|
113
117
|
return new Promise((resolve, reject) => {
|
|
114
118
|
try {
|
|
115
119
|
if (useMqtt) {
|
|
116
|
-
sendStructuredMessage(SaveCurrentMapEnum.set, data, resolve, error => reject(handleMqttError(error, 'Failed to save current map')),
|
|
120
|
+
sendStructuredMessage(SaveCurrentMapEnum.set, data, resolve, error => reject(handleMqttError(error, 'Failed to save current map')), {
|
|
121
|
+
responseType: SaveCurrentMapEnum.query
|
|
122
|
+
} // 响应类型是 query,不是 set
|
|
117
123
|
);
|
|
118
124
|
return;
|
|
119
125
|
}
|
|
@@ -36,7 +36,9 @@ export const usePartDivision = () => {
|
|
|
36
36
|
sendStructuredMessage(PartDivisionEnum.set, {
|
|
37
37
|
lines: [pointStr],
|
|
38
38
|
ids: [roomId]
|
|
39
|
-
}, resolve, error => reject(handleMqttError(error, 'Failed to set part division')),
|
|
39
|
+
}, resolve, error => reject(handleMqttError(error, 'Failed to set part division')), {
|
|
40
|
+
responseType: PartDivisionEnum.query
|
|
41
|
+
});
|
|
40
42
|
return;
|
|
41
43
|
}
|
|
42
44
|
const roomIdNumber = typeof roomId === 'string' ? Number(roomId) : roomId;
|
package/lib/mqtt/usePartMerge.js
CHANGED
|
@@ -31,7 +31,9 @@ export const usePartMerge = () => {
|
|
|
31
31
|
if (useMqtt) {
|
|
32
32
|
sendStructuredMessage(PartMergeEnum.set, {
|
|
33
33
|
ids
|
|
34
|
-
}, resolve, error => reject(handleMqttError(error, 'Failed to set part merge')),
|
|
34
|
+
}, resolve, error => reject(handleMqttError(error, 'Failed to set part merge')), {
|
|
35
|
+
responseType: PartMergeEnum.query
|
|
36
|
+
} // 响应类型是 query,不是 set
|
|
35
37
|
);
|
|
36
38
|
return;
|
|
37
39
|
}
|
package/lib/mqtt/usePassword.js
CHANGED
|
@@ -64,7 +64,9 @@ export const usePassword = () => {
|
|
|
64
64
|
oldPassword: params.oldPassword ? md5(params.oldPassword).toString() : undefined,
|
|
65
65
|
taskId: (_params$taskId = params.taskId) !== null && _params$taskId !== void 0 ? _params$taskId : String(Date.now())
|
|
66
66
|
};
|
|
67
|
-
sendStructuredMessage(PasswordEnum.set, passwordData, resolve, error => reject(handleMqttError(error, 'Failed to set password')),
|
|
67
|
+
sendStructuredMessage(PasswordEnum.set, passwordData, resolve, error => reject(handleMqttError(error, 'Failed to set password')), {
|
|
68
|
+
responseType: PasswordEnum.rst
|
|
69
|
+
} // 响应类型是 rst,不是 set
|
|
68
70
|
);
|
|
69
71
|
} catch (error) {
|
|
70
72
|
reject(handleMqttError(error, 'Failed to set password'));
|
|
@@ -86,7 +88,9 @@ export const usePassword = () => {
|
|
|
86
88
|
password: md5(params.password).toString(),
|
|
87
89
|
taskId: (_params$taskId2 = params.taskId) !== null && _params$taskId2 !== void 0 ? _params$taskId2 : String(Date.now())
|
|
88
90
|
};
|
|
89
|
-
sendStructuredMessage(PasswordEnum.check, passwordData, resolve, error => reject(handleMqttError(error, 'Failed to check password')),
|
|
91
|
+
sendStructuredMessage(PasswordEnum.check, passwordData, resolve, error => reject(handleMqttError(error, 'Failed to check password')), {
|
|
92
|
+
responseType: PasswordEnum.checkRst
|
|
93
|
+
} // 响应类型是 checkRst,不是 check
|
|
90
94
|
);
|
|
91
95
|
} catch (error) {
|
|
92
96
|
reject(handleMqttError(error, 'Failed to check password'));
|
|
@@ -55,7 +55,9 @@ export const usePurifierSchedule = () => {
|
|
|
55
55
|
}
|
|
56
56
|
sendStructuredMessage(PurifierScheduleEnum.set, _objectSpread(_objectSpread({}, message), {}, {
|
|
57
57
|
num: (_message$num = message.num) !== null && _message$num !== void 0 ? _message$num : message.list.length
|
|
58
|
-
}), resolve, error => reject(handleMqttError(error, 'Failed to set purifier schedule')),
|
|
58
|
+
}), resolve, error => reject(handleMqttError(error, 'Failed to set purifier schedule')), {
|
|
59
|
+
responseType: PurifierScheduleEnum.query
|
|
60
|
+
} // 响应类型是 query,不是 set
|
|
59
61
|
);
|
|
60
62
|
} catch (error) {
|
|
61
63
|
reject(handleMqttError(error, 'Failed to set purifier schedule'));
|
|
@@ -52,7 +52,9 @@ export const useQuiteHours = () => {
|
|
|
52
52
|
time: [`${h0},${m0}`, `${h1},${m1}`],
|
|
53
53
|
active,
|
|
54
54
|
day
|
|
55
|
-
}, resolve, error => reject(handleMqttError(error, 'Failed to set quiet hours')),
|
|
55
|
+
}, resolve, error => reject(handleMqttError(error, 'Failed to set quiet hours')), {
|
|
56
|
+
responseType: QuietHoursEnum.query
|
|
57
|
+
} // 响应类型是 query,不是 set
|
|
56
58
|
);
|
|
57
59
|
return;
|
|
58
60
|
}
|
package/lib/mqtt/useResetMap.js
CHANGED
|
@@ -28,7 +28,9 @@ export const useResetMap = () => {
|
|
|
28
28
|
return new Promise((resolve, reject) => {
|
|
29
29
|
try {
|
|
30
30
|
if (useMqtt) {
|
|
31
|
-
sendStructuredMessage(ResetCurrMapEnum.set, {}, resolve, error => reject(handleMqttError(error, 'Failed to reset map')),
|
|
31
|
+
sendStructuredMessage(ResetCurrMapEnum.set, {}, resolve, error => reject(handleMqttError(error, 'Failed to reset map')), {
|
|
32
|
+
responseType: ResetCurrMapEnum.query
|
|
33
|
+
} // 响应类型是 query,不是 set
|
|
32
34
|
);
|
|
33
35
|
return;
|
|
34
36
|
}
|
|
@@ -73,7 +73,9 @@ export const useRoomProperty = () => {
|
|
|
73
73
|
}), data.polygons && {
|
|
74
74
|
polygons: data.polygons
|
|
75
75
|
}), pickWaterFields(len, data.cisterns, data.waterValues));
|
|
76
|
-
sendStructuredMessage(RoomPropertyEnum.set, sendData, resolve, error => reject(handleMqttError(error, 'Failed to set room property')),
|
|
76
|
+
sendStructuredMessage(RoomPropertyEnum.set, sendData, resolve, error => reject(handleMqttError(error, 'Failed to set room property')), {
|
|
77
|
+
responseType: RoomPropertyEnum.query
|
|
78
|
+
} // 响应类型是 query,不是 set
|
|
77
79
|
);
|
|
78
80
|
} catch (error) {
|
|
79
81
|
reject(handleMqttError(error, 'Failed to set room property'));
|
package/lib/mqtt/useSchedule.js
CHANGED
|
@@ -65,7 +65,9 @@ export const useSchedule = () => {
|
|
|
65
65
|
if (useMqtt) {
|
|
66
66
|
sendStructuredMessage(ScheduleEnum.set, _objectSpread(_objectSpread({}, message), {}, {
|
|
67
67
|
list
|
|
68
|
-
}), resolve, error => reject(handleMqttError(error, 'Failed to set schedule')),
|
|
68
|
+
}), resolve, error => reject(handleMqttError(error, 'Failed to set schedule')), {
|
|
69
|
+
responseType: ScheduleEnum.query
|
|
70
|
+
} // 响应类型是 query,不是 set
|
|
69
71
|
);
|
|
70
72
|
return;
|
|
71
73
|
}
|
|
@@ -107,7 +107,9 @@ export const useSelectRoomClean = () => {
|
|
|
107
107
|
routePreferences: prefs.map(p => p !== null && p !== void 0 ? p : 'standard')
|
|
108
108
|
}), {}, {
|
|
109
109
|
num: rooms.length
|
|
110
|
-
}), resolve, error => reject(handleMqttError(error, 'Failed to set room clean')),
|
|
110
|
+
}), resolve, error => reject(handleMqttError(error, 'Failed to set room clean')), {
|
|
111
|
+
responseType: RoomCleanSetEnum.query
|
|
112
|
+
} // 响应类型是 query,不是 set
|
|
111
113
|
);
|
|
112
114
|
return;
|
|
113
115
|
}
|
package/lib/mqtt/useSpotClean.js
CHANGED
|
@@ -80,7 +80,9 @@ export const useSpotClean = () => {
|
|
|
80
80
|
names
|
|
81
81
|
}), spotNames && {
|
|
82
82
|
spotNames
|
|
83
|
-
}), resolve, error => reject(handleMqttError(error, 'Failed to set spot clean')),
|
|
83
|
+
}), resolve, error => reject(handleMqttError(error, 'Failed to set spot clean')), {
|
|
84
|
+
responseType: SpotCleanEnum.query
|
|
85
|
+
} // 响应类型是 query,不是 set
|
|
84
86
|
);
|
|
85
87
|
return;
|
|
86
88
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type TRequestSpotPolygons, type TSetSpotPolygons } from './type/protocols/spotPolygonsProtocol';
|
|
2
|
+
/**
|
|
3
|
+
* 自定义 Hook,用于定点位置查询与设置
|
|
4
|
+
* @returns 包含 requestSpotPolygons 和 setSpotPolygons 函数的对象
|
|
5
|
+
*/
|
|
6
|
+
export declare const useSpotPolygons: () => {
|
|
7
|
+
requestSpotPolygons: TRequestSpotPolygons;
|
|
8
|
+
setSpotPolygons: TSetSpotPolygons;
|
|
9
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { handleMqttError, useStructuredMessage } from './hooks/useStructuredMessage';
|
|
3
|
+
import { SingletonContext } from './mqttProvider';
|
|
4
|
+
import { createSpotPolygonsPayload } from './spotPolygons';
|
|
5
|
+
import { SpotPolygonsEnum } from './type';
|
|
6
|
+
/**
|
|
7
|
+
* 自定义 Hook,用于定点位置查询与设置
|
|
8
|
+
* @returns 包含 requestSpotPolygons 和 setSpotPolygons 函数的对象
|
|
9
|
+
*/
|
|
10
|
+
export const useSpotPolygons = () => {
|
|
11
|
+
const {
|
|
12
|
+
useMqtt
|
|
13
|
+
} = useContext(SingletonContext);
|
|
14
|
+
const {
|
|
15
|
+
sendStructuredMessage
|
|
16
|
+
} = useStructuredMessage();
|
|
17
|
+
return {
|
|
18
|
+
requestSpotPolygons: function () {
|
|
19
|
+
let message = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
|
20
|
+
version: '1.0.0'
|
|
21
|
+
};
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
try {
|
|
24
|
+
if (!useMqtt) {
|
|
25
|
+
reject(new Error('useMqtt is not used'));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
sendStructuredMessage(SpotPolygonsEnum.query, message, resolve, error => reject(handleMqttError(error, 'Failed to request spot polygons')));
|
|
29
|
+
} catch (error) {
|
|
30
|
+
reject(handleMqttError(error, 'Failed to request spot polygons'));
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
setSpotPolygons: message => {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
try {
|
|
37
|
+
if (!useMqtt) {
|
|
38
|
+
reject(new Error('useMqtt is not used'));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
sendStructuredMessage(SpotPolygonsEnum.set, createSpotPolygonsPayload(message), resolve, error => reject(handleMqttError(error, 'Failed to set spot polygons')), {
|
|
42
|
+
responseType: SpotPolygonsEnum.query
|
|
43
|
+
});
|
|
44
|
+
} catch (error) {
|
|
45
|
+
reject(handleMqttError(error, 'Failed to set spot polygons'));
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type TRequestThreshold, type TSetThreshold } from './type/protocols';
|
|
2
|
+
/**
|
|
3
|
+
* 自定义 Hook,用于门槛管理(可通过门槛 / 不可通过门槛 / 坡道)
|
|
4
|
+
* 门槛协议仅支持 MQTT / LAN 结构化消息通道,未启用 useMqtt 时直接 reject
|
|
5
|
+
* @returns 包含 requestThreshold 和 setThreshold 函数的对象
|
|
6
|
+
*/
|
|
7
|
+
export declare const useThreshold: () => {
|
|
8
|
+
requestThreshold: TRequestThreshold;
|
|
9
|
+
setThreshold: TSetThreshold;
|
|
10
|
+
};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import "core-js/modules/esnext.iterator.constructor.js";
|
|
2
|
+
import "core-js/modules/esnext.iterator.for-each.js";
|
|
3
|
+
// 门槛(可通过门槛 / 不可通过门槛 / 坡道)
|
|
4
|
+
import { useContext } from 'react';
|
|
5
|
+
import { pointsToString } from '../utils';
|
|
6
|
+
import { handleMqttError, useStructuredMessage } from './hooks/useStructuredMessage';
|
|
7
|
+
import { SingletonContext } from './mqttProvider';
|
|
8
|
+
import { ThresholdEnum } from './type';
|
|
9
|
+
// 门槛
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 自定义 Hook,用于门槛管理(可通过门槛 / 不可通过门槛 / 坡道)
|
|
13
|
+
* 门槛协议仅支持 MQTT / LAN 结构化消息通道,未启用 useMqtt 时直接 reject
|
|
14
|
+
* @returns 包含 requestThreshold 和 setThreshold 函数的对象
|
|
15
|
+
*/
|
|
16
|
+
export const useThreshold = () => {
|
|
17
|
+
const {
|
|
18
|
+
useMqtt
|
|
19
|
+
} = useContext(SingletonContext);
|
|
20
|
+
const {
|
|
21
|
+
sendStructuredMessage
|
|
22
|
+
} = useStructuredMessage();
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 请求门槛数据
|
|
26
|
+
* @returns Promise<ThresholdResponse> 响应结果
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 设置门槛数据(全量覆盖,传空数组表示清空全部门槛)
|
|
31
|
+
* @param message 包含门槛设置参数的对象
|
|
32
|
+
* @param message.data 门槛的数据数组,每项含 4 个顶点、类型与可选名称
|
|
33
|
+
* @param message.origin 原点坐标
|
|
34
|
+
* @returns Promise<ThresholdResponse> 响应结果
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
requestThreshold: () => {
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
try {
|
|
41
|
+
if (!useMqtt) {
|
|
42
|
+
reject(new Error('useMqtt is not used'));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
sendStructuredMessage(ThresholdEnum.query, {}, resolve, error => reject(handleMqttError(error, 'Failed to request threshold')));
|
|
46
|
+
} catch (error) {
|
|
47
|
+
reject(handleMqttError(error, 'Failed to request threshold'));
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
setThreshold: message => {
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
try {
|
|
54
|
+
if (!useMqtt) {
|
|
55
|
+
reject(new Error('useMqtt is not used'));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const {
|
|
59
|
+
data,
|
|
60
|
+
origin
|
|
61
|
+
} = message;
|
|
62
|
+
const polygons = [];
|
|
63
|
+
const types = [];
|
|
64
|
+
const names = [];
|
|
65
|
+
data.forEach(_ref => {
|
|
66
|
+
let {
|
|
67
|
+
points,
|
|
68
|
+
type,
|
|
69
|
+
name
|
|
70
|
+
} = _ref;
|
|
71
|
+
polygons.push(pointsToString(points, origin));
|
|
72
|
+
types.push(type);
|
|
73
|
+
names.push(name !== null && name !== void 0 ? name : '');
|
|
74
|
+
});
|
|
75
|
+
sendStructuredMessage(ThresholdEnum.set, {
|
|
76
|
+
num: data.length,
|
|
77
|
+
polygons,
|
|
78
|
+
types,
|
|
79
|
+
names
|
|
80
|
+
}, resolve, error => reject(handleMqttError(error, 'Failed to set threshold')), {
|
|
81
|
+
responseType: ThresholdEnum.query
|
|
82
|
+
} // 响应类型是 query,不是 set
|
|
83
|
+
);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
reject(handleMqttError(error, 'Failed to set threshold'));
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
};
|