import dbus ############################################################################################ """ HERE IS THE VERY EVIL PART OF THE CODE! DON'T TOUCH! WILL PROBABLY MESS THE PHONE!!!!""" def octify(str): ''' Returns a list of octet bytes representing each char of the input str. ''' bytes = map(ord, str) bitsconsumed = 0 referencebit = 7 octets = [] while len(bytes): byte = bytes.pop(0) byte = byte >> bitsconsumed try: nextbyte = bytes[0] bitstocopy = (nextbyte & (0xff >> referencebit)) << referencebit octet = (byte | bitstocopy) except: octet = (byte | 0x00) if bitsconsumed != 7: octets.append(byte | bitstocopy) bitsconsumed += 1 referencebit -= 1 else: bitsconsumed = 0 referencebit = 7 return octets def semi_octify(str): ''' Expects a string containing two digits. Returns an octet - first nibble in the octect is the first digit and the second nibble represents the second digit. ''' try: digit_1 = int(str[0]) digit_2 = int(str[1]) octet = (digit_2 << 4) | digit_1 except: octet = (1 << 4) | digit_1 return octet def deoctify(arr): referencebit = 1 doctect = [] bnext = 0x00 for i in arr: bcurr = ((i & (0xff >> referencebit)) << referencebit) >> 1 bcurr = bcurr | bnext if referencebit != 7: doctect.append( bcurr ) bnext = (i & (0xff << (8 - referencebit)) ) >> 8 - referencebit referencebit += 1 else: doctect.append( bcurr ) bnext = (i & (0xff << (8 - referencebit)) ) >> 8 - referencebit doctect.append( bnext ) bnext = 0x00 referencebit = 1 return ''.join([chr(i) for i in doctect]) def createPDUmessage(number, msg): ''' Returns a list of bytes to represent a valid PDU message ''' numlength = len(number) if (numlength % 2) == 0: rangelength = numlength else: number = number + 'F' rangelength = len(number) octifiednumber = [ semi_octify(number[i:i+2]) for i in range(0,rangelength,2) ] octifiedmsg = octify(msg) HEADER = 1 FIRSTOCTETOFSMSDELIVERMSG = 10 ADDR_TYPE = 129 #unknown format number_length = len(number) msg_length = len(msg) pdu_message = [HEADER, FIRSTOCTETOFSMSDELIVERMSG, number_length, ADDR_TYPE] pdu_message.extend(octifiednumber) pdu_message.append(0) pdu_message.append(0) pdu_message.append(msg_length) pdu_message.extend(octifiedmsg) return pdu_message ################################################### """ VERY EVIL PART OVER, NOW TO THE NORMAL PART """ class Messager(object): """ @summary: This is the Messager class, that handles sending SMS messages """ def __init__(self): """ @summary: The Constructor, initializes the dbus """ self.bus = dbus.SystemBus() self.smsobject = self.bus.get_object('com.nokia.phone.SMS', '/com/nokia/phone/SMS/ba212ae1') self.smsiface = dbus.Interface(self.smsobject, 'com.nokia.csd.SMS.Outgoing') def Send(self, message, number): """ @summary: The Send function, that actually sends the given message @param message: The message to be sent @type message: String @param number: The number to send the message to (can be with country code also) @type number: String """ arr = dbus.Array(createPDUmessage(number.replace('+', '00'), message)) msg = dbus.Array([arr]) self.smsiface.Send(msg, '') if __name__ == "__main__": messager = Messager() messager.Send("Hello man, testing", "0400558160")