让光猫【北京移动-HG260GT】实现定时重启

北京移动办理套餐送的免费宽带比电信联通的宽带差一些,不过比起长城歌华宽带通还是好很多。 2017年办理免费宽带赠送的烽火通用型GPON-HG260GT光猫,使用中发现光猫长时间不重启,上网就故障了,只要一重启故障就消除了。看来重启对电子产品来说,是解决故障的灵丹妙药啊。 接下来,就是看如何实现光猫的

北京移动办理套餐送的免费宽带比电信联通的宽带差一些,不过比起长城歌华宽带通还是好很多。

2017年办理免费宽带赠送的烽火通用型GPON-HG260GT光猫,使用中发现光猫长时间不重启,上网就故障了,只要一重启故障就消除了。看来重启对电子产品来说,是解决故障的灵丹妙药啊。

接下来,就是看如何实现光猫的定时重启罗。研究看光猫的系统配置,没有发现定时重启的功能,倒是有手动重启的功能。而且也没有发现烽火通用型GPON-HG260GT光猫能开启telnet或者ssh登录的功能。看来在光猫中写shell脚本或上传GO程序的方法不可行了。

此路不通那就另辟蹊径!既然光猫可以手动重启,那么就说明是可以在网络上通过程序去实现自动重启的。不说废话。上干货:

  1. 电脑上安装wireshark或Fiddler转包监控手动重启光猫的全过程。大概分为3步:

  1. 找个方便的语言写个几十行的代码接口,因为我的路由器中有Python环境,所以我就用Python罗。如你的路由器没有Python,最好用Golang编写(Golang编写的程序默认有点大,可在编译时候增加参数将生成的二进制变小,再用upx压缩一下),Python代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import re
import requests
import json
import time
import logging
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s [%(threadName)s] [%(name)s] [%(levelname)s] %(filename)s[line:%(lineno)d] %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)


class modemApi:
    def __init__(self, User=None, UserPwd=None, modemUrl=None):
        self.__User = User or "Q01DQ0FkbWlu"
        self.__UserPwd = UserPwd or "YURtOEglTWRB"
        self.__url = modemUrl or "http://192.168.1.1"
        self.session = None
        # self._log = configure_logger('default', 'logs/service.log')

    def create_session(self):
        session = requests.session()
        session.headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'text/html'}
        session.headers[
            'User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'
        return session

    def admin_login(self):
        if not self.session:
            self.session = self.create_session()
        url = self.__url + '/ctlogin.cmd'
        print(url)
        r = self.session.post(url, data={"commonName": self.__User, "commonPsd": self.__UserPwd})
        if r.status_code != 200:
            logging.error(r.text)
            return None
        db = r.text
        return db

    def access_page(self, pageurl):
        if not self.session:
            self.session = self.create_session()
        url = self.__url + '/' + pageurl
        print(url)
        r = self.session.get(url)
        if r.status_code != 200:
            logging.error(r.text)
            return None
        db = r.text
        return db

    def reboot_modem(self, sessionKey):
        if not self.session:
            self.session = self.create_session()
        url = self.__url + '/rebootinfo.cgi?sessionKey=' + sessionKey
        print(url)
        r = self.session.get(url)
        if r.status_code != 200:
            logging.error(r.text)
            return False
        return True

if __name__ == '__main__':
    modemapi = modemApi()
    modemapi.admin_login()
    pagedata = modemapi.access_page('resetrouter.html')
    result = None
    if pagedata:
        result = re.findall(".*sessionKey='(.*)';.*", pagedata)
    if len(result) == 1:
        print("sessionKey:", result[0])
        if len(result[0]) == 10:
            if modemapi.reboot_modem(result[0]):
                print("reboot successful")
  1. 上传到路由器中运行测试一下。效果极好。

  2. 在路由器中增加个定时任务。

Comment