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

 找回密码
 立即注册
查看: 1931|回复: 0

[新奇玩法] NodeRed 获取 华为光猫 光模块温度,调节 pwn 风扇

[复制链接]

80

主题

388

帖子

1680

积分

金牌会员

Rank: 6Rank: 6

积分
1680
金钱
1292
HASS币
0
发表于 2022-3-31 06:48:48 | 显示全部楼层 |阅读模式
本帖最后由 ciasdmxhxjjpd@c 于 2022-5-2 12:08 编辑

2022/4/2 更新
import os
import pickle
import requests
import re
import base64

DOMAIN = 'http://192.168.1.1/'
USERNAME = 'yourusername'
PASSWORD = 'yourpassword'
HEADERS = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Accept-Encoding': 'gzip, deflate'
}

# get random
def get_random(session):
    cnt = session.get(url=DOMAIN+'asp/GetRandCount.asp').content.decode('utf-8-sig')
    return cnt

# get login cookie
def get_cookie(session, cnt):
    payload = {'UserName': USERNAME, 'PassWord': base64.b64encode(str.encode(PASSWORD)),'Language': 'chinese', 'x.X_HW_Token' : cnt}
    save_cookies(session.post(url=DOMAIN+'login.cgi', data=payload).cookies,'cookie.txt')

# get ont temperature
def get_opticinfo(session):
    x = session.get(url=DOMAIN+'html/amp/opticinfo/opticinfo.asp', cookies=load_cookies('cookie.txt')).content.decode('utf-8-sig')
    opticinfos = re.findall('var opticInfos = new Array\(new stOpticInfo\("InternetGatewayDevice.X_HW_DEBUG.AMP.Optic","(.*)","(.*)","(.*)","(.*)","(.*)","(.*)","(.*)","(.*)","(.*)","(.*)","(.*)","(.*)","(.*)","(.*)","(.*)"\),null\);',x)
    return opticinfos

def save_cookies(cookiejar, filename):
    with open(filename, 'wb') as f:
        pickle.dump(cookiejar, f)

def load_cookies(filename):
    with open(filename, 'rb') as f:
        return pickle.load(f)

session = requests.Session()
session.headers = HEADERS

if not os.path.isfile('cookie.txt'):
    get_cookie(session, get_random(session))

opticinfo = get_opticinfo(session)
if not opticinfo:
    get_cookie(session, get_random(session))
    opticinfo_tmp = get_opticinfo(session)
    print(opticinfo_tmp[0][4])
else:
    print(opticinfo[0][4])



ha里, 因为光猫限制60s内无操作,cookie会失效,所以,设置 update time 为 50s。
sensor:
  - platform: command_line
    name: N1 CPU Temp
    command: "cat /sys/class/thermal/thermal_zone0/temp"
    unit_of_measurement: "°C"
    value_template: "{{ value | multiply(0.001) | round(1) }}"
    scan_interval: 180 

  - platform: command_line
    name: HUAWEI PON Temp
    command: "python /config/hw.py"
    unit_of_measurement: "°C"
    scan_interval: 50




-------------------------------------------------

需求: 华为光猫hs8145 x6 放在 弱电间 做 光电转换 pon 认证 和 wifi,单臂路由N1拨号 。 光猫本身的 海思 armv7芯片不带 温度传感器,但光模块是自带的。如果能方便获取,用 nodered 就可以直接获取。然后根据获取的温度,调节 pwn 风扇。
<%HW_WEB_GetParaByDomainName(InternetGatewayDevice.X_HW_DEBUG.AMP.Optic.Temperature);%>
看了下 asp 代码,只需要执行上面的代码就能获取光模块温度。

现在的问题是 对 asp 不了解,不知道如何执行上面的 asp 代码,且光猫的根分区是只读的,无法直接修改/html 下的asp 文件。所以只能找其他方法。
看雪论坛有人分析过华为光猫获取发包速率的文章。似乎他也没搞成功。
https://bbs.pediy.com/thread-215961.htm



登录的核心js代码
function SubmitForm() {
    var Username = document.getElementById('txt_Username');
    var Password = document.getElementById('txt_Password');
        var appName = navigator.appName;
        var version = navigator.appVersion;
  
        if (appName == "Microsoft Internet Explorer")
        {
                var versionNumber = version.split(" ")[3];
                if (parseInt(versionNumber.split(";")[0]) < 6)
                {
                        alert("不支持IE6.0以下版本。");
                        return false;
                }
        }
        
        if (Username.value == "") {
                alert("用户名不能为空。");
                Username.focus();
                return false;
        }
        
        if (Password.value == "") {
                alert("密码不能为空。");
                Password.focus();
                return false;
        }
        
        var cnt;

        $.ajax({
                type : "POST",
                async : false,
                cache : false,
                url : '/asp/GetRandCount.asp',
                success : function(data) {
                        cnt = data;
                }
                });
                
        var Form = new webSubmitForm();                
        var cookie2 = "Cookie=body:" + "Language:" + Language + ":" + "id=-1;path=/";
        Form.addParameter('UserName', Username.value);
        Form.addParameter('PassWord', base64encode(Password.value));
        Form.addParameter('Language', Language);
    document.cookie = cookie2;

    Username.disabled = true;
    Password.disabled = true;

    Form.addParameter('x.X_HW_Token', cnt);
        Form.setAction('/login.cgi');
        Form.submit();
    return true;
}

先通过 /asp/GetRandCount.asp 获取 随机数。并将 username 、base64编码后的password 、随机数 作为登录参数 ,用 临时 cookie 登录。登录成功后,替换成新的cookie。

完整login.asp 代码见附件。



另外一种妥协的方法,就是在弱电间放一个小米温度传感器,但是不准确,方式比较粗糙。

                               
登录/注册后可看大图






回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-28 10:55 , Processed in 0.226173 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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