def bind(self, bind_type, user, passw, desc): """Bind as receiver, transmitter, or tranceiver""" command = None tostate = None if self.state >= self.BOUND_TX: raise SMPPException("Already bound!") if bind_type == self.BIND_TX: command = 'bind_transmitter' tostate = self.BOUND_TX elif bind_type == self.BIND_RX: command = 'bind_receiver' tostate = self.BOUND_RX elif bind_type == self.BINT_TRX: command = 'bind_transceiver' tostate = self.BOUND_TRX if not command: raise SMPPException("Unknown bind type") params = SMPPParameters(command, system_id = user, password = passw, system_type = desc) seq=self._get_outseq() header = SMPPHeader(length = params.length(), command = command, seq = seq) pdu = "%s%s" % (header, params) sock = self._send_raw(a2b_hex(pdu)) (rheader, rparams) = self._read_resp(sock, response_a2b[command], seq) if not rheader.status == SMPPError.ESME_ROK: raise SMPPException(SMPPError(rheader.status)) self.state = tostate self.bind_params = params self.bindtype = command
def send_ota(self, wbxml, sender, recipient): """Wrapper for data_sm""" success = False if isinstance(sender, str): sender = SMPPAddress(sender) if isinstance(recipient, str): recipient = SMPPAddress(recipient) params = SMPPParameters(DATA_SM, source = sender, \ destination = recipient, \ esm_class = 0x02, \ data_coding = 0x04) params.add_optional(message_payload = a2b_hex(wbxml), \ source_port = 2948, \ destination_port = 2948) (rheader, rparams) = self.data_sm(params) if rheader.status == SMPPError.ESME_ROK: return { 'error': 0, 'success': 1, 'msg': 'Success' } else: message = "%s" % SMPPError(rheader.status) optionals = rparams.get_optionals() if len(optionals) > 0: message = "status: '%s', delivery_failure_reason: '%.2X', network_error_code: '%.6X', additional_status_info_text: '%s', dpf_result: '%.2X'" % (SMPPError(rheader.status), optionals.get(SMPPParameters.OPT_DELIVERY_FAILURE_REASON, ""), optionals.get(SMPPParameters.OPT_NETWORK_ERROR_CODE, ""), optionals.get(SMPPParameters.OPT_ADDITIONAL_STATUS_INFO_TEXT, ""), optionals.get(SMPPParameters.OPT_DPF_RESULT, "")) return { 'error': 1, 'success': 0, 'msg': message }
def _read_resp(self, sock, expect_cmd, expect_seq): rawpdu = "" if self.debug: print "Waiting for %s response" % response_b2a[expect_cmd] while len(rawpdu) < 4: rawpdu += self._sock_read(sock, 4-len(rawpdu)) # Get the length length = unpack('!L', rawpdu)[0] left = length - 4 # We've already read 4 bytes of the PDU tries = 10 while left > 0 and tries > 0: buf = self._sock_read(sock, left) left -= len(buf) rawpdu += buf tries -= 1 if not len(rawpdu) == length: raise SMPPException("Error in reading response for %s" % response_b2a[expect_cmd]) sock = self._releasesocket() # Acquired by _send_raw if self.debug: print "<< %s" % b2a_hex(rawpdu) header = SMPPHeader(pdu = rawpdu[0:16]) params = None if header.length > 16: params = SMPPParameters(header.command, pdu = rawpdu[16:]) if self.debug and header.command == GENERIC_NACK_RESP: print "Got a generic NACK. Our request was probably malformed!" if not header.command == expect_cmd: raise SMPPException("Received %s response out of turn", response_b2a[command]) if not header.seq == expect_seq: raise SMPPException("Received a reply I didn't expect. Expected seq: %d, but got %d" % (expect_seq, header.seq)) if self.debug: print "%s response: %s" % (response_b2a[expect_cmd], SMPPError(header.status)) return (header, params)
def _read_cmd(self): rawpdu = "" while len(rawpdu) < 4: if self.debug: print "Waiting for command.." sock = self._takesocket() rawpdu += self._sock_read(sock, 4-len(rawpdu)) # Get the length print rawpdu sock = self._releasesocket() # Acquired earlier length = unpack('!L', rawpdu)[0] left = length - len(rawpdu) # We've already read 4 bytes of the PDU if self.debug: print "We've got %d more bytes to read.." % left tries = 10 while left > 0 and tries > 0: sock = self._takesocket() buf = self._sock_read(sock, left) sock = self._releasesocket() # Acquired earlier left -= len(buf) rawpdu += buf tries -= 1 if not len(rawpdu) == length: raise SMPPException("Error in reading command, got %d octets, expected %d" % (len(rawpdu), length)) if self.debug: print "<< %s" % b2a_hex(rawpdu) header = SMPPHeader(pdu = rawpdu[0:16]) params = None if len(rawpdu) > 16: params = SMPPParameters(header.command, pdu = rawpdu[16:]) if self.debug: print "Got command %s" % command_b2a[header.command] return (header, params)