NET(通信)库封装

概述

       通讯封装包含了通讯通用模块、界面处理模块、协议处理模块、具体通讯业务模块。

其中通讯通用模块包括三个子模块:网络层数据传输层API接口层

  1. 网络层:GPRS、ADSL等网络的注册、注销、登录方式控制、登录状态控制等,其中注册、注销采用同步方式。
  2. 数据传输层:通过socket管理与socket服务器的连接、发送数据、接收数据、中断连接等控制。处理连接超时、接收超时、发送超时,及设置发送、接收、结果、状态等回调注册接口,及IP、PORT的合法性校验接口等。
  3. API接口层:通讯封装的接口,提供有提示界面和无提示界面供连接池调用。

界面处理模块(提示界面层),是提供用户界面显示接口,如显示当前的操作状态、操作进度等。

协议处理模块,主要包括有:烟草协议解析、公司标准协议解析、8583协议与目录销售8583协议解析。

      

一、接口说明

1.1 通讯通用模块

1.1.1 文件名

文件名:net_api.h   net_api.c

1.1.2 各类定义

typedef int (* NET_API_SEND_CALLBACK)(char *pszDataBuf, int *pnDataLen);//发送数据

typedef int (* NET_API_RECV_CALLBACK)(char *pszDataBuf, int nDataLen);//接受数据

typedef int (* NET_ API_RESULT_CALLBACK)(int nErrorType); //返回错误码

typedef int (* NET_ API_STAT_CALLBACK)(int nCurStat);//返回当前状态(状态改变时返回)

#define NET_API_APN_MAX_LEN 50

//发送错误代码

typedef enum enNetApiSendErr

{

    NET_API_SEND_ERR_SUCC,     //发送成功

    NET_API_SEND_ERR_CONTINUE,  //未发送成功

    NET_API_SEND_ERR_FAIL,     //发送失败

} NET_API_SEND_ERR_EN;

typedef enum enNetApiRecvErr

{

    NET_API_RECV_ERR_SUCC,     //接收成功

    NET_API_RECV_ERR_CONTINUE,  //未接受完全

    NET_API_RECV_ERR_FAIL,     //接受失败

} NET_API_RECV_ERR_EN;

typedef enum enNetLoginType

{

    NET_LOGIN_TYPE_GPRS,//gprs连接

    NET_LOGIN_TYPE_ADSL,//adsl连接

}NET_LOGIN_TYPE_EN;

//返回的结果代码

typedef enum enNetApiErr

{

    NET_API_ERR_SUCC, //成功

    NET_API_ERR_REGGED,//已注册

    NET_API_ERR_REG,  //注册错误

    NET_API_ERR_CONN, //连接错误

    NET_API_ERR_SEND, //发送错误

    NET_API_ERR_RECV, //接收错误

    NET_API_ERR_UNREG, //注销错误

} NET_API_ERR_EN;

//网络状态

typedef enum enNetApiStat

{

    NET_API_STAT_FREE, //空闲状态(完成)

    NET_API_STAT_CONN, //正在连接

    NET_API_STAT_SEND, //正在发送

    NET_API_STAT_RECV, //正在接受

    NET_API_STAT_DISCONN,//正在断开连接

} NET_API_STAT_EN;

//网络连接属性

typedef struct tagNetApiConnProperty

{

    int nConnType;

    char szApn[51];

    char szIp[16];

    char szPort[6];

}NetApiConnProperty;

1.1.3 外部接口

  1. 注册发送请求回调函数:

函数原型

int net_api_set_send_callback( const NET_API_SEND_CALLBACK pfnSendCallback );

输入参数

const NET_API_SEND_CALLBACK pfnSendCallback    发送回调处理函数指针

输出参数

返回值

TRUE成功、FALSE失败

功能

注册发送请求回调函数

注意事项

参考

net_api.c

  1. 注册接收请求回调函数:

函数原型

int net_api_set_recv_callback( const NET_API_RECV_CALLBACK pfnRecvCallback );

输入参数

const NET_API_RECV_CALLBACK pfnRecvCallback    接收回调处理函数指针

输出参数

返回值

TRUE成功、FALSE失败

功能

注册接收请求回调函数

注意事项

参考

net_api.c

  1. 注册结果处理回调函数:

函数原型

int net_api_set_recv_callback( const NET_API_RECV_CALLBACK pfnRecvCallback );

输入参数

const NET_API_RESULT_CALLBACK pfnResultCallback      结果回调处理函数指针

输出参数

返回值

TRUE成功、FALSE失败

功能

注册结果处理回调函数

注意事项

参考

net_api.c

  1. 注册状态回调函数:

函数原型

int net_api_set_stat_callback( const NET_API_STAT_CALLBACK pfnStatCallback );

输入参数

const NET_API_STAT_CALLBACK pfnStatCallback 状态回调处理函数指针

输出参数

返回值

TRUE成功、FALSE失败

功能

注册状态回调函数

注意事项

参考

net_api.c

  1. 网络层初始化:

函数原型

BOOL net_api_init( void );

输入参数

输出参数

返回值

TRUE成功、FALSE失败

功能

网络层初始化

注意事项

参考

net_api.c

  1. 获取错误信息函数:

函数原型

char *net_api_get_errstr( NET_API_ERR_EN nErrorCode );

输入参数

NET_API_ERR_EN nErrorCode  错误代码

输出参数

返回值

错误描述字符串

功能

获取错误信息函数

注意事项

参考

net_api.c

  1. 获取通讯模块版本号函数:

函数原型

char *net_api_get_version( void );

输入参数

输出参数

返回值

通讯模块版本号

功能

获取通讯模块版本号函数

注意事项

参考

net_api.c

  1. 启动数据传输:

函数原型

BOOL net_api_start( NetApiConnProperty *pstConnProperty );

输入参数

NetApiConnProperty *pstConnProperty      网络连接结构体

输出参数

返回值

TRUE成功、FALSE失败

功能

启动数据传输

注意事项

参考

net_api.c

  1. 银联业务主动注册:

函数原型

int net_api_login( NetApiConnProperty stNetApiConnProperty );

输入参数

NetApiConnProperty stNetApiConnProperty      网络连接结构体

输出参数

返回值

TRUE成功、FALSE失败

功能

银联业务主动注册

注意事项

参考

net_api.c

  1. 退出GPRS

函数原型

int net_api_exit( void );

输入参数

输出参数

返回值

TRUE成功、FALSE失败

功能

退出GPRS

注意事项

参考

net_api.c

  1. 发送数据:

函数原型

BOOL net_api_send_data_proc( void *pUserData , char szSendBuf[], int nSendLen );

输入参数

void *pUserData    socket句柄

char szSendBuf[]   要发送的字符串

int nSendLen        要发送的字符串长度

输出参数

返回值

TRUE成功、FALSE失败

功能

发送数据

注意事项

参考

net_api.c

  1. 设定超时时间:

函数原型

void net_api_set_time_out( int nConnTime, int nSendTime, int nRecvTime );

输入参数

int nConnTime      连接时间

int nSendTime     发送时间

int nRecvTime      接收时间

输出参数

返回值

功能

设定超时时间

注意事项

参考

net_api.c

  1. 设定自动注销时间:

函数原型

void net_api_set_unreg_time( int nUnregTime );

输入参数

int nUnregTime     自动注销时间

输出参数

返回值

功能

设定自动注销时间

注意事项

参考

net_api.c

  1. 判断IP的合法性:

函数原型

int net_api_judge_ip( const char szIP[] );

输入参数

const char szIP[] ip地址

输出参数

返回值

TRUE成功、FALSE失败

功能

判断IP的合法性

注意事项

参考

net_api.c

  1. 判断PORT的合法性:

函数原型

int net_api_judge_port( int nPort );

输入参数

int nPort 端口

输出参数

返回值

TRUE成功、FALSE失败

功能

判断PORT的合法性

注意事项

参考

net_api.c

  1. 设置网络调试信息的等级:

函数原型

void net_api_set_log_grade( int nGrade );

输入参数

int nGrade 网络调试信息的等级 (等级:0全部不打印,1打印错误信息,2打印正常流程,3打印全部)

输出参数

返回值

功能

设置网络调试信息的等级(如没调用该接口进行设置,默认等级为3)

注意事项

参考

net_api.c

  1. 判断当前是否允许注册网络:

函数原型

int net_api_per_login( void );

输入参数

输出参数

返回值

TRUE允许注册网络、FALSE不允许注册网络

功能

判断当前是否允许注册网络

注意事项

参考

net_api.c

1.2   界面处理模块(提示界面层)

1.2.1 文件名

文件名:net_msg_win.h   net_msg_win.c

1.2.2 各类定义

1.2.3 外部接口

  1. 窗口创建:

函数原型

HWND net_msg_win_create( HWND hParendWnd, const char *pszTitle );

输入参数

HWND hParendWnd 父窗体句柄

const char *pszTitle 要显示的标题

输出参数

返回值

窗体句柄

功能

窗口创建

注意事项

参考

net_msg_win.c

  1. 设置当前状态:

函数原型

int net_msg_win_set_stat( int nStat );

输入参数

int nStat : NET_API_STAT_CONN //正在连接

        NET_API_STAT_SEND //正在发送

        NET_API_STAT_RECV //正在接收

NET_API_STAT_DISCONN //正在断开连接

输出参数

返回值

0

功能

设置当前状态

注意事项

参考

net_msg_win.c

  1. 设置进度条范围:

函数原型

void net_msg_win_set_range(int nTotalNum);

输入参数

int nTotalNum 进度条的最大范围(默认最小为0)

输出参数

返回值

功能

设置进度条范围

注意事项

参考

net_msg_win.c

  1. 设置步进长度:

函数原型

void net_msg_win_set_step( int nStep );

输入参数

int nStep 步长

输出参数

返回值

功能

设置步进长度

注意事项

参考

net_msg_win.c

  1. 设置当前进度:

函数原型

void net_msg_win_set_progress( int nCurNum );

输入参数

int nCurNum 当前进度条位置

输出参数

返回值

功能

设置当前进度

注意事项

参考

net_msg_win.c

  1. 销毁窗体:

函数原型

void net_msg_win_destroy( void );

输入参数

输出参数

返回值

功能

销毁窗体

注意事项

参考

net_msg_win.c

  1. 错误处理函数:

函数原型

int net_msg_win_result( int nErrType );

输入参数

int nErrType 错误类型

输出参数

返回值

错误类型

功能

错误处理函数

注意事项

参考

net_msg_win.c

1.3   协议处理模块

1.3.1  烟草协议解析

1.3.1.1 文件名

文件名:net_tob.h   net_tob.c

1.3.1.2 各类定义

//网络传输结构

typedef struct tagNetTobTrans

{

       //固定部分

       void *pstSolid;             //固定部分

       int nSolidLen;              //固定部分长度

       int nStructNumSize;      //数量的占用空间大小

       //重复部分

       void *pstStruct;            //发送或接收的结构体指针(重复部分)

       int nStructNum;            //需要发送或接收的结构体数量

       int nProtocolSize;         //结构传输长度

}NetTobTrans;

typedef int (* NET_TOB_RECV_CALLBACK)(NetTobTrans *pstNetTobTrans);//接收处理回调函数

1.3.1.3 外部接口

1.  获取客户代码:

函数原型

void net_tob_get_clientcode(char *pszClientCode);

输入参数

输出参数

char *pszClientCode 客户代码

返回值

功能

获取客户代码

注意事项

参考

net_tob.c

2.  设置发送数据:

函数原型

void net_tob_set_send_data(TobNetTrans *pstTobNetTrans);

输入参数

TobNetTrans *pstTobNetTrans 传输结构指针

输出参数

返回值

功能

设置发送数据

注意事项

参考

net_tob.c

3.  设置接收结构:

函数原型

void net_tob_set_recv_data(TobNetTrans *pstTobNetTrans);

输入参数

TobNetTrans *pstTobNetTrans 传输结构指针

输出参数

返回值

功能

设置接收结构

注意事项

参考

net_tob.c

4.  设置接收回调:

函数原型

int net_tob_set_recv_callback(TOB_NET_RECV_CALLBACK pfRecvCallback);

输入参数

TOB_NET_RECV_CALLBACK pfRecvCallback

输出参数

返回值

TRUE成功、FALSE失败

功能

设置接收回调

注意事项

参考

net_tob.c

5. 开始通讯:

函数原型

int net_tob_start(int nFuncNo,char szTitle[]);

输入参数

int nFuncNo 功能号

char szTitle[] 通讯提示界面显示标题

输出参数

返回值

NET_API_ERR_SUCC,              //成功

NET_API_ERR_REGGED,         //已注册

NET_API_ERR_REG,                //注册错误

NET_API_ERR_CONN,             //连接错误

NET_API_ERR_SEND,              //发送错误

NET_API_ERR_RECV,              //接收错误

NET_API_ERR_UNREG,           //注销错误

NET_API_ERR_INVAILDCONN,//无效连接方式

功能

开始通讯

注意事项

参考

net_tob.c

1.3.2  公司标准协议解析

1.3.2.1 文件名

文件名:prtcl_std.h   prtcl_std.c

1.3.2.2 各类定义

#define PRTCL_STD_MAX_SEND_BUFF_LEN      1000000        //通讯发送静态储存区大小

#define PRTCL_STD_MAX_RECV_BUFF_LEN      1000000        //通讯接收静态储存区大小

//包头结构的定义

#define PRTCL_STD_MAX_PROTOCOL_TOTAL_LEN 6            //消息总长度

#define PRTCL_STD_MAX_PROTOCOL_HEAD_LEN   2            //消息头长度

#define PRTCL_STD_MAX_PROTOCOL_VERSION_LEN    4     //协议版本号

#define PRTCL_STD_MAX_SUPP_ID_LEN                   2            //厂商标识最大长度

#define PRTCL_STD_MAX_BUSI_ID_LEN                   2            //业务号最大长度

#define PRTCL_STD_MAX_COMM_ID_LEN                4            //命令类型最大长度

#define PRTCL_STD_MAX_SEQ_NO_LEN                   6            //流水号最大长度

#define PRTCL_STD_MAX_FRAME_TOTAL_LEN        4            //总帧数最大长度

#define PRTCL_STD_MAX_FRAME_NUM_LEN                  4     //当前帧最大长度

#define PRTCL_STD_MAX_IMEI_NUM_LEN               20          //IMEI最大长度

#define PRTCL_STD_MAX_IMSI_NUM_LEN               20          //IMSI最大长度

//计算得出包头总长度

#define PRTCL_STD_MAX_PACK_HEAD_LEN            (PRTCL_STD_MAX_PROTOCOL_TOTAL_LEN+\

PRTCL_STD_MAX_PROTOCOL_HEAD_LEN+PRTCL_STD_MAX_PROTOCOL_VERSION_LEN+\

       1+1+1+PRTCL_STD_MAX_SUPP_ID_LEN+PRTCL_STD_MAX_BUSI_ID_LEN+\

       PRTCL_STD_MAX_COMM_ID_LEN+PRTCL_STD_MAX_SEQ_NO_LEN+\

       PRTCL_STD_MAX_FRAME_TOTAL_LEN+PRTCL_STD_MAX_FRAME_NUM_LEN+\

       PRTCL_STD_MAX_IMEI_NUM_LEN+PRTCL_STD_MAX_IMSI_NUM_LEN)

//包体结构定义

#define PRTCL_STD_MAX_FIELD_GRADE    10 //最大字段重复级数

#define PRTCL_STD_MAX_FIELD_COUNT    50 //最大域数量

//字段类型定义

typedef enum enPrtclStdFieldType

{

       PRTCL_STD_FIELD_TYPE_NORMAL,   //普通数据

       PRTCL_STD_FIELD_TYPE_RPTQUAN,  //循环个数

       PRTCL_STD_FIELD_TYPE_VARQUAN, //不定长的长度

       PRTCL_STD_FIELD_TYPE_VAR,            //不定长字段

} PRTCL_STD_FIELD_TYPE;

//字符类型定义

typedef enum enPrtclStdFieldChartype

{

       PRTCL_STD_FIELD_CHARTYPE_UINT,        //无符号整数

       PRTCL_STD_FIELD_CHARTYPE_INT,          //整数

       PRTCL_STD_FIELD_CHARTYPE_OSTR,       //定长字符串

       PRTCL_STD_FIELD_CHARTYPE_DATETIME,      //日期时间YYYYMMDDhhmmss

       PRTCL_STD_FIELD_CHARTYPE_DATE,       //日期YYYYMMDD

       PRTCL_STD_FIELD_CHARTYPE_MONTH,          //月份YYYYMM

       PRTCL_STD_FIELD_CHARTYPE_MONEY,           //金额4位INTEGER

} PRTCL_STD_FIELD_CHARTYPE;

//定义字段属性

typedef struct tagPrtclStdField

{

       int nCharType;      //数据类型:

       int nGrade;            //第几级循环

       int nType;             //类型:普通数据、不定长字段、表示循环个数、不定长的长度

       int nLen;               //最大长度

} PrtclStdField;

//字段接收结构

typedef struct tagPrtclStdFieldRecv

{

       int nCharType;             //数据类型:

       int nGrade;                   //第几级循环

       int nType;                    //类型:普通数据、表示循环个数、不定长的字节数 

       int nLen;                      //最大长度

       void *pStorePosi;         //接收数据存储区域

}PrtclStdFieldRecv;

//消息头结构

typedef struct tagPrtclStdHead

{

       char szTotalLen[PRTCL_STD_MAX_PROTOCOL_TOTAL_LEN];        //消息总长度

       char szHeadLen[PRTCL_STD_MAX_PROTOCOL_HEAD_LEN];         //消息头长度

       char szVersion[PRTCL_STD_MAX_PROTOCOL_VERSION_LEN];      //协议版本

       char cIsCompress;

       char cIsEncrypt;

       char cIsHashVerify;

       char szSuppId[PRTCL_STD_MAX_SUPP_ID_LEN];              //厂商标识

       char szBusiId[PRTCL_STD_MAX_BUSI_ID_LEN];               //业务号

       char szCommId[PRTCL_STD_MAX_COMM_ID_LEN];         //命令号

       char szSeqNo[PRTCL_STD_MAX_SEQ_NO_LEN];               //流水号

       char szFraTotal[PRTCL_STD_MAX_FRAME_TOTAL_LEN]; //总帧数

       char szFraNum[PRTCL_STD_MAX_FRAME_NUM_LEN];    //当前帧

       char szIMEI[PRTCL_STD_MAX_IMEI_NUM_LEN];             //IMEI

       char szIMSI[PRTCL_STD_MAX_IMSI_NUM_LEN];             //ISEI

}PrtclStdHead;

typedef int (* PRTCL_STD_RECV_CALLBACK)(const char *pszData,int nLen);   //接收处理回调函数

typedef int (* PRTCL_STD_GLOBALRETURNCODE_CALLBACK)( int nGlobalFlag );     //全局返回码回调处理函数

1.3.2.3 外部接口

1.  设置初始化数据结构:

函数原型

BOOL prtcl_std_set_init( const PrtclStdHead *pPrtclStdHead );

输入参数

const PrtclStdHead *pPrtclStdHead 包头

输出参数

返回值

TRUE成功、FALSE失败

功能

设置初始化数据结构

注意事项

参考

prtcl_std.c

2.  设置接收处理回调函数:

函数原型

intprtcl_std_set_recv_callback( PRTCL_STD_RECV_CALLBACK pfRecvCallback[], int nGrand );

输入参数

PRTCL_STD_RECV_CALLBACK pfRecvCallback[]       回调函数集

int nGrand                   级别总数

输出参数

返回值

TRUE成功、FALSE失败

功能

设置接收处理回调函数

注意事项

参考

prtcl_std.c

3.  设置发送数据结构:

函数原型

int prtcl_std_set_send_struct( const PrtclStdField *pstFieldSend, int nFieldCount );

输入参数

const PrtclStdField *pstFieldSend        发送字段的结构

int nFieldCount                                 发送字段的数量

输出参数

返回值

TRUE成功、FALSE失败

功能

设置发送数据结构

注意事项

参考

prtcl_std.c

4.  设置接收数据结构:

函数原型

int prtcl_std_set_recv_struct( const PrtclStdFieldRecv *pstFieldRecv, int nFieldCount );

输入参数

cosnt PrtclStdFieldRecv *pstFieldRecv       接收字段的结构

int nFieldCount                                        接收字段的总数

输出参数

返回值

TRUE成功、FALSE失败

功能

设置接收数据结构

注意事项

参考

prtcl_std.c

5.  添加发送数据:

函数原型

void prtcl_std_add_senddata( int nField, const char *pszData );

输入参数

int nField 第几域

const char *pszData 数据

输出参数

返回值

功能

添加发送数据

注意事项

参考

prtcl_std.c

  1. 开始通讯:

函数原型

int prtcl_std_start( const char szTitle[] );

输入参数

const char szTitle[]       通讯提示界面显示标题

输出参数

返回值

NET_API_ERR_SUCC,              //成功

NET_API_ERR_REGGED,         //已注册

NET_API_ERR_REG,                //注册错误

NET_API_ERR_CONN,             //连接错误

NET_API_ERR_SEND,              //发送错误

NET_API_ERR_RECV,              //接收错误

NET_API_ERR_UNREG,           //注销错误

NET_API_ERR_INVAILDCONN,//无效连接方式

功能

开始通讯

注意事项

参考

prtcl_std.c

1.3.3  8583协议解析

1.3.3.1 文件名

文件名:net_8583_dir.h    net_8583_dir.c

1.3.3.2 各类定义

#define NET_8583_MAX_BUFFER_SEND_LEN (2 * 1024)    //协议包最大发送长度

#define NET_8583_MAX_BUFFER_RECV_LEN (2 * 1024)    //协议包最大接收长度

#define GRPSCLOSEBUF  "\r\nCLOSED\r\n"

#define HTTP_CONTENT_LENGTH  "Content-Length:"

#define HTTP_UMPAY_ERRCODE   "x-extern-umpay-error-code:"

#define HTTP_ENDFLAG  "\r\n\r\n"

//8583目录销售报头结构体

typedef struct tagNet8583DirHttpHead

{

       char szVer[10];             //协议版本//x-extern-ver: 1.0

       char szMsgid[11];         //功能号//x-extern-msgid: 00

       char szDevid[21];         //终端设备ID//x-extern-devid: mx00000000000001

       char szCallId[21];         //主叫号码//X-Up-Calling-Line-ID: 13999999999

       char szErrorNo[10];      //错误码//x-extern-umpay-error-code: 0

       char szIp[16];

       char szPort[6];

      

       char szLoadedFile[80];  //下载文件路径

       int  nBodyLen;

}Net8583DirHttpHead;

//8583目录销售报体结构体

typedef struct tagNet8583DirStruct

{

       char szSRn_MsgId[5];                                      //消息类型:X:n4//0840  0850

       unsigned char  uszSRb_BitMap[16];                //位图:X:b128

       char szSRn_TradeCode[7];                // 交易处理码:3:n6

       char szSRn_TradeAmount[13];                         // 交易金额:4:n12

       char szSRn_OperSn[7];                               //11 //系统跟踪号:11:n6

       char szRn_Time[7];                                     //12 //交易时间:12:n6

       char szRn_Date[5];                                     //13 //交易日期:13:n4

       char szRn_ReckonDate[5];                               //15 //清算日期:15:n4  

       char szRn_FlatId[12];                                       //32 //平台标识码:32:n11

       char szRan_SearchRef[13];                          //37 //检索参考号:37:an12

       char szRan_ResponseCode[3];                          //39 //应答码:39:an2

       char szRan_ReturnCode[60];                          //40 返回码描述信息B..50  

       char szRan_TermIdenty[9];                               //41 终端标识码Ans8 

       char szSRans_ShopCode[16];                       //42 //商户代码:42:ans15

       char szSans_OriTradeInfo[1003];                 //46 //原交易信息:46:ans…999 

       char szSRan_DevInfo[171];                         //48 //行业特定信息:48:ans…167

       char szSRan_TradeCoinCode[4];                  //49 //交易货币代码:49:an3

       char szSRan_ReckonCoinCode[4];                    //50 //清算货币代码:50:an3

       unsigned char   uszSb_PersonId[8];                 //52 //个人标识码数据:52:B64

       char szC_an_AccountBalance[41];                //54 //账户余额:54:an…40  

       char szSRn_RequestInfo[200];                          //55 // 请求信息域Ans…099

       char szSRn_PrizeInfo[1003];                         //56 // 开奖信息/ 彩票返回信息Ans...999      

       char szSRn_UserField[15];                               //60 //自定义域:60:n…011

       char szRn_ReckonCode[2];                          //66 //清算代码:66:n1

       char szSRn_TPayNum[11];                               //74 //终端支付笔数:74:n10

       char szSRn_TGainNum[11];                        //75 //终端分润笔数:75:n10

       char szSRn_CashNum[11];                               //76 //收银台笔数:76:n10

       char szSRn_CancelNum[11];                       //77 //托收+退货笔数:77:n10

       char szSRn_TPayAmount[17];                          //86 //终端支付金额:86:n16

       char szSRn_TGainAmount[17];                         //87 //终端分润金额:87:n16

       char szSRn_CashAmount[17];                           //88 //收银台金额:88:n16

       char szSRn_CancelAmount[17];                   //89 //托收+退货金额:89:n16

       unsigned char   uszRb_GoodsInfo[140];           //104//商品信息:104:B140

       unsigned char   uszC_b_DevKey[134];          //120//终端密钥:120:b...048

       unsigned char   uszC_b_Mac[8];                     //128//MAC:128:B64

}Net8583DirStruct;

typedef int (* NET_8583_Dir_RECV_CALLBACK)( Net8583DirStruct *pstNet8583DirTrans );       //接收处理回调函数

1.3.3.3外部接口

1.  获取商户号:

函数原型

void net_8583_dir_get_merchant_id( char *pszMerchantID );

输入参数

输出参数

char *pszMerchantID    终端所属商户ID

返回值

功能

获取商户号

注意事项

参考

net_8583_dir.c

2.  获取终端id

函数原型

void net_8583_dir_get_termid( char *pszTermID );

输入参数

输出参数

char *pszTermID   终端id

返回值

功能

获取终端id

注意事项

参考

net_8583_dir.c

3. 获取IMEI号:

函数原型

void net_8583_dir_get_imei( char *pszIMEI );

输入参数

输出参数

char *pszIMEI      IMEI号

返回值

功能

获取IMEI号

注意事项

参考

net_8583_dir.c

4. 获取批次号:

函数原型

void net_8583_dir_get_periodno( char *pszPeriodNo );

输入参数

输出参数

char *pszPeriodNo        批次号

返回值

功能

获取批次号

注意事项

参考

net_8583_dir.c

5.  8583初始化:

函数原型

void net_8583_dir_init( void );

输入参数

输出参数

返回值

功能

8583初始化

注意事项

参考

net_8583_dir.c

6.  清空数据:

函数原型

void net_8583_dir_clear( void );

输入参数

输出参数

返回值

功能

清空数据

注意事项

参考

net_8583_dir.c

7. 获取域对应的数组位置:

函数原型

int net_8583_dir_get_field_arrpos( int nField, BOOL *pbVarField );

输入参数

int nField 第几域(消息类型为-1域)

输出参数

BOOL *pbVarField 是否是可变域

返回值

域对应的数组位置      (错误 为-2)

功能

获取域对应的数组位置

注意事项

参考

net_8583_dir.c

8.  根据域号设置要发送的数据:

函数原型

void net_8583_dir_set_value( int nField, const char *pszValue );

输入参数

int nField 第几域(消息类型为-1域)

const char *pszValue 要设置的值(固定域时,此值只要赋于NULL,为内部自动填充有4, 11, 12, 13, 32)

输出参数

BOOL *pbVarField 是否是可变域

返回值

功能

根据域号设置要发送的数据

注意事项

参考

net_8583_dir.c

9.  注册接收数据回调函数:

函数原型

int net_8583_dir_set_recv_callback( NET_8583_Dir_RECV_CALLBACK pfRecvCallback );

输入参数

NET_8583_RECV_CALLBACK pfRecvCallback

输出参数

返回值

TRUE成功、FALSE失败

功能

注册接收数据回调函数

注意事项

参考

net_8583_dir.c

10.  开始通讯:

函数原型

int net_8583_dir_start( int nFuncNo, const char szTitle[] );

输入参数

int nFuncNo 功能号

const char szTitle[] 网络提示界面显示标题字符串

输出参数

返回值

NET_API_ERR_SUCC,       //成功

NET_API_ERR_REGGED,  //已注册

NET_API_ERR_REG,       //注册错误

NET_API_ERR_CONN,      //连接错误

NET_API_ERR_SEND,       //发送错误

NET_API_ERR_RECV,       //接收错误

NET_API_ERR_UNREG,    //注销错误

功能

开始通讯

注意事项

参考

net_8583_dir.c

二、使用方法

2.1 通讯通用模块使用方法

2.1.1 无界面使用方法

  1. 设置连接类型,ADSL,或者GPRS等:net_api_set_conntype;
  2. 注册发送数据回调函数:net_api_set_send_func
  3. 注册接收数据回调函数:net_api_set_recv_func
  4. 注册错误信息回调函数:net_api_set_result_func
  5. 启动数据传输:net_api_start
  6. 错误信息描述获取:net_api_get_errstr

2.1.2 使用默认提示界面的使用方法

  1. 定义并填充结构NetApiConnProperty,设置连接类型、apn、ip、端口,结构如下

typedef struct tagNetApiConnProperty

{

    int nConnType;

    char szApn[51];

    char szIp[16];

    char szPort[6];

}NetApiConnProperty;

  1. 注册发送数据回调函数:void net_api_set_send_callback(NET_API_SEND_CALLBACK pfSendCallback);
  2. 注册接收数据回调函数:int net_api_set_recv_callback(NET_API_RECV_CALLBACK pfRecvCallback);
  3. 注册结果信息回调函数:int net_api_set_result_callback(NET_API_RESULT_CALLBACK pfResultCallback);
  4. 注册状态改变回调函数:int net_api_set_stat_callback(NET_API_STAT_CALLBACK pfStatCallback);
  5. 启动数据传输:int net_api_start(NetApiConnProperty *pstConnProperty);
  6. 创建提示窗口:int net_msg_win_create(char *pszTitle);
  7. 在注册的结果处理函数中,必须销毁消息窗体:int net_msg_win_destroy(void);
  8. 在注册的状态改变函数中,必须设置窗体状态:int net_msg_win_set_stat(int nStat);
  9. 在接受或者发送的数据改变时,必须设置窗体进度:void net_msg_win_set_progress(int nTotalNum, int nCurNum);

2.2 协议处理模块使用方法

2.2.1 烟草协议使用方法

  1. 设置发送数据:void net_tob_set_send_data(NetTobTrans *pstNetTobTrans);
  2. 设置接受数据格式:void net_tob_set_recv_data(NetTobTrans *pstNetTobTrans);
  3. 设置接收处理回调函数:void net_tob_set_recv_callback(NET_TOB_RECV_CALLBACK *pfRecvCallback);
  4. 启动通讯:void net_tob_start(int nType,char *pszTitle);

2.2.2 公司标准协议使用方法

1、初始化协议头:void sm_net_init_header( PrtclStdHead *pstPrtclStdHead );

2、设置发送数据:int prtcl_std_set_send_struct( const PrtclStdField *pstFieldSend, int nFieldCount )

3、设置接受数据格式:int prtcl_std_set_recv_struct( const PrtclStdFieldRecv *pstFieldRecv, int nFieldCount );

4、 设置接收处理回调函数:int prtcl_std_set_recv_callback( PRTCL_STD_RECV_CALLBACK pfRecvCallback[], int nGrand );

5、启动通讯:int prtcl_std_start( const char szTitle[] );

2.2.3 8583协议使用方法

  1. 在开机时进行模块初始化:void net_dir_8583_init(void);
  2. 开始通讯前清空原有数据:void net_dir_8583_clear(void);
  3. 开始通讯前设置各个域:void net_dir_8583_set_value(int nType,char *pszValue);
  4. 开始通讯:void net_dir_8583_start(void);
  5. 获取接收到的数据:void net_dir_8583_get_value(int nType,char *pszValue);

三、使用实例

3.1 通讯通用模块使用实例

/*************************************************

  Function:           prtcl_std_start

  Description:       开始通讯

  Called By:    

  Input:         const char szTitle[]       通讯提示界面显示标题

  Output:            

  Return:       NET_API_ERR_SUCC,                     //成功

                            NET_API_ERR_REGGED,         //已注册

                            NET_API_ERR_REG,                //注册错误

                            NET_API_ERR_CONN,             //连接错误

                            NET_API_ERR_SEND,              //发送错误

                            NET_API_ERR_RECV,              //接收错误

                            NET_API_ERR_UNREG,           //注销错误

                            NET_API_ERR_INVAILDCONN,//无效连接方式

*************************************************/

int prtcl_std_start( const char szTitle[] )

{

       printf( "(prtcl_std_start) <IN>\r\n" );

       NetApiConnProperty stNetApiConnProperty;

      

//设定网路配置

       memset( &stNetApiConnProperty, 0x00, sizeof( stNetApiConnProperty ) );

       prtcl_std_set_conn_property( &stNetApiConnProperty );

      

       net_api_set_send_callback( prtcl_std_send );

       net_api_set_recv_callback( prtcl_std_recv );

       net_api_set_result_callback( prtcl_std_result );

       net_api_set_stat_callback( prtcl_std_stat_change );

       net_api_start( &stNetApiConnProperty );

       net_msg_win_create( HWND_DESKTOP, (char *)szTitle );

       /*

       if (NULL != spfPrtclStdResultCallback)

       {

              net_api_set_result_callback( spfPrtclStdResultCallback );

       }

       else

       {

              prtcl_std_result_display( snPrtclStdResult );

       }

       */

             

       printf( "(prtcl_std_start) <OUT>\r\n" );

       return snPrtclStdResult;

}

说明:

      1. 调用net_api_start( )  将创建一新执行线程进行通讯操作。
      2. 调用net_msg_win_create( ) 将创建一模态窗体,此时当前执行线程将被阻塞,直至此模态窗体被销毁。

3.2 协议处理模块使用实例

3.2.1 烟草协议使用实例

int tob_net_down_forecast_proc (void)

{           

       int nReturnResult;

       TobNetTrans stDownForecastReq;

       TobNetTrans stDownForecastResult;

       //发送数据结构设定

       memset(&stDownForecastReq, 0, sizeof(stDownForecastReq));

       stDownForecastReq.nSolidLen=TOB_NET_DOWN_FORECAST_REQ_SOLID_SIZE;

       stDownForecastReq.pstSolid=stTobNetDownForecastReqHead;

       if(db_tob_forecast_get_count()>0)

       {

              db_tob_forecast_clear();

       }

       db_tob_begin_trans();

       net_tob_set_send_data(&stDownForecastReq);

       //接受数据结构设定

       memset(&stDownForecastResult, 0, sizeof(stDownForecastResult));

       stDownForecastResult.pstSolid=&stTobNetDownForecastSolidProc;

stDownForecastResult.nSolidLen=TOB_NET_DOWN_FORECAST_RESULT_SOLID_SIZE;//+4;

       stDownForecastResult.nStructNumSize=3;

       stDownForecastResult.pstStruct=stTobNetDownForecastProc;

      stDownForecastResult.nProtocolSize=TOB_NET_DOWN_FORECAST_PROTOCOL_SIZE;

       net_tob_set_recv_data(&stDownForecastResult);

       //结果处理回调函数

       net_tob_set_recv_callback(tob_net_down_forecast_deal);

       nReturnResult=net_tob_start(IDP_NET_TOB_DOWN_ORDER_FORECAST,"下载订单预测");       //开始数据传输

       if(NET_API_ERR_SUCC == nReturnResult)

       {

              db_misc_commit();

       }

       else

       {

              db_misc_rollback();

       }

       return nReturnResult;

}

3.2.2 公司标准协议使用实例

/*************************************************

  Function:           sm_net_infoquery_set_send_data

  Description:       设置发送数据

  Called By:    

  Input:         const SMNetInfoQuerySend *pstSMNetInfoQuerySend 发送结构体指针

  Output:            

  Return:       TRUE成功、FALSE失败

*************************************************/

int sm_net_infoquery_set_send_data( const SMNetInfoQuerySend *pstSMNetInfoQuerySend )

{

       if (NULL == pstSMNetInfoQuerySend)

       {

              printf( "(sm_net_infoquery_set_send_data) pstSMNetInfoQuerySend is NULL!\r\n" );

              return FALSE;

       }

      

       prtcl_std_add_senddata( 0, pstSMNetInfoQuerySend->szInfoVer );

       return TRUE;

}

/*************************************************

  Function:           sm_net_infoquery_init

  Description :      初始化操作

  Called By:    

  Input:

  Output:            

  Return:

*************************************************/

void sm_net_infoquery_init( void )

{

       PrtclStdHead stPrtclStdHead;

       //初始化协议

       memset( &stPrtclStdHead, 0x00, sizeof( stPrtclStdHead ) );

       sm_net_init_header( &stPrtclStdHead );

      

       prtcl_pub_int_to_str( stPrtclStdHead.szCommId, IDP_SM_NET_INFOQUERY, PRTCL_STD_MAX_COMM_ID_LEN );

       printf( "[head] = %s\r\n", (char *)&stPrtclStdHead );

       prtcl_std_set_init( &stPrtclStdHead );

      

       //发送数据结构设定

       sm_net_infoquery_set_send_struct( );

       //接受数据结构设定

       sm_net_infoquery_set_recv_struct( );

}

/*************************************************

  Function:           sm_net_infoquery_proc

  Description:        信息互动查询

  Called By:    

  Input:

  Output:            

  Return:              NET_API_ERR_SUCC,        //成功

                            NET_API_ERR_REGGED,  //已注册

                            NET_API_ERR_REG,       //注册错误

                            NET_API_ERR_CONN,      //连接错误

                            NET_API_ERR_SEND,       //发送错误

                            NET_API_ERR_RECV,       //接收错误

                            NET_API_ERR_UNREG,    //注销错误

                            NET_API_ERR_INVAILDCONN,//无效连接方式

*************************************************/

int sm_net_infoquery_proc( void )

{    

       int nResult;

       PRTCL_STD_RECV_CALLBACK spRecvCallback[] = {

              sm_net_infoquery_first_grand_deal,

              sm_net_infoquery_second_grand_deal

                    

       };   

       //注册接收处理回调函数

       prtcl_std_set_recv_callback( spRecvCallback, 2 );

       //开始数据传输

       nResult =  prtcl_std_start( "信息互动查询" );   

       return nResult;

}

  • 29
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值