概述
通讯封装包含了通讯通用模块、界面处理模块、协议处理模块、具体通讯业务模块。
其中通讯通用模块包括三个子模块:网络层、数据传输层、API接口层。
- 网络层:GPRS、ADSL等网络的注册、注销、登录方式控制、登录状态控制等,其中注册、注销采用同步方式。
- 数据传输层:通过socket管理与socket服务器的连接、发送数据、接收数据、中断连接等控制。处理连接超时、接收超时、发送超时,及设置发送、接收、结果、状态等回调注册接口,及IP、PORT的合法性校验接口等。
- 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 外部接口:
- 注册发送请求回调函数:
函数原型 | int net_api_set_send_callback( const NET_API_SEND_CALLBACK pfnSendCallback ); |
输入参数 | const NET_API_SEND_CALLBACK pfnSendCallback 发送回调处理函数指针 |
输出参数 | |
返回值 | TRUE成功、FALSE失败 |
功能 | 注册发送请求回调函数 |
注意事项 | |
参考 | net_api.c |
- 注册接收请求回调函数:
函数原型 | int net_api_set_recv_callback( const NET_API_RECV_CALLBACK pfnRecvCallback ); |
输入参数 | const NET_API_RECV_CALLBACK pfnRecvCallback 接收回调处理函数指针 |
输出参数 | |
返回值 | TRUE成功、FALSE失败 |
功能 | 注册接收请求回调函数 |
注意事项 | |
参考 | net_api.c |
- 注册结果处理回调函数:
函数原型 | int net_api_set_recv_callback( const NET_API_RECV_CALLBACK pfnRecvCallback ); |
输入参数 | const NET_API_RESULT_CALLBACK pfnResultCallback 结果回调处理函数指针 |
输出参数 | |
返回值 | TRUE成功、FALSE失败 |
功能 | 注册结果处理回调函数 |
注意事项 | |
参考 | net_api.c |
- 注册状态回调函数:
函数原型 | int net_api_set_stat_callback( const NET_API_STAT_CALLBACK pfnStatCallback ); |
输入参数 | const NET_API_STAT_CALLBACK pfnStatCallback 状态回调处理函数指针 |
输出参数 | |
返回值 | TRUE成功、FALSE失败 |
功能 | 注册状态回调函数 |
注意事项 | |
参考 | net_api.c |
- 网络层初始化:
函数原型 | BOOL net_api_init( void ); |
输入参数 | |
输出参数 | |
返回值 | TRUE成功、FALSE失败 |
功能 | 网络层初始化 |
注意事项 | |
参考 | net_api.c |
- 获取错误信息函数:
函数原型 | char *net_api_get_errstr( NET_API_ERR_EN nErrorCode ); |
输入参数 | NET_API_ERR_EN nErrorCode 错误代码 |
输出参数 | |
返回值 | 错误描述字符串 |
功能 | 获取错误信息函数 |
注意事项 | |
参考 | net_api.c |
- 获取通讯模块版本号函数:
函数原型 | char *net_api_get_version( void ); |
输入参数 | |
输出参数 | |
返回值 | 通讯模块版本号 |
功能 | 获取通讯模块版本号函数 |
注意事项 | |
参考 | net_api.c |
- 启动数据传输:
函数原型 | BOOL net_api_start( NetApiConnProperty *pstConnProperty ); |
输入参数 | NetApiConnProperty *pstConnProperty 网络连接结构体 |
输出参数 | |
返回值 | TRUE成功、FALSE失败 |
功能 | 启动数据传输 |
注意事项 | |
参考 | net_api.c |
- 银联业务主动注册:
函数原型 | int net_api_login( NetApiConnProperty stNetApiConnProperty ); |
输入参数 | NetApiConnProperty stNetApiConnProperty 网络连接结构体 |
输出参数 | |
返回值 | TRUE成功、FALSE失败 |
功能 | 银联业务主动注册 |
注意事项 | |
参考 | net_api.c |
- 退出GPRS:
函数原型 | int net_api_exit( void ); |
输入参数 | |
输出参数 | |
返回值 | TRUE成功、FALSE失败 |
功能 | 退出GPRS |
注意事项 | |
参考 | net_api.c |
- 发送数据:
函数原型 | BOOL net_api_send_data_proc( void *pUserData , char szSendBuf[], int nSendLen ); |
输入参数 | void *pUserData socket句柄 char szSendBuf[] 要发送的字符串 int nSendLen 要发送的字符串长度 |
输出参数 | |
返回值 | TRUE成功、FALSE失败 |
功能 | 发送数据 |
注意事项 | |
参考 | net_api.c |
- 设定超时时间:
函数原型 | void net_api_set_time_out( int nConnTime, int nSendTime, int nRecvTime ); |
输入参数 | int nConnTime 连接时间 int nSendTime 发送时间 int nRecvTime 接收时间 |
输出参数 | |
返回值 | |
功能 | 设定超时时间 |
注意事项 | |
参考 | net_api.c |
- 设定自动注销时间:
函数原型 | void net_api_set_unreg_time( int nUnregTime ); |
输入参数 | int nUnregTime 自动注销时间 |
输出参数 | |
返回值 | |
功能 | 设定自动注销时间 |
注意事项 | |
参考 | net_api.c |
- 判断IP的合法性:
函数原型 | int net_api_judge_ip( const char szIP[] ); |
输入参数 | const char szIP[] ip地址 |
输出参数 | |
返回值 | TRUE成功、FALSE失败 |
功能 | 判断IP的合法性 |
注意事项 | |
参考 | net_api.c |
- 判断PORT的合法性:
函数原型 | int net_api_judge_port( int nPort ); |
输入参数 | int nPort 端口 |
输出参数 | |
返回值 | TRUE成功、FALSE失败 |
功能 | 判断PORT的合法性 |
注意事项 | |
参考 | net_api.c |
- 设置网络调试信息的等级:
函数原型 | void net_api_set_log_grade( int nGrade ); |
输入参数 | int nGrade 网络调试信息的等级 (等级:0全部不打印,1打印错误信息,2打印正常流程,3打印全部) |
输出参数 | |
返回值 | |
功能 | 设置网络调试信息的等级(如没调用该接口进行设置,默认等级为3) |
注意事项 | |
参考 | net_api.c |
- 判断当前是否允许注册网络:
函数原型 | 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 外部接口:
- 窗口创建:
函数原型 | HWND net_msg_win_create( HWND hParendWnd, const char *pszTitle ); |
输入参数 | HWND hParendWnd 父窗体句柄 const char *pszTitle 要显示的标题 |
输出参数 | |
返回值 | 窗体句柄 |
功能 | 窗口创建 |
注意事项 | |
参考 | net_msg_win.c |
- 设置当前状态:
函数原型 | 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 |
- 设置进度条范围:
函数原型 | void net_msg_win_set_range(int nTotalNum); |
输入参数 | int nTotalNum 进度条的最大范围(默认最小为0) |
输出参数 | |
返回值 | |
功能 | 设置进度条范围 |
注意事项 | |
参考 | net_msg_win.c |
- 设置步进长度:
函数原型 | void net_msg_win_set_step( int nStep ); |
输入参数 | int nStep 步长 |
输出参数 | |
返回值 | |
功能 | 设置步进长度 |
注意事项 | |
参考 | net_msg_win.c |
- 设置当前进度:
函数原型 | void net_msg_win_set_progress( int nCurNum ); |
输入参数 | int nCurNum 当前进度条位置 |
输出参数 | |
返回值 | |
功能 | 设置当前进度 |
注意事项 | |
参考 | net_msg_win.c |
- 销毁窗体:
函数原型 | void net_msg_win_destroy( void ); |
输入参数 | |
输出参数 | |
返回值 | |
功能 | 销毁窗体 |
注意事项 | |
参考 | net_msg_win.c |
- 错误处理函数:
函数原型 | 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 |
- 开始通讯:
函数原型 | 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 无界面使用方法
- 设置连接类型,ADSL,或者GPRS等:net_api_set_conntype;
- 注册发送数据回调函数:net_api_set_send_func
- 注册接收数据回调函数:net_api_set_recv_func
- 注册错误信息回调函数:net_api_set_result_func
- 启动数据传输:net_api_start
- 错误信息描述获取:net_api_get_errstr
2.1.2 使用默认提示界面的使用方法
- 定义并填充结构NetApiConnProperty,设置连接类型、apn、ip、端口,结构如下
typedef struct tagNetApiConnProperty
{
int nConnType;
char szApn[51];
char szIp[16];
char szPort[6];
}NetApiConnProperty;
- 注册发送数据回调函数:void net_api_set_send_callback(NET_API_SEND_CALLBACK pfSendCallback);
- 注册接收数据回调函数:int net_api_set_recv_callback(NET_API_RECV_CALLBACK pfRecvCallback);
- 注册结果信息回调函数:int net_api_set_result_callback(NET_API_RESULT_CALLBACK pfResultCallback);
- 注册状态改变回调函数:int net_api_set_stat_callback(NET_API_STAT_CALLBACK pfStatCallback);
- 启动数据传输:int net_api_start(NetApiConnProperty *pstConnProperty);
- 创建提示窗口:int net_msg_win_create(char *pszTitle);
- 在注册的结果处理函数中,必须销毁消息窗体:int net_msg_win_destroy(void);
- 在注册的状态改变函数中,必须设置窗体状态:int net_msg_win_set_stat(int nStat);
- 在接受或者发送的数据改变时,必须设置窗体进度:void net_msg_win_set_progress(int nTotalNum, int nCurNum);
2.2 协议处理模块使用方法
2.2.1 烟草协议使用方法
- 设置发送数据:void net_tob_set_send_data(NetTobTrans *pstNetTobTrans);
- 设置接受数据格式:void net_tob_set_recv_data(NetTobTrans *pstNetTobTrans);
- 设置接收处理回调函数:void net_tob_set_recv_callback(NET_TOB_RECV_CALLBACK *pfRecvCallback);
- 启动通讯: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协议使用方法
- 在开机时进行模块初始化:void net_dir_8583_init(void);
- 开始通讯前清空原有数据:void net_dir_8583_clear(void);
- 开始通讯前设置各个域:void net_dir_8583_set_value(int nType,char *pszValue);
- 开始通讯:void net_dir_8583_start(void);
- 获取接收到的数据: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;
}
说明:
-
-
- 调用net_api_start( ) 将创建一新执行线程进行通讯操作。
- 调用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;
}