most of the test systems are not built to be used for on-air operations . the ones that offer such features must be used in Shield rooms where no signal gets in or out . these rooms are expensive but usually tech universities have some rental hours for their shield and antenna rooms . its expensive as well , otherwise you are probably going to have some conflict with local regulatory sooner or later regards
On Thu, May 19, 2011 at 9:04 PM, Gianni Tedesco gianni@scaramanga.co.ukwrote:
On Fri, 2011-05-13 at 15:00 +0430, Mohammad Hosein wrote:
you could use most GSM test systems for such purpose . on ebay you might find very cheap ones regards
I managed to track down a Racal 6103. It should arrive in next couple of days.
As a followup question then, I guess that these are intended for wired rf connection or at least they transmit at very low power, and tell the phone to do the same.
However, one would feel a lot better using a channel unused by other cells in my location. I've been using cell_log to put together a list of active ARFCN's that my handset receives broadcasts from. Script for parsing cell_log logs is attached.
Am I to conclude that if cell_log hasn't dumped:
[sysinfo] arfcn 99
for example, after running for a reasonably long period of time (say 24hrs) that operating test equipment on channel 99 should be safe?
Gianni
--
#!/usr/bin/python
def getline(f): while True: l = f.readline() if not l: raise StopIteration l = l.rstrip('\r\n') if not l: continue yield l def bsic(v): (a,b) = v.split(',') return (int(a),int(b))
def hexdump(v): ret = bytearray() for x in v.split(): ret.append(int(x, 16)) return ret
class Parser: pass
class Power(Parser): def line(self, s): return
class mcc: tbl = {0x234: 'UK and Northern Ireland'} def __init__(self, num): x = ((num & 0xf00) >> 8, (num & 0xf000) >> 12, (num & 0xf)) self.val = (x[0] << 8) | x[1] << 4 | x[2] def __int__(self): return self.val def __str__(self): return self.tbl.get(self.val, '%.3x'%self.val)
class mnc: tbl = {0x15: 'Vodafone', 0x30: 'T-Mobile', 0x10: 'O2', 0x33: 'Orange', } def __init__(self, num): x = ((num & 0xf0) >> 4, (num & 0xf)) self.val = (x[1] << 4) | x[0] def __int__(self): return self.val def __str__(self): return self.tbl.get(self.val, '%.2x'%self.val)
class SystemInfo: pass
class SystemInfo3(SystemInfo): def __init__(self, b): if isinstance(b, str): b = hexdump(b) assert(b[0] > 9) # len assert(b[1] == 0x06) # discr assert(b[2] == 0x1b) # sysinfo3 self.cell = (b[3] << 8) | b[4] self.mcc = mcc((b[5] << 8) | b[6]) self.mnc = mnc(b[7]) self.lac = (b[8] << 8) | b[9] def __str__(self): return 'Cell(%s, %s)'%(self.mcc,self.mnc)
class SystemInfo4(SystemInfo): def __init__(self, b): if isinstance(b, str): b = hexdump(b) assert(b[0] > 7) # len assert(b[1] == 0x06) # discr assert(b[2] == 0x1c) # sysinfo4 self.cell = None self.mcc = mcc((b[3] << 8) | b[4]) self.mnc = mnc(b[5]) self.lac = (b[6] << 8) | b[7] def __str__(self): return 'Cell(%s, %s)'%(self.mcc,self.mnc)
class Sysinfo(Parser): _keys = {'arfcn':int, 'time':int, 'rxlev':int, 'bsic':bsic, 'si1':hexdump, 'si2':hexdump, 'si2bis':hexdump, 'si2ter':hexdump, 'si3':SystemInfo3, 'si4':SystemInfo4, 'ta':int} def line(self, s): (k,v) = s.split(None, 1) if self._keys.has_key(k): setattr(self, k, self._keys[k](v)) else: print k, v return
class RFMap: arfcns = {} cells = {} def commit(self, obj): if isinstance(obj, Sysinfo): self.arfcns.setdefault(obj.arfcn, {}) self.arfcns[obj.arfcn][str(obj.si3.mnc)] = None self.arfcns[obj.arfcn][str(obj.si4.mnc)] = None
self.cells.setdefault(obj.si3.cell, {}) self.cells[obj.si3.cell][str(obj.si3.mnc)] = None elif isinstance(obj, Power): return assert(isinstance(obj, Parser))def rf_map(f): smap = {'[power]':Power, '[sysinfo]':Sysinfo} obj = None m = RFMap()
for x in getline(f): if x[0] == '[': if obj is not None: m.commit(obj) obj = smap[x]() continue if obj is None: raise ValueError, 'Bad state' obj.line(x) if obj is not None: m.commit(obj) print 'Active ARFCNs:' x = m.arfcns.keys() x.sort() for i in x: print ' %4d:'%i, ','.join(m.arfcns[i]) print print 'Active Cells:' x = m.cells.keys() x.sort() for i in x: print ' 0x%.4x'%i, ','.join(m.cells[i]) printdef main(argv): if len(argv) > 1: infile = open(argv[1]) else: from sys import stdin infile = stdin
rf_map(infile) return 0if __name__ == '__main__': from sys import argv raise SystemExit, main(argv)