实例介绍
【实例简介】
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论