日期:2023-01-24 阅读量:0次 所属栏目:信息安全
摘 要:通过基于AT指令的M22 GPRS模块,在VB6.0下利用MSComm控件实现GPRS模块与计算机的串行通信,对电话呼入时串口的数据进行分析、提取,开发设计了来电显示功能,从而实现对来电号码的追踪。
关键词:AT指令;GPRS模块;MSComm控件;来电显示
1.引言
GPRS(General Packet Radio Service)是“通用分组无线业务”英文的缩写,是在现有的GSM网络基础上叠加了一个新的网络。它充分利用了现有移动通信网的设备,在GSM网路上增加一些硬件设备和软件升级,形成一个新的网络逻辑实体。它以分组交换技术为基础,采用数据网络协议。随着移动通信技术的发展,采用GPRS通信方式的移动数据通信网络已经覆盖了各地,而且网络运行稳定,因此给行业应用带来了广阔的市场前景。
将计算机通过串行通信技术与GPRS无线通信网络建立连接,可以实现手机与计算机的通信。计算机与GPRS网络的连接可以采用GPRS模块,也可以采用GPRS Modem,笔者采用基于AT指令的M22 GPRS模块使计算机与GPRS网络进行连接,其组成原理如图1所示。本文在Windows环境下,采用VB6.0中的MSComm控件实现M22 GPRS模块与计算机的串行通信,开发设计了来电显示功能,从而实现对来电号码的追踪。
图1 基于GPRS网络的M22模块应用系统组成原理
2. AT指令
最初AT指令仅被用于Modem操作,随后一些主要的移动电话生产厂商共同为GSM制订了一套比较完善的AT指令。在此基础上,AT指令又逐渐演化并被加入到了GSM 07.05标准以及GSM 07.07标准。GSM07.07标准是手机、Modem等设备与计算机进行通信的标准,不同的厂家对AT指令都进行了相应的扩充和修改,因而不同设备的指令格式并不完全相同,但都遵循GSM07.07标准。AT指令的格式通常有如下几种:
(1)AT
(2)AT+XXXX=XX
(3)AT+XXXX=″XX″
3. 串行通信配置方案
在Windows环境下,串口与外部设备的通信可以利用VB提供的MSComm控件来完成。MSComm是一种串行通信控件,它提供了两种处理通信的方式:事件驱动方式和查询方式。事件驱动通讯是处理串行端口交互作用的一种非常有效的方法,可以利用 MSComm 控件的 OnComm 事件捕获并处理通讯事件,OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,通过检查 CommEvent 属性的值事件和错误来查询。每个MSComm 控件对应着一个串行端口,如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。由于每个MSComm控件均对应着唯一的一个串行端口号,因此在设备连接好后,需要根据系统的具体配置设置相应的参数,主要设置的参数有设备的端口号、数据传输速率、数据位、奇偶校验位、停止位等。假设连接端口为COM1,数据传输速率为9600bit/s、数据位为n、奇偶校验位为8、停止位为1,则可设置VB的MSComm控件的属性如下:
rt = 1
gs = "9600,n,8,1"
en = 0
erSize = 1024
en = True
hold = 64
当参数设置好后,需要通过下列的AT指令来进行测试连接是否成功。
AT
AT+CMGF=1
在MSComm的OnComm事件里,当检测到返回的响应指令为“OK”时,表示串口已经连接成功。
4.来电显示的实现
笔者应用基于AT指令的M22 GPRS模块,采用VB6.0设计开发了来电显示功能,实现方法如下:
GPRS模块有电话呼入时串口收到如下数据:
RING
+CLIP:"13514303856",129,,,,0
+CLIP:"13514303856",129,,,,0
RING
+CLIP:"13514303856",129,,,,0
RING
+CLIP:"13514303856",129,,,,0
当对方挂机时收到NO CARRIER。从收到的数据可以看出,要想得到来电号码,必须对收到的数据进行处理,即提取有用信息,过滤无用信息。当有来电时,在缓存中寻找“+CLIP:”,用Val命令在连续的15个字符中取连续的数字,可将来电号码提取出来。代码如下:
Dim StrBuffer As String
Dim Point As Integer
StrBuffer =
If IsOff = False And <> "" Then
Exit Sub
End If
Point = InStr(1,StrBuffer,"+CLIP:")
If Point = 0 Then
Exit Sub
End If
If Len(Mid(StrBuffer,Point + 8,15)) <> 15 Then
Exit Sub
End If
= Val(Mid(StrBuffer,Point + 8,15))
如果前一次来电挂断后的数据不足64字节,未能触发事件,则前次的数据会驻留缓存中,本次来电后凑满64字节触发事件,如:
RING
+CLIP:"13514303856",129,,,,0
NO CARRIER
RING
+CLIP:"13180809999",129,,,,0
+CLIP:"13180809999",129,,,,0
则用寻找“+CLIP:”的方法读出的号码为:13514303856,而本次来电的号码为:13180809999。
为避免出现这个问题需要采用新的判断条件,即寻找NO CARRIER。在NO CARRIER后寻找22个字符,读出其中的连续数字。代码如下:
Dim StrBuffer As String
StrBuffer =
If InStr(1,StrBuffer,"ER") <> 0 Then
= ""
If Mid(StrBuffer,InStr(1,StrBuffer,"ER") + 6,1) <> "R" Then
= ""
IsOff = True
Exit Sub
Else
If Len(Mid(StrBuffer,InStr(1,StrBuffer,"ER") + 22,15)) = 15 Then
= Val(Mid(StrBuffer,InStr(1,StrBuffer,"ER") + 22,15))
End If
End If
End If
5.结论
通过上述的程序设计,实现了来电显示的功能。本程序在设计过程中,通过对电话呼入时串口收到的数据进行分析,提取了其中的电话号码,摒弃了无效信息,同时考虑了可能出现的特殊情况,从而确保来电显示的号码无误。
参考文献
黄晴.基于VB的网络管理系统的设计与实现.华东师范大学硕士学位论文,2007.
作者简介:王洪革(1968—),男,吉林警察学院信息工程系副教授,工学硕士,主要研究方向:信息处理及计算机通信。
下一篇:高校图书馆面向企业的信息服务研究