实例介绍
【实例简介】
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
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论