USSD Basics

USSD stands for Unstrcutured Supplementary Services Data. It is a way of sending short commands from the mobile phone to the GSM network. It uses, like SMS, the signalling channel of the GSM connection. Unlike SMS, it does not use a store and forward architecture, but a session oriented connection. USSD text messages can be up to 182 bytes in length. Messages received on the mobile phone are not stored.

USSD is defined within the GSM standard in the documents:

  • GSM 02.90 (USSD Stage 1)
  • GSM 03.90 (USSD Stage 2)

USSD applications

USSD is most used to make it easy for the (prepaid) mobile user to query his prepaid balance using his mobile phone. It can also be used in mobile payments systems and information services such as weather forecasts and traffic information.

Automating USSD using a GSM phone or modem

To automate USSD, for instance to check your prepaid balance before submitting an SMS message, can be done using an AT command. All GSM phones and modems that support USSD also support the following command:


The following sample demonstrates how to check your prepaid balance:

+CUSD: 2,"Your current balance is $ 22.10", 0

In this example we are sending the "*101#" USSD command to the network. Within seconds the network responds with a response text and an error code. In this case we have an amount of USD22.10 left on our account. The result code in this example is : '0'.

The following resultcodes exist:

0No further user action required
1Further user action required
2USSD terminated by network
4Operation not supported

The last parameter of the response indicates the DCS (data coding scheme) used in the return text.

Querying USSD commands from the ActiveXperts SMS and MMS toolkit

The SMS and MMS Toolkit can be used to send USSD data and retrieve the results. Currently only GSM is supported to send and receive USSD data. The sample code below demonstrates how to query an USSD command from Visual Basic using a connected GSM phone or modem.

Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Const MAX_PATH = 260

Public objGsm As AXmsCtrl.SmsProtocolGsm

Private Function SetDefaultLogFile()
    Dim Buffer As String

    Buffer = Space(MAX_PATH)

    If GetTempPath(MAX_PATH, Buffer) <> 0 Then
        TextLogfile.Text = Left$(Buffer, InStr(Buffer, vbNullChar) - 1) & "UssdLog.txt"
        TextLogfile.Text = "C:\UssdLog.txt"
    End If
End Function

Private Sub CommandSend_Click()
    Dim strResponse As String
    Dim strCommand As String
    Dim strFields
    MousePointer = vbHourglass
    strCommand = "AT+CUSD=1," & Chr(34) & TextCommand & Chr(34) & ",15"
    objGsm.LogFile = TextLogfile.Text                    ' Set logfile
    objGsm.Device = ComboDevice.Text                     ' Set Device
    If ComboDeviceSpeed.ListIndex = 0 Then
        objGsm.DeviceSpeed = 0                           ' use default speed
        objGsm.DeviceSpeed = ComboDeviceSpeed.List(comboSpeed.ListIndex)
    End If

    strResponse = objGsm.SendCommand(strCommand, 10000)  ' Send USSD Command
    If (InStr(strResponse, "OK") > 0) Then            ' Response should be OK
        strResponse = objGsm.SendCommand("", 10000)      ' Wait for response
        If (InStr(strResponse, "+CUSD:") > 0) Then    ' If USSD response is received, display text between ""
            strFields = Split(strResponse, Chr(34))
            strResponse = strFields(1)
        End If
    End If
    If (objGsm.LastError <> 0) Then
        TextResponse.Text = "N/A"
        TextResult.Text = "ERROR #" & objGsm.LastError & " (" & objGsm.GetErrorDescription(objGsm.LastError) & ")"
        TextResponse.Text = strResponse
        TextResult.Text = "SUCCESS"
    End If
    TextResponse.Text = strResponse
    MousePointer = vbDefault
End Sub

Private Sub CommandView_Click()
    If FileExists(TextLogfile.Text) = True Then
        Shell "notepad " + TextLogfile.Text, vbNormalFocus
    End If
End Sub

Private Sub Form_Load()
    Dim i, lDeviceCount
    Set objGsm = CreateObject ("ActiveXperts.SmsProtocolGsm")
    lDeviceCount = objGsm.GetDeviceCount()  ' Get number of  devices
    For i = 0 To lDeviceCount - 1
        ComboDevice.AddItem ( objGsm.GetDevice ( i ) ) ' Add devices to list box
    With ComboDevice
        .AddItem ("COM1")        ' Add serial devices
        .AddItem ("COM2")
        .AddItem ("COM3")
        .AddItem ("COM4")
        .AddItem ("COM5")
        .AddItem ("COM6")
        .AddItem ("COM7")
        .AddItem ("COM8")
        .ListIndex = 0
    End With
    With ComboDeviceSpeed
        .AddItem ("Default")      ' Setup devicespeed combo
        .AddItem ("1200")
        .AddItem ("2400")
        .AddItem ("9600")
        .AddItem ("19200")
        .AddItem ("38400")
        .AddItem ("57600")
        .AddItem ("115200")
        .ListIndex = 0
    End With
End Sub

Public Function FileExists(sFileName As String) As Boolean
  FileExists = CBool(Len(Dir$(sFileName))) And CBool(Len(sFileName))
End Function