『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 3282|回复: 10

[教程系列] NodeRed获取小米路由器设备在线列表&判断设备是否在线

[复制链接]

7

主题

44

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
金钱
255
HASS币
10
发表于 2023-4-27 00:26:46 | 显示全部楼层 |阅读模式
本帖最后由 study321 于 2023-5-7 01:26 编辑

先上流程截图,部分功能还在完善优化,看回复热度选择发布如果你有兴趣、有需要,请在帖子里留言让我看到


截屏2023-04-27 00.10.10.png


                               
登录/注册后可看大图





这里先记录下部分技术知识总结,动手能力强的可以进行研究与程序编写。

#1. KEY & IV 获取
由于没有多个设备试验,所以无法判断每个路由器的key 和 iv 是否一致。
这个 key 和 iv ,关系到后边的登录密码生成等。
获取地址:
GET 请求
http://192.168.31.1/cgi-bin/luci/web
然后在HTML里搜索:key: iv: 关键字即可看到


#2. 小米路由器的STOK获取
STOK是登录后返回的token,这个token和当前设备登录的mac关联,所以为了后续能在node-red服务器上(我是用docker运行)进行接口请求,则需要使用node-red服务器的mac地址进行模拟登录。

登录POST地址:
http://192.168.31.1./cgi-bin/luci/api/xqsystem/login


管理密码生成函数(供参考,对应的mac、key、iv参数上边获取到):

// 小米路由器的加密函数
var Encrypt = {
    key, iv,
    nonce: null,
    init: function () {
        var nonce = this.nonceCreat();
        this.nonce = nonce;
        return this.nonce;
    },
    nonceCreat: function () {
        var type = 0;
        var deviceId = mac;
        var time = Math.floor(new Date().getTime() / 1000);
        var random = Math.floor(Math.random() * 10000);
        return [type, deviceId, time, random].join('_');
    },
    oldPwd: function (pwd) {
        return sha1(this.nonce + sha1(pwd + this.key).toString()).toString();
    }
};


var pwd = flow.get("MI_ROUTE_PWD");

var nonce = Encrypt.init();
var oldPwd = Encrypt.oldPwd(pwd);
var param = {
    username: 'admin',
    password: oldPwd,
    logtype: 2,
    nonce: nonce
};
其中的sha1加密,可自己进行。 我这里提供我是用的sha加密方法:

var createHash = crypto.createHash;

const encrypt = (algorithm, content) => {
    let hash = createHash(algorithm)
    hash.update(content)
    return hash.digest('hex')
}

const sha1 = (content) => encrypt('sha1', content)


然后构造POST请求数据包:
msg.url = `http://${flow.get("MI_ROUTE_IP")}/cgi-bin/luci/api/xqsystem/login`;
msg.payload = `username=admin&password=${oldPwd}&logtype=2&nonce=${nonce}`;



返回的数据是json格式,code参数有两个:0和401,401是认证失败0是获取成功。 可通过这个判断数据


登录成功,会返回token数据,这个就是接下来我们请求其他API接口需要用到的STOK了!


# 3. 获取设备列表
msg.url = `http://${flow.get("MI_ROUTE_IP")}/cgi-bin/luci/;stok=${flow.get("MI_ROUTE_STOK")}/api/misystem/devicelist`


#4. 联动操作
有了数据,就好办了。
我这里分享我的一个玩法:判断设备是否在线,来判断人是否在家。 从而联动其他场景。

判断设备是否在线方法参考:

// 这里有三个判断的选择:
// 1. MAC地址
// 2. 路由器中设备的显示名称
// 3. 设备的IP地址
// 请选择填写一个即可

var checkArg = {
    mac: ',
    name: '',
    ip: '192.168.31.88'
}
// 检查是否在线
var checked = false;
msg.payload.list.map(device => {
    if (checked) return;
    if (checkArg.mac) {
        checked = device['mac'] == checkArg.mac;
    } else if (checkArg.ip) {
        device.ip.map(ipp => {
            if (checked) return;
            checked = ipp['ip'] == checkArg.ip;
        });
    } else {
        checked = device['name'] == checkArg.name;
    }
});
msg.payload = checked ? 1 : 0;
return msg;





                               
登录/注册后可看大图





暂时写到这。 流程我还在完善,后边看热度分享
有兴趣的朋友们,回帖让我看一看!




【2023-05-07】流程已分享:https://bbs.hassbian.com/forum.php?mod=viewthread&tid=20980

评分

参与人数 1金钱 +10 收起 理由
隔壁的王叔叔 + 10 感谢楼主分享!

查看全部评分

回复

使用道具 举报

7

主题

44

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
金钱
255
HASS币
10
 楼主| 发表于 2023-4-27 00:28:56 | 显示全部楼层
帖子遗漏了一个代码:获取NodeRed服务的mac地址:

// 遍历网口,获取mac地址
var tmp = os.networkInterfaces();
var mac = "";
for (let t in tmp) {
    if (mac) break;
    var net = tmp[t];
    for (let i = 0; i < net.length; i++) {
        if (mac) break;
        let info = net[i];
        if (!info.mac.startsWith('00:')) {
            mac = info.mac;
            break;
        }
    }
}
// 如果没有手动设置mac,则设置成自动获取的mac地址
if (!flow.get("CURRENT_IP_MAC")) {
    flow.set("CURRENT_IP_MAC", mac);
}
msg.payload = mac;
return msg;
回复

使用道具 举报

8

主题

89

帖子

978

积分

论坛DIY达人

积分
978
金钱
889
HASS币
10
发表于 2023-4-27 08:44:53 | 显示全部楼层
围观围观小米路由器3的路过
回复

使用道具 举报

1

主题

126

帖子

743

积分

高级会员

Rank: 4

积分
743
金钱
617
HASS币
0
发表于 2023-4-27 14:03:18 | 显示全部楼层
想学, 如果能出视频讲解下更好了。
回复

使用道具 举报

11

主题

123

帖子

3470

积分

论坛元老

Rank: 8Rank: 8

积分
3470
金钱
3347
HASS币
0
发表于 2023-5-6 18:26:51 | 显示全部楼层
太需要了。 楼主要是能分享下nodered模版就好了。
回复

使用道具 举报

7

主题

44

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
金钱
255
HASS币
10
 楼主| 发表于 2023-5-6 22:47:33 | 显示全部楼层
hyifan 发表于 2023-5-6 18:26
太需要了。 楼主要是能分享下nodered模版就好了。

正在测试,目前稳定运行了10天,数据获取正常,我再优化优化下分享哈
回复

使用道具 举报

11

主题

123

帖子

3470

积分

论坛元老

Rank: 8Rank: 8

积分
3470
金钱
3347
HASS币
0
发表于 2023-5-6 23:37:42 | 显示全部楼层
study321 发表于 2023-5-6 22:47
正在测试,目前稳定运行了10天,数据获取正常,我再优化优化下分享哈

期待。。。我等小米路由器能实现device tracker等了好久了。
回复

使用道具 举报

0

主题

17

帖子

248

积分

中级会员

Rank: 3Rank: 3

积分
248
金钱
231
HASS币
0
发表于 2023-5-7 00:02:53 | 显示全部楼层
想学想学!
回复

使用道具 举报

7

主题

44

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
金钱
255
HASS币
10
 楼主| 发表于 2023-5-7 01:26:18 | 显示全部楼层
hyifan 发表于 2023-5-6 23:37
期待。。。我等小米路由器能实现device tracker等了好久了。

你好,流程已分享。
https://bbs.hassbian.com/forum.php?mod=viewthread&tid=20980
回复

使用道具 举报

11

主题

123

帖子

3470

积分

论坛元老

Rank: 8Rank: 8

积分
3470
金钱
3347
HASS币
0
发表于 2023-5-7 12:34:44 | 显示全部楼层
study321 发表于 2023-5-7 01:26
你好,流程已分享。
https://bbs.hassbian.com/forum.php?mod=viewthread&tid=20980

谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-25 12:02 , Processed in 0.138249 second(s), 37 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表