Cơ sở dữ liệu
5.4 ĐỌC TIN NHẮN
Sau khi đã phát hiện được tin nhắn, có hai vấn đề cần đặt ra:
Thứ nhất, số máy của tin nhắn gửi đến có hợp lệ khơng. Điều này để giúp cho hệ thống không phải trả lời những số máy không được phép nhằm mục đích giảm chi phí. Tất nhiên, người sử dụng có thể chọn phương án hệ thống sẽ trả lời tất cả các số máy gửi tin đến.
Thứ hai, sau khi đã kiểm tra tính hợp lệ của số máy gửi, nếu tin nhắn là hợp lệ cần phải đọc được nội dung của tin nhắn và xem lệnh được gửi tới qua tin nhắn là lệnh gì (ứng với dịch vụ gì).
Sau khi phát hiện được tin nhắn, ta có thể sử dụng lệnh „AT+CMGL=”ALL” „ để yêu cầu môđem gửi trả nội dung của các tin nhắn, đáp ứng của môđem sau lệnh +CMGL có dạng sau:
+CMGL: 1,"REC READ","+84904139379",,"04/05/18,20:38:59+28" I will go to your home soon I will go to your home soon
+CMGL: 2,"REC READ","+84903410464",,"04/05/21,00:18:29+28" Tham Tham
+CMGL: 3,"REC UNREAD","+84903400007",,"04/05/21,09:03:35+28" Gi vay Gi vay
OK
Mơđem sẽ đáp ứng với 2 dịng text cho mỗi tin nhắn: dòng thứ nhất bao bắt đầu bằng chuỗi „+CMGL:‟ tiếp theo là chỉ số của tin nhắn trong bộ nhớ, trạng thái của tin nhắn, số máy gửi đến, thời gian gửi đến. Dòng tiếp theo sẽ là nội dung của tin nhắn.
Như vậy, việc đọc lần lượt từng tin nhắn SMS từ bộ nhớ ra tuy khơng phải dễ dàng (nó địi hỏi các kỹ thuật xử lý chuỗi ký tự khá phức tạp ), tuy nhiên cùng khơngphải là q khó. Vì vậy, chúng tơi chỉ xin dẫn ra cách gửi lệnh và cách đọc dữ liệu từ bộ đệm nhận như được minh hoạ một cách đơn giản trong chương trình 5-4. Cơng việc sau đó chỉ hồn tồn thuần tuý là xử lý xâu ký tự nhận được dựa trên cấu trúc của đáp ứng đã trình bày ở trên.
Chƣơng trình 5-4
Private Sub FetchSMS_Click()
Hệ thống nhắn tin nội bộ trên cơ sở ghép nối môđem GSM ứng dụng SMS
Comm1.Output = "AT+CMGL=" & Chr(34) & "ALL" & Chr(34) & vbCrLf
„Đợi Môđem trả lời Wait
„Đọc bộ nhớ đệm vào biến smsString Do
smsString=smsString & Comm1.Input Loop while Comm1.InBufferCount
„Nếu mơđem trả lời OK thì gọi chương trình xử lý nội dung If bOK then
ReadMessage End if
End sub
Trong đoạn chương trình kể trên, tồn bộ đáp ứng của môđem sau lệnh +CMGL sẽ được lưu vào biến smsString. Sau khi nhận được chuỗi smsString này, ta có thể thực hiện việc lọc từng tin nhắn ra qua các đoạn chương trình xử lý chuỗi ký tự.
Tuy nhiên một điều rất quan trọng là sau khi đã xác định được số máy gửi đến của mỗi tin nhắn, chúng ta cần phải kiểm tra xem số máy đó có được phép gửi hay khơng. Tính năng kiểm tra này nhằm giúp cho người khai thác giảm được chi phí cho việc gửi trả lại tin nhắn đến những số máy khơng cần thiết. Tuy nhiên người dùng có thể lựa chọn kích hoạt hoặc khơng kích hoạt tính năng này. Việc này được thực hiện bằng một ô lựa chọn trên giao diện của chương trình được đặt tên là AucROn . Kiểm tra giá trị của ô lựa chọn này, rỗi chạy chương trình con kiểm tra số máy với cơ sở dữ liệu chứa các số máy được phép , nếu số máy là hợp lệ thì tiếp tục xử lý, nếu khơng thì bỏ qua:
If AucROn.Value = 1 Then AucR If SenderValid Then SMSCheck
End If
AucROn.Value = 1 cho thấy người dùng đã khích hoạt tính năng kiểm tra này, chương trình con sẽ đặt giá trị biến SenderValid thành True nếu số máy này là hợp lệ, chương trình con này được minh họa dưới đây:
SenderValid = True Dim AucRdbs As Database Dim AucRMobNo As Recordset
Hệ thống nhắn tin nội bộ trên cơ sở ghép nối môđem GSM ứng dụng SMS
Set AucRdbs = OpenDatabase("..\Databases\AucR.mdb")
sqlstr = "select MobNo from AucR where MobNo = " & "'" & SenderNo & "'"
Set AucRMobNo = AucRdbs.OpenRecordset(sqlstr, dbOpenDynaset) If AucRMobNo.RecordCount = 0 Then SenderValid = False AucRMobNo.Close Exit Sub End If AucRdbs.Close 5.5 GỬI TIN NHẮN
Vấn đề đặt ra là sau khi đã tìm ra câu trả lời tương ứng với tin nhắn nhận được, cần phải gửi trả lại người gửi một tin nhắn chứa thơng tin trả lời. Điều này có thể thực hiện bằng cách gửi lệnh „+CMGS‟ ra cổng nối tiếp tới mơđem thơng qua đặc tính Comm.Output của MSComm trong Visual Basic.
Chương trình 5-5 minh hoạ gửi nội dung tin nhắn cần gửi được lưu trong biến SMSTxT. Chƣơng trình 5-5 If Len(Trim(SenderNo)) = 0 Then SMSTxT = "" Exit Sub Else bGreaterSign = False
Comm1.Output = "AT+CMGS=" & Chr(34) & Trim(SenderNo) & Chr(34) & vbCrLf
„ Đợi cho đến khi môđem trả lại dấu nhắc “>” While Not bGreaterSign
DoEvents Wait Wend
„Nếu môđem trá lại dấu nhắc “>” thì đưa nội dung tin cần gửi „ vào
If bGreaterSign Then
Comm1.Output = Trim(SMSTxT) & Chr(26) & vbCrLf bOK = False
bError = False ' Đợi môđem trả lời While Not bOK Or bError DoEvents
Wait Wend
' nếu môđem trả lời OK, tức là tin nhắn đã được gửi If bOK Then
SentOK = True End If
Hệ thống nhắn tin nội bộ trên cơ sở ghép nối môđem GSM ứng dụng SMS End If End If SMSTxT = "" SenderNo = "" End Sub
Như trình bày ở trong phụ lục 1 về cú pháp lệnh +CMGS, khi muốn gửi một tin nhắn, trước tiên ta phải gửi ra môđem số máy cần gửi tin nhắn đến, sau đó đợi mơđem trả lời với dấu nhắc “>” thì đưa tiếp nội dung của tin nhắn vào. Dấu nhắc này được phát hiện thông qua thủ tục On_Comm đã trình bày ở chương trình 5-2.
Trong chương trình 5-5 trên, số máy cần gửi đã được lưu vào biến SenderNo trước đó thơng qua các đoạn chương trình khác.
Nội dung của tin nhắn trả lời dịch vụ SMSTxT được thực hiện qua các chương trình con có nhiệm vụ xác định lệnh và tìm thơng tin trả lời dịch vụ. Chúng ta có thể tìm hiểu kỹ hơn ở phần tiếp theo của chương này.