Привет, %username%!
Недавно мне пришлось столкнуться со следующей задачей: есть старенький десктоп с установленной на нем Windows XP. Необходимо, чтобы с заданным интервалом времени программа на этом десктопе посылала GET-запрос на нужный сервер, парсила ответ и, в зависимости от результата, отсылала смс-сообщения на нужные номера. Из дополнительных девайсов имелся только 3G-модем E160g от Биллайна, а подключение к интернету по проводной сети или WI-FI было физически невозможно.
Задача была выполнена с помощью только этого модема и языка Python.
Первоначально было решено использовать модем одновременно как устройство подключения к интернету, так и AT-модем для отправки смс. Однако, как и следовало ожидать, он не мог работать сразу в двух режимах: при подключении к сети отправка смс становилась невозможной.
Попытка подсоединения двух 3G-модемов (один для интернета, другой для смс) терпела неудачу: устройства прекрасно функционировали отдельно друг от друга, но при одновременном подключении система видела только одно.
Положительный эффект дала замена одного модема на мобильник, но это меня не устраивало: желания тратить лишние деньги на телефон, пусть и недорогой, у меня не было.
В итоге у меня родилась идея использовать один 3G-модем, переключая его в нужные режимы программно: сначала подключаться через него к интернету, выгружать данные, затем отключаться, обрабатывать данные, и слать AT-команды для отправки смс. И всё это на языке Python.
Во-первых, отпадает необходимость во втором девайсе, а во-вторых, подключение к сети будет редким и кратковременным, что поможет сэкономить недешевый 3G-трафик.
Для отправки смс я использовал замечательный скрипт из хабра-топика Простой скрипт для рассылки СМС. А вот с управлением подключения к интернету пришлось повозиться. Можно, конечно, поставить Python-расширение для win32 и управлять им из win-API функций. Но оказалось, что гораздо проще производить манипуляции с сетевыми подключениями с помощью обычной утилиты RASDIAL.
Во время установки программы для модема в системе создается подключение через этот модем. Если оно не создалось или было удалено, то можно создать его вручную: «сетевые подключения»->«Добавить». В свойствах указываем модем, поля user/password оставляем пустыми (т.к. пользователь идентифицируется по номеру сим-карты), вводим телефон (в моем случае *99#), убираем галки «спрашивать имя пользователя, пароль». Подключение создано.
Теперь запрограммируем небольшой модуль rasdial.py, который позволит нам управлять этим подключением:
Две функции модуля производят подключение/отключение интернета по единственному аргументу: имени подключения. Например, если вы назвали его «e160g», то вызов
попытается выполнить подключение и вернет статус возврата. Если 0, то соединение выполнено успешно.
В итоге, основная программа выглядела так:
Запуск скрипта я поставил на крон с интервалом в 1 час. В итоге, я обошелся одним модемом и значительно сэкономил трафик.
Спасибо за внимание!
Недавно мне пришлось столкнуться со следующей задачей: есть старенький десктоп с установленной на нем Windows XP. Необходимо, чтобы с заданным интервалом времени программа на этом десктопе посылала GET-запрос на нужный сервер, парсила ответ и, в зависимости от результата, отсылала смс-сообщения на нужные номера. Из дополнительных девайсов имелся только 3G-модем E160g от Биллайна, а подключение к интернету по проводной сети или WI-FI было физически невозможно.
Задача была выполнена с помощью только этого модема и языка Python.
Первоначально было решено использовать модем одновременно как устройство подключения к интернету, так и AT-модем для отправки смс. Однако, как и следовало ожидать, он не мог работать сразу в двух режимах: при подключении к сети отправка смс становилась невозможной.
Попытка подсоединения двух 3G-модемов (один для интернета, другой для смс) терпела неудачу: устройства прекрасно функционировали отдельно друг от друга, но при одновременном подключении система видела только одно.
Положительный эффект дала замена одного модема на мобильник, но это меня не устраивало: желания тратить лишние деньги на телефон, пусть и недорогой, у меня не было.
В итоге у меня родилась идея использовать один 3G-модем, переключая его в нужные режимы программно: сначала подключаться через него к интернету, выгружать данные, затем отключаться, обрабатывать данные, и слать AT-команды для отправки смс. И всё это на языке Python.
Во-первых, отпадает необходимость во втором девайсе, а во-вторых, подключение к сети будет редким и кратковременным, что поможет сэкономить недешевый 3G-трафик.
Для отправки смс я использовал замечательный скрипт из хабра-топика Простой скрипт для рассылки СМС. А вот с управлением подключения к интернету пришлось повозиться. Можно, конечно, поставить Python-расширение для win32 и управлять им из win-API функций. Но оказалось, что гораздо проще производить манипуляции с сетевыми подключениями с помощью обычной утилиты RASDIAL.
Во время установки программы для модема в системе создается подключение через этот модем. Если оно не создалось или было удалено, то можно создать его вручную: «сетевые подключения»->«Добавить». В свойствах указываем модем, поля user/password оставляем пустыми (т.к. пользователь идентифицируется по номеру сим-карты), вводим телефон (в моем случае *99#), убираем галки «спрашивать имя пользователя, пароль». Подключение создано.
Теперь запрограммируем небольшой модуль rasdial.py, который позволит нам управлять этим подключением:
-
- import os
-
- def connect(connection):
- command = r'RASDIAL %s' % connection
- return os.system(command)
-
- def disconnect(connection):
- command = r'RASDIAL %s /DISCONNECT' % connection
- return os.system(command)
-
Две функции модуля производят подключение/отключение интернета по единственному аргументу: имени подключения. Например, если вы назвали его «e160g», то вызов
-
- import rasdial
-
- code = rasdial.connect('e160g')
-
попытается выполнить подключение и вернет статус возврата. Если 0, то соединение выполнено успешно.
В итоге, основная программа выглядела так:
-
- import sender
- import rasdial
- import httplib
-
- code = rasdial.connect(conn_name)
- if code == 0:
- conn = httplib.HTTPConnection(some_host)
- conn.request('GET', query)
- response = conn.getresponse()
- rasdial.disconnect(conn_name)
- # парсинг ответа
- s = sender.Sender(port)
- # отправка смс
- s.send(*args)
-
Запуск скрипта я поставил на крон с интервалом в 1 час. В итоге, я обошелся одним модемом и значительно сэкономил трафик.
Спасибо за внимание!