Public Class Smsencoder # Region "enums"
Public enum enum_tp_vpf relative_format = 16 'b4 = 1 b3 = 0 end enum
Public enum_tp_sri request_sms_report = 32 NO_SMS_REPORT = 0 END ENUM
Public enum_tp_dcs defaultalphabet = 0 ucs2 = 8 ENUM
Public enum_tp_valid_period oneHOUR = 11 '0 to 143: (TP-VP 1) * 5min threeours = 29 Sixhours = 71 TwelveHours = 143 OneDay = 167 Oneweek = 196 maximum = 255 END ENUM
#End region
#Region "Private Data" Protected SC_Number As String 'Note the plus! Protected TP_MTI As Byte = 1 Protected TP_RD As Byte = 0 Protected TP_VPF As Byte = 16 Protected TP_UDHI As Byte Protected TP_SRR As Byte Protected TP_MR As Integer Protected TP_DA As String Protected TP_PID AS BYTE PROTECTED TP_DCS AS BYTE PROTECTED TP_VP AS BYTE PROTECTED TP_UDL AS INTEGER Protected TP_UD AS STERED # end region # Region "Properties"
Public Property ServiceCenterNumber () As String Get Return SC_Number End Get Set (ByVal Value As String) 'Convert an ServiceCenterNumber to PDU Code If InStr (Value, " ") Then SC_Number = "91" Else SC_Number = "81" End If
Value = MID (Value, 2) DIM I as integer if (Value.Length Mod 2) = 1 Then Value = "f" end if for i = 1 to value.Length Step 2 sc_number = swap (Value, I, 2)) Next sc_number = bytetohex ((sc_number.length - 2) / 2 1) SC_Number End Sendnd Property
Public property TP_STATUS_REPORT_REQUEST () AS ENUM_TP_SRI GET RETURN TP_SRR END GET Set (Byval Value As Enum_TP_SRI) TP_SRR = VALUE END SET End Property
Public property TP_MESSAGE_REGERENCE () AS INTEGER GET RETURN TP_MR END GET SEGER TP_MR = VALUE End Set End Property
Public property TP_DESTINATION_ADDRESS () AS STRING GET RETURN TP_DA END GET SET (BYVAL VALUE AS STRING) TP_DA = ""
IF INSTR (Value, " ") THEN TP_DA = "91" Else TP_DA = "81" end if value = value.Replace (" ", "") TP_DA = Format (Value.length, "x2") TP_DA DIM I AS INTEGER IF (Value.Length Mod 2) = 1 Then Value = "F" end if for i = 1 to value.Length Step 2 TP_DA = SWAP (MID (Value, I, 2)) NEXT End Set End Property
Public Property TP_Data_Coding_Scheme () As ENUM_TP_DCS Get Return TP_DCS End Get Set (ByVal Value As ENUM_TP_DCS) TP_DCS = Value End Set End PropertyPublic Property TP_Validity_Period () As ENUM_TP_VALID_PERIOD Get Return TP_VP End Get Set (ByVal Value As ENUM_TP_VALID_PERIOD) TP_VP = Value End Set End Property
Public Overridable Property TP_User_Data () As String Get Return TP_UD End Get Set (ByVal Value As String) Select Case TP_DCS Case Is = ENUM_TP_DCS.DefaultAlphabet TP_UDL = Value.Length TP_UD = Encode7Bit (Value) Case Is = ENUM_TP_DCS.UCS2 TP_UDL = Value. Length * 2 tp_ud = encodeucs2 (value) case else tp_UD = value end select end set End Property # End Region
#Region "functions"
Public Overridable Function GetSMSPDUCode () As String Dim PDUCode As String 'Check User Data Length If TP_UD> 140 Then Throw New Exception ( "User Data is TOO LONG for SMS")' Make PDUCode PDUCode = SC_Number PDUCode = FirstOctet () PDUCode = Format (TP_MR, "X2") PDucode = TP_DA PDucode = Format (TP_PID, "X2") PDucode = Format (TP_DCS, "X2") PDucode = Format (TP_VP, "X2") PDucode = Format (TP_UDL, "X2") PDUCODE = TP_UD RETURN PDUCODE END FUNCTION
Public Overridable Function FirstOctet () As String Return ByteToHex (TP_MTI TP_VPF TP_SRR TP_UDHI) End FunctionShared Function ByteToHex (ByVal aByte As Byte) As String Dim result As String result = Format (aByte, "X2") Return result End Function
#Region "Enocode7Bit" Shared Function Encode7Bit (ByVal Content As String) As String 'Prepare Dim CharArray As Char () = Content.ToCharArray Dim c As Char Dim t As String For Each c In CharArray t = CharTo7Bits (c) t Next 'Add "0" DIM I as INTEGER IF (T.Length Mod 8) <> 0 THEN for i = 1 to 8 - (T.Length Mod 8) T = "0" T NEXT END IF' SPLIT INTO 8BITS DIM Result As string for i = t.length - 8 to 0 step -8 results = result bitstohex (MID (T, I 1, 8)) Next Return Result End Function
Shared function bitsTohex (byval bits as string) AS String 'Convert 8bits to Hex String Dim I, V AS Integer for i = 0 to Bits.LENGTH - 1 V = V VAL (MID (BITS, I 1, 1)) * 2 ^ (7 - i) Next Dim Result AS String Result = Format (v, "x2") RETURN RESULT END FUNCTION
Shared function charTo7bits (byval c as char) AS STRING DIM RESULT AS STRING DIM I AS Integer for i = 0 to 6 IF (ASC (c) and 2 ^ i)> 0 Then Result = "1" Result else result = " 0 " Result End If Next Return Result End Function # End RegionShared Function EncodeUCS2 (ByVal Content As String) As String Dim i, j, v As Integer Dim Result, t As String For i = 1 To Content.Length v = AscW ( MID (Content, I, 4)) T = format (v, "x4") Result = T NEXT RETURN RESULT END FUNCTION
Shared function swap (byref twoBitstr as string) AS string 'swap two bit like "EF" to "fe" DIM C () as char = twobitstr.tochararray Dim T as char t = c (0) c (0) = C ( 1) C (1) = t Return (C (0) c (1)). Tostring end function # end regionend class
Public Class ConcatenatedShortMessage 'Only for UCS2 Encoding Inherits Smsencoder Private TotalMessages AS INTEGER
Public Function GetEMSPDUCode () As String () TotalMessages = (TP_UD.Length / 4) / 67 - ((TP_UD.Length / 4 Mod 67) = 0) Dim Result (TotalMessages) As String Dim tmpTP_UD As String Dim i As Integer TP_UDHI = 2 ^ 6 for i = 0 to TotalMessages TMPTP_UD = MID (TP_UD, I * 67 * 4 1, 67 * 4) Result (i) = SC_NUMBER Result (i) = firstoct () Result (i) = Format (TP_MR, "X2") 'Next Segement TP_MR MUST BE INCREASED' TP_MR = 1 Result (i) = TP_DA Result (i) = Format (TP_PID, "X2") Result (i) = format (tp_dcs, "X2") Result (i) = format (TP_VP, "X2") TP_UDL = TMPTP_UD.LENGTH / 2 6 '6: IE Result (i) = Format (TP_UDL, "X2") Result (i) = "060804001e" 'TP_UDHL AND SOME OF Concatenated Message Result (i) = Format (TotalMessages 1, "X2") Result (i) = Format (i 1, "x2") Result (i) = TMPTP_UDNext Return Result End FunctionPublic overrides Function First () AS STRING RETURN BYTETOHEX (TP_MTI TP_VPF TP_SRR TP_UDHI) End Function
Public overrides proty u String get return tp_ud end set (byval value as string) TP_UD = Encodeucs2 (Value) End Set End Propertyend Class