GSM模块短信息驱动

SimplePCConnect是SimpleTeam提供的一款免费的GSM模块短信息驱动程序。该驱动程序可以通过红外线或数据线方式驱动多种使用 AT Command的设备,例如:Nokia、NEC、Siemens、WaveCOM等等。通过该驱动程序,用户可以发送中文(普通或免提)和英文短信息。第二代驱动主要增加了对二进制数据、WAP Push ( Service Indication / Service Loading ) 、WAP Bookmark、GPRS Setting、MMS Indication和小灵通短信的支持。

提供的驱动程序为DLL文件,适合调用的程序有:Visual Basic、C++ Builder、Visual C&C++、Delphi、Java等等。另外附件中还提供了相关的Visual Basic开发源代码以及函数详细说明。最新版本的驱动完全免费,使用和开发上没有任何限制,也不需要软件授权。

点击这里可以下载该程序:SimplePCConnect2.zip

一、简单介绍

Simple PC Connect是采用Visual C&C++ 6.0所编写的动态连接调用库。该模块中包含了Windows下的串口调用、AT指令驱动以及短信息PDU格式的编码和解码器等功能。调用该模块中的标准过程,可以驱动多种兼容AT指令的GSM设备。这些GSM设备包括绝大多数Nokia手机(例如:5110、6210等等)、NEC、WaveCOM模块、Falcom模块等等设备,实现短信息的收发。

二、功能介绍

(1)使用Visual C&C++ 6.0编写成DLL模块,可以通过Visual C&C++或Visual Basic等其他程序实现调用。
(2)内部函数简单易用,可以十分容易地实现短信息的收发。
(3)内部支持Unicode 8Bit和7Bit编码/解码,可以实现中文/英文短信息的收发。
(4)内部支持二进制数据、WAP Push(Service Indication / Service Loading)、WAP Bookmark、GPRS Setting和MMS Indication等特殊短信息。
(5)支持以红外线或数据线的方式驱动兼容AT指令的GSM设备。
(6)支持与硬件设备的相互绑定,防止软件被非法拷贝并应用。

三、函数以及说明

Simple PC Connect模块的函数一共可以分为三类函数:模块初始化函数、连接管理函数和发送接收函数。

3.1 模块初始化函数

3.1.1 取得模块相关信息

       //Get the information string of the dll moudle.
       LPCTSTR _stdcall GetModuleInformation();
       【过程描述】获得一个DLL模块描述的字符串(以’\0’结尾)。
       【注意问题】
       (1)该函数可以随时调用。

3.1.2 初始化模块

       //Initialize the module.
       BOOL _stdcall InitializePCConnect(UINT nInitializeStatus);
       【过程描述】
       在Debug版本中,该函数中将初始化一个日志函数。如果能够成功地打开日志文件,那么该函数将返回TRUE,否则返回FALSE。在Release版本中没有如上的处理过程,整个函数直接返回TRUE。
       【注意问题】
       (1)在开始使用模块的相关函数之前,请先调用该函数。
       (2)在Visual Basic中的Boolean和BOOL型可能有一定的差异。因此,采用Native Code编译后的代码在运行的时候可能会出现无法正常使用的问题。此时采用P-Code编译即可。

3.1.3 卸载模块

       //Uninitialize the module.
       void _stdcall UninitializePCConnect();
       【过程描述】
       关闭所有设备,并释放已分配的内存。
       【注意问题】
       (1)在卸载模块之前必须调用该函数。这样可以关闭忘记关闭的设备和释放已分配的内存。否则可能导致串口被长时间占用。

3.2 设备连接管理

3.2.1 初始化连接

       //Open the connection with the PC.
       BOOL _stdcall OpenPCConnect(UINT nDeviceNumber,LPCTSTR lpszLicence,LPCTSTR lpszSCA);
       【过程描述】
       该函数将打开nDeviceNumber所指定的串口,并读取设备的相关参数。如果某些参数不在范围内,那么该函数将返回初始化失败。
       【注意问题】
       (1)该函数会打开串口,并且初始化该串口。在使用完成后,一定要调用ClosePCConnect关闭该设备。
       (2)如果lpszLicence不填写或者填写不正确,将不影响连接的打开过程。
       (3)短信息中心如果不设置,那么该函数将试图从设备中读取。如果设备中也没有设置,那么设备将返回初始化失败。
       (4)引起设备初始化失败的原因比较多,例如:串口尚未连接、电源没有连接、非AT兼容设备、SIM卡没插上、读取序列号失败、读取短信息中心失败等等。

3.2.2 重新打开连接

       //Reopen the connection with the PC.
       BOOL _stdcall ReopenPCConnect(UINT nDeviceNumber);
       【过程描述】
       重新快速初始化已经出现严重错误的设备(该设备已经打开,在使用中发生严重错误)。
       【注意问题】
       (1)该函数仅在设备出现严重错误的时候才使用。
       (2)其他时候使用也有效,但是没有实际意义。
       (3)不要在发送和接收过程完成之前使用该函数。

3.2.3 关闭连接

       //Close the connection with the PC.
       void _stdcall ClosePCConnect(UINT nDeviceNumber);
       【过程描述】
       关闭指定设备,并释放已分配的内存。
       【注意问题】
       (1)在使用OpenPCConnect建立连接后,都要使用ClosePCConnect实现关闭。
       (2)ClosePCConnect只能关闭所指定的设备。
       (3)设备关闭,连接也随即关闭。此后将不能在使用发送和接收函数操作该设备。
       (4)不要在发送或接收过程完成之前使用该函数。

3.2.4 获得设备授权状态

       //Get the authorization.
       BOOL _stdcall GetAuthorization(UINT nDeviceNumber);
       【过程描述】
       获得已打开设备的授权状态。
       【注意问题】
       (1)在打开设备的时候,请使用正确的lpszLicence将设备初始化。

3.2.5 检查设备是否支持AT指令

       //Detect the connection with the PC.
       BOOL DetectPCConnect(UINT nDeviceNumber);
       【过程描述】
       获得已打开设备的授权状态。
       【注意问题】
       (1)请在该设备打开之前使用该检测指令。

3.3 内容管理函数

3.3.1 参数设置函数

       //Set status receipt requested.
       void _stdcall SetStatusReceiptRequested(BOOL bStatusReceiptRequested);
       //Set reject duplicated.
       void _stdcall SetRejectDuplicated(BOOL bRejectDuplicated);
       //Set protocol identification.
       void _stdcall SetProtocolIdentification(BYTE bProtocolIdentification);
       【过程描述】
       【注意问题】
       (1)通过收条在很大程度获得用户的接收情况。
       (2)一般来说不用拒绝重复的MR。
       (3)应用协议类型在某些特殊短信息的时候会用到。
       (4)这些参数应当在设置内容(SetXXXContent)之前设置。

3.3.2 内容设置函数

       //Set the content into the list.
       BOOL _stdcall SetUTF8Content(LPCTSTR lpszContent,BOOL bImmediateDisplay);
       BOOL _stdcall Set7BitContent(LPCTSTR lpszContent);
       BOOL _stdcall SetBinaryContent(LPCTSTR lpszContent,BOOL bHeaderIndication);
       【过程描述】
       设定待发送的内容。
       【注意问题】
       (1)SetUTF8BitContent能够设置中文或者中英混合,甚至是其他语言的短信息。但是内容长度不能超过70个Unicode字符。如果超过,则该函数返回FALSE。
       (2)Set7BitContent是用来发送纯ASCII码的短信息。内容长度不能超过160个ASCII码。如果超过,则该函数返回FALSE。
       (3)如果对多人实行群发,内容在每次发送的时候只需要设置一次即可。这样简化发送过程。

3.3.3 内容清理函数

       //Clear the content.
       void _stdcall ClearContent();
       【过程描述】
       清理设定待发送的内容。
       【注意问题】
       (1)该函数将清理所有的相关内容,使设定内容自动清空。

3.3.4 WAP功能函数

       //Set the wap push into the list.
       BOOL _stdcall SetWAPPushService(LPCTSTR lpszReference,LPCTSTR lpszDescription,BOOL bImmediately);
       //Set the wap bookmark into the list.
       BOOL _stdcall SetWAPPushBookmark(LPCTSTR lpszReference,LPCTSTR lpszDescription);
       //Set the gprs settting into the list.
       BOOL _stdcall SetWAPGPRSSetting(LPCTSTR lpszReference,LPCTSTR lpszDescription);
       //Set the mms indication into the list.
       BOOL _stdcall SetWAPMMSIndication(LPCTSTR lpszFrom,UINT nSize,LPCTSTR lpszReference);
       【过程描述】
       从上至下分别设定WAP Push服务,WAP Push书签和WAP GPRS设定。
       【注意问题】
       (1)URL地址一定要使用http://或者https://开头,否则可能导致异常。

3.4 短信收发函数

3.4.1 发送短信息

       //Send the content.
       //If not authenticated, then send the advertise at the end of the sending.
       BOOL _stdcall SendContent(UINT nDeviceNumber,LPCTSTR lpszTerminalAddress);
       【过程描述】
       将保存的内容发送到指定的用户。
       【注意问题】
       (1)在发送前,请先确认设备已经打开。
       (2)如果发送成功,那么可以在GetStatus函数中得到Status = 3的状态。
       (3)如果发送失败,那么可以在GetStatus函数中得到其他的状态数值。
       (4)如果所需要发送的内容被分为多条,那么只要有一条发送失败,那么就直接返回FALSE。
       (5)发送函数与接收函数之间已经实现了函数同步处理,因此可以在不同的线程中调用。
       (6)一般来说,该函数所需执行的时间相对较长。
       (7)如果使用未经授权的设备发送短信息,那么每条正常短信息内容之后都会跟一条广告信息。
       (8)如果需要给小灵通发送短信息,请在号码前加106。例如,北京的小灵通号码是80659031,那么目标号码应该是:【106】+『区号』+80659031,即:10601080659031。

3.4.2 接收短信息

       //Receive the content.
       BOOL _stdcall ReceiveContent(UINT nDeviceNumber,LPSTR lpszTerminalAddress,LPSTR lpszContent);
       【过程描述】
       从设备中获取接收到的短信息。该函数将只接收文本短信息,屏蔽收条和无法解析的信息(包括数据格式的信息)。
       【注意问题】
       (1)ReceiveContent并不能每次都返回TRUE。需要有一个虚幻不断地去调用该函数。
       (2)如果ReceiveContent返回FALSE,请根据GetStatus函数做相应的处理。
       (3)如果从未授权的设备上获取短信息,那么也将获得搀杂着广告信息的短信息。

3.4.3 设备状态函数

       //Get the status of the device.
       int _stdcall GetStatus(UINT nDeviceNumber);
       //Get the error of the device.
       int _stdcall GetError(UINT nDeviceNumber);
       【过程描述】
       获得设备最近一次的状态和错误代码。
       【注意问题】
       (1)请在每次调用发送和接收函数之后,如果函数返回FALSE,那么就要检测一下设备的状态。根据不同的状态做错误处理。
       (2)其他时候使用该函数,是没有实际意义的。

四、安装与使用

       Simple PC Connect有两个版本:
       (1)Release版本:SimplePCConnect.dll(155,648字节)
       (2)Debug版本:SimplePCConnect.dll(1,642,569字节)
       使用前,请将该DLL拷贝或安装到Windows的system目录下,通过声明或装载就可以使用该模块中的各个函数。使用方法请参考上面的详细说明。
       另外,该模块中可能使用到了Visual C&C++的相关动态连接库。如果你没有该库,请上网下载或者安装Visual C&C++系统。

五、基本调用过程

整个模块的详细调用过程可以参考Visual Basic例子程序的调用过程。这里再简单说明一下:

5.2 发送过程

       (1)使用InitializePCConnect初始化模块。
       (2)使用OpenPCConnect打开一个指定设备。
       (3)使用SetXXXContent设置待发送的内容。
       (4)使用SendContent将内容发送到指定的用户手机上。
       (5)检测发送结果,进行错误处理。
       (6)如果还有用户,那么重复(4)和(5)直到所有的用户都发送完毕。
       (7)使用ClosePCConnect关闭一个指定设备。
       (8)使用UninitializePCConnect卸载模块。

5.3 接收过程

       (1)使用InitializePCConnect初始化模块。
       (2)使用OpenPCConnect打开一个指定设备。
       (3)使用ReceiveContent接收短信息内容。
       (4)检测接收结果,进行错误处理。
       (5)不断重复(3)过程,直到整个应用结束。
       (6)使用ClosePCConnect关闭一个指定设备。
       (7)使用UninitializePCConnect卸载模块。

六、注意问题

6.1 在Visual Basic的接口过程中凡是使用BOOL变量的返回函数有些时候工作不正常。

       【解决】
       在Visual Basic中的boolean变量为2个字节,而在Visual C&C++中的BOOL为4个字节。建议将函数声明为整数函数,或者使用P-Code(而不是Native Code)编译程序。