راه‌اندازی مجدد مودم ADSL از طریق کدنویسی

یکی از معایب اینترنت‌های ADSL معمولی عدم پایداری اتصال به اینترنت می‌باشد. یعنی زمانی که مودم ADSL برای ساعات طولانی مدت (معمولاً بیشتر از 24 ساعت) روشن باشد، غالباً اینترنت قطع شده و نیاز به راه‌اندازی مجدد مودم برای ایجاد سشن جدید و اتصال مجدد به اینترنت می‌باشد.

چقدر خوب بود اگر می‌شد این کار بصورت اتوماسیون انجام می‌گرفت.

برای انجام این کار قطعه کدی تهیه کرده‌ام که بصورت متوالی اتصال به اینترنت را آزمایش کرده و در صورت عدم اتصال به اینترنت مودم را خاموش و روشن می‌کند.

نکته‌ای که در اینجا حائز اهمیت است نحوه خاموش و روشن کردن مودم از طریق کدنویسی می‌باشد.

غالباً برای انجام اجرای دستورات مودم یا روترها از Telnet استفاده می‌شود. به این شکل که از طریق خط فرمان با دستور Telnet به مودم متصل شده و پس از وارد کردن نام کاربری و رمز عبور، دستور مورد نظر را مثل دستور Reboot رای در خط فرمان تایپ کرده و اینتر زده و بدین ترتیب مودم راه‌اندازی مجدد می‌شود.

بعلت اینکه جهت Telnet کردن به مودم نیاز به وارد کردن نام کاربر و رمز عبور در خط فرمان می‌باشد، از امکانات زبان پایتون استفاده خواهیم کرد.

نحوه اتصال به مودم از طریق برنامه‌نویسی

ابتدا نصاب پایتون برای ویندوز را از این آدرس دریافت کرده و آن را نصب نمایید. نصب پایتون نکته‌ی خاصی ندارد.

پس از نصب پایتون قطعه کد زیر را در فایلی با پسوند "py" ذخیره می‌‌کنید.

برای تست اتصال به اینترنت از متد زیر استفاده می‌کنیم:

def pingHost():
    hostname = "www.google.com"
    response = os.system("ping " + hostname)

    if response == 0:
      return True
    else:
      return False

این قطعه کد یک Ping به یک هاست مانند گوگل زده و از این طریق وضعیت اتصال به اینترنت را تشخیص می‌دهد.

اگر به تعداد maxTry اتصال به اینترنت انجام نشود، توسط متد زیر مودم مجدداً راه‌اندازی می‌شود:

def rebootModem():
    try:
        print("Rebooting modem...")
        HOST = "192.168.1.1"
        user = b"admin"
        password = b"password"

        tn = telnetlib.Telnet(HOST)

        tn.read_until(b"Login: ")
        tn.write(user + b"\n")
        tn.read_until(b"Password: ")
        tn.write(password + b"\n")
        tn.read_until(b"> ")
        tn.write(b"reboot\n\n")
    except:
        print("Error!")

توسط این متد ابتدا به آی‌پی مودم که بصورت پیش‌فرض 192.168.1.1 می‌باشد، Telnet کرده و منتظر خط فرمان برای درخواست نام کاربری می‌ماند، یعنی منتظر مانده تا در خط فرمان عبارت "Login:" دیده شود:

        tn.read_until(b"Login: ")

پس از مشاهده عبارت Login برنامه نام کاربری را ارسال کرده و فشردن کلید اینتر را توسط کاراکتر "\n" شبیه‌سازی می‌کند:

        tn.write(user + b"\n")

بهمین ترتیب منتظر درخواست کلمه رمز شده و کلمه رمز را ارسال می‌کند و پس از ظاهر شدن اعلان خط فرمان مودم یعنی پس از دیده شدن کاراکتر "<" دستور "reboot" صادر شده و فشرده شدن کلید اینتر شبیه‌سازی می‌شود:

        tn.read_until(b"> ")
        tn.write(b"reboot\n\n")

کد کامل برنامه

import os
import time
import telnetlib
import datetime

maxTry = 3
shortDelay = 10
longDelay = 300
tryCount = 0

def pingHost():
    hostname = "www.google.com"
    response = os.system("ping " + hostname)

    if response == 0:
      return True
    else:
      return False

def rebootModem():
    try:
        print("Rebooting modem...")
        HOST = "192.168.1.1"
        user = b"admin"
        password = b"password"

        tn = telnetlib.Telnet(HOST)

        tn.read_until(b"Login: ")
        tn.write(user + b"\n")
        tn.read_until(b"Password: ")
        tn.write(password + b"\n")
        tn.read_until(b"> ")
        tn.write(b"reboot\n\n")
    except:
        print("Error!")

delayTime = longDelay

while True:
    if(pingHost() == False):
        delayTime = shortDelay
        if(tryCount == maxTry):
            rebootModem()
            tryCount = 0
            delayTime = longDelay
        else:
            tryCount+=1
    else:
        delayTime = longDelay
    time.sleep(delayTime)

اجرای برنامه

جهت اجرای برنامه به دو روش می‌توانید اقدام کنید:

1- برنامه IDLE که در مسیر All Program>Python x.x قرار دارد را اجرا کنید. از منوی File>Open فایل برنامه را بازکرده و کلید F5 را جهت اجرا بفشارید.

2- از طریق خط فرمان زیر:

C:\PythonXX\python.exe RebootModem.py

 

کد کامل برنامه را در قالب فایل پایتون دریافت کنید: