1 """ Copyright (C) 2010-2011 ST-Ericsson SA """
3 """ Author: Szymon Janc <szymon.janc@tieto.com> for ST-Ericsson. """
5 """ This program is free software; you can redistribute it and/or modify """
6 """ it under the terms of the GNU General Public License as published by """
7 """ the Free Software Foundation; either version 2 of the License, or """
8 """ (at your option) any later version. """
10 """ This program is distributed in the hope that it will be useful, """
11 """ but WITHOUT ANY WARRANTY; without even the implied warranty of """
12 """ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the """
13 """ GNU General Public License for more details. """
15 """ You should have received a copy of the GNU General Public License """
16 """ along with this program; if not, write to the Free Software """
17 """ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """
19 from array import array
20 from bluetooth import *
25 """ SAP Parameter Class """
28 ConnectionStatus = 0x01
30 DisconnectionType = 0x03
34 CardReaderStatus = 0x07
36 TransportProtocol = 0x09
37 CommandAPDU7816 = 0x10
39 def __init__(self, name, id, value = None):
44 def _padding(self, buf):
46 while ( (len(buf) + len(pad)) % 4 ) != 0:
50 def _basicCheck(self, buf):
51 if len(buf) < 4 or (len(buf) % 4) != 0 or buf[1] != 0:
55 plen = buf[2] * 256 + buf[3] + 4
72 return "%s(id=0x%.2X), value=%s \n" % (self.name, self.id, self.value)
75 a = array('B', '\00\00\00\00')
81 a.extend(self._padding(a))
84 def deserialize(self, buf):
85 p = self._basicCheck(buf)
93 class SAPParam_MaxMsgSize(SAPParam):
94 """MaxMsgSize Param """
96 def __init__(self, value = None):
97 SAPParam.__init__(self,"MaxMsgSize", SAPParam.MaxMsgSize, value)
100 def __validate(self):
101 if self.value > 0xFFFF:
105 a = array('B', '\00\00\00\00')
108 a.append(self.value / 256)
109 a.append(self.value % 256)
110 a.extend(self._padding(a))
113 def deserialize(self, buf):
114 p = self._basicCheck(buf)
117 self.value = buf[4] * 256 + buf[5]
120 class SAPParam_CommandAPDU(SAPParam):
121 def __init__(self, value = None):
123 SAPParam.__init__(self, "CommandAPDU", SAPParam.CommandAPDU, array('B'))
125 SAPParam.__init__(self, "CommandAPDU", SAPParam.CommandAPDU, array('B', value))
128 a = array('B', '\00\00\00\00')
130 plen = len(self.value)
134 a.extend(self._padding(a))
137 def deserialize(self, buf):
138 p = self._basicCheck(buf)
141 self.value = buf[4:p[0]]
144 class SAPParam_ResponseAPDU(SAPParam_CommandAPDU):
145 """ResponseAPDU Param """
147 def __init__(self, value = None):
149 SAPParam.__init__(self, "ResponseAPDU", SAPParam.ResponseAPDU, array('B'))
151 SAPParam.__init__(self, "ResponseAPDU", SAPParam.ResponseAPDU, array('B', value))
153 class SAPParam_ATR(SAPParam_CommandAPDU):
156 def __init__(self, value = None):
158 SAPParam.__init__(self, "ATR", SAPParam.ATR, array('B'))
160 SAPParam.__init__(self, "ATR", SAPParam.ATR, array('B', value))
162 class SAPParam_CommandAPDU7816(SAPParam_CommandAPDU):
163 """Command APDU7816 Param."""
165 def __init__(self, value = None):
167 SAPParam.__init__(self, "CommandAPDU7816", SAPParam.CommandAPDU7816, array('B'))
169 SAPParam.__init__(self, "CommandAPDU7816", SAPParam.CommandAPDU7816, array('B', value))
172 class SAPParam_ConnectionStatus(SAPParam):
173 """Connection status Param."""
175 def __init__(self, value = None):
176 SAPParam.__init__(self,"ConnectionStatus", SAPParam.ConnectionStatus, value)
179 def __validate(self):
180 if self.value is not None and self.value not in (0x00, 0x01, 0x02, 0x03, 0x04):
181 print "Warning. ConnectionStatus value in reserved range (0x%x)" % self.value
183 def deserialize(self, buf):
184 ret = SAPParam.deserialize(self, buf)
190 class SAPParam_ResultCode(SAPParam):
191 """ Result Code Param """
193 def __init__(self, value = None):
194 SAPParam.__init__(self,"ResultCode", SAPParam.ResultCode, value)
197 def __validate(self):
198 if self.value is not None and self.value not in (0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07):
199 print "Warning. ResultCode value in reserved range (0x%x)" % self.value
201 def deserialize(self, buf):
202 ret = SAPParam.deserialize(self, buf)
208 class SAPParam_DisconnectionType(SAPParam):
209 """Disconnection Type Param."""
211 def __init__(self, value = None):
212 SAPParam.__init__(self,"DisconnectionType", SAPParam.DisconnectionType, value)
215 def __validate(self):
216 if self.value is not None and self.value not in (0x00, 0x01):
217 print "Warning. DisconnectionType value in reserved range (0x%x)" % self.value
219 def deserialize(self, buf):
220 ret = SAPParam.deserialize(self, buf)
226 class SAPParam_CardReaderStatus(SAPParam_CommandAPDU):
227 """Card reader Status Param."""
229 def __init__(self, value = None):
231 SAPParam.__init__(self, "CardReaderStatus", SAPParam.CardReaderStatus, array('B'))
233 SAPParam.__init__(self, "CardReaderStatus", SAPParam.CardReaderStatus, array('B', value))
235 class SAPParam_StatusChange(SAPParam):
236 """Status Change Param """
238 def __init__(self, value = None):
239 SAPParam.__init__(self,"StatusChange", SAPParam.StatusChange, value)
241 def __validate(self):
242 if self.value is not None and self.value not in (0x00, 0x01, 0x02, 0x03, 0x04, 0x05):
243 print "Warning. StatusChange value in reserved range (0x%x)" % self.value
245 def deserialize(self, buf):
246 ret = SAPParam.deserialize(self, buf)
252 class SAPParam_TransportProtocol(SAPParam):
253 """Transport Protocol Param """
255 def __init__(self, value = None):
256 SAPParam.__init__(self,"TransportProtocol", SAPParam.TransportProtocol, value)
259 def __validate(self):
260 if self.value is not None and self.value not in (0x00, 0x01):
261 print "Warning. TransportProtoco value in reserved range (0x%x)" % self.value
263 def deserialize(self, buf):
264 ret = SAPParam.deserialize(self, buf)
274 DISCONNECT_REQ = 0x02
275 DISCONNECT_RESP =0x03
276 DISCONNECT_IND = 0x04
277 TRANSFER_APDU_REQ = 0x05
278 TRANSFER_APDU_RESP = 0x06
279 TRANSFER_ATR_REQ = 0x07
280 TRANSFER_ATR_RESP = 0x08
281 POWER_SIM_OFF_REQ = 0x09
282 POWER_SIM_OFF_RESP = 0x0A
283 POWER_SIM_ON_REQ = 0x0B
284 POWER_SIM_ON_RESP = 0x0C
286 RESET_SIM_RESP = 0x0E
287 TRANSFER_CARD_READER_STATUS_REQ = 0x0F
288 TRANSFER_CARD_READER_STATUS_RESP = 0x10
291 SET_TRANSPORT_PROTOCOL_REQ = 0x13
292 SET_TRANSPORT_PROTOCOL_RESP = 0x14
294 def __init__(self, name, id):
298 self.buf = array('B')
300 def _basicCheck(self, buf):
301 if len(buf) < 4 or (len(buf) % 4) != 0 :
304 if buf[0] != self.id:
312 def getContent(self):
313 s = "%s(id=0x%.2X) " % (self.name, self.id)
314 if len( self.buf): s = s + "[%s]" % re.sub("(.{2})", "0x\\1 " , self.buf.tostring().encode("hex").upper(), re.DOTALL)
316 for p in self.params:
317 s = s + "\t" + p.getContent()
323 def addParam(self, param):
324 self.params.append(param)
327 ret = array('B', '\00\00\00\00')
329 ret[1] = len(self.params)
330 ret[2] = 0 # reserved
331 ret[3] = 0 # reserved
332 for p in self.params:
333 ret.extend(p.serialize())
338 def deserialize(self, buf):
340 return len(buf) == 4 and buf[1] == 0 and self._basicCheck(buf)
343 class SAPMessage_CONNECT_REQ(SAPMessage):
344 def __init__(self, MaxMsgSize = None):
345 SAPMessage.__init__(self,"CONNECT_REQ", SAPMessage.CONNECT_REQ)
346 if MaxMsgSize is not None:
347 self.addParam(SAPParam_MaxMsgSize(MaxMsgSize))
350 if len(self.params) == 1:
351 if self.params[0].getID() == SAPParam.MaxMsgSize:
355 def deserialize(self, buf):
358 if SAPMessage._basicCheck(self, buf):
359 p = SAPParam_MaxMsgSize()
360 if p.deserialize(buf[4:]) == len(buf[4:]):
362 return self._validate()
366 class SAPMessage_CONNECT_RESP(SAPMessage):
367 def __init__(self, ConnectionStatus = None, MaxMsgSize = None):
368 SAPMessage.__init__(self,"CONNECT_RESP", SAPMessage.CONNECT_RESP)
369 if ConnectionStatus is not None:
370 self.addParam(SAPParam_ConnectionStatus(ConnectionStatus))
371 if MaxMsgSize is not None:
372 self.addParam(SAPParam_MaxMsgSize(MaxMsgSize))
375 if len(self.params) > 0:
376 if self.params[0] .getID() == SAPParam.ConnectionStatus:
377 if self.params[0].getValue() == 0x02:
378 if len(self.params) == 2:
381 if len(self.params) == 1:
385 def deserialize(self, buf):
389 if SAPMessage._basicCheck(self, buf):
390 p = SAPParam_ConnectionStatus()
391 r = p.deserialize(buf[4:])
395 p = SAPParam_MaxMsgSize()
396 r = p.deserialize(buf[4+r:])
400 return self._validate()
404 class SAPMessage_DISCONNECT_REQ(SAPMessage):
406 SAPMessage.__init__(self,"DISCONNECT_REQ", SAPMessage.DISCONNECT_REQ)
408 class SAPMessage_DISCONNECT_RESP(SAPMessage):
410 SAPMessage.__init__(self,"DISCONNECT_RESP", SAPMessage.DISCONNECT_RESP)
412 class SAPMessage_DISCONNECT_IND(SAPMessage):
413 def __init__(self, Type = None):
414 SAPMessage.__init__(self,"DISCONNECT_IND", SAPMessage.DISCONNECT_IND)
416 self.addParam(SAPParam_DisconnectionType(Type))
419 if len(self.params) == 1:
420 if self.params[0].getID() == SAPParam.DisconnectionType:
424 def deserialize(self, buf):
427 if SAPMessage._basicCheck(self, buf):
428 p = SAPParam_DisconnectionType()
429 if p.deserialize(buf[4:]) == len(buf[4:]):
431 return self._validate()
436 class SAPMessage_TRANSFER_APDU_REQ(SAPMessage):
437 def __init__(self, APDU = None, T = False):
438 SAPMessage.__init__(self,"TRANSFER_APDU_REQ", SAPMessage.TRANSFER_APDU_REQ)
441 self.addParam(SAPParam_CommandAPDU(APDU))
443 self.addParam(SAPParam_CommandAPDU7816(APDU))
446 if len(self.params) == 1:
447 if self.params[0].getID() == SAPParam.CommandAPDU or self.params[0].getID() == SAPParam.CommandAPDU7816:
451 def deserialize(self, buf):
454 if SAPMessage._basicCheck(self, buf):
456 p = SAPParam_CommandAPDU()
457 p2 = SAPParam_CommandAPDU7816()
458 if p.deserialize(buf[4:]) == len(buf[4:]):
460 return self._validate()
461 elif p2.deserialize(buf[4:]) == len(buf[4:]):
463 return self._validate()
467 class SAPMessage_TRANSFER_APDU_RESP(SAPMessage):
468 def __init__(self, ResultCode = None, Response = None):
469 SAPMessage.__init__(self,"TRANSFER_APDU_RESP", SAPMessage.TRANSFER_APDU_RESP)
470 if ResultCode is not None:
471 self.addParam(SAPParam_ResultCode(ResultCode))
472 if Response is not None:
473 self.addParam(SAPParam_ResponseAPDU(Response))
476 if len(self.params) > 0:
477 if self.params[0] .getID() == SAPParam.ResultCode:
478 if self.params[0].getValue() == 0x00:
479 if len(self.params) == 2:
482 if len(self.params) == 1:
486 def deserialize(self, buf):
490 if SAPMessage._basicCheck(self, buf):
491 p = SAPParam_ResultCode()
492 r = p.deserialize(buf[4:])
496 p = SAPParam_ResponseAPDU()
497 r = p.deserialize(buf[4+r:])
501 return self._validate()
505 class SAPMessage_TRANSFER_ATR_REQ(SAPMessage):
507 SAPMessage.__init__(self,"TRANSFER_ATR_REQ", SAPMessage.TRANSFER_ATR_REQ)
509 class SAPMessage_TRANSFER_ATR_RESP(SAPMessage):
510 def __init__(self, ResultCode = None, ATR = None):
511 SAPMessage.__init__(self,"TRANSFER_ATR_RESP", SAPMessage.TRANSFER_ATR_RESP)
512 if ResultCode is not None:
513 self.addParam(SAPParam_ResultCode(ResultCode))
515 self.addParam(SAPParam_ATR(ATR))
518 if len(self.params) > 0:
519 if self.params[0] .getID() == SAPParam.ResultCode:
520 if self.params[0].getValue() == 0x00:
521 if len(self.params) == 2:
524 if len(self.params) == 1:
528 def deserialize(self, buf):
532 if SAPMessage._basicCheck(self, buf):
534 p = SAPParam_ResultCode()
535 r = p.deserialize(buf[4:])
543 r = p.deserialize(buf[4+r:])
547 return self._validate()
551 class SAPMessage_POWER_SIM_OFF_REQ(SAPMessage):
553 SAPMessage.__init__(self,"POWER_SIM_OFF_REQ", SAPMessage.POWER_SIM_OFF_REQ)
555 class SAPMessage_POWER_SIM_OFF_RESP(SAPMessage):
556 def __init__(self, ResultCode = None):
557 SAPMessage.__init__(self,"POWER_SIM_OFF_RESP", SAPMessage.POWER_SIM_OFF_RESP)
558 if ResultCode is not None:
559 self.addParam(SAPParam_ResultCode(ResultCode))
562 if len(self.params) == 1:
563 if self.params[0].getID() == SAPParam.ResultCode:
567 def deserialize(self, buf):
570 if SAPMessage._basicCheck(self, buf):
571 p = SAPParam_ResultCode()
572 if p.deserialize(buf[4:]) == len(buf[4:]):
574 return self._validate()
578 class SAPMessage_POWER_SIM_ON_REQ(SAPMessage):
580 SAPMessage.__init__(self,"POWER_SIM_ON_REQ", SAPMessage.POWER_SIM_ON_REQ)
582 class SAPMessage_POWER_SIM_ON_RESP(SAPMessage_POWER_SIM_OFF_RESP):
583 def __init__(self, ResultCode = None):
584 SAPMessage.__init__(self,"POWER_SIM_ON_RESP", SAPMessage.POWER_SIM_ON_RESP)
585 if ResultCode is not None:
586 self.addParam(SAPParam_ResultCode(ResultCode))
588 class SAPMessage_RESET_SIM_REQ(SAPMessage):
590 SAPMessage.__init__(self,"RESET_SIM_REQ", SAPMessage.RESET_SIM_REQ)
592 class SAPMessage_RESET_SIM_RESP(SAPMessage_POWER_SIM_OFF_RESP):
593 def __init__(self, ResultCode = None):
594 SAPMessage.__init__(self,"RESET_SIM_RESP", SAPMessage.RESET_SIM_RESP)
595 if ResultCode is not None:
596 self.addParam(SAPParam_ResultCode(ResultCode))
598 class SAPMessage_STATUS_IND(SAPMessage):
599 def __init__(self, StatusChange = None):
600 SAPMessage.__init__(self,"STATUS_IND", SAPMessage.STATUS_IND)
601 if StatusChange is not None:
602 self.addParam(SAPParam_StatusChange(StatusChange))
605 if len(self.params) == 1:
606 if self.params[0].getID() == SAPParam.StatusChange:
610 def deserialize(self, buf):
613 if SAPMessage._basicCheck(self, buf):
614 p = SAPParam_StatusChange()
615 if p.deserialize(buf[4:]) == len(buf[4:]):
617 return self._validate()
621 class SAPMessage_TRANSFER_CARD_READER_STATUS_REQ(SAPMessage):
623 SAPMessage.__init__(self,"TRANSFER_CARD_READER_STATUS_REQ", SAPMessage.TRANSFER_CARD_READER_STATUS_REQ)
625 class SAPMessage_TRANSFER_CARD_READER_STATUS_RESP(SAPMessage):
626 def __init__(self, ResultCode = None, Status = None):
627 SAPMessage.__init__(self,"TRANSFER_CARD_READER_STATUS_RESP", SAPMessage.TRANSFER_CARD_READER_STATUS_RESP)
628 if ResultCode is not None:
629 self.addParam(SAPParam_ResultCode(ResultCode))
630 if Status is not None:
631 self.addParam(SAPParam_CardReaderStatus(Status))
634 if len(self.params) > 0:
635 if self.params[0] .getID() == SAPParam.ResultCode:
636 if self.params[0].getValue() == 0x00:
637 if len(self.params) == 2:
640 if len(self.params) == 1:
644 def deserialize(self, buf):
648 if SAPMessage._basicCheck(self, buf):
649 p = SAPParam_ResultCode()
650 r = p.deserialize(buf[4:])
654 p = SAPParam_CardReaderStatus()
655 r = p.deserialize(buf[4+r:])
659 return self._validate()
663 class SAPMessage_ERROR_RESP(SAPMessage):
665 SAPMessage.__init__(self,"ERROR_RESP", SAPMessage.ERROR_RESP)
668 class SAPMessage_SET_TRANSPORT_PROTOCOL_REQ(SAPMessage):
669 def __init__(self, protocol = None):
670 SAPMessage.__init__(self,"SET_TRANSPORT_PROTOCOL_REQ", SAPMessage.SET_TRANSPORT_PROTOCOL_REQ)
671 if protocol is not None:
672 self.addParam(SAPParam_TransportProtocol(protocol))
675 if len(self.params) == 1:
676 if self.params[0].getID() == SAPParam.TransportProtocol:
680 def deserialize(self, buf):
683 if SAPMessage._basicCheck(self, buf):
684 p = SAPParam_TransportProtocol()
685 if p.deserialize(buf[4:]) == len(buf[4:]):
687 return self._validate()
691 class SAPMessage_SET_TRANSPORT_PROTOCOL_RESP(SAPMessage_POWER_SIM_OFF_RESP):
692 def __init__(self, ResultCode = None):
693 SAPMessage.__init__(self,"SET_TRANSPORT_PROTOCOL_RESP", SAPMessage.SET_TRANSPORT_PROTOCOL_RESP)
694 if ResultCode is not None:
695 self.addParam(SAPParam_ResultCode(ResultCode))
703 uuid = "0000112D-0000-1000-8000-00805F9B34FB"
708 def __init__(self, host = None, port = None):
711 if host is None or is_valid_address(host):
714 raise BluetoothError ("%s is not a valid BT address." % host)
723 self.__connectRFCOMM()
726 self.__disconnectRFCOMM()
728 def __disconnectRFCOMM(self):
729 if self.sock is not None:
731 self.state = self.DISCONNECTED
733 def __discover(self):
734 service_matches = find_service(self.uuid, self.host)
736 if len(service_matches) == 0:
737 raise BluetoothError ("No SAP service found")
740 first_match = service_matches[0]
741 self.port = first_match["port"]
742 self.host = first_match["host"]
744 print "SAP Service found on %s(%s)" % first_match["name"] % self.host
746 def __connectRFCOMM(self):
747 self.sock=BluetoothSocket( RFCOMM )
748 self.sock.connect((self.host, self.port))
749 self.sock.settimeout(self.timeout)
750 self.state = self.CONNECTED
752 def __sendMsg(self, msg):
753 if isinstance(msg, SAPMessage):
755 print "\tTX: " + msg.getContent()
756 return self.sock.send(s.tostring())
758 def __rcvMsg(self, msg):
759 if isinstance(msg, SAPMessage):
760 print "\tRX Wait: %s(id = 0x%.2x)" % (msg.name, msg.id)
761 data = self.sock.recv(self.bufsize)
763 if msg.deserialize(array('B',data)):
764 print "\tRX: len(%d) %s" % (len(data), msg.getContent())
767 print "msg: %s" % array('B',data)
768 raise BluetoothError ("Message deserialization failed.")
770 raise BluetoothError ("Timeout. No data received.")
773 self.__connectRFCOMM()
775 def disconnect(self):
776 self.__disconnectRFCOMM()
778 def isConnected(self):
781 def proc_connect(self):
783 self.__sendMsg(SAPMessage_CONNECT_REQ(self.bufsize))
784 params = self.__rcvMsg(SAPMessage_CONNECT_RESP()).getParams()
786 if params[0].getValue() in (0x00, 0x04):
788 elif params[0].getValue() == 0x02:
789 self.bufsize = params[1].getValue()
791 self.__sendMsg(SAPMessage_CONNECT_REQ(self.bufsize))
792 params = self.__rcvMsg(SAPMessage_CONNECT_RESP()).getParams()
794 if params[0].getValue() not in (0x00, 0x04):
799 params = self.__rcvMsg(SAPMessage_STATUS_IND()).getParams()
800 if params[0].getValue() == 0x00:
802 elif params[0].getValue() == 0x01:
804 return self.proc_transferATR()
805 elif params[0].getValue() == 0x02:
806 """T0 not supported"""
807 if self.proc_transferATR():
808 return self.proc_setTransportProtocol(1)
813 except BluetoothError , e:
814 print "Error. " +str(e)
817 def proc_disconnectByClient(self, timeout=0):
819 self.__sendMsg(SAPMessage_DISCONNECT_REQ())
820 self.__rcvMsg(SAPMessage_DISCONNECT_RESP())
821 time.sleep(timeout) # let srv to close rfcomm
822 self.__disconnectRFCOMM()
824 except BluetoothError , e:
825 print "Error. " +str(e)
828 def proc_disconnectByServer(self, timeout=0):
830 params = self.__rcvMsg(SAPMessage_DISCONNECT_IND()).getParams()
833 if params[0].getValue() == 0x00:
834 if not self.proc_transferAPDU():
837 return self.proc_disconnectByClient(timeout)
839 except BluetoothError , e:
840 print "Error. " +str(e)
843 def proc_transferAPDU(self, apdu = "Sample APDU command"):
845 self.__sendMsg(SAPMessage_TRANSFER_APDU_REQ(apdu))
846 params = self.__rcvMsg(SAPMessage_TRANSFER_APDU_RESP()).getParams()
848 except BluetoothError , e:
849 print "Error. " +str(e)
852 def proc_transferATR(self):
854 self.__sendMsg(SAPMessage_TRANSFER_ATR_REQ())
855 params = self.__rcvMsg(SAPMessage_TRANSFER_ATR_RESP()).getParams()
857 except BluetoothError , e:
858 print "Error. " +str(e)
861 def proc_powerSimOff(self):
863 self.__sendMsg(SAPMessage_POWER_SIM_OFF_REQ())
864 params = self.__rcvMsg(SAPMessage_POWER_SIM_OFF_RESP()).getParams()
866 except BluetoothError , e:
867 print "Error. " +str(e)
870 def proc_powerSimOn(self):
872 self.__sendMsg(SAPMessage_POWER_SIM_ON_REQ())
873 params = self.__rcvMsg(SAPMessage_POWER_SIM_ON_RESP()).getParams()
874 if params[0].getValue() == 0x00:
875 return self.proc_transferATR()
878 except BluetoothError , e:
879 print "Error. " +str(e)
882 def proc_resetSim(self):
884 self.__sendMsg(SAPMessage_RESET_SIM_REQ())
885 params = self.__rcvMsg(SAPMessage_RESET_SIM_RESP()).getParams()
886 if params[0].getValue() == 0x00:
887 return self.proc_transferATR()
890 except BluetoothError , e:
891 print "Error. " +str(e)
894 def proc_reportStatus(self):
896 params = self.__rcvMsg(SAPMessage_STATUS_IND()).getParams()
897 except BluetoothError , e:
898 print "Error. " +str(e)
901 def proc_transferCardReaderStatus(self):
903 self.__sendMsg(SAPMessage_TRANSFER_CARD_READER_STATUS_REQ())
904 params = self.__rcvMsg(SAPMessage_TRANSFER_CARD_READER_STATUS_RESP()).getParams()
905 except BluetoothError , e:
906 print "Error. " +str(e)
909 def proc_errorResponse(self):
911 """ send malformed message, no mandatory maxmsgsize parameter"""
912 self.__sendMsg(SAPMessage_CONNECT_REQ())
914 params = self.__rcvMsg(SAPMessage_ERROR_RESP()).getParams()
915 except BluetoothError , e:
916 print "Error. " +str(e)
919 def proc_setTransportProtocol(self, protocol = 0):
921 self.__sendMsg(SAPMessage_SET_TRANSPORT_PROTOCOL_REQ(protocol))
922 params = self.__rcvMsg(SAPMessage_SET_TRANSPORT_PROTOCOL_RESP()).getParams()
924 if params[0].getValue() == 0x00:
925 params = self.__rcvMsg(SAPMessage_STATUS_IND()).getParams()
926 if params[0].getValue() in (0x01, 0x02):
927 return self.proc_transferATR()
930 """return False ???"""
931 elif params[0].getValue == 0x07:
934 """return False ???"""
938 except BluetoothError , e:
939 print "Error. " +str(e)
942 if __name__ == "__main__":