我是作SP的,有ZTE中兴的API如何用C#调用阿?要写小灵通网关高手是否知道,网关运行的整个过程(底层的)

Frankeny 2004-01-16 05:07:17
我是作SP的,有ZTE中兴的API如何用C#调用阿?要写小灵通网关高手是否知道,网关运行的整个过程(底层的)

我是做SP的,现在要写小灵通网关,有中兴提供的API 是个DLL文件,不知道C#如何包含调用,在引用里添加报错,说不是COM或组件,API说明文件中推荐用java C++调用
我想能用JAVA调用 ,也应该能用C#调用吧,如果不能调用
现用C#写,不知道底层具体是什么机制,是不是用sokote编程,很急 希望高手指点,有例子更好
里面有如下函数:
API说明如下:
1动态库接口函数调用说明
动态链接库包含smgpapi.dll、smgpapi.lib、smgpapi.h三个文件

使用动态链接库smgpapi.dll,按照如下步骤:
1. 应用程序调用InitSMGPAPI函数用来注册通讯。
2. 注册成功后,应用程序调用SMGPSendLogin函数向网关发送登录消息。另外,应用程序若想终止与外界的通讯,应用程序调用SMGPExitMsg函数发送注销登录消息。
3. 应用程序调用SMGPSendSingle向一个用户发送Submit消息。一般来说,应用程序收到自己所发消息的响应。
4. 应用程序调用SMGPSendBatch向多个用户发送Submit消息。一般来说,应用程序收到自己所发消息的响应。
5. 应用程序调用SMGPDeliver函数接收网关发送来的Deliver消息消息。
6. 应用程序调用SMGPActiveTest函数测试与网关之间的链路。
7. 应用程序调用SMGPSendBatchResp函数查询SMGPSendBatch函数发出消息的响应。
8. 应用程序调用SMGPRecvSNReport函数查询发送消息的状态报告。
9. 应用程序在处理完收到的消息后,必须调用CloseSMGPAPI释放内存。
2动态库接口原型函数
1、BYTE InitSMGPAPI( char SiniFile[], HWND hWnd, HINSTANCE hInstance );
2、BYTE SMGPSendLogin( char ClientID[], char Password[], WORD *pwSendErr, DWORD *pdwStatus, WORD *pwRecvErr );
3、BYTE SMGPSendSingle( SMGPSendSingle_T *ptSMGPSendSingle, WORD *pwSendErr, WORD *pwRecvErr );
4、BYTE SMGPSendBatch( SMGPSendBatch_T *ptSMGPSendBatch, WORD *pwSendErr, WORD *pwRecvErr );
5、BYTE GetSendBatchResp( SendBatchResp_T *ptSendBatchResp, long nPos, char sMsgIDFile[], BOOL *pblFileEnd );
6、BYTE SMGPDeliver( SMGPDeliverReq_T *ptSMGPDeliverReq, WORD *pwSendErr );
7、BYTE SMGPRecvSMReport( IsReport_T *ptIsReport, long nPos, BOOL *pblFileEnd );
8、BYTE SMGPActiveTest( SMGPActiveTest_T *ptSMGPActiveTest );
9、BYTE SMGPExitMsg();
10、void CloseSMGPAPI();
3动态库接口函数说明
(1) BYTE InitSMGPAPI( char SiniFile[], HWND hWnd, HINSTANCE hInstance )
功 能: 应用程序( 进程 )刚启动时, 都必须首先用此函数进行通信初始化。
返 回: 成 功 返 回 0
失 败 返 回 1
输 入:hWnd ---- 应用程序的窗口句柄。
HInstance ---- 应用程序的实例。
SiniFile。---- 配置文件名称和路径

(2) BYTE SMGPSendLogin( char ClientID[], char Password[], WORD *pwSendErr, DWORD *pdwStatus, WORD *pwRecvErr )
功 能:应用程序调用此函数发送Login消息。
返 回:成 功 返 回 0
失 败 返 回 1
输 入:ClientID ---- CP接入号。
Password ---- CP接入密码。
输 出:*pwSendErr ---- 返回发送时的错误码。
*pdwStatus ---- 登录响应状态。
*pwRecvErr ---- 返回接收时的错误码。

(3) BYTE SMGPSendSingle( SMGPSendSingle_T *ptSMGPSendSingle, WORD *pwSendErr, WORD *pwRecvErr )
功 能:应用程序调用此函数向一个目的用户发送Submit消息。
返 回:成 功 返 回 0
失 败 返 回 1
输 入:*ptSMGPSendSingle ---- Sumit消息所需的发送信息,见消息体说明。
输 出:*pwSendErr ---- 返回发送时的错误码。
*pwRecvErr ---- 返回接收时的错误码。

(4) BYTE SMGPSendBatch( SMGPSendBatch_T *ptSMGPSendBatch, WORD *pwSendErr, WORD *pwRecvErr )
功 能:应用程序调用此函数向一个目的用户发送Submit消息。
返 回:成 功 返 回 0
失 败 返 回 1
输 入:*ptSMGPSendBatch ---- Sumit消息所需的发送信息,见消息体说明。
输 出:*pwSendErr ---- 返回发送时的错误码。
*pwRecvErr ---- 返回接收时的错误码。

(5) BYTE GetSendBatchResp( SendBatchResp_T *ptSendBatchResp, long nPos, char sMsgIDFile[], BOOL *pblFileEnd )
功 能:应用程序调用此函数获得群发消息的响应信息。
返 回:成 功 返 回 0
失 败 返 回 1
输 入:nPos ----消息体在文件中的位置,0表示第一条消息,1表示第二条消息…。
sMsgIDFile ---- 存放MsgID的文件名。
输 出:*ptSendBatchResp ----响应消息体,见消息体说明。
*pblFileEnd ---- 返回文件是否结束,FALSE表示未结束,TRUE表示结束
注意:存放MsgID的文件最多只能存放100条消息响应。(即nPos值为0-99)
(6) BYTE SMGPDeliver( SMGPDeliverReq_T *ptSMGPDeliverReq, WORD *pwSendErr )
功 能:应用程序调用此函数获得群发消息的响应信息。
返 回:成 功 返 回 0
失 败 返 回 1
输 出:*ptSMGPDeliverReq ----Deliver消息消息体,见消息体说明。
*pwSendErr ---- 返回发送时的错误码。
*pwRecvErr ---- 返回接收时的错误码。

(7) BYTE SMGPRecvSMReport( IsReport_T *ptIsReport, long nPos, BOOL *pblFileEnd
功 能:应用程序调用此函数获得群发消息的响应信息。
返 回:成 功 返 回 0
失 败 返 回 1
输 入:nPos ----消息体在文件中的位置,0表示第一条消息,1表示第二条消息…。
输 出:*ptIsReport ----状态报告消息体,见消息体说明。
*pblFileEnd ---- 返回文件是否结束,FALSE表示未结束,TRUE表示结束
注意:存放状态报告的名为../config/IsReport.dat,若不存在../config目录则不产生状态报告文件,改文件最多只能存放100条消息响应。(即nPos值为0-99)

(8) BYTE SMGPActiveTest( SMGPActiveTest_T *ptSMGPActiveTest )
功 能:测试CP和网关之间的链路状态
返 回:成功返回 0
失败返回 1
输 入:*ptSMGPActiveTest ---- 链路测试消息体,见消息体说明。

(9) BYTE SMGPExitMsg()
功 能:注销CP接入
返 回:成功返回 0
失败返回 1

(10) CloseSMGPAPI()
功 能:释放资源
应用程序结束时使用
...全文
136 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xcode21 2004-09-03
  • 打赏
  • 举报
回复
看了一下InitSMGPAPI函数,好像要把连接字符串放到INI文件里。

而且API提供很详细了,估计不用你手动使用Socket连接服务器了。

在C#里使用“特性”调用非托管的DLL,好像是[ImportDll()]
然后使用C#语法重写DLL里的函数,注意要加一个程序在外部的指示字,具体是什么忘了,去查语法参考吧。注意写的时候注意参数类型的大小要匹配。

csq0516 2004-09-03
  • 打赏
  • 举报
回复
顶顶顶顶顶 顶顶顶顶顶顶顶
顶 顶
顶 顶
顶 顶顶顶顶顶顶
顶 顶 顶
顶 顶 顶 顶
顶 顶 顶 顶
顶 顶 顶 顶 顶
顶 顶 顶 顶
顶 顶 顶
edolphin 2004-09-02
  • 打赏
  • 举报
回复
up
jimh 2004-01-19
  • 打赏
  • 举报
回复
参考http://www.codeproject.com/csharp/win32.asp
dcf2000 2004-01-19
  • 打赏
  • 举报
回复
用华为的SMei吧。
ahow 2004-01-18
  • 打赏
  • 举报
回复
建议不要用中兴的api,还是参考SMGP1.3自己写一个把,比用API快
yoobj 2004-01-17
  • 打赏
  • 举报
回复
mark
lovered 2004-01-17
  • 打赏
  • 举报
回复
大哥,你不用一老重复你是做sp的
rroo 2004-01-17
  • 打赏
  • 举报
回复
http://www.codeproject.com/csharp/win32.asp
这是大部分WIN API在C#中的调用方法,你可以对照这些,写出你的API函数调用方法和参数类型的声明,肯定可以的!
fgc5201314 2004-01-17
  • 打赏
  • 举报
回复
dz.......
Tadpole0510 2004-01-17
  • 打赏
  • 举报
回复
呵呵,什么是SP
vbcb 2004-01-17
  • 打赏
  • 举报
回复
学习
八爪鱼-杭州 2004-01-16
  • 打赏
  • 举报
回复
up
ivt 2004-01-16
  • 打赏
  • 举报
回复
利用属性把API全部改写成C#的再调用呀,我们当初用华为的短信网关也是这样呀
Frankeny 2004-01-16
  • 打赏
  • 举报
回复
5消息结构和错误码定义
/*API中的错误码*/
#define Code_Error_Offset_M 0
#define Code_No_Err_M 0 + Code_Error_Offset_M
#define Decode_No_Err_M 0 + Code_Error_Offset_M
#define Code_In_Para_Null_M 1 + Code_Error_Offset_M
#define Recv_Msg_TimeOut_M 2 + Code_Error_Offset_M
#define Invalid_Msg_Len_M 4 + Code_Error_Offset_M
#define Invalid_Fee_Code_M 5 + Code_Error_Offset_M
#define Msg_Len_Too_Long_M 6 + Code_Error_Offset_M
#define Invalid_ServiceID_M 7 + Code_Error_Offset_M
#define Send_Too_Fast_M 8 + Code_Error_Offset_M
#define Invalid_ICP_M 10 + Code_Error_Offset_M
#define Invalid_MsgFormat_M 11 + Code_Error_Offset_M
#define Invalid_Fee_Type_M 12 + Code_Error_Offset_M
#define Invalid_ValidTime_M 13 + Code_Error_Offset_M
#define Invalid_AtTime_M 14 + Code_Error_Offset_M
#define Invalid_chargeTermId_M 15 + Code_Error_Offset_M
#define Invalid_DestTermId_M 16 + Code_Error_Offset_M
#define Cannot_Open_DestTermIdFile_M 17 + Code_Error_Offset_M
#define Cannot_Open_MsgFile_M 18 + Code_Error_Offset_M
#define Invalid_MsgContent_M 19 + Code_Error_Offset_M
#define Failure_Connect_M 20 + Code_Error_Offset_M
#define Failure_Login_M 21 + Code_Error_Offset_M
#define Failure_Recv_M 22 + Code_Error_Offset_M
#define OverFlow_SendQueue_M 23 + Code_Error_Offset_M
#define OverTake_System_M 24 + Code_Error_Offset_M
#define Invalid_Connect_M 25 + Code_Error_Offset_M /*连接已经建立*/
#define System_Error_M 99 + Code_Error_Offset_M

<2>常量定义
#define SmgpIcpShareKeyLen_M 50
#define SmgpClientIDLen_M 8
#define SmgpAuthCodeLen_M 16
#define SmgpServiceIdLen_M 10
#define SmgpFeeTypeLen_M 2
#define SmgpFeeCodeLen_M 6
#define SmgpFixedFeeLen_M 6
#define SmgpValidTimeLen_M 17
#define SmgpRecvTimeLen_M 14
#define SmgpMsgIdLen_M 10
#define SmgpTermIDLen_M 21
#define SmgpDestTermIDCount_M 10
#define SmgpMsgContentLen_M 252

<3>消息结构
typedef struct tagSMGPSendSingle
{
BYTE nNeedReport; /* 是否要求返回状态报告(0=不要求,1=要求) */
BYTE nMsgLevel; /* 信息级别(0-9,0=最低优先级) */
char sServiceID[SmgpServiceIdLen_M + 1]; /* 业务类型*/
BYTE nMsgFormat; /* 短消息格式*/
char sFeeType[SmgpFeeTypeLen_M + 1]; /* 资费类别*/
char sFeeCode[SmgpFeeCodeLen_M + 1]; /* 资费代码*/
char sFixedFee[SmgpFeeCodeLen_M + 1]; /* 包月费/封顶费 */
char sValidTime[SmgpValidTimeLen_M + 1];/* 存活有效期*/
char sAtTime[SmgpValidTimeLen_M + 1]; /* 定时发送时间*/
char sSrcTermID[SmgpTermIDLen_M + 1]; /* 短消息发送用户号码*/
char sChargeTermID[SmgpTermIDLen_M + 1];/* 计费号码*/
char sDestTermID[SmgpTermIDLen_M + 1];/* 短消息接收号码*/
BYTE nMsgLen; /* 短消息长度*/
char sMsgContent[SmgpMsgContentLen_M +1];/* 短消息内容,nMsgLen=0时表示存放短消息的文件名*/
char sMsgID[SmgpMsgIdLen_M + 1]; /* 返回的短消息标识*/
DWORD nErrorCode; /* 错误代码*/
BYTE bMsgType; /* 短消息类型 */
}SMGPSendSingle_T;

typedef struct tagSMGPSendBatch
{
BYTE nNeedReport; /* 是否要求返回状态报告(0=不要求,1=要求) */
BYTE nMsgLevel; /* 信息级别(0-9,0=最低优先级) */
char sServiceID[SmgpServiceIdLen_M + 1]; /* 业务类型*/
BYTE nMsgFormat; /* 短消息格式*/
char sFeeType[SmgpFeeTypeLen_M + 1]; /* 资费类别*/
char sFeeCode[SmgpFeeCodeLen_M + 1]; /* 资费代码*/
char sFixedFee[SmgpFeeCodeLen_M + 1]; /* 包月费/封顶费 */
char sValidTime[SmgpValidTimeLen_M + 1];/* 存活有效期*/
char sAtTime[SmgpValidTimeLen_M + 1]; /* 定时发送时间*/
char sSrcTermID[SmgpTermIDLen_M + 1]; /* 短消息发送用户号码*/
char sChargeTermID[SmgpTermIDLen_M + 1];/* 计费号码*/
char sDestTermIDFile[101]; /* 短消息接收号码*/
BYTE nMsgLen; /* 短消息长度*/
char sMsgContent[SmgpMsgContentLen_M +1];/* 短消息内容,nMsgLen=0时表示存放短消息的文件名*/
char sMsgIDFile[101];/* 保存所有短消息的返回MsgID和ErrorCode的文件名*/
BYTE bMsgType;/* 短消息子类型*/
}SMGPSendBatch_T;

typedef struct tagSendBatchResp
{
DWORD nErrorCode;
BYTE sMsgID[SmgpMsgIdLen_M + 1];
char sPhoneNo[SmgpTermIDLen_M + 1];
char RecvTime[30];
}SendBatchResp_T;

typedef struct tagIsReport
{
char sSrcTermID[SmgpTermIDLen_M + 1];/*原用户地址*/
char sDestTermID[SmgpTermIDLen_M +1];/*目的用户地址*/
char RecvTime[30]; /*接收时间*/
char sReportContent[150]; /*状态报告内容*/
}IsReport_T;

typedef struct tagSMGPActiveTest
{
DWORD nErrorCode;
}SMGPActiveTest_T;

/*收到的Delivery消息,给用户的响应*/
typedef struct tagSMGPDeliverResp
{
BYTE sMsgID[SmgpMsgIdLen_M + 1];
BYTE nMsgFormat;
char sSrcTermID[SmgpTermIDLen_M + 1];
BYTE nIsReport;
BYTE nMsgLen;
char sMsgContent[SmgpMsgContentLen_M + 1];
char sDestTermID[SmgpTermIDLen_M + 1];
char sRecvTime[SmgpRecvTimeLen_M + 1]; /* 定时发送时间*/
}SMGPDeliverResp_T;

typedef struct tagSMGPDeliver
{
WORD nTimeout;
SMGPDeliverResp_T tSMGPDeliverResp;
}SMGPDeliverReq_T;
6 配置文件说明
在配置文件中(../config/smgpc.ini)
AutoLogon 1为自动登录,0为手动登录
CPId 表示自动登录的CP接入号码(AutoLogon=1时起作用)
CPShareKey 表示自动登录的CP接入号密码(AutoLogon=1时起作用)
ServerIP 表示y要接入的网关IP
SubmitRekey 表示CP与网关断开连接后,自动连接的次数
RequestTimeout 表示接收消息的超时时间
Frankeny 2004-01-16
  • 打赏
  • 举报
回复
4常用的消息体说明
应用程序使用smgpapi.dll,通常用到的消息体和其中的参数值如下:
1. SMGPSendSingle_T:
typedef struct tagSMGPSendSingle
{
BYTE nNeedReport; /* 是否要求返回状态报告(0=不要求,1=要求) */
BYTE nMsgLevel; /* 信息级别(0-9,0=最低优先级) */
char sServiceID[SmgpServiceIdLen_M + 1];/* 业务类型*/
BYTE nMsgFormat; /* 短消息格式*/
char sFeeType[SmgpFeeTypeLen_M + 1]; /* 资费类别*/
char sFeeCode[SmgpFeeCodeLen_M + 1]; /* 资费代码*/
char sFixedFee[SmgpFeeCodeLen_M + 1]; /* 包月费/封顶费 */
char sValidTime[SmgpValidTimeLen_M + 1]; /* 存活有效期*/
char sAtTime[SmgpValidTimeLen_M + 1]; /* 定时发送时间*/
char sSrcTermID[SmgpTermIDLen_M + 1]; /* 短消息发送用户号码*/
char sChargeTermID[SmgpTermIDLen_M + 1];/* 计费号码*/
char sDestTermID[SmgpTermIDLen_M + 1];/* 短消息接收号码*/
BYTE nMsgLen; /* 短消息长度*/
char sMsgContent[SmgpMsgContentLen_M +1];/* 短消息内容, nMsgLen=0时表示存放短消息的文件名*/
char sMsgID[SmgpMsgIdLen_M + 1]; /* 返回的短消息标识*/
DWORD nErrorCode; /* 错误代码*/
BYTE bMsgType; /* 短消息类型 */
}SMGPSendSingle_T;
输出参数:
sMsgID 为返回响应的短消息标识
nErrorCode 为返回响应的错误码,其中0为正确响应,非零为错误码
输入参数:
nNeedReport 为是否返回状态报告 0不要求,1=要求
nMsgLevel 为信息级别(0-9),其中0为最低优先级
sServiceID 为业务类型
nMsgFormat 为短消息格式0为ASCII编码方式,8为UCS2编码方式,15不编码
sFeeType 为资费类别00免费,01按条收费,02包月
sFeeCode 为资费代码(以分为单位)
sFixedFee 为包月费/封顶费(以分为单位)
sValidTime 为存活有效期,NULL为短消息中心的缺省有效期
sAtTime 为定时发送时间,NULL为及时发送
sSrcTermID 为发送用户号码
sChargeTermID 为计费号码
sDestTermID 为目的用户号码
nMsgLen 为短消息长度
sMsgContent 为短消息内容, nMsgLen=0时表示存放短消息的文件名(文件名为文本文件,以.TXT为后缀)
2. SMGPSendBatch_T:
typedef struct tagSMGPSendBatch
{
BYTE nNeedReport; /* 是否要求返回状态报告(0=不要求,1=要求) */
BYTE nMsgLevel; /* 信息级别(0-9,0=最低优先级) */
char sServiceID[SmgpServiceIdLen_M + 1]; /* 业务类型*/
BYTE nMsgFormat; /* 短消息格式*/
char sFeeType[SmgpFeeTypeLen_M + 1]; /* 资费类别*/
char sFeeCode[SmgpFeeCodeLen_M + 1]; /* 资费代码*/
char sFixedFee[SmgpFeeCodeLen_M + 1]; /* 包月费/封顶费 */
char sValidTime[SmgpValidTimeLen_M + 1]; /* 存活有效期*/
char sAtTime[SmgpValidTimeLen_M + 1]; /* 定时发送时间*/
char sSrcTermID[SmgpTermIDLen_M + 1]; /* 短消息发送用户号码*/
char sChargeTermID[SmgpTermIDLen_M + 1];/* 计费号码*/
char sDestTermIDFile[101]; /* 短消息接收号码*/
BYTE nMsgLen; /* 短消息长度*/
char sMsgContent[SmgpMsgContentLen_M +1];/* 短消息内容,nMsgLen=0时表示存放短消息的文件名*/
char sMsgIDFile[101]; /* 保存所有短消息的返回MsgID和ErrorCode的文件名*/
BYTE bMsgType; /* 短消息子类型*/
}SMGPSendBatch_T;
基本同SMGPSendSingle_T,其中sDestTermIDFile为存放目的用户的文件名(文件名为文本文件,以.TXT为后缀),每个用户之间以逗号,或空格,或分号格开,最多发送100个用户。
群发不等待响应,收到的响应放在sMsgIDFile表示的文件
3. SendBatchResp_T:
typedef struct tagSendBatchResp
{
DWORD nErrorCode;
BYTE sMsgID[SmgpMsgIdLen_M + 1];
char sPhoneNo[SmgpTermIDLen_M + 1];
char RecvTime[30];
}SendBatchResp_T;
输出:
sMsgID 为返回响应的短消息标识
nErrorCode 为返回响应的错误码,其中0为正确响应,非零为错误码
sPhoneNo 为目的用户号码
RecvTime 为接收响应的时间

4. IsReport_T:
typedef struct tagIsReport
{
char sSrcTermID[SmgpTermIDLen_M + 1];/*原用户地址*/
char sDestTermID[SmgpTermIDLen_M +1];/*目的用户地址*/
char RecvTime[30]; /*接收时间*/
char sReportContent[150]; /*状态报告内容*/
}IsReport_T;
输出:
sSrcTermID 为原用户号码
sDestTermID 为目的用户号码
RecvTime 为接收响应的时间
SReportContent 为接收的状态报告内容

5. SMGPActiveTest_T:
typedef struct tagSMGPActiveTest
{
DWORD nErrorCode;
}SMGPActiveTest_T;
输出:
nErrorCode为返回响应的错误码,其中0为正确响应,非零为错误码

6. SMGPDeliverReq_T:
typedef struct tagSMGPDeliver
{
WORD nTimeout;
SMGPDeliverResp_T tSMGPDeliverResp;
}SMGPDeliverReq_T;
输入:
nTimeout 为响应的超时时间
输出:
tSMGPDeliverResp Deliver消息内容
/*收到的Delivery消息,给用户的响应*/
typedef struct tagSMGPDeliverResp
{
BYTE sMsgID[SmgpMsgIdLen_M + 1];
BYTE nMsgFormat;
char sSrcTermID[SmgpTermIDLen_M + 1];
BYTE nIsReport;
BYTE nMsgLen;
char sMsgContent[SmgpMsgContentLen_M + 1];
char sDestTermID[SmgpTermIDLen_M + 1];
char sRecvTime[SmgpRecvTimeLen_M + 1]; /* 定时发送时间*/
}SMGPDeliverResp_T;
参数:
sMsgID: 为短消息标识
nMsgFormat 为消息格式
sSrcTermID 原用户地址
nIsReport 是否为状态报告 0不是,1是
nMsgLen 消息内容长度
sMsgContent 消息内容
sDestTermID 目的用户号码
sRecvTime 接收时间

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧