NoPaste

Huawei AT Commands

von Anonymous

SNIPPET_TEXT:
  1. # -*- coding: utf-8 -*-
  2. # Copyright (C) 2006-2008  Vodafone España, S.A.
  3. # Copyright (C) 2008-2009  Warp Networks, S.L.
  4. # Author:  Pablo Martí
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License along
  17. # with this program; if not, write to the Free Software Foundation, Inc.,
  18. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  19. """
  20. Common stuff for all Huawei cards
  21. """
  22.  
  23. import re
  24.  
  25. from twisted.python import log
  26.  
  27. from wader.common.middleware import WCDMAWrapper
  28. from wader.common.command import get_cmd_dict_copy, OK_REGEXP, ERROR_REGEXP
  29. from wader.common.consts import BAND_OPTS_REV, CONN_OPTS, CONN_OPTS_REV
  30. from wader.common.hardware.base import WCDMACustomizer
  31. from wader.common.netspeed import bps_to_human
  32. from wader.common.plugin import DevicePlugin
  33. from wader.common.sim import SIMBaseClass
  34. from wader.common.utils import rssi_to_percentage
  35. import wader.common.signals as S
  36. import wader.common.aterrors as E
  37.  
  38. NETINFO_REGEXP = re.compile('[^a-zA-Z0-9.\-\s]*')
  39. BADOPER_REGEXP = re.compile('FFF*')
  40.  
  41. HUAWEI_CONN_DICT = {
  42.     'ANY'    : 'AT^SYSCFG=2,0,3FFFFFFF,2,4',
  43.     '2GONLY' : 'AT^SYSCFG=13,1,3FFFFFFF,2,4',
  44.     '3GONLY' : 'AT^SYSCFG=14,2,3FFFFFFF,2,4',
  45.     '2GPREF' : 'AT^SYSCFG=2,1,3FFFFFFF,2,4',
  46.     '3GPREF' : 'AT^SYSCFG=2,2,3FFFFFFF,2,4',
  47. }
  48.  
  49. HUAWEI_BAND_DICT = {
  50.     0 : '3FFFFFFF',   # any band
  51.     1 : '00000100',   # EGSM (900MHz)
  52.     2 : '00000080',   # DCS (1800MHz)
  53.     4 : '00200000',   # PCS (1900MHz)
  54.     8 : '00080000',   # GSM (850 MHz)
  55.    16 : '00400000',   # WCDMA 2100Mhz  (Class I)
  56. }
  57.  
  58. def huawei_new_conn_mode(args):
  59.     """Translates C{arg} to Wader's internal representation"""
  60.     mode_args_dict = {
  61.         '0,0' : S.NO_SIGNAL,
  62.         '0,2' : S.NO_SIGNAL,
  63.         '3,0' : S.GPRS_SIGNAL,
  64.         '3,1' : S.GPRS_SIGNAL,
  65.         '3,2' : S.GPRS_SIGNAL,
  66.         '3,3' : S.GPRS_SIGNAL,
  67.         '5,4' : S.UMTS_SIGNAL,
  68.         '5,5' : S.HSDPA_SIGNAL,
  69.         '5,6' : S.HSUPA_SIGNAL,
  70.         '5,7' : S.HSPA_SIGNAL,
  71.     }
  72.     return mode_args_dict[args]
  73.  
  74. def huawei_new_speed_link(args):
  75.     converted_args = map(lambda hexstr: int(hexstr, 16), args.split(','))
  76.     time, tx, rx, tx_flow, rx_flow, tx_rate, rx_rate = converted_args
  77.     return bps_to_human(tx * 8, rx * 8)
  78.  
  79. HUAWEI_CMD_DICT = get_cmd_dict_copy()
  80. get_syscfg = dict(end=OK_REGEXP,
  81.                   error=ERROR_REGEXP,
  82.                   extract=re.compile(r"""
  83.                                      \r\n
  84.                                      \^SYSCFG:
  85.                                      (?P<mode>\d),
  86.                                      (?P<acqorder>\d),
  87.                                      (?P<band>[0-9a-fA-F]*),
  88.                                      (?P<roam>\d),
  89.                                      (?P<srvdomain>\d)
  90.                                      \r\n
  91.                                      """, re.VERBOSE))
  92.  
  93. get_radio_status = dict(end=re.compile('\r\n\+CFUN:\s?\d\r\n'),
  94.                         error=ERROR_REGEXP,
  95.                         extract=re.compile('\r\n\+CFUN:\s?(?P<status>\d)\r\n')
  96. )
  97. HUAWEI_CMD_DICT['get_radio_status'] = get_radio_status
  98. HUAWEI_CMD_DICT['get_syscfg'] = get_syscfg
  99.  
  100.  
  101. class HuaweiWCDMACustomizer(WCDMACustomizer):
  102.     """
  103.     Base Customizer class for Huawei cards
  104.     """
  105.     async_regexp = re.compile('\r\n(?P<signal>\^[A-Z]{3,9}):(?P<args>.*)\r\n')
  106.     band_dict = HUAWEI_BAND_DICT
  107.     conn_dict = HUAWEI_CONN_DICT
  108.     cmd_dict = HUAWEI_CMD_DICT
  109.     device_capabilities = [S.SIG_NETWORK_MODE,
  110.                            S.SIG_RSSI,
  111.                            S.SIG_SPEED]
  112.  
  113.     signal_translations = {
  114.         '^MODE' : (S.SIG_NETWORK_MODE, huawei_new_conn_mode),
  115.         '^RSSI' : (S.SIG_RSSI, lambda rssi: rssi_to_percentage(int(rssi))),
  116.         '^DSFLOWRPT' : (S.SIG_SPEED, huawei_new_speed_link),
  117.         '^BOOT' : (None, None),
  118.         '^SRVST' : (None, None),
  119.         '^SIMST' : (None, None),
  120.         '^CEND' : (None, None),
  121.     }
  122.  
  123.  
  124. class HuaweiEXXXWrapper(WCDMAWrapper):
  125.     """
  126.     Wrapper for all Huawei E2XX cards
  127.     """
  128.  
  129.     def _get_syscfg(self, callback):
  130.         d = self.send_at('AT^SYSCFG?', name='get_syscfg',
  131.                          callback=callback)
  132.         return d
  133.  
  134.     def get_band(self):
  135.         """
  136.         Returns the current used band
  137.         """
  138.         def process_band_cb(resp):
  139.             band = int(resp[0].group('band'), 16)
  140.             ret = 0
  141.             for k in HUAWEI_BAND_DICT:
  142.                 val = int(HUAWEI_BAND_DICT[k], 16)
  143.                 if band & val:
  144.                     ret |= BAND_OPTS_REV[k]
  145.  
  146.             return ret
  147.  
  148.         d = self._get_syscfg(process_band_cb)
  149.         d.addErrback(log.err)
  150.         return d
  151.  
  152.     def get_network_info(self):
  153.         def process_netinfo_cb(info):
  154.             operator, tech = info
  155.             m = BADOPER_REGEXP.match(operator)
  156.             # sometimes the operator will come as a FFFFFFF+
  157.             if m:
  158.                 return "Unknown Network", tech
  159.  
  160.             # clean extra '@', 'x1a', etc
  161.             return NETINFO_REGEXP.sub('', operator), tech
  162.  
  163.         d = super(HuaweiEXXXWrapper, self).get_network_info()
  164.         d.addCallback(process_netinfo_cb)
  165.         return d
  166.  
  167.     def get_network_mode(self):
  168.         """
  169.         Returns the current used network mode
  170.         """
  171.         def process_netmode_cb(resp):
  172.             mode = int(resp[0].group('mode'))
  173.             acqorder = int(resp[0].group('acqorder'))
  174.  
  175.             for k in HUAWEI_CONN_DICT:
  176.                 at_str = HUAWEI_CONN_DICT[k].split('=')[1]
  177.                 try:
  178.                     _mode, _acqorder = map(int, at_str.split(',')[:2])
  179.                 except:
  180.                     log.err()
  181.  
  182.                 if mode == _mode and acqorder == _acqorder:
  183.                     return CONN_OPTS_REV[k]
  184.  
  185.             msg = "Could not find the at_str for mode %d and acqorder %d"
  186.             raise RuntimeError(msg % (mode, acqorder))
  187.  
  188.         d = self._get_syscfg(process_netmode_cb)
  189.         d.addErrback(log.err)
  190.         return d
  191.  
  192.     def set_band(self, band):
  193.         """
  194.         Sets the band to C{band}
  195.         """
  196.         ret = 0
  197.         for k in reversed(sorted(HUAWEI_BAND_DICT.keys())):
  198.             if k & band:
  199.                 band -= k
  200.                 band_str = HUAWEI_BAND_DICT[k]
  201.                 ret |= int(band_str, 16)
  202.  
  203.         if not ret:
  204.             band_str = "%s" % HUAWEI_BAND_DICT[0] # ANY
  205.         else:
  206.             band_str = "%s" % hex(ret).replace('0x', '')
  207.  
  208.         return self.send_at('AT^SYSCFG=16,3,%s,2,4' % band_str)
  209.  
  210.     def set_network_mode(self, mode):
  211.         """
  212.         Sets the network mode to C{mode}
  213.         """
  214.         if mode not in CONN_OPTS:
  215.             raise ValueError("Unknown mode %d for set_network_mode" % mode)
  216.  
  217.         mode_name = CONN_OPTS[mode]
  218.         if mode_name not in HUAWEI_CONN_DICT:
  219.             raise ValueError("Unknown mode %d for set_network_mode" % mode)
  220.  
  221.         return self.send_at(HUAWEI_CONN_DICT[mode_name])
  222.  
  223.     def set_smsc(self, smsc):
  224.         """
  225.         Sets the SIM's smsc to C{smsc}
  226.  
  227.         We wrap the operation with set_charset('IRA') and set_charset('UCS2')
  228.         """
  229.         d = self.set_charset('IRA')
  230.         d.addCallback(lambda _: super(HuaweiEXXXWrapper, self).set_smsc(smsc))
  231.         d.addCallback(lambda _: self.set_charset('UCS2'))
  232.         return d
  233.  
  234.  
  235. class HuaweiSIMClass(SIMBaseClass):
  236.     """Huawei SIM Class"""
  237.     def __init__(self, sconn):
  238.         super(HuaweiSIMClass, self).__init__(sconn)
  239.  
  240.     def initialize(self, set_encoding=True):
  241.         def at_curc_eb(failure):
  242.             failure.trap(E.ATError)
  243.  
  244.         d = super(HuaweiSIMClass, self).initialize(set_encoding=set_encoding)
  245.         def init_cb(size):
  246.             # enable unsolicited control commands
  247.             d = self.sconn.send_at('AT^CURC=1')
  248.             d.addErrback(at_curc_eb)
  249.  
  250.             self.sconn.send_at('AT+COPS=3,0')
  251.             return size
  252.  
  253.         d.addCallback(init_cb)
  254.         return d
  255.  
  256.  
  257. class HuaweiEXXXCustomizer(HuaweiWCDMACustomizer):
  258.     """
  259.     Customizer for all Huawei EXXX cards
  260.     """
  261.     wrapper = HuaweiEXXXWrapper
  262.  
  263.  
  264. class HuaweiWCDMADevicePlugin(DevicePlugin):
  265.     """DevicePlugin for Huawei"""
  266.     simklass = HuaweiSIMClass
  267.     custom = HuaweiEXXXCustomizer()

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN