2 # -*- coding: utf-8 -*-
3 ## This program is free software; you can redistribute it and/or modify
4 ## it under the terms of the GNU General Public License as published
5 ## by the Free Software Foundation; version 2 and higer.
7 ## Guseynov Alexey (kibergus bark-bark gmail.com) 2010
11 from subprocess import *
17 if len(sys.argv) != 2 and len(sys.argv) != 3:
18 print "Usage: ussdquery.py <ussd number> [<language>]\nAllowed languages: German, English, Italian, French, Spanish, Dutch, Swedish, Danish, Portuguese, Finnish, Norwegian, Greek, Turkish, Reserved1, Reserved2, Unspecified"
22 if len(sys.argv) == 3:
23 if sys.argv[2] == "German":
25 elif sys.argv[2] == "English":
27 elif sys.argv[2] == "Italian":
29 elif sys.argv[2] == "French":
31 elif sys.argv[2] == "Spanish":
33 elif sys.argv[2] == "Dutch":
35 elif sys.argv[2] == "Swedish":
37 elif sys.argv[2] == "Danish":
39 elif sys.argv[2] == "Portuguese":
41 elif sys.argv[2] == "Finnish":
43 elif sys.argv[2] == "Norwegian":
45 elif sys.argv[2] == "Greek":
47 elif sys.argv[2] == "Turkish":
49 elif sys.argv[2] == "Reserved1":
51 elif sys.argv[2] == "Reserved2":
53 elif sys.argv[2] == "Unspecified":
56 print >> sys.stderr, "Language unknown, falling back to unspecified."
58 # We have only one modem, simultaneous acces wouldn't bring anything good
59 lockf = open("/tmp/ussdquery.lock", 'a')
60 fcntl.flock(lockf,fcntl.LOCK_EX)
62 # Operations should timeout in 30 seconds.
63 # I'm not shure, that readline uses timeouts
67 while response != "OK" and retry > 0 :
69 # OK response should be recieved shortly
70 child = pexpect.spawn('pnatd', [], 2)
73 # Read our "at" command
76 response = child.readline().strip()
77 except pexpect.TIMEOUT:
86 print >> sys.stderr, "Couldn't init modem."
89 fcntl.flock(lockf,fcntl.LOCK_UN)
96 child.send('at+cusd=1,"'+(sys.argv[1])+'",'+str(language)+'\r')
97 # Read our query echoed back
100 #Read and parse reply
101 replystring = child.readline().decode('string_escape')
102 except pexpect.TIMEOUT:
103 print >> sys.stderr, "Timeout. Modem didn't reply."
105 fcntl.flock(lockf,fcntl.LOCK_UN)
110 fcntl.flock(lockf,fcntl.LOCK_UN)
113 #replystring = "+CUSD: 0,\"OCTATOK 165.65 p.\n 3BOHu 333! HOBbIu PA3DEL: ХuT-nAPAD MY3bIKu (3p. MuHYTA)\",1"
115 if replystring.strip() == "ERROR" :
116 print >> sys.stderr, "Modem returned ERROR. Query not executed."
120 reresult = re.match("(?s)^\\+CUSD: \\d+,\"(.*)\",(\\d+)$", replystring.strip())
121 reply = reresult.group(1)
122 encoding = reresult.group(2)
124 print >> sys.stderr, "Couldn't parse modem answer."
128 reply = gsmdecode.decode(reply, int(encoding))