Игорь Пашев - Скрипт для USB модема

Feb. 17th, 2011

12:38 pm - Скрипт для USB модема

Previous Entry Add to Memories Tell A Friend Next Entry

Подсмотрел здесь: http://ru.gentoo-wiki.com/wiki/MF626
Переписал на Python 3, сделал расширяемым.
В таком виде показывает баланс и рекламу :-)

Раскрасил так:

pygmentize -f html -O 'noclasses=true' 1.py


#!/usr/bin/env python3
#coding: utf8
import time, io

class Modem:
    p = None
    def __init__(self, dev='/dev/ttyUSB1'):
        self.open(dev)

    def open(self, dev):
        #self.close()
        self.p = io.open(dev, 'w+b', 0)
    
    def write(self, s):
        self.p.write(str.encode(s) + b'\r\n')
        time.sleep(0.1)

    def close(self):
        self.p.close()

    def ussd(self, code):
        self.write('AT+CPBS="SM"')
        self.write('AT+CPMS="SM","SM",""')
        self.write('AT+ZSNT=0,0,2')
        self.write('AT+CUSD=1,' + code + ',15')

        for ln in self.p:
            if ln.startswith(b'+CUSD'):
                msg = ln[10:ln.rfind(b'"')].decode('ascii')
                return bytes.fromhex(msg).decode('utf-16-be')

    def balance(self, code='*100#'):
        return self.ussd(code)

modem = Modem()
print(modem.balance())

Tags: , , , ,
(4 комментария | Оставить комментарий)

Comments:

From:(Anonymous)
Date:February 17th, 2011 - 12:37 pm
(Link)
wow!
(Reply to this)
From:(Anonymous)
Date:February 18th, 2011 - 01:08 pm
(Link)
Говнокод.
1. WTF is p?
2. закомментированный код - в топку
3. PEP8 требует каждого import'а на отдельной строке.
4. ussd() и balance() - одно и то же.
5. self.write('AT+CUSD=1,' + code + ',15') - плюсы идут в жопу, ибо каждый плюс создает новый объект "строка". Use % format.
6. ln - говно название для переменной. ln - натуральный логарифм.
7. if ln - return чего-то. А в противном случае - return *что*?
8. Modem.open() не делает ничего, кроме io.open() - переместить в __init__. Рефакторить позже, по мере нужды.
9. Почему sleep(0.1), а не 0.09 и не 0.11?
10. Приватные методы сделать типа _write() - нефиг, чтобы все кто попало их вызывал.

(Reply to this) (Thread)
[User Picture]
From:[info]igorpashev
Date:February 18th, 2011 - 02:25 pm

Спасибо :-)

(Link)
1. WTF is p?
2. закомментированный код - в топку
3. PEP8 требует каждого import'а на отдельной строке.

4. ussd() и balance() - одно и то же.
Семантика разная

5. self.write('AT+CUSD=1,' + code + ',15') - плюсы идут в жопу, ибо каждый плюс создает новый объект "строка". Use % format.
Алсо, это Питон 3

6. ln - говно название для переменной. ln - натуральный логарифм.
Алсо, у буржуев log

7. if ln - return чего-то. А в противном случае - return *что*?
8. Modem.open() не делает ничего, кроме io.open() - переместить в __init__. Рефакторить позже, по мере нужды.

9. Почему sleep(0.1), а не 0.09 и не 0.11?
Пока работает и без задержки

10. Приватные методы сделать типа _write() - нефиг, чтобы все кто попало их вызывал.


#!/usr/bin/env python3
#coding: utf8

import io

class Modem:
    def __init__(self, dev='/dev/ttyUSB1'):
        self.stream = io.open(dev, 'w+b', 0)

    def __write(self, s):
        self.stream.write(str.encode('{}\r\n'.format(s)))

    def close(self):
        self.stream.close()

    def ussd(self, code):
        self.__write('AT+CPBS="SM"')
        self.__write('AT+CPMS="SM","SM",""')
        self.__write('AT+ZSNT=0,0,2')
        self.__write('AT+CUSD=1,{},15'.format(code))

        for l in self.stream:
            if l.startswith(b'+CUSD'):
                msg = l[10:l.rfind(b'"')].decode('ascii')
                return bytes.fromhex(msg).decode('utf-16-be')
        return ''

    def balance(self, code='*100#'):
        return self.ussd(code)

modem = Modem()
print(modem.balance())

(Reply to this) (Parent) (Thread)
[User Picture]
From:[info]igorpashev
Date:February 18th, 2011 - 07:23 pm

Re: Спасибо :-)

(Link)
Асло по седьмому пункту:

7. if ln - return чего-то. А в противном случае - return *что*?

противного случая на самом деле не будет, ибо читается поток
(Reply to this) (Parent)