/*
******************以下全文的192.168.1.8请替换为你自己的门禁ip******************
// 网关信息-浏览器打开
http://192.168.1.8/smart/iot.info
// 设备列表-浏览器打开 (devNo是nm,devCh是ch)
http://192.168.1.8/smart/speDev.info
// 场景列表-浏览器打开
http://192.168.1.8/smart/speScene.info
// 场景详情-浏览器打开(nm由场景列表获取)
http://192.168.1.8/smart/scene/{nm}.json
我只有灯具和窗帘设备,
如有其他设备不知道要传什么参数,可以先将其加入场景,然后查看场景详情里的参数来猜测。
更多cmd取值看https://github.com/dnakeyun/DNKSmartHomeSDK/blob/main/DNKSmartHomeSDK/DNKSmartHomeSDK.framework/Headers/SDKInterface.h
*/
const GATEWAY = {
ip: '192.168.1.8', // 改成你的门禁ip
iotDeviceName: '', // (获取方法:网关信息-iotDeviceName)
gwIotName: '', // (获取方法:网关信息-gwIotName)
authUsername: 'admin', // 一般是固定的
authPassword: '123456', // 一般是固定的
};
function b64EncodeUnicode(str) {
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
function(match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
function getUuid(len = 32, radix = 10) {
var n, r, i = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""), o = [];
if (radix = radix || i.length,
len)
for (n = 0; n < len; n++)
o[n] = i[0 | Math.random() * radix];
else
for (o[8] = o[13] = o[18] = o[23] = "-",
o[14] = "4",
n = 0; n < 36; n++)
o[n] || (r = 0 | 16 * Math.random(),
o[n] = i[19 == n ? 3 & r | 8 : r]);
return o.join("")
}
function request(data) {
return fetch('http://'+GATEWAY.ip+'/route.cgi?api=request', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'authorization': 'Basic ' + b64EncodeUnicode(GATEWAY.authUsername + ':' + GATEWAY.authPassword)
},
body: JSON.stringify({
"fromDev": GATEWAY.iotDeviceName,
"toDev": GATEWAY.gwIotName,
"data": data
})}
);
}
// 获取设备状态(state=0为关,state=1为开,state=3貌似是待机.电动窗帘有level值,猜测:0-254。0全关,254全开。)
request({"action":"readAllDevState","uuid":getUuid()}).then(()=>{})
// 开灯 (devNo是设备列表的nm,devCh是设备列表的ch)
request({"cmd": "on", "action": "ctrlDev", "devNo":26,"devCh":1, "uuid": getUuid()}).then(()=>{})
// 关灯 (devNo是设备列表的nm,devCh是设备列表的ch)
request({"cmd": "off", "action": "ctrlDev", "devNo":26,"devCh":1, "uuid": getUuid()}).then(()=>{})
// 开窗帘 (devNo是设备列表的nm,devCh是设备列表的ch)
request({"cmd":"on","action": "ctrlDev", "devNo":38,"devCh":1, "uuid": getUuid()}).then(()=>{})
// 关窗帘 (devNo是设备列表的nm,devCh是设备列表的ch)
request({"cmd":"off","action": "ctrlDev", "devNo":38,"devCh":1, "uuid": getUuid()}).then(()=>{})
// 开一半窗帘(猜测:level:0-254。0全关,254全开)
request({"cmd":"level","action": "ctrlDev", "level":128, "devNo":38,"devCh":1, "uuid": getUuid()}).then(()=>{})
// 获取设备列表(不包含名称,好像没什么用)
request({"action":"readAllDevList","discover":0,"gwid":0,"uuid":getUuid()}).then(()=>{})