在好例子网,分享、交流、成长!
您当前所在位置:首页ASP 开发实例VB界面编程 → AT指令 SMS发短信实例源码下载

AT指令 SMS发短信实例源码下载

VB界面编程

下载此实例
  • 开发语言:ASP
  • 实例大小:0.62M
  • 下载次数:26
  • 浏览次数:255
  • 发布时间:2014-08-08
  • 实例类别:VB界面编程
  • 发 布 人:crazycode
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 短信 实例 C# 下载 sms

实例介绍

【实例简介】

This is a .NET 2.0 AT ibrary and SMS/EMS library with Plug-In support. You can develop your own Plug-In to support multi phones.
ATCommandBase is a class to execute AT commands.
CommPhone is a class with minimal set of functions of a phone. Usually be used in phone detect. 
PhoneControllerSDK is a SDK for you to develop your own phone plugin.
PluginForNokia is a DEMO PLUGIN for demostrate how to use these classes.
ShortMessageService is a class for decoding and encoding SMS.
Test AT is a test project offering some Test Cases to test AT,SMS Read, Write, send. Be sure Test Case 3 and Test Case 4 for SMS Receving and Sending should be passed!
CodeDemoForCSharp is a C# project for some C# developer.

【实例截图】

【核心代码】

'//////////////////////////////////////////////////////////////////////////
'// Use at your own risk                                                 //
'// www.hesicong.net                                                     //
'// Copyright Dreamworld. You can use this program freely but no in      //
'// commerial use without my permission.                                 //
'// Authoer: hesicong                                                    //
'// Date: 2007-2-25                                                      //
'//////////////////////////////////////////////////////////////////////////


Imports System.IO
Imports System.Text
Imports System.Text.Encoding
Imports System.Text.RegularExpressions
Imports System.Threading

Namespace Dreamworld.Mobile
    Public Class ATCommandBase
        Implements IDisposable

        Private myPhone As Mutex = New Mutex(False)
        Private mSerialStream As Ports.SerialPort
        Private mLastError As String
        Private mTimeOut As Integer = 20000
        Private mCancel As Boolean = False
        Private mCancelResponse As String = "ERROR"

        ''' <summary>
        ''' Indicate a new message is arrived. Message will be a status report or a new SMS.
        ''' Some phone will only return the index and some phone will return content.
        ''' </summary>
        ''' <param name="index">Index of this message. If not provided, content should be provided.</param>
        ''' <param name="content">Content of message. If index is not provided, content should provided.</param>
        ''' <remarks></remarks>
        Public Event NewMessageArrived(ByVal index As Integer, ByVal content As String)

        ''' <summary>
        ''' Initialize port and enable monitor.
        ''' </summary>
        ''' <param name="port">Port of phone connected.</param>
        ''' <param name="baudrate">Speed of connection.</param>
        ''' <param name="timeOut">Time out of AT command, in MillionSeconds. Default is 20s. If some AT commands execute longer than 20s, you should provide a more larger value.</param>
        ''' <remarks></remarks>
        Sub New(ByVal port As String, ByVal baudrate As Integer, ByVal timeOut As Integer)
            mSerialStream = New Ports.SerialPort(port, baudrate)
            mSerialStream.Open()
            mSerialStream.RtsEnable = True
            mSerialStream.DtrEnable = True
            mTimeOut = timeOut
            mSerialStream.ReadExisting()
            EnableMonitor()
        End Sub

        ''' <summary>
        ''' Initialize port and enable monitor.
        ''' </summary>
        ''' <param name="portStream">Port stream of a operable port.</param>
        ''' <param name="timeOut">Time out of AT command, in MillionSeconds. Default is 20s. If some AT commands execute longer than 20s, you should provide a more larger value.</param>
        ''' <remarks></remarks>
        Sub New(ByVal portStream As IO.Ports.SerialPort, ByVal timeOut As Integer)
            mSerialStream = portStream
            If portStream.IsOpen = False Then
                mSerialStream.Open()
                mSerialStream.RtsEnable = True
                mSerialStream.DtrEnable = True
            End If
            mTimeOut = timeOut
            mSerialStream.ReadExisting()
            EnableMonitor()
        End Sub

        ''' <summary>
        ''' Close monitor and port.
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function Close() As Boolean
            DisableMonitor()
            mSerialStream.Close()
        End Function

        ''' <summary>
        ''' Return last error of AT command
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property LastError() As String
            Get
                Return mLastError
            End Get
        End Property

        ''' <summary>
        ''' Set or returns timeout of AT command
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property TimeOut() As Integer
            Get
                Return mTimeOut
            End Get
            Set(ByVal value As Integer)
                mTimeOut = value
            End Set
        End Property


#Region "Inputbuffer"
        ''' <summary>
        ''' inputbuffer
        ''' </summary>
        Private mInputBuffer As New StringBuilder

        ''' <summary>
        ''' Thread to monitor a inputbuffer
        ''' </summary>
        ''' <remarks></remarks>
        Private mInputBufferMonitorThread As Thread

        ''' <summary>
        ''' Indicate monitor should be closed
        ''' </summary>
        ''' <remarks></remarks>
        Private mExitMonitor As Boolean

        ''' <summary>
        ''' Strings to notify
        ''' </summary>
        ''' <remarks></remarks>
        Private mStringToNotify As String() = {" CMS ERROR", " CMTI:", " CMT:", " CDS:", " CDSI:"}

        ''' <summary>
        ''' Enum associated with mStringToNotify. Indicating the index of the string
        ''' </summary>
        ''' <remarks></remarks>
        Private Enum StringToNotifyEnum
            CMSERROR
            CMTI
            CMT
            CDS
            CDSI
        End Enum

        ''' <summary>
        ''' Event when a certain string appeared
        ''' </summary>
        ''' <param name="strToNotify"></param>
        ''' <param name="buffer"></param>
        ''' <remarks></remarks>
        Private Event StringNotify(ByVal strToNotify As StringToNotifyEnum, ByVal buffer As String)

        ''' <summary>
        ''' Monitor a certain string. Mosted used in monitor a incoming msg and get last error message.
        ''' Use EnableMonitor function or DisableMonitor function to enable or disable this.
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub InputBufferMonitorThread()
            Do
                Thread.Sleep(1)
                If mExitMonitor Then Exit Do
                mInputBuffer.Append(mSerialStream.ReadExisting)
                'Monitor a certain string
                Dim bufferString As String = mInputBuffer.ToString
                'Dim bufferString As String = mSerialStream.ReadLine()
                For i As Integer = 0 To mStringToNotify.Length - 1
                    If bufferString.IndexOf(mStringToNotify(i)) > 0 Then
                        RaiseEvent StringNotify(CType(i, StringToNotifyEnum), bufferString)
                    End If
                Next
            Loop
        End Sub

        ''' <summary>
        ''' Enable monitor. This will start a thread to monitor certain strings.
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub EnableMonitor()
            mExitMonitor = False
            mInputBufferMonitorThread = New Thread(AddressOf InputBufferMonitorThread)
            mInputBufferMonitorThread.Name = "InputBuffer Monitor"
            mInputBufferMonitorThread.Start()
        End Sub

        ''' <summary>
        ''' Disable string monitor. When you want to enter DATA mode like OBEX, you must turn string monitor off.
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub DisableMonitor()
            mExitMonitor = True
        End Sub

        ''' <summary>
        ''' Clear input buffer
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub ClearInputBuffer()
            mInputBuffer = New StringBuilder
        End Sub

        ''' <summary>
        ''' Handle string to notify
        ''' </summary>
        ''' <param name="strToNotify"></param>
        ''' <param name="buffer"></param>
        ''' <remarks></remarks>
        Private Sub StringNotifyHandler(ByVal strToNotify As StringToNotifyEnum, ByVal buffer As String) Handles Me.StringNotify
            Select Case strToNotify
                Case StringToNotifyEnum.CMSERROR
                    'Get last error
                    Dim regexCMS As Regex = New Regex( _
                    "\ CMS\s*ERROR:\s*(?<CODE>\d )", _
                    RegexOptions.IgnoreCase _
                    Or RegexOptions.Compiled _
                    Or RegexOptions.RightToLeft _
                    )
                    Dim m As Match = regexCMS.Match(buffer)
                    mLastError = m.Groups("CODE").Value
                Case StringToNotifyEnum.CDS
                    Stop
                Case StringToNotifyEnum.CDSI
                    Dim regexCMS As Regex = New Regex( _
                                            "\ CDSI:\s*""(?<STO>\w*)"",(?<INDEX>\d )", _
                                            RegexOptions.IgnoreCase _
                                            Or RegexOptions.Compiled _
                                            Or RegexOptions.RightToLeft _
                                            )
                    Dim m As Match = regexCMS.Match(buffer)
                    If m.Success = True Then
                        Dim index As Integer = CInt(m.Groups("INDEX").ToString)
                        RaiseEvent NewMessageArrived(index, String.Empty)
                    End If
                Case StringToNotifyEnum.CMT
                    Stop
                Case StringToNotifyEnum.CMTI
                    Dim regexCMS As Regex = New Regex( _
                                            "\ CMTI:\s*""(?<STO>\w*)"",(?<INDEX>\d )", _
                                            RegexOptions.IgnoreCase _
                                            Or RegexOptions.Compiled _
                                            Or RegexOptions.RightToLeft _
                                            )
                    Dim m As Match = regexCMS.Match(buffer)
                    If m.Success = True Then
                        Dim index As Integer = CInt(m.Groups("INDEX").ToString)
                        RaiseEvent NewMessageArrived(index, String.Empty)
                    End If
            End Select

            ClearInputBuffer()
        End Sub
#End Region

#Region "AT command base"
        ''' <summary>
        ''' Send a AT command
        ''' </summary>
        ''' <param name="command">Command to Send. Will be automatically add VBCRLF after the command</param>
        ''' <returns>Response of this AT Command</returns>
        ''' <remarks></remarks>
        Public Overloads Function SendCommand(ByVal command As String) As String
            mCancel = False

            DisableMonitor()
            myPhone.WaitOne()

            'Clear input buffer
            ClearInputBuffer()

            mSerialStream.Write(command & vbCrLf)

            Dim StartTime As Date = Now
            Dim buffer As String
            Do
                Thread.Sleep(10)
                mInputBuffer.Append(mSerialStream.ReadExisting)
                buffer = mInputBuffer.ToString
                If buffer.IndexOf("OK") >= 0 Then Exit Do
                If buffer.IndexOf("ERROR") >= 0 Then Exit Do
                If mCancel = True Then
                    buffer = mCancelResponse
                    Exit Do
                End If
                'Simulate time out
                If Now.Subtract(StartTime).TotalMilliseconds > mTimeOut Then
                    Throw New TimeoutException("Send AT command time out")
                End If
            Loop
            myPhone.ReleaseMutex()
            EnableMonitor()
            buffer = buffer.Replace(command, "")
            Return buffer
        End Function


        Public Overloads Function SendCommand(ByVal command As String, ByVal toWait As String, ByVal commandAfterWait As String) As String
            mCancel = False
            DisableMonitor()
            myPhone.WaitOne()
            command = command & vbCrLf
            'Clear input buffer
            ClearInputBuffer()

            'Send byte data
            mSerialStream.Write(command)

            Dim StartTime As Date = Now

            'Simulate TimeOut
            Do
                Thread.Sleep(1)
                mInputBuffer.Append(mSerialStream.ReadExisting)
                If mInputBuffer.ToString.IndexOf(toWait) >= 0 Then Exit Do
                If mCancel = True Then
                    Return mCancelResponse
                End If
                If Now.Subtract(StartTime).TotalMilliseconds > mTimeOut Then
                    Throw New IOException("Wait for certain string timeout!")
                    Return String.Empty
                End If
            Loop

            mSerialStream.Write(commandAfterWait)

            StartTime = Now
            Dim Buffer As String
            Do
                Thread.Sleep(10)
                mInputBuffer.Append(mSerialStream.ReadExisting)
                Buffer = mInputBuffer.ToString
                If Buffer.IndexOf("OK") >= 0 Then Exit Do
                If Buffer.IndexOf("ERROR") >= 0 Then Exit Do
                If mCancel = True Then
                    Buffer = mCancelResponse
                    Exit Do
                End If
                If Now.Subtract(StartTime).TotalMilliseconds = mTimeOut Then
                    Throw New IOException("Wait for term char timeout!")
                    Return String.Empty
                End If
            Loop
            myPhone.ReleaseMutex()
            EnableMonitor()
            Return mInputBuffer.ToString
        End Function

        Public Overloads Function CancelCurrentAction() As Boolean
            mCancel = True
            DisableMonitor()
            EnableMonitor()
            Return True
        End Function
#End Region

        ''' <summary>
        ''' Check if error occur
        ''' </summary>
        ''' <param name="inputBuffernputBuffer"></param>
        ''' <returns>True if no error; False if error</returns>
        ''' <remarks></remarks>
        Public Shared Function CheckResponse(ByVal inputBuffer As String) As Boolean
            '##################################
            'Function should be extend to hand  CME ERROR
            '##################################
            If inputBuffer Is Nothing Then Return False
            If inputBuffer Is String.Empty Then Return False
            If inputBuffer.IndexOf("ERROR") > 0 Then Return False
            'When no error return true 
            Return True
        End Function

        Private disposedValue As Boolean = False        ' To detect redundant calls

        ' IDisposable
        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    ' TODO: free unmanaged resources when explicitly called
                    If mSerialStream Is Nothing = False Then
                        mSerialStream.Close()
                    End If
                    If myPhone Is Nothing = False Then
                        myPhone.Close()
                    End If
                End If

                ' TODO: free shared unmanaged resources
            End If
            Me.disposedValue = True
        End Sub

#Region " IDisposable Support "
        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub

        Protected Overrides Sub Finalize()
            ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(False)
            MyBase.Finalize()
        End Sub
#End Region

        ''' <summary>
        ''' Get current input buffer 
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>Added at 10/2/2005</remarks>
        Public ReadOnly Property InputBuffer() As String
            Get
                Return mInputBuffer.ToString()
            End Get
        End Property

    End Class
End Namespace

标签: 短信 实例 C# 下载 sms

实例下载地址

AT指令 SMS发短信实例源码下载

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警