configure_cots_bandrich_ue.py 6.83 KB
Newer Older
1 2
#!/usr/bin/python 

3 4 5 6 7 8 9 10 11
import time
import serial
import os
from pyroute2 import IPRoute
import sys
import re
import threading
import signal
import traceback
12
import os
13
import commands
14 15

# configure the serial connections (the parameters differs on the device you are connecting to)
16 17
#First we find an open port to work with
serial_port=''
18
ser=serial.Serial()
Rohit Gupta's avatar
Rohit Gupta committed
19 20 21 22 23
openair_dir = os.environ.get('OPENAIR_DIR')
if openair_dir == None:
  print "Error getting OPENAIR_DIR environment variable"
  sys.exit(1)

24 25
def find_open_port():
   global serial_port, ser
26 27 28
   max_ports=100
   if os.path.exists(serial_port) == True:
     return serial_port
29
   for port in range(2,100):
30 31 32 33
      serial_port = '/dev/ttyUSB'+str(port)
      if os.path.exists(serial_port) == True:
         print 'New Serial Port : ' + serial_port
         break
34

35 36 37
   ser = serial.Serial(port=serial_port)
   return

38

39 40
    
#serial_port = '/dev/ttyUSB2'
Rohit Gupta's avatar
Rohit Gupta committed
41
bandrich_ppd_config = os.environ.get('OPENAIR_DIR') + '/cmake_targets/autotests/tools/wdial.bandrich.conf'
42 43 44 45 46 47 48 49 50 51 52 53 54

exit_flag=0

def signal_handler(signal, frame):
        print('You pressed Ctrl+C!')
        print('Resetting the UE to detached state')
        timeout=10
        exit_flag=1
        send_command('AT+CGATT=0' , 'OK' , timeout)
        sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)

55

56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82

#ser.open()
#ser.isOpen()

class pppThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        print "Starting " + self.name
        #Here we keep running pppd thread in indefinite loop as this script terminates sometimes
        #while 1:
        while 1:
           time.sleep(5) #Hard coded, do not reduce this number! 
           print "Starting wvdial now..."
           print 'exit_flag = ' + str(exit_flag)
           send_command('AT+CGATT=1','OK', 300)
           os.system('wvdial -C ' + bandrich_ppd_config + '' )
           if exit_flag == 1:
              print "Exit flag set to true. Exiting pppThread now"
           print "Terminating wvdial now..."

def send_command (cmd, response, timeout):
   count=0
   sleep_duration = 1
Rohit Gupta's avatar
Rohit Gupta committed
83
   print 'In function: send_command: cmd = <' + cmd + '> response: <' + response + '> \n'
84
   global serial_port, ser
85
   while count <= timeout:
Rohit Gupta's avatar
Rohit Gupta committed
86
      try:
87 88 89
        #Sometimes the port does not exist coz of reset in modem.
        #In that case, we need to search for this port again
        if os.path.exists(serial_port) == False:
90
            find_open_port()
Rohit Gupta's avatar
Rohit Gupta committed
91 92 93 94 95 96 97 98 99 100 101 102 103 104
        ser.write (cmd + '\r\n')
        out = ''
        time.sleep(sleep_duration)
        count = count + sleep_duration
        while ser.inWaiting() > 0:
            out += ser.read(1)
        print 'out = <' + out + '> response = <' + response + '> \n'
        if re.search(response, out):
          break
      except Exception, e:
        error = ' cmd : ' + cmd + ' response : ' + response
        error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: '  + str(e.__class__) + " : " + str( e)
        error = error + traceback.format_exc()
        print error
105 106 107 108 109 110
        

def start_ue () :
   #print 'Enter your commands below.\r\nInsert "exit" to leave the application.'
   timeout=60 #timeout in seconds
   send_command('AT', 'OK' , timeout)
111
   send_command('AT+CFUN=1' , 'OK' , timeout)
Rohit Gupta's avatar
Rohit Gupta committed
112
   #send_command('AT+CGATT=0' , 'OK' , timeout)
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
   send_command('AT+CGATT=1','OK', 300)
   #os.system('wvdial -C ' + bandrich_ppd_config + ' &' )
   
   thread_ppp = pppThread(1, "ppp_thread", 1)
   thread_ppp.start()

   iface='ppp0'
   
   while 1:
     time.sleep ( 2)
     #Now we check if ppp0 interface is up and running
     try:
        if exit_flag == 1:
          break
        ip = IPRoute()
        idx = ip.link_lookup(ifname=iface)[0]
129 130
        os.system ('route add ' + gw + ' ppp0')
        os.system ('ping ' + gw)
131 132 133 134 135 136 137 138 139 140 141 142 143
        break
     except Exception, e:
        error = ' Interface ' + iface + 'does not exist...'
        error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: '  + str(e.__class__) + " : " + str( e)
        error = error + traceback.format_exc()
        print error
    
   thread_ppp.join()

def stop_ue():
   timeout=60
   os.system('killall wvdial')
   send_command('AT', 'OK' , timeout)
Rohit Gupta's avatar
Rohit Gupta committed
144
   send_command('AT+CGATT=0' , 'OK|ERROR' , timeout)
145
   send_command('AT+CFUN=4' , 'OK' , timeout)
146

147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163

#reset the USB BUS of Bandrich UE
def reset_ue():
  stringIdBandrich='BandRich, Inc. 4G LTE adapter'
  status, out = commands.getstatusoutput('lsusb | grep -i \'' + stringIdBandrich + '\'')
  if (out == '') :
     print "Bandrich 4G LTE Adapter not found. Exiting now..."
     sys.exit()
  p=re.compile('Bus\s*(\w+)\s*Device\s*(\w+):\s*ID\s*(\w+):(\w+)')
  res=p.findall(out)
  BusId=res[0][0]
  DeviceId=res[0][1]
  VendorId=res[0][2]
  ProductId=res[0][3]
  usb_dir= find_usb_path(VendorId, ProductId)
  print usb_dir
  cmd = "sudo sh -c \"echo 0 > " + usb_dir + "/authorized\""
Rohit Gupta's avatar
Rohit Gupta committed
164
  os.system(cmd + " ; sleep 15" )
165
  cmd = "sudo sh -c \"echo 1 > " + usb_dir + "/authorized\""
Rohit Gupta's avatar
Rohit Gupta committed
166
  os.system(cmd + " ; sleep 30" )
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190

def read_file(filename):
  try:
    file = open(filename, 'r')
    return file.read()
  except Exception, e:
    #error = ' Filename ' + filename 
    #error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: '  + str(e.__class__) + " : " + str( e)
    #error = error + traceback.format_exc()
    #print error
    return ''


def find_usb_path(idVendor, idProduct):
  for root, dirs, files in os.walk("/sys/bus/usb/devices", topdown=False):
    for name in dirs:
        tmpdir= os.path.join(root, name)
        tmpidVendor = read_file(tmpdir+'/idVendor').replace("\n","")
        tmpidProduct = read_file(tmpdir+'/idProduct').replace("\n","")
        #print "tmpdir = " + tmpdir + " tmpidVendor = " + tmpidVendor + " tmpidProduct = " + tmpidProduct
        if tmpidVendor == idVendor and tmpidProduct == idProduct:
            return tmpdir
  return ''

191 192 193 194
i=1
gw='192.172.0.1'
while i <  len(sys.argv):
    arg=sys.argv[i]
195
    if arg == '--start-ue' :
196 197
        find_open_port()
        print 'Using Serial port : ' + serial_port  
198 199
        start_ue()
    elif arg == '--stop-ue' :
200 201
        find_open_port()
        print 'Using Serial port : ' + serial_port  
202
        stop_ue()
203 204
    elif arg == '--reset-ue' :
        reset_ue()
205 206 207 208 209 210 211 212
    elif arg == '-gw' :
        gw = sys.argv[i+1]
        i=i+1
    elif arg == '-h' :
        print "--reset-ue:  Reset the UE on USB Bus. Similar to unplugging and plugging the UE"
        print "--stop-ue:  Stop the UE. Send DETACH command" 
        print "--start-ue:  Start the UE. Send ATTACH command"
        print "-gw:  Specify the default gw as sometimes the gateway/route arguments are not set properly via wvdial"
213 214 215
    else :
        print " Script called with wrong arguments, arg = " + arg
        sys.exit()
216
    i = i +1
217 218