四、 具体的内部编程思路:
GPRS控件的编写,我们用到的是Winsock控件,所以首先要先了解一下Winsock控件的使用。
1、Winsock控件的使用:
Winsock控件对用户来说是不可见的,我们在编写客户端或服务器程序时,通过设置控件的属性并调用其方法即可实现数据的双向交换。
如果创建客户应用程序,就必须知道服务器计算机名或者 IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用 Connect 方法。
如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用 Listen 方法。当客户计算机需要连接时就会发生 ConnectionRequest 事件。为了完成连接,可调用 ConnectionRequest 事件内的 Accept 方法。
建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用 SendData 方法。当接收数据时会发生 DataArrival 事件。调用 DataArrival 事件内的 GetData 方法就可获取数据。
2、Winsock控件的常用属性:
a、协议
在使用Winsock控件时,首先需要考虑使用什么协议。可以使用的协议包括 TCP 和 UDP。两种协议之间的重要区别在于它们的连接状态:
• TCP 协议控件是基于连接的协议,可以将它同电话系统相比。在开始数据传输之前,用户必须先建立连接。
• UDP 协议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。另外,单次传输的最大数据量取决于具体的网络。
在设计时,可以按如下方式设置应用程序使用的协议:在“属性”窗口中单击“协议”,然后选择 sckTCPProtocol 或者 sckUDPProtocol。也可以使用程序代码来设置 Protocol 属性,如下所示:
Winsock1.Protocol = sckTCPProtocol
b、IP地址(计算机名称)
客户应用程序在与远程计算机相连接的时候,需要知道远程计算机的 IP 地址或者计算机名称。
我们连接计算机时可以将其作为 RemoteHost 属性的值。代码如下:
Winsock1.RemoteHost = 计算机名称 或者为 Winsock1.RemoteHost =IP地址
服务器程序用到LocalIP 属性,它返回本地机器的 IP 地址,格式是 IP 地址加点字符串 (xxx.xxx.xxx.xxx)。
用RemoteHostIP属性返回远程计算机的IP。
c、端口号
对于客户应用程序来说,RemotePort 属性最重要,它设置要连接的远程端口号。
对于服务器程序来说,LocalPort 属性最重要,它设置所用到的本地端口。这是用于侦听的本地端口。如果指定的是端口 0,就使用一个随机端口。在调用了 Listen 方法后,属性就包含了已选定的实际端口。
3、Winsock控件的常用事件
a、Connect 事件
该事件是在到服务器的连接建立之后发生。
b、ConnectionRequest 事件
当远程计算机请求连接时出现。
如果有连接请求时,可以用 Accept 方法接受新连接。
c、DataArrival 事件
当新数据到达时出现。
如果有新数据到达时,可以用GetData方法接收数据。如果没有获取一个 GetData 调用中的全部数据,则事件不会出现。只有存在新数据时才激活事件。可随时用 BytesReceived 属性检查可用的数据量。
4、Winsock控件的常用方法
a、Accept 方法
接受新连接。
仅适用于 TCP 服务器应用程序。在处理 ConnectionRequest 事件时用这个方法接受新连接。在 ConnectionRequest 事件中使用 Accept 方法。ConnectionRequest 事件有一个对应的参数,即 RequestID 参数(新连接请求标识),该参数应该传给 Accept 方法。
b、Bind 方法
指定用于 TCP 连接的 LocalPort(端口号) 和 LocalIP。(IP 地址)
在调用 Listen 方法之前必须调用 Bind 方法。
c、Close 方法
关闭连接。
d、GetData 方法
获取当前的数据块并将其存储在变体类型的变量中。
通常总是将 GetData 方法与 DataArrival 事件并用。
e、Listen 方法
侦听模式。该方法仅适用于 TCP 连接。
当有新连接时就会出现 ConnectionRequest 事件。处理ConnectionRequest 事件时,应用程序应该(在一个新的控件示例上)用 Accept 方法接受连接。
f、SendData 方法
将数据发送给远程计算机。
大体了解了Winsock控件的使用之后,对理解GPRS通讯的原理来说,有一定的帮助。
接下来我们将根据Winsock控件的使用来大体理解GPRS通讯的原理。
1、启动服务
原理为建立一个Tcp的连接,首先设定数据业务中心的IP地址及监听端口号,将其赋给Winsock控件,并用该控件进行连接,连接成功后,进行监听。
代码如下:
myLocalIP = tcpServer(0).LocalIP‘本地机器的 IP 地址(局域网方式)
myLocalIP = “10.14.87.102”‘无线Modem的IP地址(拨号上网方式)
PlngTCPLocalPort = 2020 ‘Tcp服务器的监听端口号
Winsock.Bind (Port ,IP)
Winsock.Listen
需要注意的是如果计算机上既有本地连接又有无线Modem,在运行程序(启动服务)时有可能失败,所以,在编写代码的时候一定要注意自己使用的是哪种方式。因为LocalIP属性获取的是本地连接的IP,用无线Modem的时候IP最好是直接赋值。
再者就是两者同时使用的时候,如果用的是无线Modem的拨号连接,则本地连接只能是同一个网段内使用。
2、GPRS模块连接请求处理
代码如下:
Public Sub Winsock_ConnectionRequest(ByVal RequestID As Long)
Winsock.Accept Requested‘接收新连接
End Sub
原理为如果现在有连接请求,先把请求连接的GPRS模块的IP地址记录下来(用的是Winsock控件的RemoteHostIP属性),再判断保存所有GPRS模块信息的数组中是否出现过,如果没有出现过,保存该信息;如果出现过,先卸载该控件,然后重新加载该控件,保存信息。
3、GPRS模块数据通讯处理
代码如下:
Public Sub Winsock_DataArrival(ByVal bytesTotal As Long)
GprsLong = Winsock.BytesReceived‘返回接收到的(当前在接收端缓冲区内的)数据的数量
Winsock.GetData TempArr, vbByte‘用 GetData 方法来获取数据,取得的数据存放在TempArr中。
End Sub
原理为如果下面的GPRS模块向数据业务中心发送数据,数据业务中心用GetData方法将数据从接收缓冲区中读出来,然后根据条件进行判断所收到的数据是否正确。
在用GetData方法进行数据接收时需要注意是用哪种方式进行通讯的,收到的数是Hex还是Ascii,这里接收的方式不一样。如果是Ascii方式,接收的数据要赋给一个字符串变量,方式为:Winsock.GetData TempStr, vbString;如果是Hex方式,接收的数据要赋给一个以Byte 数据类型的数组,方式为:Winsock.GetData TempArr, vbByte 。
在接收数据之后,必须先要进行数据编译,如果碰到‘80H和90H’在一块的将其转换成为‘1AH’,碰到‘8AH和9AH’在一块的将其转换成为‘8AH’。
将接收到的数据进行编译之后,就可根据条件进行数据处理了。
4、数据中心发送数据
代码如下:
以十六进制发送数据时为:
Dim Cmd(1 to 7) As Byte
Cmd(1)=&H4C
Cmd(2)=&H57
Cmd(3)=&H01
Cmd(4)=&H00
Cmd(5)=&H20
Cmd(6)=&H21
Cmd(7)=&H0D
Winsock.SendData Cmd
以Ascii方式发送数据为:
dim Cmd as string
Cmd=”#01A”+chr(13)
Winsock.SendData Cmd
原理为发送数据时,要知道该GPRS模块的ID号和发送的数据。程序在发送时,先判断该ID号是否收到过,如果没有收到过,程序就不向外发送数据;如果收到过,在发送的时候还要判断GPRS模块当前的状态(是否在线),只有所有条件都符合,才进行发送数据命令。否则程序会出现错误,提示网络连接失败,不能发送数据。
5、停止服务
代码如下:
Winsock.Close
原理为如果用户要关闭服务的话,先关闭所有控件的连接,并把所有加载的控件卸载掉,清空存放GPRS模块的信息,将数据返回长度置为0。
评论
查看更多