如何利用动态库接收无线通信模块的数据
动态库使用说明
数据中心DSC(Data Service Center)是用于接收终端数据和向终端发送数据的服务软件,和终端之间通讯使用开发包中动态库gprsdll.dll,该文件包括和终端通讯所需要的全部API函数,包括服务的启动、数据发送、数据接收、关闭服务等。DSC实际上是架构在gprsdll.dll所提供的功能之上的数据处理软件,其所需要完成的主要功能如下:
1、使用API启动和停止数据服务;
2、使用API接收数据和向终端发送数据,并且对数据作进一步处理;
3、使用API轮询终端用户列表并且进行进一步处理,如显示和统计等;
1.数据结构:
(1).基本数据结构:
typedef UINT u32t; //32位无符号整数
typedef UCHAR u8t; //8位无符号整数
typedef USHORT u16t; //16位无符号整数
typedef ULONGu64t; //64位无符号整数
(2).用以区分标识各台Modem的数据结构:
typedef struct _modem_info_t_
{
u32t m_modemId; //Modem模块的ID号
u8t m_phoneno[12]; //Modem的11位电话号码,必须以'\0'字符结尾
u8t m_dynip[4]; //Modem获取到的动态ip地址
u64t m_conn_time; //Modem模块最后一次建立TCP连接的时间
u64tm_refresh_time; //Modem模块最后一次收发数据的时间
u8t m_signal; //上线前检测到的信号质量
} ModemInfoStruct;
(3).描述中心从终端所接收到的数据的数据结构:
#define MAX_RECEIVE_BUF 1450
typedef struct _modem_data_t {
u32t m_modemId; // Modem模块的ID号
u64t m_recv_time;//接收到数据包的时间
u8t m_data_buf[MAX_RECEIVE_BUF+1];//存储接收到的数据
u16t m_data_len;//接收到的数据包长度
#define DATA_TYPE_USERDATA 0x01
#define DATA_TYPE_CTLRESP 0x02
#define DATA_TYPE_JPEGDATA 0x03
#define DATA_TYPE_GPSDATA 0x04
u8t m_data_type; //接收到的数据包类型,
//0x01:用户数据包
//0x02:对控制命令帧的回应
//0x03: 图片数据,图片数据的ID号存放在m_jpegId中。
//可以通过DSGetJpegById()函数获取图片。
//注意:如果收到了MODEM数据内容是图片数据,则
//应当尽快调用DSGetJpegById()进行图片的读
//取,否则会导致内存中数据过多
//0x04: GPS参数数据
//表明数据中都是GPS相关参数(目前的实现由用户
//进行解码,后续提供专门的解码程序)。
u32t m_jpegId; //图片数据的ID号(实际上就是指针了啦)
}ModemDataStruct;
2.Api说明:
(1). BOOL _stdcall DSStartService(u16t uiListenPort);
功能:启动服务器的数据服务
参数: u16ListenPort:服务的侦听端口
说明:启动服务器的数据服务。启动数据服务后,服务器侦听在指定端口。
数据中心启动后应当首先调用这个API进行端口侦听
如果失败了,可以调用DSGetLastError()函数查看错误原因。
(2). BOOL _stdcall DSStopService(void);
功能:停止服务器的数据服务
参数:无
说明:停止服务器的数据服务。所有的终端都将下线。
如果失败了,可以调用DSGetLastError()函数查看错误原因。
(3). BOOL _stdcall DSGetNextData(ModemDataStruct* pDataStruct,u16t waitseconds);
功能:读取下一条Modem送上来的信息
参数:pDataStruct: 存放Modem所送上来的信息和数据的结构,读函数执行成功后,返回的数据存放到该参数指向的结构中
waitseconds:本函数读到数据后立即返回;如果没有数据到达,则等待最长waitseconds(时间单位:秒)的时间,直到有数据到达,取值范围从0~65535,如果取值为0表明本函数将立即返回。
返回:如果返回为非零值,表明收到了一条Modem信息。如果返回为0,则表明没有收到数据。
(4). BOOL _stdcall DSSendData(u32t modemId,u16t len,u8t * buf);
功能:向指定ID号的的Modem发送数据
参数:modemId:终端的ID号,用以标识一个终端
len:待发送的数据长度(字节数),数据长度必须小于或等于1450个字节
buf:待发送的数据
如果失败了,可以调用DSGetLastError()函数查看错误原因。
(5). u32t _stdcall DSGetModemCount(void);
功能:取得当前在线的所有的Modem的总数;
(6). BOOL _stdcall DSGetModemByPosition(u32t pos, ModemInfoStruct *pModemInfo);
功能:取得指定位置的Modem的数据;
参数:pos:Modem列表中的位置信息,0代表第一个Modem位置;
pModemInfo:指向用以保存Modem信息的数据结构;
(7). BOOL _stdcall DSSendControl(u32t modemId,u16t len,u8t * buf);
功能:向指定ID号的的终端发送控制命令
参数:modemId:终端的ID号,用以标识一个终端
len:待发送的控制命令长度(字节数),数据长度必须小于或等于1000个字节
buf:待发送的控制命令帧
如果失败了,可以调用DSGetLastError()函数查看错误原因。
(8). void _stdcall DSGetLastError(char *str,int nMaxBufSize);
功能:获得先前API执行时发生的错误;
参数:str:用来存放错误信息的缓冲区;
nMaxStrSize:缓冲区的最大长度,如果错误信息的大小超过了这个值,则此函数将把错误信息的尾部截除。
(9). void _stdcall DSGetVersion(char *strVerBuf,int iVerBufSize);
功能:获取动态链接库的版本号
参数:strVerBuf:动态链接库版本结果存储缓冲区。
iVerBufSize:动态链接库版本结果存储缓冲区的大小(字节数)。
(10).BOOL _stdcall DSIoCtrl(u32t u32Argu,u8t * ptrVal,u32t sizeOfVal);
功能:设置/获取当前的动态链接库的各项参数.
参数:u32Argu:动态链接库的命令类型。
ptrVal:指向命令值的指针。
sizeOfVal:指向命令的值的大小(多少个字节);
目前定义的命令有
(1)CMD_SET_STRAIGHT
#define CMD_SET_STRAIGHT1
(2)CMD_GET_STRAIGHT
#define CMD_GET_STRAIGHT2
控制是否对和DTU的之间通信(接收和发送双向)的数据进行转义。
1:不进行转义处理;
0.进行转义处理;
(3)CMD_SET_TIMESYNC
#define CMD_SET_TIMESYNC3
(4)CMD_GET_TIMESYNC
#define CMD_GET_TIMESYNC4
控制中心是否在DTU注册成功后向DTU发送时钟同步信息。
1:发送;
0.不发送;
(5)CMD_SET_IFCAMERA
#define CMD_SET_IFCAMERA5
(6)CMD_GET_IFCAMERA
#define CMD_GET_IFCAMERA6
控制中心是否支持CAMERA显示。
1:支持;
0.不支持;
(11).BOOL _stdcall DSGetJpegById(u32t u32JpegId,u8t * ptrVal,u32t sizeOfVal);
功能:通过id号来获取Jpeg图片
参数:u32JpegId: Jpeg图片数据的ID号。
ptrVal:存储接收到的图片数据的缓冲区首地址
sizeOfVal:存储接收到的图片数据的缓冲区的大小
返回:如果成功,返回TRUE;如果失败,返回FALSE。
注意: 缓冲区的大小必须大于MAX_JPEG_SIZE
#define MAX_JPEG_SIZE (256*512)
[color=#FF0000][/color]以上就是动态库的使用说明,但还是不知道该怎么声明和调用?
请高手指点,需要实现的功能是:接收无线通信模块发送的数据!
[解决办法]
'==============================================================================' Constant defining ( 常数定义 )'==============================================================================Private Const MAX_RECEIVE_BUF = 1450Private Const DATA_TYPE_USERDATA = 1Private Const DATA_TYPE_CTLRESP = 2Private Const DATA_TYPE_JPEGDATA = 3Private Const DATA_TYPE_GPSDATA = 4Private Const CMD_SET_STRAIGHT = 1Private Const CMD_GET_STRAIGHT = 2Private Const CMD_SET_TIMESYNC = 3Private Const CMD_GET_TIMESYNC = 4Private Const CMD_SET_IFCAMERA = 5Private Const CMD_GET_IFCAMERA = 6Private Const MAX_JPEG_SIZE = 131072 '256 * 512'==============================================================================' Data type defining ( 数据类型定义 )'==============================================================================Private Type ModemInfoStruct m_modemId As Long m_phoneno(11) As Byte m_dynip(3) As Byte m_conn_time As Currency m_refresh_time As Currency m_signal As ByteEnd TypePrivate Type ModemDataStruct m_modemId As Long m_recv_time As Currency m_data_buf(MAX_RECEIVE_BUF) As Byte m_data_len As Integer m_data_type As Byte m_jpegId As LongEnd Type'==============================================================================' API function declare ( API函数声明 )'==============================================================================' DSC API function declarePrivate Declare Function DSStartService Lib "gprsdll.dll" ( _ ByVal uiListenPort As Integer) As BooleanPrivate Declare Function DSStopService Lib "gprsdll.dll" () As BooleanPrivate Declare Function DSGetNextData Lib "gprsdll.dll" ( _ pDataStruct As Any, _ ByVal waitseconds As Integer) As BooleanPrivate Declare Function DSSendData Lib "gprsdll.dll" ( _ ByVal modemId As Long, _ ByVal mlen As Integer, _ buf As Any) As BooleanPrivate Declare Function DSGetModemCount Lib "gprsdll.dll" () As LongPrivate Declare Function DSGetModemByPosition Lib "gprsdll.dll" ( _ ByVal pos As Long, _ pModemInfo As Any) As BooleanPrivate Declare Function DSSendControl Lib "gprsdll.dll" ( _ ByVal modemId As Long, _ ByVal mlen As Integer, _ buf As Any) As BooleanPrivate Declare Sub DSGetLastError Lib "gprsdll.dll" ( _ str As Any, _ ByVal nMaxBufSize As Long)Private Declare Sub DSGetVersion Lib "gprsdll.dll" ( _ strVerBuf As Any, _ ByVal iVerBufSize As Long)Private Declare Function DSIoCtrl Lib "gprsdll.dll" ( _ ByVal u32Argu As Long, _ ptrVal As Any, _ ByVal sizeOfVal As Long) As BooleanPrivate Declare Function DSGetJpegById Lib "gprsdll.dll" ( _ ByVal u32JpegId As Long, _ ptrVal As Any, _ ByVal sizeOfVal As Long) As Boolean' Win32 API function declarePrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ Destination As Any, _ Source As Any, _ ByVal Length As Long)'==============================================================================' 自定义函数及处理过程'=============================================================================='********************************************************************************'** 函 数 名 : VBTypeToVCType_MIS'** 输 入 : mVBType(ModemInfoStruct) - 要通过Sock发送的任何类型数据内容'** 返 回 : (Byte()) - 拼合后的 ModemInfoStruct 类型字节流'** 功能描述 : 将 ModemInfoStruct 类型的数据转换到符合 VC 结构的字节流并返回'** 创建日期 : 2010-09-27'** 修 改 人 :'** 修改日期 :'** 版 本 : Version 1.0.0'********************************************************************************Private Function VBTypeToVCType_MIS(mVBType As ModemInfoStruct) As Byte() ReDim VBTypeToVCType_MIS(36) CopyMemory VBTypeToVCType_MIS(0), mVBType.m_modemId, 4 CopyMemory VBTypeToVCType_MIS(4), mVBType.m_phoneno(0), 12 CopyMemory VBTypeToVCType_MIS(16), mVBType.m_dynip(0), 4 CopyMemory VBTypeToVCType_MIS(20), mVBType.m_conn_time, 8 CopyMemory VBTypeToVCType_MIS(28), mVBType.m_refresh_time, 8 CopyMemory VBTypeToVCType_MIS(36), mVBType.m_signal, 1End FunctionPrivate Function VBTypeToVCType_MDS(mVBType As ModemDataStruct) As Byte() '...你自己模仿上面的写过程把End FunctionPrivate Function VCTypeToVBType_MIS(ByteArray() As Byte) As ModemInfoStruct '...你自己模仿上面的写过程把End FunctionPrivate Function VCTypeToVBType_MDS(ByteArray() As Byte) As ModemDataStruct '...你自己模仿上面的写过程把End Function