def __init__(self, host, port, keepalive=True, debug=True): if isinstance(port, str): port = int(port) self.host=host self.port=port self._socket=None self._socket_lock=threading.Lock() self.state=self.CLOSED self.outseq=0 self.debug=debug self._connect() self._keepalive_thread = None if keepalive: self._keepalive_thread = SMPPKeepAlive(self) self._keepalive_thread.start()
class SMPP: """A Limited Synchronous SMPP API designed for ease of use""" CLOSED=0 OPEN=1 BOUND_TX=2 BOUND_RX=3 BOUND_TRX=4 BIND_TX=BOUND_TX BIND_RX=BOUND_RX BIND_TRX=BOUND_TRX def __init__(self, host, port, keepalive=True, debug=True): if isinstance(port, str): port = int(port) self.host=host self.port=port self._socket=None self._socket_lock=threading.Lock() self.state=self.CLOSED self.outseq=0 self.debug=debug self._connect() self._keepalive_thread = None if keepalive: self._keepalive_thread = SMPPKeepAlive(self) self._keepalive_thread.start() def _keepalive(self): ret = None if self.state >= self.BOUND_TX: if self.debug: print "Sending keepalive" ret = self.enquire_link() return ret def _takesocket(self): self._socket_lock.acquire() # We have the lock now return self._socket def _releasesocket(self): self._socket_lock.release() sleep(0.0001) # Yield to thread scheduler return None def _disconnect(self): if self.state >= self.BOUND_TX: self._unbind() self._socket.close() self.state=self.CLOSED def _connect(self): if not self.state == self.CLOSED: raise SMPPException("Attempting to connect out of turn!") self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) self._socket.settimeout(30.0) try: self._socket.connect((self.host, self.port)) except socket.error: raise state=self.OPEN def _send_raw(self, data): # Verify state is sane (socket open, and we're bound) sock = self._takesocket() # It'll be released by _sock_read if self.debug: cmd = unpack("!L", data[4:8])[0] print "Sending %s.." % (command_b2a[cmd]) if self.debug: print ">> %s" % b2a_hex(data) try: sock.sendall(data) except Exception, e: if self.debug: print "Got error writing to socket, reconnecting" oldstate = self.state self.state = self.CLOSED self._connect() sock = self._releasesocket() self.rebind(oldstate) raise return sock