예제 #1
0
	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
예제 #2
0
	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 }
예제 #3
0
	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)
예제 #4
0
	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)