SMS mit GSM Modem (USB) verschicken

    • VB.NET

    Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Svenundmel.

      SMS mit GSM Modem (USB) verschicken

      Hallo Miteinander,

      da ich berüflich nach einer Möglichkeit gesucht habe um automatisiert SMS zu versenden, bin ich auf eine sehr gute Lösung gestoßen, bei der man nicht viel mehr als ein USB Modem mit Simkarte (haben bestimmt viele zu Hause rumliegen).

      Es gibt noch viele andere Möglichkeiten:
      • Drittanbieter
      • SMS Server (kostenpflichtige Software)
      • SMS Gateway mit Auduino od. Raspberry

      Mit der hier vorgestellten Version ist man sehr konstengünstig am Weg und kann alles selbst mit ein paar Zeilen Code machen!

      VB.NET-Quellcode

      1. Imports System.Management
      2. Imports System.IO.Ports
      3. Public Class GSM
      4. Public Class GSMModem
      5. Private WithEvents SerialInterface As New SerialPort
      6. Public Property AttachedTo As String
      7. Public Property Description As String
      8. Public ReadOnly Property isConnected As Boolean
      9. Get
      10. Return SerialInterface.IsOpen
      11. End Get
      12. End Property
      13. Public Event DataRecived(ByVal e As String)
      14. Public Event SuccessfullyConnectedToModem()
      15. Public Event Disconnected()
      16. Public Overrides Function ToString() As String
      17. Return Me.Description
      18. End Function
      19. Public Sub New(ByVal queryObj As ManagementObject)
      20. Me.AttachedTo = queryObj("AttachedTo")
      21. Me.Description = queryObj("Description")
      22. End Sub
      23. Public Sub connect()
      24. With SerialInterface
      25. .PortName = Me.AttachedTo
      26. .BaudRate = 9600
      27. .Parity = Parity.None
      28. .DataBits = 8
      29. .StopBits = StopBits.One
      30. .Handshake = Handshake.None
      31. .RtsEnable = True
      32. .ReceivedBytesThreshold = 1
      33. .NewLine = vbCr
      34. .ReadTimeout = 1000
      35. .Open()
      36. End With
      37. If SerialInterface.IsOpen Then
      38. RaiseEvent SuccessfullyConnectedToModem()
      39. End If
      40. End Sub
      41. Public Sub disconnect()
      42. SerialInterface.Close()
      43. RaiseEvent Disconnected()
      44. End Sub
      45. Public Sub send(ByVal text As String)
      46. SerialInterface.WriteLine(text)
      47. End Sub
      48. Public Sub sendSMS(ByVal tel As String, ByVal message As String)
      49. With SerialInterface
      50. .Write("at" & vbCrLf)
      51. System.Threading.Thread.Sleep(1000)
      52. .Write("at+cmgf=1" & vbCrLf)
      53. System.Threading.Thread.Sleep(1000)
      54. .Write("at+cmgs=" & Chr(34) & tel & Chr(34) & vbCrLf)
      55. System.Threading.Thread.Sleep(1000)
      56. .Write(message & Chr(26))
      57. End With
      58. End Sub
      59. Private Sub SerialInterface_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialInterface.DataReceived
      60. Dim dataIn As String = ""
      61. For i As Integer = 1 To SerialInterface.BytesToRead
      62. dataIn &= Chr(SerialInterface.ReadChar)
      63. Next
      64. RaiseEvent DataRecived(dataIn)
      65. End Sub
      66. End Class
      67. Public Function CollectModems() As List(Of GSMModem)
      68. Dim Modems As New List(Of GSMModem)
      69. Try
      70. Dim Searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_POTSModem")
      71. For Each queryObj As ManagementObject In Searcher.Get
      72. If queryObj("Status") = "OK" Then
      73. Modems.Add(New GSMModem(queryObj))
      74. End If
      75. Next
      76. Catch ex As Exception
      77. MsgBox(ex)
      78. End Try
      79. Return Modems
      80. End Function
      81. End Class


      VB.NET-Quellcode

      1. Public Class Form1
      2. Private isExpanded As Boolean = True
      3. Private g As New GSM
      4. Private WithEvents usedModem As GSM.GSMModem
      5. Delegate Sub delegateLog(ByVal text As String)
      6. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      7. Dim ListOfModems As List(Of GSM.GSMModem) = g.CollectModems
      8. For Each item In ListOfModems
      9. ListBox_allDevices.Items.Add(item)
      10. Next
      11. End Sub
      12. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btn_connect_disconnect.Click
      13. If IsNothing(usedModem) Then
      14. usedModem = ListBox_allDevices.SelectedItem
      15. usedModem.connect()
      16. Else
      17. If usedModem.isConnected Then
      18. usedModem.disconnect()
      19. End If
      20. End If
      21. End Sub
      22. Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox_allDevices.SelectedIndexChanged
      23. Dim pos As Integer = Me.ListBox_allDevices.IndexFromPoint(Me.ListBox_allDevices.PointToClient(MousePosition))
      24. If pos <> -1 Then
      25. btn_connect_disconnect.Enabled = True
      26. Else
      27. btn_connect_disconnect.Enabled = False
      28. End If
      29. End Sub
      30. Sub log(ByVal text As String)
      31. RichTextBox2.AppendText(text)
      32. End Sub
      33. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
      34. usedModem.sendSMS(txt_tel.Text, rtb_nachricht.Text)
      35. End Sub
      36. Private Sub btn_refresh_Click(sender As Object, e As EventArgs) Handles btn_refresh.Click
      37. ListBox_allDevices.Items.Clear()
      38. Dim ListOfModems As List(Of GSM.GSMModem) = g.CollectModems
      39. For Each item In ListOfModems
      40. ListBox_allDevices.Items.Add(item)
      41. Next
      42. End Sub
      43. Private Sub usedModem_DataRecived(e As String) Handles usedModem.DataRecived
      44. Me.Invoke(New delegateLog(AddressOf log), e)
      45. End Sub
      46. Private Sub usedModem_SuccessfullyConnectedToModem() Handles usedModem.SuccessfullyConnectedToModem
      47. btn_connect_disconnect.Text = "Verbindung Trennen"
      48. btn_connect_disconnect.Image = Image.FromFile(Application.StartupPath & "\images\disconnect.png")
      49. ListBox_allDevices.Enabled = False
      50. sendsmspanel.Enabled = True
      51. MessageBox.Show("Verbindung zum Modem erfolgreich hergestellt", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
      52. End Sub
      53. Private Sub usedModem_Disconnected() Handles usedModem.Disconnected
      54. usedModem = Nothing
      55. btn_connect_disconnect.Text = "Verbindung zum Modem herstellen"
      56. btn_connect_disconnect.Image = Image.FromFile(Application.StartupPath & "\images\connect.png")
      57. ListBox_allDevices.Enabled = True
      58. sendsmspanel.Enabled = False
      59. MessageBox.Show("Verbindung wurde getrennt", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
      60. End Sub
      61. Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles btn_expand.Click
      62. If isExpanded = True Then
      63. isExpanded = False
      64. Me.Size = New Size(Me.Width, Me.Height - RichTextBox2.Height)
      65. btn_expand.Image = Image.FromFile(Application.StartupPath & "\images\plus.png")
      66. Else
      67. isExpanded = True
      68. Me.Size = New Size(Me.Width, Me.Height + RichTextBox2.Height)
      69. btn_expand.Image = Image.FromFile(Application.StartupPath & "\images\minus.png")
      70. End If
      71. End Sub
      72. End Class
      Bilder
      • Unbenannt.JPG

        29,89 kB, 588×491, 624 mal angesehen
      Dateien
      • GSM Projekt.zip

        (107,6 kB, 513 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „windowsfan“ ()

      schaut gut aus, genau sowas habe ich auch gesucht.. hätte ich sonst nur über php und provider lösen können :thumbsup:

      welchen Huawai Stick benutzt du?

      EDIT:
      kannst du bitte das projekt noch hochladen?

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „H2O“ ()

      Hi. Ich benutze den Code. Er funktioniert auch einwandfrei solange ich lateinische Schrift verwende. Sobald kyrillisch also russisch, etc. Verschickt wird, dann kommt beim Empfänger nur ??? an. Hat einer eine Idee wie ich das lösen kann? Eventuell windowsfan? Ich bräuchte dringend eine Lösung, da mein Projekt sonst gefährdet ist. Vielen Dank
      Also ein SerialPort hat auch eine Encoding-Property, vllt. mal eins Einstellen. Standart is ASCII und da sind keine kyrillischen Chars drin.
      docs.microsoft.com/de-de/dotne…g?view=netframework-4.7.2
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin
      Ich hab nun auch mal recherchiert. Werde mich damit demnächst mal selbst beschäftigen(GSM Modem + AT-Commands). Habe diesen Artikel gefunden, scheinbar kann man keine Unicode-Nachrichten verschicken, wenn AT+CMGF=1 ist, was ja hier der Fall ist.

      Ein älterer Artikel:(mit abhängigkeit(GSMComm)) Geht auch mit Unicode!
      codeproject.com/Articles/20420…ing-GSM-Modem?msg=2458023

      ein neurer Artikel, scheinbar ohne abhängigkeiten.
      codeproject.com/Articles/88678…elete-SMS-with-IOT-Device
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin
      Ja verwirrend. Schau mir das gerade zum erstem mal an, finde das aber recht interessant.

      Ich hab jetzt einfach mal meine Schlagwörter für die Suche geändert, nachdem ich nach at command send unicode text suchte, fand ich das:
      climem.wordpress.com/2011/06/0…at-command-via-gsm-modem/

      Zwar Perl, aber im Grunde geht es ja nur um das Protokoll.
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin
      Moin,

      naja benötigen tuhe ich das nicht, aber diese Thematik interessiert mich, ich fummel aktuell mit IC's rum(lerne Digitale Elektronik allgemein), so ein GSM Modem habe ich gerade nicht zur Hand, mein alter Huawei-Stick will leider nicht mehr. Werde aber in der nächsten Zeit eins besorgen.

      Also diese GSM-Modems lassen sich via AT-Commands steuern. Wie man am Code sieht, werden diese AT Commands via SerialPort ans Modem geschickt, es kommen auch Antorten zurück. Ich würde jetzt, wenn ich ein GSM-Modem hätte, einfach mal drauf los legen das modem anschreiben und schauen was es dann meldet, also erforschen und verstehen lernen. Nebenbei würde ich mich näher mit den AT-Commands beschäftigen. Da habe ich auch schon ein scheinbar brauchbares PDF zur Hand:

      sparkfun.com/datasheets/Cellul…ds_Reference_Guide_r0.pdf
      Dürfte aber ein wenig Zeit brauchen, sich da einzuarbeiten.

      Tut mir leid das ich da jetzt nicht helfen konnte, aber du scheinst dir die AT-Commadns anschauen zu müssen um hier weiter zu kommen. Schritt 1 wäre aber ertsmal zu schauen, ob dein Modem das auch kann. Bei der verlinkung zum Perl-Beispiel, testet der Typ auch, indem er AT+CSCS=? and Modem schreibt, sollte in der Antwort HEX oder UCS2 stehen, kann es das. Darauf musst du denn nach und nach aufbauen.
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „NoIde“ ()

      Hi. Also Modem kann es, ich bekomm aber immer den Fehler 302. also nicht zulässig. Ich werde bekloppt. Hat jemand noch einen Ratschlag oder ein codesnipsel der funktioniert? Ich hab Google hunderte mal befragt, viele haben das gleiche Problem, aber nirgends eine Lösung gefunden