GPRS无线数传模块编程方法(VB)
一、在不同组网方式下的具体设置:
不管哪种方式PC机都需要一个固定IP。公网或专线方式的IP为网卡的IP;拨号上网方式的IP为无线Modem的GPRS卡绑定的IP。
1、 公网方式:
因为PC机有了固定的IP,所以在使用的时候,不需要做什么特别的设置就行了,只要将模块的APN名称设为CMNET就行。
2、 专线方式:PC机由网卡可以登录到数据服务器所在的网络内。
具体实现方法:设置PC机的本地连接,(主要是IP地址和网关,网关为数据服务器的网关)设置完成后,可以用Ping命令测试网络是否通。
步骤:点击“开始”—“运行”,在‘打开’中输入Ping数据服务器的 IP,(如莱芜力创的数据服务器IP为192.168.0.164,输入Ping 192.168.0.164)回车。模块的APN名称设为 LICHUANG. LW. SD
3、 拨号上网方式:PC机由无线Modem可以登录到数据服务器所在的网络内。
a、 无线Modem(调制解调器)有几种?
一般情况下,我们使用的有两种,一种为USB连接的,一种为串口连接的。
b、 怎样设置可以使无线Modem登录到数据服务器所在的网络?
先将调制解调器正确连接到计算机上。
对调制解调器进行安装:控制面板—添加新硬件—从列表中选择“调制解调器”—选择此调制解调器所使用的端口—在区号中输入‘086’,选择音频,拨打外线区号可以不输入。
调制解调器安装完成后,还要诊断一下是否安装正确,安装的调制解调器是否可用。步骤为:控制面板—调制解调器—属性—诊断。
对调制解调器进行配置:控制面板—调制解调器—属性—高级,在额外的初始化命令中,
如果是使用东营的GPRS卡,则在附加设置中输入(“AT+CGDCONT=1,”IP”,”DYSHL.SD””)
如果使用的是力创的GPRS卡,则在附加设置中输入(“AT+CGDCONT=1,”IP”,”LICHUANG.LW.SD””)
c、 怎样建立拨号连接?
正确连接调制解调器后,还要建立拨号连接才可以。详细步骤为:
右击‘网上邻居’—属性—建立新连接—选择拨号到专用网络—在输入电话号码时输入‘*99***1#’,其于情况默认点击‘下一步’即可。
d、 拨号上网方式的IP怎样获得?
判断数据中心(无线Modem)的IP,方法有多种:
先拨号连接,待拨号连接成功后,
在任务栏中右击”拨号连接”的图标,选择’状态’,在弹出的画面中选择’信息’,看一下’客户端IP’就行了。
选择开始—运行(输入cmd回车)—输入ipconfig回车,便可以看到拨号连接的IP了。
e、 怎样让无线Modem掉线后自动重拨?
无线Modem在使用的过程中会出现掉线的情况,因为用户不可能总是关注此时的无线Modem是否掉线了,为了使无线Modem不耽误数据传输,可以将其设置成掉线后自动重拨的功能。
具体操作为:
先查找到‘拨号连接’(在拨号网络中)—属性—选项
在‘拨号选项’中去掉所有的选项,选中‘重拨选项’中的断线重拨即可。
在设置时也可以将重拨次数设置的更大一些,比如说10次,不设置也可,用户可根据实际情况来定。
在‘重拨选项’中有一项为‘挂断前的空闲时间’,我们一般设置为“从不”。如果设置为某个时间,则连接时间到了该值时便出现掉线的状况。
图示为图1:
图1
二、一般控件的编写:
控件实际上就是类的封装,一个类中可以定义自己的结构、属性、方法、事件。
1、 结构: Private Type 结构名
MyName as String '''结构中的参数
MyAge as Integer
End Type
2、 属性:
Dim m_GPRSLong As Long
Public Property Let GPRSLong (ByVal NewGPRSLong As Long) '''将表达式的值赋给变量或属性
m_GPRSLong = NewGPRSLong
PropertyChanged "GPRSLong" '''PropertyChanged方法是通知属性的值已经发生变化
End Property
Public Property Get GPRSLong() As Long '''读属性值
GPRSLong = m_GPRSLong
End Property
3、 方法(函数):
Public Function StartServer(Ip As String, Port As Long) As Boolean
'''这种方法用户可以使用
End Function
Private Sub tcpServer_Close(Index As Integer) As Boolean
'''这种方法用户不可以使用,控件本身自己使用
End Sub
4、 事件:
Public Event GetUserID(ByVal User_Id As String, ByVal UserDeal_Id As String)
激活事件时用RaiseEvent 语句
RaiseEvent GetUserID(m_Id, Deal_Id)
5、 用户用到的一些常用事件:
UserControl_Resize '当控件第一次显示或状态改变时发生,调节控件大小的。
比如可以在这里面设置一下控件的高度和宽度
UserControl.Height = 525
UserControl.Width = 525
这样在用户使用的时候向窗体中添加该控件时,大小就不可以改变了。
三、GPRS控件的主要属性、方法、事件:
有了前面介绍的一般控件的知识,下面主要针对GPRS的工作原理,介绍一下其控件的编程:
1、 属性:
GPRS控件的主要属性就是IP地址、端口号、接收到的数据长度。
LocalIP 属性 / Localport 属性 / GPRSLong属性
2、 方法:
A、StartServer(Ip As String, Port As Long) 启动服务方法
本方法用于启动GPRS服务,在系统初始化时必须调用本方法来完成GPRS服务的初始化,否则GPRS模块将无法正确登陆网络,进行通讯。
IP参数为服务器Ip地址, 字符串型
Port参数为服务器通讯端口, 长整型,通常为2020端口.
成功返回Ture,失败则返回False。
示例: StartServer(“192.168.0.1”,2020)
B、StopServer() 停止服务方法
停止服务方法,用来停止GPRS服务,在系统结束退出时,调用本方法停止GPRS服务。
成功返回Ture,失败则返回False.
示例: StopServer()
C、SendDataGPRS(DtuId As String, CmdData As Variant) 发送数据方法
本方法用来与GPRS模块进行通讯,核心方法,参数比较复杂.
DtuID,Gprs模块标识号,用来表明与那块模块进行通讯.
CmdData,要传送的数据,变体变量,可接受字符串或者数组类型.
示例: SendDataGPRS(“6900000196”,Cmd)
3、 事件:
A、 GetUserID(ByVal User_Id As String, ByVal UserDeal_Id As String)
’’收到GPRS模块的ID号或者是上线的ID的时触发的事件
User_Id 为所有在线GPRS模块ID号所组成的字符串。
UserDeal_Id为所有离线GPRS模块ID号所组成的字符串。
如果下面的GPRS模块上传ID号时,系统会以事件的方式进行接收,用户可以在事件中对ID号做处理,想以什么格式显示ID的信息有用户自己做决定。
B、ReceiveData(ByVal User_Id As String, ByVal User_GetDataASC As Variant, ByVal User_GetDataHEX As Variant) ’’ 收到数据时触发的事件
如果下面的设备有数据上传时,就会触发该事件,该事件包括3个参数:
User_Id 为 设备的ID号;
User_GetDataASC 为 以ASCII方式显示的数据;
User_GetDataHEX 为 以HEX方式显示的数据。
下面的设备在上传数据的时候,会将ID号一块传上来,这样用户能够分辨出是哪个设备传上来的,而且上传数据时,会将ASCII方式的数据和HEX方式的数据一块传上来,用户想用什么数据自己决定。
四、 具体的内部编程思路:
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。
五、在TCP/UDP两种方式下的数据通讯方法
1、TCP:
数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。
TCP方式下客户端的连接为:
Winsock.RemoteHost = IP ‘’指定服务器端的IP和端口号
Winsock.RemotePort = Port
Winsock.Connect ‘’’连接
如果连接成功后会响应Winsock 的 Connect事件。
TCP方式下服务器端的监听为:
Dim LocalPort as Long
Dim LocalIP as String
LocalPort =Winsock.LocalPort
LocalIP=Winsock.LocalIP
Winsock.Bind LocalPort, LocalIP ‘’指定连接
Winsock.Listen ‘’’侦听
如果此时下面的终端有连接请求时,会响应Winsock 的ConnectionRequest 事件。
2、UDP:
用户数据文报协议 (UDP) 是一个无连接协议。跟 TCP 的操作不同,计算机并不建立连接。
UDP方式下客户端通讯为:
Winsock.RemoteHost = IP ‘’指定服务器端的IP和端口号
Winsock.RemotePort = Port
Winsock. LocalPort = LocalPort ‘’本地端口
如果有两个终端(A / B)之间通讯,则为:
A: B:
Winsock.RemoteHost = B_IP Winsock.RemoteHost = A_IP
Winsock.RemotePort = B_Port Winsock.RemotePort = A_Port
Winsock. LocalPort = A_Port Winsock. LocalPort = B_Port
UDP方式下服务器端监听为:
Winsock. LocalPort = Port