短讯API接口说明 版本V3D8012.11 深圳华为技术有限公司 二零零二年八月 修订记录 日期 修订版本 函数 描述 作者 2004/8/3 2.12 CMPPGetDeliverSM CMPPDoDeliverACK SMPP34SubmitSM 增加 注:前两个函数实现接收CMPP协议消息,控制应答 张志龙 注:描述中要区分增加或修改的函数,已有函数的修改不涉及接口参数的在函数说明中记录修改情况.以后动态库版本与对应的网关版本统一,便于维护. 目录第一章 概述81.1接口说明 8 1.2适用范围 9 1.3支持协议 9 1.4缩略语清单 9 1.5引用标准 9 第二章 函数说明 11 2.1 初始化与退出函数 11 1. IFInitInterface 11 【函数功能】 11 【预置条件】 11 【函数原型】 11 【参数说明】 11 【返回值】 12 【函数说明】 12 【调用举例】 12 【参考函数】 13 2. IFExitInterface 13 【函数功能】 13 【预置条件】 14 【函数原型】 14 【返回值】 14 【函数说明】 14 【调用举例】 14 【参考函数】 14 2.2 短讯业务函数 14 1. Login_R 14 【函数功能】 14 【预置条件】 14 【函数原型】 14 【参数说明】 14 【返回值】 15 【函数说明】 15 【调用举例】 15 【参考函数】 15 2. Logout 15 【函数功能】 15 【预置条件】 15 【函数原型】 16 【返回值】 16 【函数说明】 16 【调用举例】 16 【参考函数】 16 3. SubmitA 和SubmitAExEx、 SubmitAExExEx 16 【函数功能】 16 【预置条件】 16 【函数原型】 16 【参数说明】 17 【返回值】 22 【函数说明】 23 【调用举例】 23 附加说明VPSubmitSM 27 4. QuerySMStatusA 27 【函数功能】 27 【预置条件】 27 【函数原型】 28 【参数说明】 28 【返回值】 29 【调用举例】 29 5. CancelSMA 30 【函数功能】 30 【预置条件】 30 【函数原型】 30 【参数说明】 30 【返回值】 30 【函数说明】 30 6. CancelCmppSM 30 【函数功能】 30 【预置条件】 31 【函数原型】 31 【参数说明】 31 【返回值】 31 【函数说明】 31 7. HasDeliverMessage 31 【函数功能】 32 【预置条件】 32 【函数原型】 32 【参数说明】 32 【返回值】 32 【函数说明】 32 8. GetDeliverSMEx 32 【函数功能】 32 【预置条件】 32 【函数原型】 32 【参数说明】 32 【返回值】 33 【函数说明】 33 9. GetDeliverSMExEx 34 【函数功能】 34 【预置条件】 34 【函数原型】 34 【参数说明】 34 【返回值】 35 【函数说明】 35 【调用举例】 35 10. GetDeliverSMExExEx 36 【函数功能】 36 【预置条件】 36 【函数原型】 36 【参数说明】 36 【返回值】 38 【函数说明】 38 【调用举例】 38 11.InitSMGPAPI 39 【函数功能】 40 【预置条件】 40 【返回值】 40 【函数说明】 40 12.SMGPSendSingle 40 【函数功能】 40 【预置条件】 40 【返回值】 40 【函数说明】 40 13.SMGPSendBatch 40 【函数功能】 41 【预置条件】 41 【返回值】 41 【函数说明】 41 14.GetSendBatchResp 41 【函数功能】 41 【预置条件】 41 【返回值】 41 【函数说明】 41 15.SMGPDeliver 41 【函数功能】 42 【预置条件】 42 【返回值】 42 【函数说明】 42 16.CMPPDeliver函数 42 【函数功能】 42 17. CMPP3Submit 42 【函数功能】 42 【预置条件】 42 【函数原型】 42 【参数说明】 43 【返回值】 45 【函数说明】 45 18. GetCMPP3DeliverSM 46 【函数功能】 46 【预置条件】 46 【函数原型】 46 【参数说明】 46 【返回值】 48 【函数说明】 48 19. CNGPSubmit 48 【函数功能】 48 【预置条件】 48 【函数原型】 48 【参数说明】 49 【返回值】 50 【函数说明】 50 20. GetCNGPDeliverSM 50 【函数功能】 50 【预置条件】 50 【函数原型】 51 【参数说明】 51 【返回值】 52 【函数说明】 52 21. SgipSubmitSm 52 【函数功能】 52 【预置条件】 52 【函数原型】 52 【参数说明】 52 【返回值】 54 【函数说明】 54 20. SgipGetSM 54 【函数功能】 54 【预置条件】 54 【函数原型】 54 【参数说明】 55 【返回值】 56 【函数说明】 56 【调用举例】 56 21. CMPPGetDeliverSM 61 【函数功能】 61 【预置条件】 61 【函数原型】 61 【参数说明】 61 22. CMPPGetDeliverSM 62 【函数功能】 62 【预置条件】 62 【函数原型】 62 【参数说明】 63 【调用举例】 63 23. SMPP34SubmitSM 63 【函数功能】 63 【预置条件】 63 【函数原型】 64 【参数说明】 64 【调用举例】 67 第三章 Smeidll 功能配置说明 67 一、smeidll.ini配置说明 67 1. [COMMON]的配置 67 2. [COMPATIBILITY]段的配置 69 3. [QUERYFEE] 段的配置 70 4. [SGIPServer]段的配置 71 二、 SMGPC.ini配置说明 71 三、功能配置说明 71 1. 流程使用接口自动登陆 71 2. 支持SGIP协议服务端的相关配置 71 第四章 API for UNIX说明 72 3.1 安装说明 72 3.2 函数说明 73 第五章 Java版API说明 75 4.1 CMPP协议的封装 75 4.2 SMProxy使用说明 76 4.2.1 SMProxy提供的接口方法描述 76 4.2.2 封装接口方法的SMProxy的抽象类 77 4.2.3 使用SMProxy抽象类 79 4.2.4 配置参数使用说明 79 4.2.5 使用SMProxy收发短信 82 1 直接使用SMProxy发送短信 82 2 使用SMProxy收发短信 83 4.3 使用SMProxy收发短信的例子 85 4.3.1 直接使用SMProxy发送短信的Demo 85 4.3.2 使用SMProxy收发短信的例子 87 第六章 API应用FAQ 89 第六章 API开发注意事项 91 附录1:编制历史 92 附录2:手机铃声图片对应参数表 93 附录3: infoX响应消息错误码详细说明. 93 附录4:Smeidll动态库函数返回值说明 99 附录5 :有关CMPP协议和MD5算法的网址 101 第一章 概述71.1接口说明 7 1.2适用范围 8 1.3支持协议 8 1.4缩略语清单 8 1.5引用标准 8 第二章 函数说明 10 2.1 初始化与退出函数 10 1. IFInitInterface 10 【函数功能】 10 【预置条件】 10 【函数原型】 10 【参数说明】 10 【返回值】 11 【函数说明】 11 【调用举例】 11 【参考函数】 12 2. IFExitInterface 12 【函数功能】 12 【预置条件】 12 【函数原型】 13 【返回值】 13 【函数说明】 13 【调用举例】 13 【参考函数】 13 2.2 短讯业务函数 13 1. Login_R 13 【函数功能】 13 【预置条件】 13 【函数原型】 13 【参数说明】 13 【返回值】 14 【函数说明】 14 【调用举例】 14 【参考函数】 14 2. Logout 14 【函数功能】 14 【预置条件】 14 【函数原型】 14 【返回值】 15 【函数说明】 15 【调用举例】 15 【参考函数】 15 3. SubmitA 和SubmitAExEx、 SubmitAExExEx 15 【函数功能】 15 【预置条件】 15 【函数原型】 15 【参数说明】 16 【返回值】 21 【函数说明】 21 【调用举例】 22 附加说明VPSubmitSM 26 4. QuerySMStatusA 26 【函数功能】 26 【预置条件】 26 【函数原型】 27 【参数说明】 27 【返回值】 28 【调用举例】 28 5. CancelSMA 28 【函数功能】 28 【预置条件】 29 【函数原型】 29 【参数说明】 29 【返回值】 29 【函数说明】 29 6. CancelCmppSM 29 【函数功能】 29 【预置条件】 30 【函数原型】 30 【参数说明】 30 【返回值】 30 【函数说明】 30 7. HasDeliverMessage 30 【函数功能】 30 【预置条件】 31 【函数原型】 31 【参数说明】 31 【返回值】 31 【函数说明】 31 8. GetDeliverSMEx 31 【函数功能】 31 【预置条件】 31 【函数原型】 31 【参数说明】 31 【返回值】 32 【函数说明】 32 9. GetDeliverSMExEx 33 【函数功能】 33 【预置条件】 33 【函数原型】 33 【参数说明】 33 【返回值】 34 【函数说明】 34 【调用举例】 34 10. GetDeliverSMExExEx 35 【函数功能】 35 【预置条件】 35 【函数原型】 35 【参数说明】 35 【返回值】 37 【函数说明】 37 【调用举例】 37 11.InitSMGPAPI 38 【函数功能】 38 【预置条件】 38 【返回值】 39 【函数说明】 39 12.SMGPSendSingle 39 【函数功能】 39 【预置条件】 39 【返回值】 39 【函数说明】 39 13.SMGPSendBatch 39 【函数功能】 39 【预置条件】 39 【返回值】 40 【函数说明】 40 14.GetSendBatchResp 40 【函数功能】 40 【预置条件】 40 【返回值】 40 【函数说明】 40 【函数功能】 40 【预置条件】 40 【返回值】 41 【函数说明】 41 16.CMPPDeliver函数 41 17. CMPP3Submit 41 【函数功能】 41 【预置条件】 41 【函数原型】 41 【参数说明】 42 【返回值】 44 【函数说明】 44 18. GetCMPP3DeliverSM 45 【函数功能】 45 【预置条件】 45 【函数原型】 45 【参数说明】 45 【返回值】 47 【函数说明】 47 19. CNGPSubmit 47 【函数功能】 47 【预置条件】 47 【函数原型】 47 【参数说明】 47 【返回值】 49 【函数说明】 49 20. GetCNGPDeliverSM 49 【函数功能】 49 【预置条件】 49 【函数原型】 49 【参数说明】 50 【返回值】 51 【函数说明】 51 21. SgipSubmitSm 51 【函数功能】 51 【预置条件】 51 【函数原型】 51 【参数说明】 51 【返回值】 53 【函数说明】 53 20. SgipGetSM 53 【函数功能】 53 【预置条件】 53 【函数原型】 53 【参数说明】 53 【返回值】 54 【函数说明】 55 2.3 、smeidll.ini配置说明 55 2.4 SMGPC.ini配置说明 58 第三章 API for UNIX说明 59 3.1 安装说明 59 3.2 函数说明 60 第四章 Java版API说明 62 4.1 CMPP协议的封装 62 4.2 SMProxy使用说明 63 4.2.1 SMProxy提供的接口方法描述 63 4.2.2 封装接口方法的SMProxy的抽象类 64 4.2.3 使用SMProxy抽象类 66 4.2.4 配置参数使用说明 66 4.2.5 使用SMProxy收发短信 69 1 直接使用SMProxy发送短信 69 2 使用SMProxy收发短信 70 4.3 使用SMProxy收发短信的例子 72 4.3.1 直接使用SMProxy发送短信的Demo 72 4.3.2 使用SMProxy收发短信的例子 74 第五章 API应用FAQ 77 第六章 API开发注意事项 79 附录1:编制历史 79 附录2:手机铃声图片对应参数表 80 附录3: infoX响应消息错误码详细说明. 81 附录4:Smeidll动态库函数返回值说明 87 附录5 :有关CMPP协议和MD5算法的网址 89 第一章 概述61.1接口说明 6 1.2适用范围 7 1.3支持协议 7 1.4缩略语清单 7 1.5引用标准 7 第二章 函数说明 9 2.1 初始化与退出函数 9 1. IFInitInterface 9 【函数功能】 9 【预置条件】 9 【函数原型】 9 【参数说明】 9 【返回值】 10 【函数说明】 10 【调用举例】 10 【参考函数】 11 2. IFExitInterface 11 【函数功能】 11 【预置条件】 11 【函数原型】 12 【返回值】 12 【函数说明】 12 【调用举例】 12 【参考函数】 12 2.2 短讯业务函数 12 1. Login_R 12 【函数功能】 12 【预置条件】 12 【函数原型】 12 【参数说明】 12 【返回值】 13 【函数说明】 13 【调用举例】 13 【参考函数】 13 2. Logout 13 【函数功能】 13 【预置条件】 13 【函数原型】 13 【返回值】 14 【函数说明】 14 【调用举例】 14 【参考函数】 14 3. SubmitA 和SubmitAExEx、 SubmitAExExEx 14 【函数功能】 14 【预置条件】 14 【函数原型】 14 【参数说明】 15 【返回值】 20 【函数说明】 20 【调用举例】 21 附加说明VPSubmitSM 25 4. QuerySMStatusA 25 【函数功能】 25 【预置条件】 25 【函数原型】 26 【参数说明】 26 【返回值】 27 【调用举例】 27 5. CancelSMA 27 【函数功能】 27 【预置条件】 28 【函数原型】 28 【参数说明】 28 【返回值】 28 【函数说明】 28 6. CancelCmppSM 28 【函数功能】 28 【预置条件】 29 【函数原型】 29 【参数说明】 29 【返回值】 29 【函数说明】 29 7. HasDeliverMessage 29 【函数功能】 29 【预置条件】 30 【函数原型】 30 【参数说明】 30 【返回值】 30 【函数说明】 30 8. GetDeliverSMEx 30 【函数功能】 30 【预置条件】 30 【函数原型】 30 【参数说明】 30 【返回值】 31 【函数说明】 31 9. GetDeliverSMExEx 32 【函数功能】 32 【预置条件】 32 【函数原型】 32 【参数说明】 32 【返回值】 33 【函数说明】 33 【调用举例】 33 10. GetDeliverSMExExEx 34 【函数功能】 34 【预置条件】 34 【函数原型】 34 【参数说明】 34 【返回值】 36 【函数说明】 36 【调用举例】 36 11.InitSMGPAPI 37 【函数功能】 37 【预置条件】 37 【返回值】 38 【函数说明】 38 12.SMGPSendSingle 38 【函数功能】 38 【预置条件】 38 【返回值】 38 【函数说明】 38 13.SMGPSendBatch 38 【函数功能】 38 【预置条件】 38 【返回值】 39 【函数说明】 39 14.GetSendBatchResp 39 【函数功能】 39 【预置条件】 39 【返回值】 39 【函数说明】 39 【函数功能】 39 【预置条件】 39 【返回值】 40 【函数说明】 40 17. CMPP3Submit 40 【函数功能】 40 【预置条件】 40 【函数原型】 40 【参数说明】 41 【返回值】 43 【函数说明】 43 18. GetCMPP3DeliverSM 44 【函数功能】 44 【预置条件】 44 【函数原型】 44 【参数说明】 44 【返回值】 46 【函数说明】 46 19. CNGPSubmit 46 【函数功能】 46 【预置条件】 46 【函数原型】 46 【参数说明】 46 【返回值】 48 【函数说明】 48 18. GetCNGPDeliverSM 48 【函数功能】 48 【预置条件】 48 【函数原型】 48 【参数说明】 49 【返回值】 50 【函数说明】 50 2.3smeidll.ini配置说明 50 2.4 SMGPC.ini配置说明 53 第三章 API for UNIX说明 54 3.1 安装说明 54 3.2 函数说明 55 第四章 Java版API说明 57 4.1 CMPP协议的封装 57 4.2 SMProxy使用说明 58 4.2.1 SMProxy提供的接口方法描述 58 4.2.2 封装接口方法的SMProxy的抽象类 59 4.2.3 使用SMProxy抽象类 61 4.2.4 配置参数使用说明 61 4.2.5 使用SMProxy收发短信 64 1 直接使用SMProxy发送短信 64 2 使用SMProxy收发短信 65 4.3 使用SMProxy收发短信的例子 67 4.3.1 直接使用SMProxy发送短信的Demo 67 4.3.2 使用SMProxy收发短信的例子 69 第五章 API应用FAQ 72 第六章 API开发注意事项 74 附录1:编制历史 74 附录2:手机铃声图片对应参数表 75 附录3: infoX响应消息错误码详细说明. 75 附录4:Smeidll动态库函数返回值说明 82 附录5 :有关CMPP协议和MD5算法的网址 83 第一章 概述61.1接口说明 6 1.2适用范围 7 1.3支持协议 7 1.4缩略语清单 7 1.5引用标准 7 第二章 函数说明 8 2.1 初始化与退出函数 8 1. IFInitInterface 8 【函数功能】 8 【预置条件】 8 【函数原型】 8 【参数说明】 8 【返回值】 9 【函数说明】 9 【调用举例】 9 【参考函数】 10 2. IFExitInterface 10 【函数功能】 10 【预置条件】 10 【函数原型】 10 【返回值】 10 【函数说明】 11 【调用举例】 11 【参考函数】 11 2.2 短讯业务函数 11 1. Login_R 11 【函数功能】 11 【预置条件】 11 【函数原型】 11 【参数说明】 11 【返回值】 11 【函数说明】 12 【调用举例】 12 【参考函数】 12 2. Logout 12 【函数功能】 12 【预置条件】 12 【函数原型】 12 【返回值】 12 【函数说明】 12 【调用举例】 13 【参考函数】 13 3. SubmitA 和SubmitAExEx、 SubmitAExExEx 13 【函数功能】 13 【预置条件】 13 【函数原型】 13 【参数说明】 14 【返回值】 19 【函数说明】 19 【调用举例】 20 4. QuerySMStatusA 24 【函数功能】 24 【预置条件】 24 【函数原型】 24 【参数说明】 24 【返回值】 25 【调用举例】 26 5. CancelSMA 26 【函数功能】 26 【预置条件】 26 【函数原型】 26 【参数说明】 26 【返回值】 27 【函数说明】 27 6. CancelCmppSM 27 【函数功能】 27 【预置条件】 27 【函数原型】 27 【参数说明】 27 【返回值】 27 【函数说明】 27 7. HasDeliverMessage 28 【函数功能】 28 【预置条件】 28 【函数原型】 28 【参数说明】 28 【返回值】 28 【函数说明】 28 8. GetDeliverSMEx 29 【函数功能】 29 【预置条件】 29 【函数原型】 29 【参数说明】 29 【返回值】 30 【函数说明】 30 9. GetDeliverSMExEx 30 【函数功能】 30 【预置条件】 30 【函数原型】 30 【参数说明】 31 【返回值】 31 【函数说明】 32 【调用举例】 32 10. GetDeliverSMExExEx 32 【函数功能】 33 【预置条件】 33 【函数原型】 33 【参数说明】 33 【返回值】 34 【函数说明】 34 【调用举例】 35 11.InitSMGPAPI 36 【函数功能】 36 【预置条件】 36 【返回值】 36 【函数说明】 36 12.SMGPSendSingle 36 【函数功能】 36 【预置条件】 36 【返回值】 37 【函数说明】 37 13.SMGPSendBatch 37 【函数功能】 37 【预置条件】 37 【返回值】 37 【函数说明】 37 14.GetSendBatchResp 37 【函数功能】 37 【预置条件】 38 【返回值】 38 【函数说明】 38 15.SMGPDeliver 38 【函数功能】 38 【预置条件】 38 【返回值】 38 【函数说明】 38 2.3smeidll.ini配置说明 38 第三章 API for UNIX说明 42 3.1 安装说明 42 3.2 函数说明 43 第四章 Java版API说明 45 4.1 CMPP协议的封装 45 4.2 SMProxy使用说明 46 4.2.1 SMProxy提供的接口方法描述 46 4.2.2 封装接口方法的SMProxy的抽象类 47 4.2.3 使用SMProxy抽象类 49 4.2.4 配置参数使用说明 49 4.2.5 使用SMProxy收发短信 52 1 直接使用SMProxy发送短信 52 2 使用SMProxy收发短信 53 4.3 使用SMProxy收发短信的例子 55 4.3.1 直接使用SMProxy发送短信的Demo 56 4.3.2 使用SMProxy收发短信的例子 57 第五章 API应用FAQ 60 第六章 API开发注意事项 61 附录1:编制历史 62 附录2:手机铃声图片对应参数表 63 附录3: infoX响应消息错误码详细说明. 63 附录4:Smeidll动态库函数返回值说明 68 附录5 :有关CMPP协议和MD5算法的网址 70 第一章 概述1.1接口说明 短消息中心(SMC)和手机(MS)之间的联系,通过PLMN网,按照有关协议进行联系.而扩展短消息实体(ESME)和短消息中心之间的联系,ETSI规范中另有相关规定,GSM 03.39 SMPP协议等.ESME和SMSC之间通讯协议一般是 TCPIP协议,上层协议可以是SMPP或者其他扩展协议.例如中国移动的CMPP协议中国联通的SGIP协议,中国电信的SMGP协议等.华为公司的M900INtess-SMAX II系统提供的SMPP协议,对GSM03.39 SMPP协议中的某些局限进行功能上的扩展,支持SMPP协议定义的所有功能. 随着短消息业务的迅速推广,用户对短消息服务的要求也随之提高,要求 提供的信息服务越来越多,对服务的内容和品质的要求也越来越高.用户对信息的需求促使短消息服务上了一个崭新台阶、提高营运服务质量的需求也日益紧迫.这样对短消息网关的要求越来越高.网关的形态越来越多,全球通用户梦网网关、神州行梦网网关、与联通短消息的互联网关、与中国电信短消息的互联网关、企业短消息网关,以及其它专用SMPP网关等. 华为技术有限公司在这样的形势下,集中优势的开发队伍,开发出拥有自主知 识产权,商用化的产品:infoX综合网关也称信息平台.infoX综合网关是华为技术有限公司在积累了短消息中心产品开发的技术经验,并分析短消息应用的前景在GSM网络、CDMA网络、3G网络的基础上,结合智能业务交换与业务分离的设计思想的基础上开发出来的基于短消息交互、信息服务以及各个SP(服务提供者)间互联的综合服务平台. 扩展短消息实体ESMEs(SP、ICP、人工台、自动台等)可以直接和短消息 中心信息平台、短消息中心按照SMPP或内部协议通讯,实现规范规定的有关服务.ESMEs消息网关之间的通讯如果直接通过SMPP协议或CMPP、SGIP协议、SMGP协议通讯十分烦琐,而且有许多工作是公共的,所以在M900INtess-SMAX II系统中提供了一些API函数,供扩展短消息实体(ESMEs)直接调用用,而不用 ESMEs处理低层的TCPIP通信,和短消息网关或SMSC的握手等工作.通过这些 API函数,ESMEs(SP、ICP)可以很方便和综合信息平台、短消息中心通讯、提供短消息服务. ESME,用户接口(SMEIDLL)、信息平台(infoX)、SMSC之间的关系图如下: 通过该接口可以用SMPP协议的格式和其他支持SMPP协议的SMSC进行通讯. 用户接口具有的功能有: 1. 低层链路出现故障时,重连链路,提示上层. 2. 和infoX信息平台或SMSC的定时握手. 3. 提供实现SMPP、CMPP、SMGP,SGIP,CNGP和内部协议中定义的相关协议的API函数. 本接口说明在完善过程中,研发的infoX项目组成员,用服专家徐荣华,周英玉等,还有一些SP的工程师提了很多宝贵意见,在这里提了很多宝贵意见,在这里致以衷心的感谢! 1.2适用范围 本接口说明适用于业务开发者和SP厂商利用华为开发的Smeidll.dll动态链接库里的函数和 华为的infoX短消息网关或短消息中心根据已支持的协议进行通讯. 1.3支持协议 本文档接口支持SMPP3.3,CMPP2.0,SMGP1.8,CNGP1.0,CMPP3.0,SGIP1.2协议. 1.4缩略语清单 API : Aplication Program Interface 应用程序接口. infoX: 华为信息综合平台,短消息网关商标. SMEI: 短消息扩展协议 SMPP: Short Message Peer to Peer 短消息点对点协议 CMPP:China Mobile Peer to Peer 中国移动点对点协议 ISMG: Internet Short Message Gateway 互联网短消息网关 SMSC: Short Message Service Center 短消息中心 infoX:华为短消息综合网关注册商标,也称infoX信息平台. SMGP:Short Message Gateway Protocol 短消息网关协议. SP: Service Provider ,服务提供商. CP: Content Provider ,内容提供商. ICP:Internet Content Provider,网络内容提供商. Smeidll :华为API动态链接库名称. MS: Mobile Station 移动站. SGIP: Short Message Gateway Interface Protocol 联通短消息网关接口协议. M900INtess-SMAX II:华为短消息中心系统软件注册商标. CNGP: China Netcom Short Message Gateway Protocol 中国网通短消息网关协议 SGIP: Short Message Gateway Interface Protocol 短消息网关接口协议 1.5引用标准 [1] SMPP3.3 Short Message Peer to Peer Protocol Specification V3.3 [2] GSM3.4 Digital cellular telecomunications system(phase 2+);Technical realization of the Short Message Service(SMS) [3] CMPP1.2 点对点短消息网间互通协议V1.2 [4] CMPP2.0 中国移动通讯互联网短讯网关接口协议V2.0 (中国移动通信信息资源站实体与互联网短消息网关接口协议) [5] SMGP1.3 Short Message Gateway ProtocolV1.3 [6] 《PHS短消息网关技术规范第一分册》 [7] CMPP3.0中国移动通讯互联网短讯网关接口协议V3.0 [8] SGIP1.2 中国联通短消息网关接口协议V1.2 第二章 函数说明 短讯接口API可分为以下几类: (1)初始化与退出函数 (2)短讯业务函数 2.1 初始化与退出函数 1. IFInitInterface 【函数功能】 初始化接口,和infoX信息平台、短讯中心建立连接,应用程序必须首先调用本函数. 【预置条件】 smeidll.dll动态连接库必须在系统能够找到的目录下. 【函数原型】 BOOL WINAPI IFInitInterface(DWORD dwCodeProtocol, DWORD dwDriverProtocol, LPCSTR pDriverParam); 【参数说明】 dwCodeProtocol 类型:DWORD 说明:和短讯中心连接的协议类型 取值 意义 1 内部协议(保留) 2 网关协议(保留) SMPP协议 SGIP 协议(中国联通网关互联协议) 5 CMPP2.x协议(中国移动点对点协议) 6 SMGP协议(固网网关协议) 7 CMPP3.x协议(中国移动点对点协议) 8 CNGP协议 (中国网通网关协议) dwDriverProtocol 类型:DWORD 说明:和短讯中心或infoX信息平台连接的网络协议 取值 意义 1 TCP/IP协议 2 COM协议(保留) 3 X25协议(保留) PDriverParam 类型;LPCSTR 说明:网络协议参数.字符串,参数之间以空格隔开. 例如:TCP/IP协议的参数为"IP地址 端口号 超时时间" (如"129.9.123.8 7890 5000") 注:SP在各种协议连接infoX短消息网关使用的端口号: CMPP2.x: 7890; (注意对应的dwCodeProtocol应为5) SMPP: 5018; (注意对应的dwCodeProtocol应为3,连接短消息中心时端口号为5016.) SMGP: 8890; (注意对应的dwCodeProtocol应为6) CMPP3.x:7891;(注意对应的dwCodeProtocol应为7) CNGP:9890;(注意对应的dwCodeProtocol应为8) SGIP: 8801;(注意对应的dwCodeProtocal应为4) 【返回值】 FALSE表示失败,TRUE表示成功. 【函数说明】 IFInitInterface用于初始化用户接口,定义接口的协议和使用的网络协议.使用该接口时,必须首先调用IFInitInterface,然后才能调用其他函数. 当低层链路出现故障后,如果用户没有注册出错处理函数,接口会调用缺省的出错处理函数,杀掉现在的接口,重新连接,建立新接口. 如果用户注册了出错处理函数,接口调用用户的回调函数,此时,接口已破坏,用户必须再次调用此函数,重新初始化接口,然后才能成功调用其他函数. 此函数在调用时,会杀掉当前的接口,不管当前接口是否出错.如果当前接口已经登录到SMSC,则重新初始化后,会自动调用Login函数,以上次登录的数据自动登录,当调用Logout函数后,上次登录的数据才会丢弃,无效. dwCodeProtocol定义接口的编码协议,即ESME和短消息网关或SMSC之间的接口协议,取值有内部协议、SMPP协议、CMPP协议、SGIP协议、SMGP协议等.其中代码为2的网关协议是网关和SMSC之间的协议,目前动态库不承载此协议. dwDriverProtocol定义网络通讯协议,其中COM协议,X25协议,此版本保留,尚未提供. pDriverParam定义网络协议的连接参数,对于不同的网络协议,参数不同.如果选择的协议是TCP/IP协议,则此参数应是按SMSC或infoX信息平台的IP地址,dwCodeProtocol定义的协议的端口号,连接超时时间顺序的字符串.其中端口号根据协议、厂家的不同有不同的值. 例如: 华为的infoX信息平台,CMPP协议的端口号是7890. 当IP地址所对应的机器上的应用程序停止运行时、调用这个函数将返回失败. 【调用举例】 int iProtocol; CString sDrvPara; WORD wPort; switch(m_protocol) ;m_protocol 是一个控件变量,保存所采用协议对应的值 { case 0: iProtocol = 3; //SMPP协议 if (m_port)m_Port 是一个控件变量保存要用来登陆的端口号 wPort = (WORD)m_port; else wPort = 5016; sDrvPara.Format("%s %d %d", m_ip, wPort, INITIALTIME); break; case 2: iProtocol = 5; //Cmpp if (m_port) wPort = (WORD)m_port; else wPort = 7890; sDrvPara.Format("%s %d %d", m_ip, wPort, INITIALTIME); break; }; if (!IFInitInterface(iProtocol, 1, (LPCSTR)sDrvPara) ) AfxMessageBox(" initial failed!"); else { AfxMessageBox(" initial success!"); }; 上面这段是在一个Demo中通过判断要初始化确定通讯采用的协议和端口号,调用 IFInitInterface函数.初始化通讯接口. 例2: IFInitInterface(5, 1, "129.9.123.8 7890 5000 "); 注:表示通过CMPP协议、端口号7890,超时时间为5000毫秒初始化接口. 【参考函数】 IFExitInterface 2. IFExitInterface 【函数功能】 退出接口,应用程序在退出程序时必须调用此函数. 【预置条件】 加载了动态连接库. 【函数原型】 BOOL WINAPI IFExitInterface(); 【返回值】 FALSE表示失败,TRUE表示成功 【函数说明】 此函数用于退出接口时,删除接口,释放某些接口分配的系统资源.此函数只能在应用程序退出系统时调用,调用后接口以不完整,即使再次调用IFInitInterface后,接口也已不可再用,必须重新加载用户程序,重新加载SMEIDLL.DLL,再初始化接口. 注意,在退出用户应用程序前,必须调用IFExitInterface函数.否则在Windows 95或者98下,卸载SMEIDLL.DLL时,会出现线程退不干净的现象.在Windows NT下,由于调度机制的完善,即使不调用IFExitInterface,SMEIDLL.DLL也可正常卸载,不会出现线程退不干净的现象. 【调用举例】 if (!IFExitInterface()) ::MessageBox(NULL, "exit failed.", "",MB_OK|MB_ICONINFORMATION); else { ::MessageBox(NULL, "exit success.", "",MB_OK|MB_ICONINFORMATION) }; 【参考函数】 IFInitInterface(); 2.2 短讯业务函数 1. Login_R 【函数功能】 用户向 infoX信息平台、短讯中心等服务端注册登录.服务端对用户数据进行校验,如果 合法,则登记该用户为合法用户,此后用户即可使用其他短讯业务函数.如果此函数调用不成功,则服务端(infoX信息平台或短讯中心)不会处理用户其他有关短讯业务的命令. 【预置条件】 成功调用IFInitInterface函数. 【函数原型】 BOOL WINAPI Login_R(LPCSTR SystemID, LPCSTR Password); 【参数说明】 SystemID 类型:LPCSTR,最大长度为15个字符 (如果以CMPP协议登录,最大长度只支持6个字符) 意义:在服务端注册的帐号名. Password 类型: LPCSTR,最大长度为8个字符 (如果以CMPP协议登录,最大长度支持8个字符) 意义;帐号密码. 【返回值】 FALSE表示失败, TRUE表示成功. 【函数说明】 Login_R函数用于用户接口向infoX信息平台、短讯中心服务端登录.用户必须在初始化接口即成功调用IFInitInterface函数后,调用此函数向服务端(包括infoX信息平台或短讯中心)注册.只有成功注册以后才能跟服务端建立正常的协议通讯,如果注册不成功则服务端对于接口的其他有关业务的命令是不会处理的. 参数SystemID是在服务端登记的帐号名.参数Password是帐号的密码.如果SMSC或infoX没有该账号,或者密码不正确,或者该账号已经被使用达到最到的允许连接的接口数等原因,都会造成登录不成功.如果登录成功后,接口会保存最后一次登录的数据,当链路出现故障后,重新初始化接口后,会自动登录到服务端.只有调用Logout后,接口才会废弃登录数据. 【调用举例】 例1:(假设调用 IFInitInterface(..)已经成功) if (!Login_R(m_system_id, m_password)) //m_system_id 登录帐号变量. AfxMessageBox("login failed.m_password 登录帐号的密码. else { AfxMessageBox("login success."); }; 例2: If (IFInitInterface(5, 1, "129.9.123.8 7890 5000")) Login_R("newid", "password"); 【参考函数】 Logout 2. Logout 【函数功能】 用户向 infoX信息平台、短讯中心注销接口. 【预置条件】 成功调用IFInitInterface. 成功调用Login_R. 【函数原型】 BOOL WINAPI Logout(); 【返回值】 FALSE表示失败, TRUE表示成功. 【函数说明】 此函数用于向服务端(infoX或SMSC)注销接口.注销后,服务端在处理除登录外的其他协议.此外调用此函数后,接口会将上次登录的接口数据,保存在接口中的接口名和密码丢弃 【调用举例】 例1: if (!Logout()) ::MessageBox(NULL, "LOGOUT FAILED.", "Logout Info", MB_OK|MB_ICONINFORMATION); else ::MessageBox(NULL, "logout success.", "Logout Info", MB_OK|MB_ICONINFORMATION); return 0; 【参考函数】 Login_R 3. SubmitA 和SubmitAExEx、 SubmitAExExEx 【函数功能】 向指定的地址发送短讯. 【预置条件】 成功调用IFInitInterface. 成功调用Login_R. 【函数原型】 int WINAPI SubmitA(unsigned char OrgTON, unsigned char OrgNPI, LPCSTR OrgAddr, unsigned char DestTON, unsigned char DestNPI, LPCSTR DestAddr, unsigned char PRI, unsigned char RD, unsigned char RP, unsigned char SRR, unsigned char MR, unsigned char DCS, unsigned char PID, LPCSTR Schedule, LPCSTR Expire, unsigned long Default_ID, unsigned char UDHI, unsigned long UDLen, LPCSTR UserData, unsigned long* SM_ID, unsigned char* FCS); 注:SubmitA适用于SMPP协议. int WINAPI SubmitAExEx(unsigned char OrgTON, unsigned char OrgNPI, LPCSTR OrgAddr, unsigned char DestTON, unsigned char DestNPI, LPCSTR DestAddr, unsigned char PRI, unsigned char RD, unsigned char RP, unsigned char SRR, unsigned char MR, unsigned char DCS, unsigned char PID, LPCSTR Schedule, LPCSTR Expire, unsigned long Default_ID, unsigned char UDHI, unsigned long UDLen, LPCSTR UserData, LPCSTR ServiceSubType, unsigned char* byMsgID, unsigned char byPKTotal, unsigned char byPKNumber, unsigned char byMsglevel, unsigned char byFeeUserType, LPCSTR sSPID, LPCSTR sFeeType, LPCSTR sFeeAddr, LPCSTR sFeeCode,unsigned char byUserNum, LPCSTR sDestAddrs, unsigned long* SM_ID, unsigned char* FCS) 注:SubmitAExEx适用于CMPP协议(移动). int WINAPI SubmitAExExEx(unsigned char OrgTON, unsigned char OrgNPI, LPCSTR OrgAddr, unsigned char DestTON, unsigned char DestNPI, LPCSTR DestAddr, unsigned char PRI, unsigned char RD, unsigned char RP, unsigned char SRR, unsigned char MR, unsigned char DCS, unsigned char PID, LPCSTR Schedule, LPCSTR Expire, unsigned long Default_ID, unsigned char UDHI, unsigned long UDLen, LPCSTR UserData, LPCSTR ServiceSubType, unsigned char* byMsgID, unsigned char byPKTotal, unsigned char byPKNumber, unsigned char byMsglevel, unsigned char byFeeUserType, LPCSTR sSPID, LPCSTR sFeeType, LPCSTR sFeeAddr, LPCSTR sFeeCode, unsigned char byUserNum, LPCSTR sDestAddrs, unsigned long* SM_ID, unsigned char* FCS, unsigned char *bySmgpMsgID, unsigned char byMsgType, LPCSTR FixedFee) 注:SubmitAExExEx适用于SMGP协议(固网)标准调用SMGP协议的上提消息可用SMGPSendSingle函数,具体请参考此函数的说明. 【参数说明】 输入参数: OrgTON 类型:unsigned char 适用协议:SMPP 说明:源地址号码类型 取值 意义 0 未知,当用户或网络不含关于编码方案的较早信息 1 国际号码, 2 国内号码,不能包含地区和退出数字 3 网络特殊号码 4 用户号码 5 字符数字 6 缩写号码 保留 如:86 应该填1 反之就应该填2. 而对于象9999这样的特服号码一般填1. OrgNPI 类型:unsigned char 适用协议:SMPP 意义:源地址编码方案 取值 意义 0 未知,当TON=5时,NPI=0 1 ISDN或电话号码编码方案(E164/E163)对于任意实体SC,MSC或MS,都有效 2 保留 3 数据编码方案(X121) 4 电报编码方案 5-7 保留 8 国内编码方案 9 私有编码方案 10 ERMES编码方案(ETSI DE/PS 3 01-3) 保留 缺省值一般为1. OrgAddr 类型:LPCSTR 最大长度为20个ASCII字符 适用协议:SMPP 意义:源地址 DestTON 类型:unsigned char 适用协议:SMPP 意义:目标地址号码类型.取值同OrgTON. DestNPI 类型:unsigned char 适用协议:SMPP 意义:目标地址编码方案.取值同OrgNPI. DestAddr 类型:LPCSTR 最大长度为20个ASCII字符 适用协议:SMPP 意义:目标地址 PRI 类型:unsigned char 适用协议:SMPP 意义:SM优先级 取值 意义 1 优先级别 0 缺省级别 RD 类型:unsigned char 意义:保留,设置为0. RP 类型:unsigned char 意义:回应路径,保留,设置为0. SRR 类型:unsigned char 适用协议:SMPP,CMPP 意义:状态报告,保留,设置为0;需要状态报告时,设置为1. MR 类型:unsigned char 意义:消息索引,保留,设置为0. DCS 类型:unsigned char 适用协议:SMPP,CMPP 意义:数据编码方案 取值 意义 0 缺省编码方案(7位) 4 二进制编码方案 UCS2编码方案 15 GBK编码 其他 保留 对于一般的中文短消息应填8或15,对于传送铃声图片一般填4. PID 类型:unsigned char 适用协议:SMPP 意义:协议类型,缺省为0. Schedule 类型:LPCSTR 长度为19个ASCII字符的字符串 适用协议:SMPP,CMPP 意义:定时时间 注意:时间格式必须为"yyyy/mm/dd hh:mm:ss".缺省为NULL. 如果使用的不是Smedll的API函数,请视情况而定,时间格式可能为 yymmddhhmmss32+NULL.以下时间的输入格式相同. Expire 类型:LPCSTR 长度为19个ASCII字符的字符串 适用协议:SMPP,CMPP 意义:超时时间 注意:时间格式必须为"yyyy/mm/dd hh:mm:ss".缺省为NULL. Default_ID 类型:unsigned long 适用协议:SMPP 意义:缺省短消息的信息码,缺省为0. 注意:国标定义的缺省短消息的个数为100条. UDHI 类型:unsigned char. 适用协议:SMPP 意义:用于长短消息,表示UserData是否是结构 取值 意义 0 UD是正常字符串 1 UD是结构 UDLen 类型:unsigned long 适用协议:SMPP 意义:表示UserData的长度,单位是字节.此处不是定长的.UDLen要注意的事项如下,如果对于UDHI设置为1的短消息,则此项表示UserData的字符个数(字符个数和字节个数不同,对于7比特编码格式,字符是7比特的,字节是8比特.其他编码方式则字符的大小和字节的大小相同) UserData 类型;LPCSTR 适用协议:SMPP 意义:用户信息,短消息正文.对于正常短消息,该字段的最大长度和编码方式有关,对于7比特编码方式(缺省的编码方式)为160个字符的ASCII字符串,如果为8比特编码方式则为140个8比特字节流,如果为UCS2编码方式,则为70个字符的16比特字符串. 此外对于UDHI设置为1的短消息,表示此字段已经经过编码,所以不论是什么编码方式,此字段的最大长度为140字节. 如果传输是图片铃声则要求UDHI的值为1、DCS值为4.而且对不同的品牌的手机、DCS值可能有变化. 输出参数: SM_ID 类型:unsigned long* 适用协议:SMPP 意义:返回短消息ID FCS 类型:unsigned char* 意义:返回SC端失败原因 SubmitAExEx函数部分的参数说明: (以下为CMPP新增字段) sServiceType 类型:LPCSTR 适用协议:CMPP 意义:业务类型,通过此值来判断计费.缺省值为NULL. byPKTotal 类型:unsigned char 适用协议:CMPP 意义:相同Msg_id的消息总条数,从1开始. byPKNumber 类型:unsigned char 适用协议:CMPP 意义:相同Msg_id的消息序号,从1开始. byMsglevel 类型:unsigned char 适用协议:CMPP 意义:信息级别,缺省为0. byFeeUserType 类型:unsigned char 适用协议:CMPP 意义:计费用户类型字段: 0:对目的终端MSISDN计费; 1:对源终端MSISDN计费; 2:对SP计费; 3:表示本字段无效 注意对于SP来说此字段如果 填"1"则将导致计费失败. sSPID 类型:LPCSTR ,6个ASCII字符串 适用协议:CMPP 意义:信息内容来源(Src_ID) ,对应CMPP的Msg_src. sFeeType 类型:LPCSTR,2个ASCII字符串 适用协议:CMPP 意义:资费类别 00 "短消息类型"为"发送",对"计费用户号码"不计信息费, 此类话单仅用于核减SP对称的信道费; 01 对"计费用户号码"免费; 02 对"计费用户号码"按条计信息费; 03 对"计费用户号码"按包月收取信息费; 04 对"计费用户号码"的信息费封顶; 05 对"计费用户号码"的收费是由SP实现. sFeeAddr 类型:LPCSTR,长度为20个ASCII的字符串 适用协议:CMPP 意义:被计费用户的号码(如本字节填空,则表示本字段无效,对 谁计费参见byFeeUserType字段.本字段与byFeeUserType字段互斥) sFeeCode 类型:LPCSTR,6个ASCII字符串 适用协议:CMPP 意义:资费代码,以分为单位. byUserNum 类型:unsigned char 适用协议:CMPP 意义:接收消息的用户数量 sDestAddrs 类型:LPCSTR,21* byUserNum个ASCII字符串 适用协议:CMPP 意义:接收业务的MSISDN号码,最多100个MSISDN号码. MsgID 类型:unsigned char* (输出参数) 适用协议:CMPP 意义:返回ACK应答消息的MsgID. 信息标识,由SP侧短信网关本身产生: 这里得到的MsgID已经将64位(8字节)的整数转化为21字节的字符串. (1)时间(从月精确到分) 0――9位(2)SMC(短讯中心)号码 或网关ID号.10――14位(3)序列号 15――19位 各分段如不能填满,左补零,右对齐 SubmitAExExEx函数新增的参数说明: BySmgpMsgID 类型:unsign char指针. 意义:网关产生的消息流水号. ByMsgType 类型:unsign char 指针. 意义:短消息类型 1:取消订阅 2:订阅请求 3:点播 4:订阅 5:交互式操作 6:查询 FixedFee 类型: Char*字符串长指针. 意义:包月费、封顶费.单位分. 【返回值】 函数返回值定义参见附录. 【函数说明】 此函数封装了SUBMIT_SM协议,实现ESME向信息平台或SMSC提交短消息.将SUBMIT_SM协议的各项以参数的形式提供. 手机的地址由参数TON(OrgTON或DestTON),参数NPI(OrgNPI或DestNPI)和参数Addr(OrgAddr或DestAddr)确定.如果地址是手机的号码,则NPI必须取1.当NPI取1后,TON可取相应的值,对于国际编码,即手机号码加了"86",TON可取1;对于国内编码,不加"86",TON应取2. 对于参数编码方案DCS,建议短消息内容为英文ASCII码,可取0.对于中文短消息,DCS必须取8,表示UNICODE,否则会出现乱码.对于图片、铃声此值一般设为4,但是对于不同品牌的手机,此值又有不同. 参数Schedule用于定时短消息,即指定短消息发送的时间,当时间到达指定的时间后,SMSC才会下发. 参数Expire用于指定该提交短消息的生存期,即超时时间.生存期是指当某条短消息在SMSC中存在的时间,当生存期结束后,短消息会被写入数据库中.生存期结束有多种原因,例如:短消息下发成功;短消息一直未下发成功,但超时时间已到;下发时遇永久性失败等.SMSC的缺省时间是48小时,这个时间可设置.用户也可以通过这个参数设置某个短消息的生存期,设置是到达某个时间点失效,具体输入格式请参考上面的说明..设置此值时需注意应用程序所在服务器时间必须和短讯中心时间同步. 参数Default_ID是缺省短消息的代码.国标定义的缺省短消息的个数是100条.对于不同的SMSC,缺省短消息的意义可能不同.如果Default_ID为非零,则参数UDHI,UDLen,UserData被忽略. 参数UDHI表示参数UserData是否有头结构.有头结构表示UserData字段是经过编码的内容;缺省情况下,此项应设成0.对图片、铃声此值应设为1. 参数UDLen表示UserData的长度,表示UserData的字符长度. 参数UserData是需要发送的短消息的内容,根据DCS和UDHI的设置不同可以是ASCII字符串,多字节字符串,二进制字符流. 参数SM_ID返回成功提交短消息后,这条短消息的ID.通过这个ID,可对这条短消息进行其他操作. 参数FCS返回SC端失败原因.详细说明参见SMPP协议. 如果该函数执行的不成功,函数的返回值中定义了详细的出错原因,具体可参见返回值部分的定义. 【调用举例】 例1 unsigned char PRI = 0, DCS = 8, RD = 0, RP = 0, SRR = 0, MR = 0, PID = 0; unsigned long default_id = 0; unsigned char UDHI = 0; Cstring UserData = "你好,我已到达."; unsigned long UDLen = UserData.GetLength(); unsigned long SM_ID; unsigned char FCS; int iRet = SubmitA(2, 1, "1392700001", 2, 1, "1392700002", PRI, RD, RP, SRR, MR, DCS, PID, "1998/01/01 08:00:00", "1998/01/01 20:30:00", default_id, 0, UDLen, (LPCSTR)UserData, &SM_ID, &FCS); if (iRet != 0) AfxMessageBox("短讯发送失败"); 例2: CDemoDlg* p =(CDemoDlg*)lparam; unsigned char OrgTON=1, OrgNPI=1; unsigned char DestTON=1, DestNPI=1; unsigned char PRI, DCS; char sadd[100]; char dadd[100]; char schedule[100]; char expire[100]; unsigned char bySRR; //状态报告标志 unsigned long default_id=0; unsigned char UDHI=0; unsigned long UDLen; unsigned long SM_ID; unsigned char FCS; unsigned char PID; ::EnterCriticalSection(&(p->m_critical)); PID = (unsigned char)p->m_pid; bySRR = (unsigned char)p->m_iSRR; switch(p->m_PRI) { case 0: PRI=SM_PRI_DEFAULT; break; case 1: PRI=SM_PRI_PRIOR; break; }; DCS = (unsigned char)atol(p->m_DCS); UDLen=p->m_len; UDHI = p->m_UDHI; BOOL IsBinary = p->m_Binary; int size = p->m_userdata.GetLength(); char * ud =NULL; ud=new char[size+1]; memset(ud, 0, size+1); if (ud == NULL) { ::LeaveCriticalSection(&(p->m_critical)); return -1; }; if (IsBinary) { AnalysisString(p->m_userdata, (unsigned char*)ud, size); UDLen = size; } else strcpy(ud,p->m_userdata); strcpy(schedule, p->m_schedule); strcpy(expire, p->m_expire); default_id=p->m_default_id; strcpy(sadd,p->m_orgaddr); strcpy(dadd,p->m_destaddr); ::LeaveCriticalSection(&(p->m_critical)); CString str; unsigned char byMsgID[23]CMPP的字段,消息ID unsigned char byPKTotal = 0;相同Msg_id的⒆芴跏?开始 unsigned char byPKNumber = 0;相同Msg_id的消息序号,从1开始 unsigned char byMsgLevel = 0;信息级别 unsigned char byFeeUserType = 0; //计费用户类型字段,0:对目的终端MSISDN计费;1:对源终端MSISDN计费; // 2:对SP计费;3:表示本字段无效 char sSPID[MAX_SPID_LEN]信息内容来源 char sFeeType[MAX_FEE_TYPE_LEN]资费类别 char sFeeAddr[MAX_ADDR_LEN]被计费用户 char sFeeCode[MAX_FEE_CODE_LEN]资费代码 unsigned char byUserNum = 0;接收消息的用户数 char sDestAddrs[MAX_ADDRS_LEN]手机号码集 unsigned char sSmgpMsgID[SMGP_MSGID_LEN]; unsigned char msgtype; char sFixedFee[MAX_FEE_CODE_LEN]; memset(byMsgID, 0, 23); memset(sSPID, 0, MAX_SPID_LEN); memset(sFeeType, 0, MAX_FEE_TYPE_LEN); memset(sFeeAddr, 0, MAX_ADDR_LEN); memset(sFeeCode, 0, MAX_FEE_CODE_LEN); memset(sDestAddrs, 0, MAX_ADDRS_LEN); memset(sFixedFee, 0, MAX_FEE_CODE_LEN); memset(sSmgpMsgID, 0, SMGP_MSGID_LEN); byPKTotal = p->m_byPKTotal; byPKNumber = p->m_byPKNumber; byMsgLevel = p->m_byMsgLevel; byFeeUserType = p->m_byFeeUserType; memcpy(sSPID, p->m_sSPID, MAX_SPID_LEN); memcpy(sFeeType, p->m_sFeeType, MAX_FEE_TYPE_LEN); memcpy(sFeeAddr, p->m_sFeeAddr, MAX_ADDR_LEN); memcpy(sFeeCode, p->m_sFeeCode, MAX_FEE_CODE_LEN); byUserNum = p->m_byUsrNum; memcpy(sDestAddrs, p->m_sDestAddrs, MAX_ADDRS_LEN); memcpy(sFixedFee, p->m_sFixedFee, MAX_FEE_CODE_LEN); msgtype = p->m_uMsgType; int iRet; char ServiceSubType[MAX_SERVICE]; memcpy(ServiceSubType, p->m_sServiceType, MAX_SERVICE - 1); if(p->m_protocol == 2) //CMPP协议 { iRet = SubmitAExEx(OrgTON,OrgNPI,sadd,DestTON,DestNPI,dadd,PRI,0,0, \ bySRR,0,DCS,PID,schedule,expire,default_id,UDHI,UDLen, LPCSTR)ud,\ (LPCSTR)ServiceSubType, byMsgID/*new*/, byPKTotal/*new*/, \ byPKNumber/*new*/, byMsgLevel/*new*/, byFeeUserType/*new*/, \ sSPID/*new*/, sFeeType/*new*/, sFeeAddr/*new*/, sFeeCode/*new*/, \ byUserNum/*new*/, sDestAddrs/*new*/, &SM_ID,&FCS); } else if(p->m_protocol == 6) // SMGP { iRet = SubmitAExExEx(OrgTON,OrgNPI,sadd,DestTON,DestNPI,dadd,PRI,0,0, bySRR,0,DCS,PID,schedule,expire,default_id, UDHI, UDLen, (LPCSTR)ud, \ (LPCSTR)ServiceSubType, byMsgID/*new*/, byPKTotal/*new*/, \ byPKNumber/*new*/, byMsgLevel/*new*/, byFeeUserType/*new*/, sSPID/*new*/, sFeeType/*new*/, sFeeAddr/*new*/, sFeeCode/*new*/, \ byUserNum/*new*/, sDestAddrs/*new*/, &SM_ID,&FCS, sSmgpMsgID, \ msgtype, sFixedFee); } else { //SMPP协议. if((p->m_sServiceType).IsEmpty()) iRet = SubmitA(OrgTON,OrgNPI,sadd,DestTON,DestNPI,dadd,PRI,0,0,\ bySRR,0,DCS,PID,schedule,expire,default_id, UDHI, UDLen, \ (LPCSTR)ud,&SM_ID,&FCS); else iRet= SubmitAEx(OrgTON,OrgNPI,sadd,DestTON,DestNPI,dadd,PRI,0,0,\ bySRR,0,DCS,PID, schedule,expire,default_id,UDHI,UDLen, \ (LPCSTR)ud, (LPCSTR)ServiceSubType, &SM_ID,&FCS); } /*int iRet = VPSubmitSM(sadd, dadd, schedule, expire, default_id, (LPCSTR)ud, &SM_ID);*/ if (iRet != E_SUCCESS) { char errstr[200]; if (GetErrorString(iRet, 200, errstr) > 0) ::MessageBox(NULL,errstr,"Submit Error Info", MB_OK| \ MB_ICONINFORMATION); delete ud; return 0; }; str.Format("submit success.\n" " SM ID :%u,\n"" FCS :%u.", SM_ID, FCS); ::MessageBox(NULL,str, "Submit Info", MB_OK|MB_ICONINFORMATION); delete ud; 附加说明VPSubmitSM: int WINAPI VPSubmitSM(LPCTSTR OrgAddr, LPCTSTR DestAddr, LPCTSTR Schedule, LPCTSTR Expire,unsigned long Default_ID, LPCTSTR UserData, unsigned long* SM_ID) 此函数一般为SCE流程所调用,通过配置smeidll,ini 的[VP] 段 可以实现自动连接. 具体连接的配置请参考 smeidll.ini 的配置说明. 调用此函数时Schedul, Expire 配置格式在smeidll V100R001.2D9 for USSD版本之前的格式是 YYYYMMDDhh:mm:ss; 在这之后格式和前面一样统一为yyyy/mm/dd hh:mm:ss. 4. QuerySMStatusA 【函数功能】 此函数用于SMPP协议. 此函数用于查询一条短消息的状态和除短消息内容之外的其他参数.查询是通过短消息ID,短消息ID是SMSC返回的短消息的一个句柄.SubmitSM函数返回提交短消息的ID,通过函数QuerySMS也可以查到短消息ID. 【预置条件】 成功调用IFInitInterface 成功调用Login_R 调用前有提交了的消息. 【函数原型】 int WINAPI QuerySMStatusA(unsigned long SM_ID, unsigned char OrgTON, unsigned char OrgNPI, LPCSTR OrgAddr, unsigned char* DestTON, unsigned char* DestNPI, LPTSTR DestAddr, LPTSTR Final_date, unsigned char* SM_Status, unsigned char* Error_Code); 【参数说明】 输入参数: SM_ID 类型:unsigned long 意义:短消息ID OrgTON 类型:unsigned char 意义:源地址号码类型 OrgNPI 类型:unsigned char 意义:源地址编码方案 OrgAddr 类型:LPTSTR 最大长度为20的字符串(不包括'\0'结束符). 意义:源地址 以上这些参数在查询时必须提供. 输出参数: DestTON 类型:unsigned char* 意义:返回目标地址号码类型 DestNPI 类型:unsigned char* 意义:返回目标地址编码方案 DestAddr 类型:LPTSTR 返回最大长度为20的字符串(不包括'\0'结束符). 意义:目标地址 Final_Data 类型:LPTSTR 返回长度为19的字符串(不包括'\0'结束符). 意义:如果短消息生存期已结束,则是最后发送时间 ;如果短消 息还处在等待状态,则是查询时间. SM_Status 类型:unsigned char* 意义:返回短消息的状态 取值 意义 0 等待发送 1 发送成功 2 发送失败 3 上次提交失败,等待再次下发 4 定时时间未到,等待发送 5 正在发送 手机不可寻址,等待发送 如果在SMEIDLL的配置文件中设置了ErrorAccordant=1.则返回的短消息状态的定义如下.这个状态值是符合国标的状态值. 0:转发状态 1:发送成功(不再尝试转发) 2:发送失败(不再尝试转发) 3:因下发失败而等待(继续尝试转发) 4:因定时消息而等待(继续尝试转发) 5:短消息被删除(不再尝试转发) 6:短消息超时删除(不再尝试转发) 7:无效状态(不再尝试转发) 其他:保留 Error_Code 类型:unsigned char* 意义:返回错误代码,0表示 正确,非0表示 出错. 【返回值】 函数返回值定义参见附录. 【调用举例】 unsigned long SM_ID = SubmitSm( unsigned char OrgTON, OrgNPI; char OrgAddr[30]; unsigned char DestTON, DestNPI; char DestAddr[30]; char Final_date[30]; unsigned char SM_Status; unsigned char Error_Code; int iRet; iRet = QuerySMStatus(SM_ID, &OrgTON, &OrgNPI, (LPCSTR)OrgAddr, &DestTON, &DestNPI,(LPCSTR)DestAddr, (LPCSTR)Final_date, &SM_Status, &Error_Code); if (iRet != 0) AfxMessageBox("error."); 5. CancelSMA 【函数功能】 此函数仅适用于SMPP,删除尚未下发的短讯. 【预置条件】 成功调用IFInitInterface 成功调用Login_R 调用前有提交了的消息. 【函数原型】 int WINAPI CancelSMA(char cService_type, unsigned long SM_ID, unsigned char OrgTON, unsigned char OrgNPI, LPCSTR OrgAddr, unsigned char DestTON, unsigned char DestNPI, LPCSTR DestAddr); 【参数说明】 cService_type 类型:char 意义:保留 SM_ID 类型:unsigned long 意义;短消息ID OrgTON 类型:unsigned char 意义:源地址号码类型 OrgNPI 类型:unsigned char 意义:源地址编码方案 OrgAddr 类型:LPTSTR 最大长度为20的字符串(不包括'\0'结束符). 意义:源地址 DestTON 类型:unsigned char 意义:目标地址号码类型 DestNPI 类型:unsigned char 意义:目标地址编码方案 DestAddr 类型:LPCSTR 最大长度为20的字符串(不包括'\0'结束符). 意义:目标地址 【返回值】 函数返回值定义参见附录. 【函数说明】 此函数用于删除尚未发送成功,等待发送的短消息.如果该短消息已经结束生命期则不能被删除,或者短消息的源地址和目的地址不正确. 6. CancelCmppSM 【函数功能】 此函数仅适用于CMPP,删除在infoX保存的尚未下发的短讯,应用此函数时要保证infoX信息平台启用了存储转发功能,建议最好不要用. 【预置条件】 成功调用IFInitInterface; 成功调用Login_R; 调用前有提交了的消息. 【函数原型】 int WINAPI CancelCmppSM(char* byMsgID, unsigned char* byRet); 【参数说明】 byMsgID 类型:char型指针. 意义:消息的ID,信息标识(SP想要删除的信息标识). byRet 类型:char指针. 意义:成功标识 0:成功;1:失败 【返回值】 函数返回值定义参见附录. 【函数说明】 此函数用于删除尚未发送成功,等待发送的短消息.如果该短消息已经结束生命期则不能被删除.注意此消息只有在infoX启动了存储转发功能后才能起作用. 【调用举例】 unsigned char byMsgID[8]; memset(byMsgID, 0, 8); byMsgID[0] = 0x01; byMsgID[1] = 0x00; byMsgID[2] = 0xF3; byMsgID[3] = 0x02; byMsgID[4] = 0x40; byMsgID[5] = 0x15; byMsgID[6] = 0xC1; byMsgID[7] = 0x86 ; BYTE byRet = 1; CancelCmppSM((char*)byMsgID, &byRet); if(byRet == 0) AfxMessageBox("删除成功!"); else AfxMessageBox("删除失败!"); 7. HasDeliverMessage 【函数功能】 检查接口有无下发消息 【预置条件】 成功调用IFInitInterface 成功调用Login_R 【函数原型】 int WINAPI HasDeliverMessage(DWORD dwTimeOut); 【参数说明】 dwTimeOut 类型:DWORD 意义:等待时间,单位毫秒. 【返回值】 函数返回值定义参见附录. 【函数说明】 该函数用于查询有无下发到接口的短消息.在等待时间内如果有消息,则返回0.如果没有,则返回非0. 【调用举例】 if (HasDeliverMessage(500) != 0) AfxMessageBox("No Deliver SM!"); 8. GetDeliverSMEx 【函数功能】 读取下发的短讯内容 用于SMPP. 【预置条件】 成功调用IFInitInterface 成功调用Login_R 【函数原型】 int WINAPI GetDeliverSMEx(ULONG* sm_ID, unsigned char* DestTON, unsigned char* DestNPI, char* DestAddr, unsigned char* OrgTON, unsigned char* OrgNPI, char* OrgAddr, unsigned char* PRI, unsigned char* RP, unsigned char* UDHI, unsigned char* PID, unsigned char* DCS, char* TimeStamp, unsigned long * UDLen, char* UserData); 【参数说明】 Sm_ID 类型:ULONG* 意义:返回短消息的ID DestTON 类型:unsigned char* 意义:返回目标地址号码类型 DestNPI 类型:unsigned char* 意义;返回目标地址编码方案 DestAddr 类型:char* 返回最大长度为20的字符串(不包括'\0'结束符). 意义:目标地址 OrgTON 类型:unsigned char* 说明:返回源地址号码类型 OrgNPI 类型:unsigned char* 说明:返回源地址编码方案 OrgAddr 类型:char* 返回最大长度为20的字符串(不包括'\0'结束符). 说明:源地址 PRI 类型:unsigned char* 说明:返回优先级 RP 类型:unsigned char* 说明:返回回应路径 UDHI 类型:unsigned char* 说明:返回头结构指示 PID 类型:unsigned char* 说明:返回协议标志 DCS 类型:unsigned char* 说明:返回编码方案 TimeStamp 类型:char* 返回最大长度为19的字符串(不包括'\0'结束符). 说明:提交时间 UDLen 类型:ULONG* 意义:返回短消息的UDL UserData 类型:char* 返回最大长度为140字节的字符串(不包括'\0'结束符 ). 说明:正文 【返回值】 函数返回值定义参见附录. 【函数说明】 该函数用于获得短消息中心或短消息网关(infoX信心平台)下发到接口的Deliver消息 Deliver消息的各项由参数给出.Deliver消息的回包由接口完成,在调用此函数成功后,接口自动返回应答消息包. 参数DestAddr和OrgAddr是接收返回地址的缓冲区,大小不应小于21字节.参数TimeStamp是接收提交时间的缓冲区,大小不应小于20字节.参数UserData是接收返回正文的缓冲区,大小不应小于141字节.参数DCS中指示的是发送到接口的数据的编码方案.参数UDHI返回UserData是否有头结构,为1表示UserData中的数据是编码后的数据.如果为0表示 UserData是解码后的正常的ASCII字符串或者多字节字符串或者8比特字符流.这是有DCS决定的.参数UDLen表示UserData的内容的字符长度. 【调用举例】 9. GetDeliverSMExEx 【函数功能】 读取下发的短讯内容,从此短训内容消息体的StatusRport字段可以判断是否为状态报告,需要698版本(2001/315以后)以上的短消息中心以及信息平台支持,此函数适用于SMPP协议. 【预置条件】 成功调用IFInitInterface 成功调用Login_R 【函数原型】 int WINAPI GetDeliverSMExEx(ULONG* sm_ID, unsigned char* DestTON, unsigned char* DestNPI, char* DestAddr, unsigned char* OrgTON, unsigned char* OrgNPI, char* OrgAddr, unsigned char* PRI, unsigned char* RP, unsigned char* UDHI, unsigned char* PID, unsigned char* DCS, char* TimeStamp, unsigned long * UDLen, char* UserData, unsigned char* StatusReport); 【参数说明】 Sm_ID 类型:ULONG* 意义:返回短消息的ID DestTON 类型:unsigned char* 意义:返回目标地址号码类型 DestNPI 类型:unsigned char* 意义;返回目标地址编码方案 DestAddr 类型:char* 返回最大长度为20的字符串(不包括'\0'字符). 意义:目标地址 OrgTON 类型:unsigned char* 说明:返回源地址号码类型 OrgNPI 类型:unsigned char* 说明:返回源地址编码方案 OrgAddr 类型:char* 返回最大长度为20的字符串(不包括'\0'结束符). 说明:源地址 PRI 类型:unsigned char* 说明:返回优先级 RP 类型:unsigned char* 说明:返回回应路径 UDHI 类型:unsigned char* 说明:返回头结构指示 PID 类型:unsigned char* 说明:返回协议标志 DCS 类型:unsigned char* 说明:返回编码方案 TimeStamp 类型:char* 返回最大长度为19的字符串(不包括'\0'结束符). 说明:提交时间 UDLen 类型:ULONG* 意义:返回短消息的UDL UserData 类型:char* 返回最大长度为140字节的字符串(不包括'\0'结束符 ). 说明:正文 StatusReport 类型:unsigned char* 返回:状态报告标志,0表示不是状态报告,1:表示为状态报告 【返回值】 函数返回值定义参见附录4. 【函数说明】 该函数用于获得短消息中心下发到接口的Deliver消息 .Deliver消息的各项由 参数给出.Deliver消息的回包由接口完成,在调用此函数成功后,接口自动回包. 参数DestAddr和OrgAddr是接收返回地址的缓冲区,大小不应小于21字节.参数 TimeStamp是接收提交时间的缓冲区,大小不应小于20字节.参数UserData是接收返回正文的缓冲区,大小不应小于141字节. 参数DCS中指示的是发送到接口的数据的编码方案. 参数UDHI返回UserData是否有头结构,为1表示UserData中的数据是编码后的数据.如果为0表示UserData是解码后的正常的ASCII字符串或者多字节字符串或者8比特字符流.这是有DCS决定的. 参数UDLen表示UserData的内容的字符长度. 【调用举例】 ULONG ulsm_ID; unsigned char byDestTON, byDestNPI, byOrgTON, byOrgNPI, byPRI, byPID, \ byDCS; char sDestAddr[MAX_ADDR_LEN]; memset(sDestAddr, 0, MAX_ADDR_LEN); char sOrgAddr[MAX_ADDR_LEN]; memset(sOrgAddr, 0, MAX_ADDR_LEN); char sTimeStamp[MAX_TIMESTAMP_LEN]; memset(sTimeStamp, 0, MAX_TIMESTAMP_LEN); char sUserData[MAX_UD_LEN]; memset(sUserData, 0, MAX_UD_LEN); int iRet; unsigned char byRP; unsigned char byUDHI; unsigned long ulUDLen; unsigned char byStatusReport = 0; iRet = GetDeliverSMExEx(&ulsm_ID, &byDestTON, &byDestNPI, sDestAddr, &byOrgTON,&byOrgNPI, sOrgAddr, &byPRI, &byRP, &byUDHI, &byPID, &byDCS,sTimeStamp, &ulUDLen, sUserData, &byStatusReport); if(iRet == 0) { CString sGetData; sGetData.Format("接收成功!\n接受到数据:%s", sUserData); MessageBox(sGetData,MB_OK,0); } else MessageBox("接收失败!",MB_OK,0); 10. GetDeliverSMExExEx 【函数功能】 读取下发的短讯内容,并且能确认此消息是否为状态报告,用于CMPP协议中,SP需要短消息网关网关返回状态报告的内容.需要698及以上的短消息中心以及信息平台支持. 【预置条件】 成功调用IFInitInterface 成功调用Login_R 【函数原型】 int WINAPI GetDeliverSMExExEx(ULONG* sm_ID, unsigned char* DestTON, unsigned char* DestNPI, char* DestAddr, unsigned char* OrgTON, unsigned char* OrgNPI, char* OrgAddr, unsigned char* PRI, unsigned char* RP, unsigned char* UDHI, unsigned char* PID, unsigned char* DCS, char* TimeStamp, unsigned long * UDLen, char* UserData, unsigned char* StatusReport,unsigned char* sMsgID, char* sSubmitdate, char* sDonedate, char* sStatus,int iDeliverAckResult); 【参数说明】 Sm_ID 类型:ULONG* 意义:返回短消息的ID DestTON 类型:unsigned char* 意义:返回目标地址号码类型 DestNPI 类型:unsigned char* 意义;返回目标地址编码方案 DestAddr 类型:char* 返回最大长度为20的字符串(不包括'\0'结束符). 意义:目标地址 OrgTON 类型:unsigned char* 说明:返回源地址号码类型 OrgNPI 类型:unsigned char* 说明:返回源地址编码方案 OrgAddr 类型:char* 返回最大长度为20的字符串(不包括'\0'结束符). 说明:源地址 PRI 类型:unsigned char* 说明:返回优先级 RP 类型:unsigned char* 说明:返回回应路径 UDHI 类型:unsigned char* 说明:返回头结构指示 PID 类型:unsigned char* 说明:返回协议标志 DCS 类型:unsigned char* 说明:返回编码方案 TimeStamp 类型:char* 返回最大长度为19的字符串(不包括'\0'结束符). 说明:提交时间 UDLen 类型:ULONG* 意义:返回短消息的UDL UserData 类型:char* 返回最大长度为140字节的字符串(不包括'\0'结束符). 说明:正文(为状态报告时无意义) StatusReport 类型:unsigned char* 返回:状态报告标志,0:表示不是状态报告, 1:表示为状态报告 sMsgID 类型:unsigned char*返回22字节的字符串, 此消息为状态报告时此字段才有意义. 说明:可通过此字段去匹配相应的Submit消息 sSubmitdate 类型:char* 返回: 提交时间. 说明:10字节的提交时间格式 YYMMDDHHMM(YY为年的后两位00- 99,MM:01-12,DD:01-31,HH:00-23,MM:00-59) sDonedate 类型:char* 返回:下发时间. 说明:10字节的消息下发时间格式YYMMDDHHMM(同上面的sSubmitdata) sStatus 类型:char* 返回:处理状态. 说明:7字节的字符串, SP根据该字段确定CMPP_SUBMIT消息的 处理状态.具体值的意义见下表. Message State Final Message States Description DELIVERED DELIVRD Message is delivered to destination EXPIRED EXPIRED Message validity period has Expired DELETED DELETED Message has been deleted. UNDELIVERABLE UNDELIV Message is undeliverable ACCEPTED ACCEPTD Message is in accepted state(i.e. has been manually read on behalf of the subscriber by customer service) UNKNOWN UNKNOWN Message is in invalid state REJECTED REJECTD Message is in a rejected state iDeliverAckResult 类型: int 说明:0表示返回成功应答,其余表示失败应答. 【返回值】 函数返回值定义参见附录. 【函数说明】 和GetDeliverSmExEx相同 【调用举例】 ULONG ulsm_ID; unsigned char byDestTON, byDestNPI, byOrgTON, byOrgNPI, byPRI, byPID, \ byDCS; char sDestAddr[MAX_ADDR_LEN]; memset(sDestAddr, 0, MAX_ADDR_LEN); char sOrgAddr[MAX_ADDR_LEN]; memset(sOrgAddr, 0, MAX_ADDR_LEN); char sTimeStamp[MAX_TIMESTAMP_LEN]; memset(sTimeStamp, 0, MAX_TIMESTAMP_LEN); char sUserData[MAX_UD_LEN]; memset(sUserData, 0, MAX_UD_LEN); unsigned char MsgID[23]; memset(MsgID, 0, 23); char sSubmitdate[MAX_SUBMIT_TIME_LEN+1]; memset(sSubmitdate, 0, MAX_SUBMIT_TIME_LEN+1); char sDonedate[MAX_DONE_TIME_LEN+1]; memset(sDonedate, 0, MAX_DONE_TIME_LEN+1); char sStatus[MAX_STATE_LEN+1]; memset(sStatus, 0, MAX_STATE_LEN+1); int iRet; unsigned char byRP; unsigned char byUDHI; unsigned long ulUDLen; unsigned char byStatusReport = 0; iRet = GetDeliverSMExEx(&ulsm_ID, &byDestTON, &byDestNPI, sDestAddr, &byOrgTON,&byOrgNPI, sOrgAddr, &byPRI, &byRP, &byUDHI, &byPID, &byDCS,sTimeStamp, &ulUDLen, sUserData, &byStatusReport, MsgID, sSubmitdate, sDonedate, sStatus); if(iRet == 0) { CString sGetData; sGetData.Format("接收成功!\n接受到数据:%s", sUserData); CString str; str.Format("接收到Deliver消息\n" "源地址 = %s\n" "目标地址 = %s\n" "TimeStamp = %s\n" "正文 = %s\n" "状态报告标志 = %d\n" "MsgID = %s\n" "Submit date = %s\n" "done date = %s\n" "stat = %s", sOrgAddr, sDestAddr, sTimeStamp, sUserData, StatusReport, MsgID, sSubmitdate, sDonedate, sStatus); MessageBox(str,MB_OK,0); } else MessageBox("接收失败!",MB_OK,0); 以下为固网网关API部分 11.InitSMGPAPI 【函数功能】 初始化接口及配置,专门用于SMGP协议. 【预置条件】 需要配置Smgpc.ini 【函数原型】 int WINAPI InitSMGPAPI(char* SiniFile/*配置文件路径*/); 【返回值】 0:成功、1:失败 【函数说明】 无需调用IFInitInterface 及Login_R,调用此函数可直接登录,并从指定的配置文件中读取相应的配置. 12.SMGPSendSingle 【函数功能】 单条发送消息,专门用于SMGP协议. 【预置条件】 InitSMGPAPI成功 【函数原型】 int WINAPI SMGPSendSingle(int NneedReply/*是否需要状态报告*/, int NMsgLever/*短消息优先级*/, char* SserviceID/*服务类型*/ , int NMsgFormat/*短信编码方式*/, char* SfeeType/*计费类型*/, char* SfeeCode/*计费代码*/, char* SvalidTime/*短信有效时间*/, char* SatTime/*定时发送时间*/, char* SchargeTermID/*计费号码*/, char* SdestTermID/*目的地址号码*/, char* SreplyPath/*源地址*/, int NMsgLen/*消息长度*/, char* SMsgContent/*消息内容*/, char* SmsgID/*短讯中心的sm_ID*/, int &NerrorCode/*错误码*/); 【返回值】 0:成功、1:失败 【函数说明】 调用此函数无需等待应答消息,此函数可自己实现等待应答消息并得到错误码以及短消息中心分配的SmsgID,并且此函数可自动对短讯内容进行分包处理 13.SMGPSendBatch 【函数功能】 群发消息,专门用于SMGP协议. 【预置条件】 InitSMGPAPI成功 【函数原型】 int WINAPI SMGPSendBatch(int NneedReply/*是否需要状态报告*/, int NMsgLever/*短消息优先级*/, char* SserviceID/*服务类型*/, int NMsgFormat/*短信编码方式*/, char* SfeeType/*计费类型*/, char* SfeeCode/*计费代码*/, char* SvalidTime/*短信有效时间*/, char* SatTime/*定时发送时间*/, char* SchargeTermID/*计费号码*/, char* SdestTermIDFile/*地址文件名*/, char* SMsgFile/*消息内容文件名*/, char* SmsgIDFile/*MsgID文件名*/); 【返回值】 0:成功、1:失败 【函数说明】 调用此函数无需等待应答消息,此函数可自己实现等待应答消息并得到错误码以及短消息中心分配的SmsgID,并且此函数可自动对短讯内容进行分包处理,能发送给多个目的地址,最大支持100个. 14.GetSendBatchResp 【函数功能】 从相应文件中读取群发消息所得到的应答消息的相应内容,专门用于SMGP协议. 【预置条件】 需要有相应的MsgID的二进制文件 【函数原型】 int WINAPI GetSendBatchResp(char* SmsgIDFile/*MsgID文件名*/, int Npos/*MsgID在文件中的位置*/, SendBatchResp* PsendBatchResp/*Msgid在文件中存放的消息结构*/); 【返回值】 0:成功、1:失败 【函数说明】 MsgID在文件中的结构定义在MsgStructuredef.h头文件中 15.SMGPDeliver 【函数功能】 接收SMGP的Deliver消息,包含状态报告.用于SMGP协议. 【预置条件】 需要有Deliver消息发向SP 【函数原型】 int WINAPI SMGPDeliver(int Ntimeout/*超时时间*/, DeliverResp* PdeliverResp/*deliver消息结构*/); 【返回值】 0:成功、1:失败 【函数说明】 此结构体具体定义参见固网协议 int WINAPI CMMPActiveTest(int &NerrorCode/*错误码*/); 新补充的API函数: 16.CMPPDeliver函数 【函数功能】 发送Cmpp协议的Deliver消息. 门户系统专用,一般的SP不能调用词函数发送消息.这里不说明. 17. CMPP3Submit 【函数功能】 向指定的地址发送短讯. 【预置条件】 成功调用IFInitInterface. 成功调用Login_R. 【函数原型】 int WINAPI CMPP3Submit(unsigned char byPKTotal, unsigned char byPKNumber, unsigned char SRR, unsigned char byMsglevel, LPCTSTR ServiceSubType, unsigned char byFeeUserType, LPCTSTR sFeeAddr, unsigned char byFeeTerminalType, unsigned char PID, unsigned long Default_ID, unsigned char UDHI, unsigned char DCS, LPCTSTR sSPID, LPCTSTR sFeeType, LPCTSTR sFeeCode, LPCTSTR Schedule, LPCTSTR Expire, LPCTSTR OrgAddr, unsigned char byUserNum, LPCTSTR sDestAddrs, LPCTSTR DestAddr, unsigned char byDestTerminalType, unsigned long UDLen, LPCTSTR UserData, LPCTSTR sLinkID, unsigned char* byMsgID) 注:CMPP3Submit适用于CMPP3.0协议(移动). 【参数说明】 输入参数: byPKTotal 类型:unsigned char 意义:相同Msg_id的消息总条数,从1开始. byPKNumber 类型:unsigned char 意义:相同Msg_id的消息序号,从1开始. SRR 类型:unsigned char 意义:状态报告,保留,设置为0;需要状态报告时,设置为1. byMsglevel 类型:unsigned char 意义:信息级别,缺省为0. ServiceSubType 类型:LPCSTR 意义:业务类型,缺省值为NULL. byFeeUserType 类型:unsigned char 意义:计费用户类型字段: 0:对目的终端MSISDN计费; 1:对源终端MSISDN计费; 2:对SP计费; 3:表示本字段无效 注意对于SP来说此字段如果 填"1"则将导致计费失败. sFeeAddr 类型:LPCSTR,长度为20个ASCII的字符串 意义:被计费用户的号码(如本字节填空,则表示本字段无效,对 谁计费参见byFeeUserType字段.本字段与byFeeUserType字段互斥) byFeeTerminalType 类型:unsigned char 意义:计费用户号码类型: 0:真实号码 1:伪码 PID 类型:unsigned char 意义:GSM协议类型,缺省为0. Default_ID 类型:unsigned long 意义:缺省短消息的信息码,缺省为0. 注意:国标定义的缺省短消息的个数为100条. UDHI 类型:unsigned char. 意义:用于长短消息,表示UserData是否是结构 取值 意义 0 UD是正常字符串 1 UD是结构 DCS 类型:unsigned char 意义:数据编码方案 取值 意义 0 缺省编码方案(7位) 4 二进制编码方案 8 UCS2编码方案 15 GBK编码 其他 保留 对于一般的中文短消息应填8或15,对于传送铃声图片一般填4. sSPID 类型:LPCSTR ,6个ASCII字符串 意义:信息内容来源(Src_ID) ,对应CMPP的Msg_src. sFeeType 类型:LPCSTR,2个ASCII字符串 意义:资费类别 01 对"计费用户号码"免费; 02 对"计费用户号码"按条计信息费; 03 对"计费用户号码"按包月收取信息费; sFeeCode 类型:LPCSTR,6个ASCII字符串 意义:资费代码,以分为单位. Schedule 类型:LPCSTR 长度为19个ASCII字符的字符串 意义:定时时间 注意:时间格式必须为"yyyy/mm/dd hh:mm:ss".缺省为NULL. 如果使用的不是Smedll的API函数,请视情况而定,时间格式可能为 yymmddhhmmss32+NULL.以下时间的输入格式相同. Expire 类型:LPCSTR 长度为19个ASCII字符的字符串 意义:超时时间 注意:时间格式必须为"yyyy/mm/dd hh:mm:ss".缺省为NULL. OrgAddr 类型:LPCSTR 最大长度为20个ASCII字符 意义:源地址 byUserNum 类型:unsigned char 适用协议:CMPP 意义:接收消息的用户数量 sDestAddrs 类型:LPCSTR,32* byUserNum个ASCII字符串 意义:接收业务的MSISDN号码,最多100个MSISDN号码. byDestTerminalType 类型:unsigned char 意义:目的用户号码类型: 0:真实号码 1:伪码 UDLen 类型:unsigned long 意义:表示UserData的长度,单位是字节.此处不是定长的.UDLen要注意的事项如下,如果对于UDHI设置为1的短消息,则此项表示UserData的字符个数(字符个数和字节个数不同,对于7比特编码格式,字符是7比特的,字节是8比特.其他编码方式则字符的大小和字节的大小相同) UserData 类型;LPCSTR 意义:用户信息,短消息正文.对于正常短消息,该字段的最大长度和编码方式有关,对于7比特编码方式(缺省的编码方式)为160个字符的ASCII字符串,如果为8比特编码方式则为140个8比特字节流,如果为UCS2编码方式,则为70个字符的16比特字符串. 此外对于UDHI设置为1的短消息,表示此字段已经经过编码,所以不论是什么编码方式,此字段的最大长度为140字节. 如果传输是图片铃声则要求UDHI的值为1、DCS值为4.而且对不同的品牌的手机、DCS值可能有变化. MsgID 类型:unsigned char* (输出参数) 适用协议:CMPP 意义:返回ACK应答消息的MsgID. 信息标识,由SP侧短信网关本身产生: 这里得到的MsgID已经将64位(8字节)的整数转化为21字节的字符串. (1)时间(从月精确到分) 0――9位(2)SMC(短讯中心)号码 或网关ID号.10――14位(3)序列号 15――19位 各分段如不能填满,左补零,右对齐 【返回值】 函数返回值定义参见附录. 【函数说明】 此函数封装了SUBMIT_SM协议,实现ESME向信息平台提交短消息.将SUBMIT_SM协议的各项以参数的形式提供. 对于参数编码方案DCS,建议短消息内容为英文ASCII码,可取0.对于中文短消息,DCS必须取8,表示UNICODE,否则会出现乱码.对于图片、铃声此值一般设为4,但是对于不同品牌的手机,此值又有不同. 参数Schedule用于定时短消息,即指定短消息发送的时间,当时间到达指定的时间后,SMSC才会下发. 参数Expire用于指定该提交短消息的生存期,即超时时间.生存期是指当某条短消息在SMSC中存在的时间,当生存期结束后,短消息会被写入数据库中.生存期结束有多种原因,例如:短消息下发成功;短消息一直未下发成功,但超时时间已到;下发时遇永久性失败等.SMSC的缺省时间是48小时,这个时间可设置.用户也可以通过这个参数设置某个短消息的生存期,设置是到达某个时间点失效,具体输入格式请参考上面的说明..设置此值时需注意应用程序所在服务器时间必须和短讯中心时间同步. 参数Default_ID是缺省短消息的代码.国标定义的缺省短消息的个数是100条.对于不同的SMSC,缺省短消息的意义可能不同.如果Default_ID为非零,则参数UDHI,UDLen,UserData被忽略. 参数UDHI表示参数UserData是否有头结构.有头结构表示UserData字段是经过编码的内容;缺省情况下,此项应设成0.对图片、铃声此值应设为1. 参数UDLen表示UserData的长度,表示UserData的字符长度. 参数UserData是需要发送的短消息的内容,根据DCS和UDHI的设置不同可以是ASCII字符串,多字节字符串,二进制字符流. 如果该函数执行的不成功,函数的返回值中定义了详细的出错原因,具体可参见返回值部分的定义. 18. GetCMPP3DeliverSM 【函数功能】 读取下发的短讯内容,从此短训内容消息体的StatusRport字段可以判断是否为状态报告,需要698版本(2001/315以后)以上的短消息中心以及信息平台支持,此函数适用于CMPP3.0协议. 【预置条件】 成功调用IFInitInterface 成功调用Login_R 【函数原型】 int WINAPI GetCMPP3DeliverSM(ULONG* sm_ID, char* DestAddr, char* OrgAddr, unsigned char* bySrcTerminalType, unsigned char* PRI, unsigned char* RP, unsigned char* UDHI, unsigned char* PID, unsigned char* DCS, char* TimeStamp, unsigned long * UDLen, char* UserData, char* sLinkID, unsigned char* StatusReport, unsigned char* sMsgID, char* sSubmitdate, char* sDonedate, char* sStatus, int iDeliverAckResult) 【参数说明】 Sm_ID 类型:ULONG* 意义:返回短消息的ID DestAddr 类型:char* 返回最大长度为20的字符串(不包括'\0'字符). 意义:目标地址 OrgAddr 类型:char* 返回最大长度为20的字符串(不包括'\0'结束符). 说明:源地址 bySrcTerminalType 类型:unsigned char* 说明:源终端号码类型 PRI 类型:unsigned char* 说明:返回优先级 RP 类型:unsigned char* 说明:返回回应路径 UDHI 类型:unsigned char* 说明:返回头结构指示 PID 类型:unsigned char* 说明:返回协议标志 DCS 类型:unsigned char* 说明:返回编码方案 TimeStamp 类型:char* 返回最大长度为19的字符串(不包括'\0'结束符). 说明:提交时间 UDLen 类型:ULONG* 意义:返回短消息的UDL UserData 类型:char* 返回最大长度为140字节的字符串(不包括'\0'结束符 ). 说明:正文 StatusReport 类型:unsigned char* 返回:状态报告标志,0表示不是状态报告,1:表示为状态报告 sMsgID 类型:unsigned char*返回22字节的字符串, 此消息为状态报告时此字段才有意义. 说明:可通过此字段去匹配相应的Submit消息 sSubmitdate 类型:char* 返回: 提交时间. 说明:10字节的提交时间格式 YYMMDDHHMM(YY为年的后两位00- 99,MM:01-12,DD:01-31,HH:00-23,MM:00-59) sDonedate 类型:char* 返回:下发时间. 说明:10字节的消息下发时间格式YYMMDDHHMM(同上面的sSubmitdata) sStatus 类型:char* 返回:处理状态. 说明:7字节的字符串, SP根据该字段确定CMPP_SUBMIT消息的 iDeliverAckResult 类型:int 该参数为输入参数,为回送DeliverResp中的错误码,缺省为0 【返回值】 函数返回值定义参见附录4. 【函数说明】 该函数用于网关下发到接口的Deliver消息 .Deliver消息的各项由 参数给出.Deliver消息的回包由接口完成,在调用此函数成功后,接口自动回包. 参数DestAddr和OrgAddr是接收返回地址的缓冲区,DestAddr大小不应小于21字节,OrgAddr大小不应小于32字节.参数TimeStamp是接收提交时间的缓冲区,大小不应小于20字节.参数UserData是接收返回正文的缓冲区,大小不应小于160字节. 参数DCS中指示的是发送到接口的数据的编码方案. 参数UDHI返回UserData是否有头结构,为1表示UserData中的数据是编码后的数据.如果为0表示UserData是解码后的正常的ASCII字符串或者多字节字符串或者8比特字符流.这是有DCS决定的. 参数UDLen表示UserData的内容的字符长度. 19. CNGPSubmit 【函数功能】 向指定的地址发送短讯. 【预置条件】 成功调用IFInitInterface. 成功调用Login_R. 【函数原型】 int WINAPI CNGPSubmit(LPCTSTR sSPID, unsigned char bySubType, unsigned char byNeedReport, unsigned char byPriority, LPCTSTR sService, LPCTSTR sFeeType, unsigned char byFeeUserType, LPCTSTR sFeeCode, unsigned char byMsgFormat, LPCTSTR sValidTime, LPCTSTR sAtTime, LPCTSTR sOrgAddr, LPCTSTR sChargeAddr, unsigned char byUserNum, LPCTSTR sDestAddrs, unsigned char byMsgLen, LPCTSTR sMsgContent, unsigned char byProValue,unsigned char* byMsgID) 注: CNGPSubmit适用于CNGP协议(网通). 【参数说明】 参数 类型 意义 sSPID LPCTSTR,长度为10 SP的企业代码 bySubType unsigned char 短消息子类型(0=取消订阅,1=订阅或点播请求,2=点播下发,3=订阅下发,其他保留) byNeedReport unsigned char 是否要求返回状态报告:(0=不要求,1=要求) byPriority unsigned char 发送优先级(从0到3)3为最高级 sService LPCTSTR,长度为10 业务类型,缺省值为NULL. sFeeType LPCTSTR,长度2 资费类型 00=免费 01=按条收费 02=包月 03=封顶 04=包月扣费请求 05=CR话单 其他:保留 byFeeUserType unsigned char 计费用户类型字段 0:对目的终端计费 1:对源终端计费 2:对SP计费 3:按照计费用户号码计费 其他保留 注意对于SP来说此字段如果 填"1"则将导致计费失败. sFeeCode LPCTSTR,长度为6 每条短消息的信息费,单位:分byMsgFormat unsigned char 短消息格式 0:ASCII编码 3:保留 4:二进制短消息 8:UCS2 15:GB2312编码 建议值为15 sValidTime LPCTSTR,长度17 有效时间,(格式:" YYYY/MM/DD HH:MM:SS"yyyymmddhhmmss) ) sAtTime LPCTSTR,长度17 定时发送时间,(格式:"YYYY/MM/DD HH:MM:SS"yyyymmddhhmmss) sOrgAddr LPCTSTR长度为20个ASCII的字符串 短消息发送用户号码 sChargeAddr LPCTSTR长度为20个ASCII的字符串 计费用户号码 byUserNum unsigned char 短消息接收号码总数(≤100) sDestAddr LPCTSTR长度为20个ASCII的字符串 短消息接收号码(连续存储DestTermIDCount个号码) byMsgLen unsigned char 短消息长度 sMsgContent LPCTSTR,最大长度为254 短消息内容 byProValu unsigned char 协议标识,缺省为1 byMsgID(输出) unsigned char *, 长度10 SMGW产生的短消息流水号,由三部分组成: SMGW代码:3字节(BCD码) 时间:4字节(BCD码) 序列号:3字节(BCD码).用于状态报告的匹配 各分段如不能填满,左补零,右对齐 【返回值】 函数返回值定义参见附录. 【函数说明】 此函数封装了SUBMIT_SM协议,实现SP向短信网关提交短消息.将SUBMIT_SM协议的各项以参数的形式提供. 对于参数编码方案DCS,建议对于图片、铃声此值一般设为4,但是对于不同品牌的手机,此值又有不同,其他情况取值15. 参数sAtTime用于定时短消息,即指定短消息发送的时间,当时间到达指定的时间后,SMSC才会下发. 参数sValidTime用于指定该提交短消息的生存期,即超时时间.生存期是指当某条短消息在SMSC中存在的时间,当生存期结束后,短消息会被写入数据库中.生存期结束有多种原因,例如:短消息下发成功;短消息一直未下发成功,但超时时间已到;下发时遇永久性失败等.SMSC的缺省时间是48小时,这个时间可设置.用户也可以通过这个参数设置某个短消息的生存期,设置是到达某个时间点失效,具体输入格式请参考上面的说明..设置此值时需注意应用程序所在服务器时间必须和短讯中心时间同步. 注意:此函数中sAtTime和sValidTime参数的输入格式为"YYYY/MM/DD HH:MM:SS". 但是在CNGP submit_SM协议发送时,目前只支持CNGP v2.0中格式,如果需要支持CNGPv1.0,请使用20040331以前支持CNGP协议的SMEIDLL 如果该函数执行的不成功,函数的返回值中定义了详细的出错原因,具体可参见返回值部分的定义. 2018. GetCNGPDeliverSM 【函数功能】 读取下发的短讯内容,从此短训内容消息体的StatusRport字段可以判断是否为状态报告,需要(V100R001.3DD101以后)以上的短消息中心以及信息平台支持,此函数适用于CNGP协议. 【预置条件】 成功调用IFInitInterface 成功调用Login_R 【函数原型】 int WINAPI GetCNGPDeliverSM(char* sMsgID, unsigned char* byMsgFormat, char* sRecvTime, char* sOrgAddr, char* sDestAddr, unsigned char* byMsgLen, char* sMsgContent, unsigned char* byProValue,unsigned char* byIsReport, char* sSrcMsgID, char* sSubmitdate, char*sDonedate, char* sStatus, int iDeliverAckResult) 【参数说明】 sMsgID 类型:char* 返回最大长度为10的BCD码流 意义:返回短消息的MsgID byMsgFormat 类型:unsigned char* 说明:返回编码方案 sRecvTime 类型:char* 返回最大长度为14的字符串(不包括'\0'结束符). 说明:接收时间 sOrgAddr 类型:char* 返回最大长度为20的字符串(不包括'\0'结束符). 说明:源地址 sDestAddr 类型:char* 返回最大长度为20的字符串(不包括'\0'字符). 意义:目标地址 byMsgLen 类型:unsigned char* 意义:返回短消息的长度 sMsgContent 类型:char* 返回最大长度为254字节的字符串(不包括'\0'结束符 ). 说明:短消息内容 byProValue 类型:unsigned char* 意义:协议标识 byIsReport 类型:unsigned char* 返回:状态报告标志, 0表示不是状态报告,1:表示为状态报告 sSrcMsgID 类型:unsigned char*返回10字节的BCD码流, 此消息为状态报告时此字段才有意义. 说明:可通过此字段去匹配相应的Submit消息 sSubmitdate 类型:char* 返回: 提交时间. 说明:10字节的提交时间格式 YYMMDDHHMM(YY为年的后两位00- 99,MM:01-12,DD:01-31,HH:00-23,MM:00-59) sDonedate 类型:char* 返回:下发时间. 说明:10字节的消息下发时间格式YYMMDDHHMM(同上面的sSubmitdata) sStatus 类型:char* 返回:处理状态. 说明:7字节的字符串, SP根据该字段确定CMPP_SUBMIT消息的发送结果 iDeliverAckResult 类型:int 该参数为输入参数,为回送DeliverResp中的错误码,缺省为0 【返回值】 函数返回值定义参见附录4. 【函数说明】 该函数用于网关下发到接口的Deliver消息 .Deliver消息的各项由参数给出.Deliver消息的回包由接口完成,在调用此函数成功后,接口自动回包. 参数DestAddr和OrgAddr是接收返回地址的缓冲区,大小不应小于21字节.参数sRecvTime是接收提交时间的缓冲区,大小不应小于14字节.参数UserData是接收返回正文的缓冲区,大小不应小于254字节. 21. SgipSubmitSm 【函数功能】 发送基于SGIP协议的Submit短讯. 【预置条件】 成功调用IFInitInterface. 成功调用Login_R. 【函数原型】 int WINAPI SgipSubmitSM(LPCTSTR sSPNumber, LPCTSTR sChargeNumber, unsigned char byUserCount,LPCTSTR sUserNumber, LPCTSTR sCorpID, LPCTSTR sServiceType, unsigned char byFeeType,LPCTSTR sFeeValue, LPCTSTR sGivenValue, unsigned char byAgentFlag, unsigned char byCauseMTFlag, unsigned char byPriority, LPCTSTR sExpireTime, LPCTSTR sScheduleTime, unsigned char byReportFlag, unsigned char byPID, unsigned char byUDHI, unsigned char byMsgCoding, unsigned char byMsgType,unsigned long ulMsgLen, LPCTSTR sMsgContent, char* sReserve,unsigned char &byResult) 注: SgipSubmitSm适用于SGIP协议(联通). 【参数说明】 字段 长度(字节) 类型 说明 sSPNumber 21 Text SP的接入号码 sChargeNumber 21 Text 付费号码,手机号码前加"86"国别标志;当且仅当群发且对用户收费时为空;如果为空,则该条短消息产生的费用由UserNumber代表的用户支付;如果为全零字符串"000000000000000000000",表示该条短消息产生的费用由SP支付. byUserCount 1 Integer 接收短消息的手机数量,取值范围1至100 sUserNumber 21 Text 接收该短消息的手机号,该字段重复UserCount指定的次数,手机号码前加"86"国别标志 sCorpId 5 Text 企业代码,取值范围0-99999 sServiceType 10 Text 业务代码,由SP定义 byFeeType 1 Integer 计费类型 sFeeValue 6 Text 取值范围0-99999,该条短消息的收费值,单位为分,由SP定义 对于包月制收费的用户,该值为月租费的值 sGivenValue 6 Text 取值范围0-99999,赠送用户的话费,单位为分,由SP定义,特指由SP向用户发送广告时的赠送话费 byAgentFlag 1 Integer 代收费标志,0:应收;1:实收 byCauseMTFlag 1 Integer 引起MT消息的原因 0-MO点播引起的第一条MT消息; 1-MO点播引起的非第一条MT消息; 2-非MO点播引起的MT消息; 3-系统反馈引起的MT消息. byPriority 1 Integer 优先级0-9从低到高,默认为0 sExpireTime 16 Text 短消息寿命的终止时间,如果为空,表示使用短消息中心的缺省值.时间内容为16个字符,格式为" YYYY/MM/DD HH:MM:SS" sScheduleTime 16 Text 短消息定时发送的时间,如果为空,表示立刻发送该短消息.时间内容为16个字符,格式为YYYY/MM/DD HH:MM:SS byReportFlag 1 Integer 状态报告标记 0-该条消息只有最后出错时要返回状态报告 1-该条消息无论最后是否成功都要返回状态报告 2-该条消息不需要返回状态报告 3-该条消息仅携带包月计费信息,不下发给用户,要返回状态报告 其它-保留 缺省设置为0 byPID 1 Integer GSM协议类型.详细解释请参考GSM03.40中的9.2.3.9 byUDHI 1 Integer GSM协议类型.详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐 byMsgCoding 1 Integer 短消息的编码格式. 0:纯ASCII字符串 3:写卡操作 4:二进制编码 8:UCS2编码 15: GBK编码 其它参见GSM3.38第4节:SMS Data Coding Scheme byMsgType 1 Integer 信息类型: 0-短消息信息 其它:待定 ulMsgLen 4 Integer 短消息的长度 sMsgContent Message Length Text 短消息的内容 sReserve 8 Text 保留,扩展用 此参数即是输入函数也是输出函数 byResult 1 Interger 此参数是输出参数 Submit 命令是否成功接收 0:接收成功 其他:错误码 【返回值】 如果该函数执行的不成功,函数的返回值中定义了详细的出错原因,具体可参见返回值部分的定义或者附录的说明.如果byResult 返回值的 【函数说明】 此函数封装了SGIP协议的Submit命令,实现SP向短信网关提交短消息.将SUBMIT命令的各项以参数的形式提供. 对于参数编码方案MessageCoding,建议对于图片、铃声此值一般设为4,但是对于不同品牌的手机,此值又有不同,其他情况取值15. 参数sScheduleTime用于指定该提交短消息的生存期,即超时时间.生存期是指当某条短消息在SMSC中存在的时间,当生存期结束后,短消息会被写入数据库中.生存期结束有多种原因,例如:短消息下发成功;短消息一直未下发成功,但超时时间已到;下发时遇永久性失败等.SMSC的缺省时间是48小时,这个时间可设置.用户也可以通过这个参数设置某个短消息的生存期,设置是到达某个时间点失效,具体输入格式请参考上面的说明..设置此值时需注意应用程序所在服务器时间必须和短讯中心时间同步. 注意:此函数中sExpire和sScheduleTime参数的输入格式为"YYYY/MM/DD HH:MM:SS". 20. SgipGetSM 【函数功能】 读取下发的短讯内容,从此短训内容消息体的StatusRport字段可以判断是否为状态报告,需要(V100R001.3DD101以后)以上的短消息中心以及信息平台支持,此函数适用于CNGP协议. 【预置条件】 成功调用IFInitInterface 成功调用Login_R 【函数原型】 int WINAPI SgipGetSM(ULONG* ulCommandID, ULONG* ulNodeNum,ULONG* ulTime, ULONG* ulSequenceID, char* sUserNumber, char* sSPNumber, unsigned char* byPID,unsigned char* byUDHI, unsigned char* byMsgCoding,unsigned long* ulMsgLen, char* sMsgContent, ULONG* ulOrgNodeNum, ULONG* ulOrgTime, ULONG* ulOrgSeqID, unsigned char* byReporttype,unsigned char* byState,unsigned char* byErrCode, unsigned char* byUserCondition,char* sReserve, unsigned char byAckResult) 【参数说明】 字段 长度(字节) 类型 说明 ulCommandID 4 ULong 接收到消息的命令值 十六进制数字, 此值不同表示的消息不一样, 0x00000004 时 表示此消息是Deliver消息 0x00000005 时 表示此消息是Report消息 0x00000011 时 表示此消息是UserRpt消息 ulNodeNum 4 ULong SGIP协议中序列号的第一部分命令源节点编号. ulTime 4 ULong SGIP协议中序列号的第二部分产生的日期和时间. ulSequence 4 ULong SGIP协议中序列号的第三部分由0开始的循环序列号. sUserNumber 21 Text 发送短消息的用户手机号,手机号码前加"86"国别标志. sSPNumber 21 Text 此字段只有在获取到的消息时Deliver,UserRpt消息时才有值,SP的接入号码. byPID 1 Integer 此字段只有在获取到的消息时Deliver消息时才有值 GSM协议类型.详细解释请参考GSM03.40中的9.2.3.9 byUDHI 1 Integer 此字段只有在获取到的消息时Deliver消息时才有值 GSM协议类型.详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐 byMsgCoding 1 Integer 此字段只有在获取到的消息时Deliver消息时才有值, 短消息的编码格式. 0:纯ASCII字符串 3:写卡操作 4:二进制编码 8:UCS2编码 15: GBK编码 其它参见GSM3.38第4节:SMS Data Coding Scheme ulMsgLen 4 Integer 此字段只有在获取到的消息时Deliver消息时才有值, 短消息的长度 sMsgContent ulMsgLen Text 此字段只有在获取到的消息时Deliver消息时才有值, 短消息的内容,大小不应小于254字节 ulOrgNodeNum 4 ULong 此字段只有在获取到的消息时Report消息时才有值, Report消息对应的Deliver消息的SGIP协议中序列号的第一部分命令源节点编号, ulOrgTime 4 ULong 此字段只有在获取到的消息时Report消息时才有值 Report消息对应的Deliver消息的GIP协议中序列号,第二部分产生的日期和时间 ulOrgSeqID 4 ULong 此字段只有在获取到的消息时Report消息时才有值 Report消息对应的Deliver消息的SGIP协议中序列号第三部分由0开始的循环序列号 byReporttype 1 Integer 此字段只有在获取到的消息时Report消息时才有值 Report命令类型 0:对先前一条Submit命令的状态报告 1:对先前一条前转Deliver命令的状态报告 byState 1 Integer 此字段只有在获取到的消息时Report消息时才有值 该命令所涉及的短消息的当前执行状态 0:发送成功 1:等待发送 2:发送失败 byErrCode 1 Integer 此字段只有在获取到的消息时Report消息时才有值 当State=2时为错误码值,否则为0 byUserCondition 1 Integer 此字段只有在获取到的消息时UseRpt消息时才有值 0:注销;1:欠费停机;2:恢复正常 sReserve 8 Text 保留,扩展用 byAckResult 1 Integer 在获取到消息后要返回的结果值,缺省为0. 【返回值】 函数返回值定义参见附录4. 【函数说明】 该函数用于接收网关下发到接口的Deliver,Report,UserRpt消息及消息的各项参数输出.Deliver消息的回包由动态库完成,在调用此函数成功后,接口自动回包. 参数sMsgContent是接收返回正文的缓冲区,大小不应小于254字节. 其中Deliver消息都到的参数有以下几个:ulCommandID, ulNodeNum, ulTime, ulSequenceID, sUserNumber, sSPNumber,byPID, byUDHI, byMsgCoding, ulMsgLen, sMsgContent,sReserve,byAckResult ;当消息是Deliver 其余参数没有意义 Report消息涉及到的参数有sUserNumber ,ulCommandID, ulNodeNum, ulTime, ulSequenceID,ulOrgNodeNum, ulOrgTime, ulOrgSeqID,byReporttype, byState, byErrCode, sReserve,byAckResult. Deliver消息都到的参数有以下几个:ulCommandID, ulNodeNum, ulTime, ulSequenceID, sUserNumber, sSPNumber, sReserve, byAckResult. 【调用举例】 unsigned char OrgTON=1, OrgNPI=1; unsigned char DestTON=1, DestNPI=1; unsigned char PRI = 0, DCS=0; unsigned long default_id=0; unsigned long SM_ID; unsigned char FCS; unsigned char SRR = pThis->m_iSRR; int iRet = 0; CHAR sServiceType[11]; CHAR sFeeType[3]; CHAR sFeeCode[7]; CHAR sFixedFee[7]; CHAR sSpid[7]; CHAR sCngpSPID[CNGP_MAX_SPID_LEN+1]; memset(sServiceType,0,11); memset(sFeeType,0,3); memset(sFeeCode,0,7); memset(sFixedFee,0,7); memset(sSpid, 0 , 7); strncpy(sServiceType,pThis->m_sServiceType,10); strncpy(sFeeType, pThis->m_sFeeType, 2); strncpy(sFeeCode, pThis->m_sFeeCode, 6); strncpy(sFixedFee, pThis->m_sFixedFee, 6); strncpy(sSpid, pThis->m_sSPID, 6); memset(sCngpSPID,0x00,CNGP_MAX_SPID_LEN+1); strncpy(sCngpSPID, pThis->m_sSPID, CNGP_MAX_SPID_LEN); __int64 orgnum = pThis->sonum; __int64 orgbegin = pThis->sobnum; __int64 destnum = pThis->sdnum; __int64 destbegin = pThis->sdbnum; CString Org; __int64 iOrg = 0; CString Dest; __int64 iDest = 0; CString ud="abcdefghijklmnopqrstuvwxyz"; CString sInfoUD[] = {"GP 0004", "GP S 0004 2112", "TQ 755", "XW 01", "HB NX102", "HB VMMC ZSSS" }; static int nUdCount = 0; unsigned long UDLen = ud.GetLength(); unsigned int iOrgCount = 0; unsigned int iDestCount = 0; char sNum[255]; //SGIP 参数 unsigned char byAgentFlag; byAgentFlag = pThis->m_byAgentFlag; unsigned char bySgipMsgType; bySgipMsgType = pThis->m_bySGIPMsgType; unsigned char byMorelatetoMTFlag; byMorelatetoMTFlag = pThis->m_byMoreMTFlag; CHAR sGiveValue[SGIP_GIVENVALUE_LEN+1]; memset(sGiveValue,0,SGIP_GIVENVALUE_LEN+1); strncpy(sGiveValue, pThis->m_sGivenValue,SGIP_GIVENVALUE_LEN); unsigned char byFeeType = atoi(sFeeType); memset(sNum, 0, 255); _i64toa(iOrg, sNum, 10); Org.Format("%s%s", pThis->m_sOrgAddrPrefix, sNum); if (destnum == 1) iDest = destbegin; else iDest = (destbegin + (rand() * rand()) % destnum); memset(sNum, 0, 255); _i64toa(iDest, sNum, 10); Dest.Format("%s%s", pThis->m_sDestAddrPrefix, sNum); PRI = 0; CString sCurUD; if(pThis->m_sUD.IsEmpty()) { nUdCount = (nUdCount + 1) % 6; sCurUD = sInfoUD[nUdCount]; UDLen = sCurUD.GetLength(); } else sCurUD = pThis->m_sUD; unsigned char PID = pThis->m_byPID; DCS = pThis->m_byDCS; UCHAR uMsgType; if(pThis->m_bAutoGetType) { pThis->m_uMsgType ++; if(pThis->m_uMsgType > 6) { pThis->m_uMsgType = 1; } uMsgType = pThis->m_uMsgType; } else { uMsgType = pThis->m_iMsgType; } char Dests[2100]; memset(Dests, 0, 2100); strncpy(Dests, Dest, 21); UCHAR byMsgID[23]; memset(byMsgID, 0, 23); UCHAR bySmgpMsgID[26]; memset(bySmgpMsgID, 0, 26); char sPaseudoDests[3200]; memset(sPaseudoDests, 0, sizeof(sPaseudoDests)); strncpy(sPaseudoDests, Dest, 21); UCHAR result; char sReserve[8]; switch(pThis->m_iSmeiOrSmpp) { case CMPP3_PROTOCOL: iRet = CMPP3Submit(1, 1, SRR, PRI, sServiceType, 0, "", 0, PID, default_id, 0, DCS, sSpid, sFeeType, sFeeCode,Org, 1, sPaseudoDests, 0, UDLen, (LPCTSTR)sCurUD, "", byMsgID); break; case CNGP_PROTOCOL: iRet = CNGPSubmit(sCngpSPID, uMsgType, SRR, PRI, sServiceType, sFeeType, 0, sFeeCode, DCS,Org, "", 1, Dests, UDLen, (LPCTSTR)sCurUD, 1, byMsgID); break; case SGIP_PROTOCOL: iRet = SgipSubmitSM(Org,"",1, Dests,sSpid,sServiceType,byFeeType, sFeeCode,sGiveValue,byAgentFlag,byMorelatetoMTFlag ,PRI,"","",SRR,PID,0, DCS,bySgipMsgType,UDLen, (LPCTSTR)sCurUD,sReserve,result); break; default: iRet = SubmitAExExEx(1, 1, Org, 1, 1, Dest, PRI, 0, 0, SRR, 0, DCS, PID, 0, 0, default_id, 0, UDLen, (LPCTSTR)sCurUD, sServiceType, byMsgID, 1, 1, 0, 0, sSpid, sFeeType, "", sFeeCode, 1, Dests, &SM_ID, &FCS, bySmgpMsgID, uMsgType, sFixedFee); break; } ULONG sm_ID; unsigned char DestTON, DestNPI, OrgTON, OrgNPI, PRI, PID, DCS; char DestAddr[21]; memset(DestAddr, 0, 21); char OrgAddr[21]; memset(OrgAddr, 0, 21); char TimeStamp[20]; memset(TimeStamp, 0, 20); char UserData[200]; memset(UserData, 0, 200); unsigned char MsgID[23]; memset(MsgID, 0, 23); char sSubmitdate[11]; memset(sSubmitdate, 0, 11); char sDonedate[11]; memset(sDonedate, 0, 11); char sStatus[8]; memset(sStatus, 0, 8); int iRet; unsigned char RP; unsigned char UDHI; unsigned long UDLen; unsigned char StatusReport = 0; //CMPP3.0 unsigned char bySrcTerminalType; char sOrgAddrPaseudo[MAX_ADDRPSEUDO_LEN]; memset(sOrgAddrPaseudo, 0, sizeof(sOrgAddrPaseudo) ); char sLinkID[MAX_LINKID_LEN]; memset(sLinkID, 0, sizeof(sLinkID)); //CNGP unsigned char byProValue; unsigned char byMsgLen; char sMsgID[23]; memset(sMsgID, 0, 23); char sSrcMsgID[23]; memset(sSrcMsgID, 0, 23); //SGIP unsigned long NodeNum; unsigned long Time; unsigned long SequenceID; unsigned char MsgCoding; char reserve[9]; memset(reserve,0,9); unsigned long CommandID; unsigned long OrgNodeNum; unsigned long OrgTime; unsigned long OrgSeqID; //report消息消息序列号 unsigned char Reporttype;Report命令类型 unsigned char State;短消息执行状态 unsigned char ErrCode;错误码值 unsigned char UserCondition;判断是否是Report unsigned char AckResult = 1; switch(p->m_iSmeiOrSmpp) { case CMPP3_PROTOCOL: iRet = GetCMPP3DeliverSM(&sm_ID, DestAddr, sOrgAddrPaseudo, &bySrcTerminalType, &PRI, &RP, &UDHI, &PID, &DCS, TimeStamp, &UDLen, UserData, sLinkID, &StatusReport, MsgID, sSubmitdate, sDonedate, sStatus); break; case CNGP_PROTOCOL: iRet = GetCNGPDeliverSM(sMsgID, &DCS, TimeStamp, OrgAddr, DestAddr, &byMsgLen, UserData, &byProValue, &StatusReport, sSrcMsgID, sSubmitdate, sDonedate, sStatus); break; case SGIP_PROTOCOL: iRet = SgipGetSM(&CommandID,&NodeNum, &Time,&SequenceID, OrgAddr,DestAddr,&PID,&UDHI,&MsgCoding,&UDLen,UserData,&OrgNodeNum,&OrgTime, &OrgSeqID, &Reporttype, &State, &ErrCode, &UserCondition,reserve); break; default: iRet = GetDeliverSMExEx(&sm_ID, &DestTON, &DestNPI, DestAddr, &OrgTON,&OrgNPI, OrgAddr, &PRI, &RP, &UDHI, &PID, &DCS,TimeStamp, &UDLen, UserData, &StatusReport); break; } 21. CMPPGetDeliverSM 【函数功能】 读取下发的短讯内容,并且能确认此消息是否为状态报告,用于CMPP协议中,SP需要短消息网关网关返回状态报告的内容.需要698及以上的短消息中心以及信息平台支持. 接收消息后不自动返回成功应答,需要调用CMPPDoDeliverACK返回应答. 【预置条件】 成功调用IFInitInterface 成功调用Login_R 【函数原型】 int WINAPI CMPPGetDeliverSM(ULONG* sm_ID,unsigned char* DestTON, unsigned char* DestNPI, char* DestAddr, unsigned char* OrgTON, unsigned char* OrgNPI char* OrgAddr,unsigned char* PRI, unsigned char* RP,unsigned char* UDHI,unsigned char* PID,unsigned char* DCS, char* TimeStamp, unsigned long * UDLen,char* UserData, unsigned char* StatusReport,char* sSubmitdate,char* sDonedate,char* sStatus,unsigned long * sequence,unsigned char* byMsgID); 【参数说明】 字段 长度(字节) 类型 说明 Sm_ID 4 ULong 返回短消息的ID DestTON 1 Unsigned char 返回目标地址号码类型. DestNPI 1 Unsigned char 返回目标地址编码方案 DestAddr 20 Char 目标地址 OrgTON 1 Unsigned char 返回源地址号码类型 OrgNPI 1 Unsigned char 返回源地址编码方案 OrgAdd 20 Char 源地址 PRI 1 Unsigned char 返回优先级 RP 1 unsignedchar 返回回应路径 UDHI 1 Unsigned char 返回头结构指示 PID 1 Unsigned char 返回协议标志 DCS 1 Unsigded char 返回编码方案 TimeStamp 19 char 提交时间 UDLen 4 ULong 返回短消息的UDL UserData, 141 char 正文(为状态报告时无意义) StatusReport 1 Unsigned char 状态报告标志,0:表示不是状态报告, 1:表示是状态报告 sSubmitdate 10 char 提交时间 sDonedate 10 char 下发时间. sStatus 7 char 处理状态,7字节的字符串, SP根据该字段确定CMPP_SUBMIT消息的处理状态 sequence 4 ULong 消息序列号 byMsgID 10 char 信息标识 22. CMPPDoDeliverACK 【函数功能】 在利用函数CMPPGetDeliverSM后,使用本函数返回应答.可以控制应答的错误码. 【预置条件】 成功调用IFInitInterface 成功调用Login_R 成功调用CMPPGetDeliverSM 【函数原型】 void WINAPI CMPPDoDeliverACK(DWORD dwHeadSequence, ULONG sm_ID, int iStatus, unsigned char* byMsgID); 【参数说明】 字段 长度(字节) 类型 说明 dwHeadSequence 4 ULong 短消息序列号 Sm_ID 4 ULong 短消息的ID iState 4 ULong 应答错误码 byMsgID 10 char 信息标识 【调用举例】 unsigned long g_sequence; unsigned char g_MsgID[10]; unsigned long g_sm_ID; unsigned char DestTON, DestNPI, OrgTON, OrgNPI, PRI, PID, DCS; unsigned char RP; unsigned char UDHI; char DestAddr[21]; memset(DestAddr, 0, 21); char OrgAddr[21]; memset(OrgAddr, 0, 21); unsigned long UDLen; char TimeStamp[20]; memset(TimeStamp, 0, 20); char UserData[200]; memset(UserData, 0, 200); char sSubmitdate[11]; memset(sSubmitdate, 0, 11); char sDonedate[11]; memset(sDonedate, 0, 11); char sStatus[8]; memset(sStatus, 0, 8); unsigned char StatusReports; int iRet = CMPPGetDeliverSM(&g_sm_ID, &DestTON, &DestNPI, DestAddr, &OrgTON,&OrgNPI, OrgAddr, &PRI, &RP, &UDHI, &PID, &DCS, TimeStamp, &UDLen, UserData, &StatusReports,sSubmitdate, sDonedate, sStatus,&g_sequence,g_MsgID); CMPPDoDeliverACK(g_sequence,g_sm_ID,m_ErrCode,g_MsgID); 23. SMPP34SubmitSM 【函数功能】 向指定地址发送短消息. (支持SMPP3.4协议) 【预置条件】 成功调用IFInitInterface 成功调用Login_R 【函数原型】 int WINAPI SMPP34SubmitSM(unsigned char OrgTON, unsigned char OrgNPI, LPCTSTR OrgAddr,unsigned char DestTON, unsigned char DestNPI, LPCTSTR DestAddr, unsigned char PRI, unsigned char RD, unsigned char RP, unsigned char SRR, unsigned char MR, unsigned char DCS, unsigned char PID, LPCTSTR Schedule, LPCTSTR Expire, unsigned long Default_ID, unsigned char UDHI, unsigned long UDLen,LPCTSTR UserData, unsigned long* SM_ID, unsigned char* FCS, LPCSTR pChargeNum); 【参数说明】 输入参数: OrgTON 类型:unsigned char 适用协议:SMPP 说明:源地址号码类型 取值 意义 0 未知,当用户或网络不含关于编码方案的较早信息 1 国际号码, 2 国内号码,不能包含地区和退出数字 3 网络特殊号码 4 用户号码 5 字符数字 6 缩写号码 保留 如:86 应该填1 反之就应该填2. 而对于象9999这样的特服号码一般填1. OrgNPI 类型:unsigned char 适用协议:SMPP 意义:源地址编码方案 取值 意义 0 未知,当TON=5时,NPI=0 1 ISDN或电话号码编码方案(E164/E163)对于任意实体SC,MSC或MS,都有效 2 保留 3 数据编码方案(X121) 4 电报编码方案 5-7 保留 8 国内编码方案 9 私有编码方案 10 ERMES编码方案(ETSI DE/PS 3 01-3) 保留 缺省值一般为1. OrgAddr 类型:LPCSTR 最大长度为20个ASCII字符 适用协议:SMPP 意义:源地址 DestTON 类型:unsigned char 适用协议:SMPP 意义:目标地址号码类型.取值同OrgTON. DestNPI 类型:unsigned char 适用协议:SMPP 意义:目标地址编码方案.取值同OrgNPI. DestAddr 类型:LPCSTR 最大长度为20个ASCII字符 适用协议:SMPP 意义:目标地址 PRI 类型:unsigned char 适用协议:SMPP 意义:SM优先级 取值 意义 1 优先级别 0 缺省级别 RD 类型:unsigned char 意义:保留,设置为0. RP 类型:unsigned char 意义:回应路径,保留,设置为0. SRR 类型:unsigned char 适用协议:SMPP,CMPP 意义:状态报告,保留,设置为0;需要状态报告时,设置为1. MR 类型:unsigned char 意义:消息索引,保留,设置为0. DCS 类型:unsigned char 适用协议:SMPP,CMPP 意义:数据编码方案 取值 意义 0 缺省编码方案(7位) 4 二进制编码方案 UCS2编码方案 15 GBK编码 其他 保留 对于一般的中文短消息应填8或15,对于传送铃声图片一般填4. PID 类型:unsigned char 适用协议:SMPP 意义:协议类型,缺省为0. Schedule 类型:LPCSTR 长度为19个ASCII字符的字符串 适用协议:SMPP,CMPP 意义:定时时间 注意:时间格式必须为"yyyy/mm/dd hh:mm:ss".缺省为NULL. 如果使用的不是Smedll的API函数,请视情况而定,时间格式可能为 yymmddhhmmss32+NULL.以下时间的输入格式相同. Expire 类型:LPCSTR 长度为19个ASCII字符的字符串 适用协议:SMPP,CMPP 意义:超时时间 注意:时间格式必须为"yyyy/mm/dd hh:mm:ss".缺省为NULL. Default_ID 类型:unsigned long 适用协议:SMPP 意义:缺省短消息的信息码,缺省为0. 注意:国标定义的缺省短消息的个数为100条. UDHI 类型:unsigned char. 适用协议:SMPP 意义:用于长短消息,表示UserData是否是结构 取值 意义 0 UD是正常字符串 1 UD是结构 UDLen 类型:unsigned long 适用协议:SMPP 意义:表示UserData的长度,单位是字节.此处不是定长的.UDLen要注意的事项如下,如果对于UDHI设置为1的短消息,则此项表示UserData的字符个数(字符个数和字节个数不同,对于7比特编码格式,字符是7比特的,字节是8比特.其他编码方式则字符的大小和字节的大小相同) UserData 类型;LPCSTR 适用协议:SMPP 意义:用户信息,短消息正文.对于正常短消息,该字段的最大长度和编码方式有关,对于7比特编码方式(缺省的编码方式)为160个字符的ASCII字符串,如果为8比特编码方式则为140个8比特字节流,如果为UCS2编码方式,则为70个字符的16比特字符串. 此外对于UDHI设置为1的短消息,表示此字段已经经过编码,所以不论是什么编码方式,此字段的最大长度为140字节. 如果传输是图片铃声则要求UDHI的值为1、DCS值为4.而且对不同的品牌的手机、DCS值可能有变化. 输出参数: SM_ID 类型:unsigned long* 适用协议:SMPP 意义:返回短消息ID FCS 类型:unsigned char* 意义:返回SC端失败原因 pChargeNum 类型:LPCSTR 最大长度为20个ASCII字符 意义: 计费地址 【调用举例】 第三章 Smeidll 功能配置说明 一、2.3 、smeidll.ini配置说明 SMEIDLL的INI文件说明 [COMMON]的配置 [COMMON]段下有四个分项 Timeout表示缺省的超时时间,以毫秒为单位.DLL的缺省的超时时间为 120000毫秒 例如:Timeout=120000 2. Expose_TONnNPI表示是否屏蔽提交短消息时的TON、NPI,使用设置的TON、NPI. 1表示屏蔽, 使用缺省的TON,忽略提交时的TON、NPI.0表示使用提交时的 TON、NPI. 例如:Expose_TONnNPI=1 3. Default_TON表示缺省的TON.注意只有在Expose_TONnNPI=1采有效. 例如:Default_TON=1 4. Default_NPI表示缺省的NPI.注意只有在Expose_TONnNPI=1采有效. 例如:Default_NPI=1 5. EnquireLinkTime表示定时握手时间间隔,以毫秒为单位. 例如:EnquireLinkTime=3010000 6. ErrorAccordant是否使用错误值一致,0表示不使用,1表示使用. 例如:ErrorAccordant=0 7.ExpireTime 超时时间缺省配置 缺省为0 格式为yyyy/mm/dd hh:mm:ss 没有用请配置为空 8.ScheduleTime 定时下发时间缺省配置,缺省为0 格式为yyyy/mm/dd hh:mm:ss没有用请配置为空 [VP]段下有六个分项 CodeToolProtocol表示编码协议,1表示内部协议,2表示网关协议, 3表示SMPP协议. 例如:CodeToolProtocol=11 2. DriverProtocol表示通讯协议,1表示TCP/IP协议,其他保留. 例如:DriverProtocol=1 3. DriverParam表示通讯协议参数. 对于TCP/IP协议,参数的的含义是"IP地址 端口号 超时时间" 例如:DriverParam=10.108.22.114 1000 5000 4. SystemID表示短消息中心接口名. 例如:SystemID=new 5. Password表示接口的密码 例如:Password= 6. LogType表示登录命令的类型是Transmiter或者Reciever,缺省是Transmiter 调用VpSubmit时设为1 例如:LogType=1 表示Reciever; LogType=0 表示Transmiter; [COMPATIBILITY]段的配置 [COMPATIBILITY]段下有五个字段 1. ExpireTime表示缺省的超时字段,以秒为单位. ALDISCON协议此项要设置. 例如:ExpireTime=360030 2. NotSuportLongSM是否支持长短消息.0表示支持,1表示不支持.缺省为支持. ALDISCON协议此项要设置为1. 例如:NotSuportLongSM=1 StaticLog表示是否使用INI文件中的登录参数.1表示使用INI文件中登录参数. 0表示不使用. ALDISCON协议此项要设置为1,其余都需设为 0. 例如:StaticLog=1 4. SystemType表示接口登录类型.此参数是兼容ALDISCON的协议. ALDISCON协议此项要设置. 例如:SystemType=ing 5. AddressRange表示地址范围.此参数是兼容ALDISCON的协议. ALDISCON协议此项可设置为空. 例如:AddressRange= 6. ConvertAddr表示是否添加国家码,1表示添加,0表示不添加. 设置此项后Default_TON和Default_NPI必须设置为1. 例如:ConvertAddr=1 7. FixSourceAddr表示是否固定源地址.0表示协议指定源地址,其他为源地址指定的 号码.例如:FixSourceAddr=1258 [QUERYFEE] 段的配置 [QUERYFEE]下面这些值是CMMP协议SubmitSM字段的缺省配置.具体取值配置方法配置 方法可以参考SubmitAExEx的参数说明.下面的配置值只是举例.具体配置值要根据需要来配置. 注意:这个Section的配置项只有在资费模块时才有用到,如果不是请不要配置.可在配置文件把这些项删除. 1.DefaultFee = 5 #此值为1表示启用以下2-11资费模块的缺省 计费配置,为0 这些配置无效.资费模块刚开始的确省配置是Smpp协议,配成何值就是表示要采用此值对应协议的计费,具体值对应的协议可参考 IFInitInterface 函数参数 dwCodePorotol 取值情况.目前计费配置只支持到CMPP.固此值配为5. 1 内部协议(保留) 2 网关协议(保留) SMPP协议 5 CMPP协议(中国移动点对点协议) 6 SMGP协议(固网网关协议) 2. ChangePort = 7890 #采用对应计费协议的登陆端口号,此值一定和DefaultFee 采用的登陆协议相对应,注意该协议采用的登陆端口号. 3.ServiceSubType = 0 #业务子类型配置,通过此值来判断计费. 4.PKTotal = 1 #相同序列号的短消息总数,从1开始. 5.PKNumber = 1 #相同Msg_ID的短消息序号,从1开始. 6.MsgLevel = 0 #短消息级别 7.FeeUserType = 0 #对于SP 此值填1将导致计费失败 0:对目的终端MSISDN计费; 1:对源终端MSISDN计费; 2:对SP计费; 3:表示本字段无效 注意对于SP来说此字段如果 填"1"则将导致计费失败. 8.SPID = 9999 #信息内容来源 SP企业码 9.FeeType = 02 #计费用户类型 00 "短消息类型"为"发送",对"计费用户号码"不计信息费, 此类话单仅用于核减SP对称的信道费; 01 对"计费用户号码"免费; 02 对"计费用户号码"按条计信息费; 03 对"计费用户号码"按包月收取信息费; 04 对"计费用户号码"的信息费封顶; 05 对"计费用户号码"的收费是由SP实现. 10. FeeCode = 10 #资费代码值以分为单位. 11. FeeAddr= 0 #被计费用户号码.以分为单位.(如本字节填空,则表示本字段 无效,对谁计费参见byFeeUserType字段.本字段与byFeeUserType字段互斥) [SGIPServer]段的配置 [SGIPServer] 主要在动态库支持SGIP协议时才有用. IsStartServer= 0/1 #是否要启动 动态库作为服务端 ListenPort = 8805 #作为服务端时侦听客户端的端口号 LoginPassword=作为服务端时客户端登陆是用的密码 LoginAccount=new # 作为服务端时客户端登陆是用的帐号 NodeNum=302109999 #作为客户端登陆服务端Bind消息是否使用配置的序列号的节点号,根据运营商定义来配置 例如:上海联通CP端源节点编码的定义:30210+CP_ID 二、2.4 SMGPC.ini配置说明 此配置文件只有在动态库提供SMGP协议接口时才有用. IcpId=new #信息平台给SP分配的登陆帐号 IcpShareKey=信息平台给SP分配的效验密码 WithPrevPage=to be continue #动态库拆分过大的消息包后增加的消息前缀 WithNextPage=continue #动态库拆分过大的消息包后增加的消息后缀 PageSpaceAscii=252 #表示对与大于252字节的Ascii码消息包需要拆分 PageSpaceGB=252 #表示对与大于252字节的中文消息包需要拆分 PageSpaceBinary=252 #表示对与大于252字节的二进制码消息包需要拆分 WithPageIndex=1 #拆分后是否增加页码显示 MaxPage=20 #最大的拆分包数目 ClientIP=127.0.0.1 #本端的IP地址(可以不填) ServerIP=127.0.0.1 #连接信息平台的IP地址 ServerPort=7118 #连接信息平台的端口号 RequestTimeout=2000 #等待应答的超时时间 三、功能配置说明 流程使用接口自动登陆 配置Smeidll.ini [VP]段内容 支持SGIP协议服务端的相关配置 配置Smeidll.ini [SGIPServer]相关内容. 同时请注意在作为服务端,网关是主动建立连接登陆动态库.动态库根据配置提供网关登录的用户名、密码.此外,由于SGIP协议中,SP和网关之间是采用短连接,因此在SP发送消息一段时间后,网关会断掉SP的接口,这是SP如果要发送消息则需要重新登录. 第四三章 API for UNIX说明 3.1 安装说明 安装过程如下(以SUN Soloris为例) 1、修改用户Shell为Korn Shell: 执行命令:ksh -o vi 2、在用户的根目录下创建/bin、/tmp、/script 目录,并将安装文件中相应目录下的文件拷贝到相应目录并进行修改(详细内容见后). 3、修改.profile文件,增加以下内容 PROXY_SCRIPT_DIR=$HOME/script;export PROXY_SCRIPT_DIR PROXY_BIN_DIR=$HOME/bin;export PROXY_BIN_DIR PROXY_RUN=$HOME;export PROXY_RUN PROXY_TMP=$HOME/tmp;export PROXY_TMP PROXY_OBJ=$HOME/obj;export PROXY_OBJ PS1='[ $PWD ]'; export PS1 PS2="[ $PWD ]>"; export PS2 # OPERATION_SYSTEM=SUN_SVR4_OPSYS, or SCO_UNIX_OPSYS # 1. SCO_UNIX_OPSYS --> for Sco unix # 2. SUN_SVR4_OPSYS --> for Sun Solaris # 3.axposf_OPSYS --> for AXPOSF # 4.NEC_OPSYS)for NEC # 5.IBM_AIX_OPSYS) --> for IBM AIX # 6.HP_UNIX_OPSYS) --> for HP OPERATION_SYSTEM=SUN_SVR4_OPSYS; export OPERATION_SYSTEM # CPU_SW CPU type # 1. SUN_CPU --> for Sun Sparcs like CPU # 2. INTEL_CPU --> for Intel like CPU CPU_SW=SUN_CPU; export CPU_SW CC_SW=cc; export CC_SW 并将/script和/bin目录设到查找路径中. PATH=$PATH:$PROXY_BIND_DIR:$PROXY_SCRIPT_DIR;export PATH 4、确定用户的客户端个数并设置配置文件 在/bin目录下创建smproxyX.cfg文件,X表示1,2,3,...15个代理 在配置文件中增加以下信息 SMC IP Address = <10.108.20.112> Send SM Port = 7890 Receive SM Port = 7890 Send SM Buffer Size = 30000 Receive SM Buffer Size = 30000 Receive Ack Buffer Size = 20000 Output To Trace = Y SMC System ID = new SMC Password = 5、运行proxy,将产生出系统菜单,选择1,运行PROXY.如需要测试软件,可运行APIDEMO,此软件可提交以及接收短消息. 3.2 函数说明 如有疑问,请参阅例子程序Apidemo.c. 【系统登录】 int ProxyLogin (int nNumber); 输入参数:1、CMPP代理的序号(1~10)(每一台服务器最大支持10个CMPP协议代理) 输出参数:1:成功 0:失败 -1:致命错误 调用此函数进行协议代理注册,在参数中需要指明用哪个协议代理,一个协议代理对应一个客户端程序. 【系统注销】 void ProxyLogout() 调用此函数退出与协议代理的通讯,在退出程序之前调用此函数通知协议代理与服务器断连. 【发送短消息】 RETCD CMPPSnd( unsigned char byPkTotal, unsigned char byPkNumber, unsigned char byRegisteredDelivery, unsigned char byMsgLevel, char *psServiceID, unsigned char byFeeUserType, char *psFeeTerminalID, unsigned char byTPPID, unsigned char byTPUDHI, unsigned char byMsgFmt, char *psMsgSrc, char *psFeeType, char *psFeeCode, char *psValidTime, char *psAtTime, char *psSrcTerminalID, unsigned char byDestUsrTl, char *psDestTerminalID, unsigned char byMsgLength, char *pMsgContent, char *pReserve, unsigned short nLID); 输入参数: 此参数与CMPP2.0协议中规定的相同名称的参数意义相同,请参考CMPP2.0中的相关描述. 输出参数:1、成功 失败 -1、致命错误 【接收发送短消息应答】 int CMPPGetSndAck( unsigned short *LID, unsigned char *psMsgID, int *pStatus); 输入参数:LID: 本地发送消息标识 psMsgID:网关的消息ID pStatus:短消息的发送状态,0表示成功,非0表示失败. 输出参数:1、成功 失败 -1、致命错误 【接收短消息】 int CMPPRcv( unsigned char *pMsgID, char *pDestnationID, char *pServiceID, unsigned char *pbyTPID, unsigned char *pbyTPUDHI, unsigned char *pbyMsgFmt, char *pSrcminalID, unsigned char *pbyRegistered, unsigned char *pbyMsgLength, char *pMsgContent, char *pReserve); 输入参数:与CMPP2.0协议中描述的相同参数相同. 输出参数:1、成功 失败 -1、致命错误 第五四章 Java版API说明 4.1 CMPP协议的封装 CMPP协议封装在com.huawei.insa2.comm.cmpp.message包中,主要消息如下 (1)CMPPActiveMessage 心跳消息,对应CMPP2.0文档中的CMPP_Active_Test消息,是SMProxy与ISMG的心跳消息. (2)CMPPActiveRepMessage 心跳响应消息,对应CMPP2.0文档中的CMPP_Active_Test_REP,是SMProxy发送心跳消息后收到的响应消息 (3)CMPPCancelMessage 删除短信消息,对应CMPP2.0文档中的CMPP_Cancel的消息,是SMProxy向ISMG发送的删除短消息. (4)CMPPCancelRepMessage 删除短信响应消息,对应CMPP2.0文档中的CMPP_Cancel_REP的消息,是SMProxy发送删除短信后收到的响应消息. (5)CMPPConnectMessage 请求连接消息,对应CMPP2.0文档中的CMPP_Connect的消息,是SMProxy向ISMG发送的建立逻辑请求连接消息. (6)CMPPConnectRepMessage 请求连接应答消息,对应CMPP2.0文档中的CMPP_Connect_REP的消息,是SMProxy向ISMG发送的建立逻辑请求连接后收到的响应消息. (7)CMPPDeliverMessage ISMG下发短信,对应CMPP2.0文档中的 CMPP_Deliver消息,是ISMG下发给SMProxy的短消息或者状态报告消息. (8)CMPPDeliverRepMessage 下发短信响应,对应CMPP2.0文档中的 CMPP_Deliver_REP消息,是SMProxy收到的下发短信后的响应消息. (9)CMPPQueryMessage 发送短信状态查询消息,对应CMPP2.0文档中的 CMPP_Query消息,是SMProxy查询Time属性指定的日期的统计信息. (10)CMPPQueryRepMessage 发送短信状态查询的响应消息,对应CMPP2.0文档中的 CMPP_Query_REP消息. 1(11)CMPPSubmitMessage 发送短信消息,对应CMPP2.0文档中的 CMPP_Submit消息,是SMProxy发送短讯的消息. (12)CMPPSubmitRepMessage 下发短信的响应,对应CMPP2.0 文档中的 CMPP_Submit_REP消息,是SMProxy发送短讯的响应消息. (13)CMPPTerminateMessage 终止连接消息,对应CMPP2.0 文档中的 CMPP_Terminate消息,是ISMG和SMProxy终止逻辑连接的消息. (14)CMPPTerminateRepMessage 终止连接的响应消息,对应CMPP2.0 文档中的 CMPP_Terminate_REP消息,是ISMG或SMProxy收到终止连接后发送的响应消息. 其中的心跳消息(1,2)、建立逻辑连接的消息(5,6)和终止逻辑连接消息(13,14)只是SMProxy系统内部使用消息,提供给外部的接口中不涉及这六条消息. 4.2 SMProxy使用说明 4.2.1 SMProxy提供的接口方法描述 1、send 【函数功能】 向ISMG发送CMPP消息,阻塞直到收到响应或超时. 【函数原型】 CMPPMessage send(CMPPMessage message); 【参数说明】 [IN] message - 发送的CMPP消息,包括 (1)CMPPSubmitMessage 提交短信 (2)CMPPQueryMessage 发送短信状态查询 (3)CMPPCancelMessage 删除短信 【处理】 调用这个接口方法,向ISMG发送Submit/Query/Cancel等命令消息. 如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理. 【返回值】 发送CMPPSubmitMessage,返回CMPPSubmitRepMessage; 发送CMPPCancelMessage,返回CMPPCancelRepMessage; 发送CMPPQueryMessage,返回CMPPQueryRepMessage; 2 close 【函数功能】 向ISMG发送终止连接CMPP消息,调用之后连接将永久不可用. 【函数原型】 Void close(); 【参数说明】 无 【处理】 调用这个接口方法,SMProxy向ISMG发送CMPPTerminateMessage消息 如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理. 【返回值】无3getConnState 【函数功能】 获取通讯连接的状态方法. 【函数原型】 1 String getConnState(); 【参数说明】 无 【处理】 调用这个接口方法,获取TCP连接状态的描述. 如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理. 【返回值】 当前错误描述,若连接正常则返回null. 4.2.2 封装接口方法的SMProxy的抽象类 SMProxy在com.huawei.SMProxy的包中,封装了Send、close、getConnState方法.SMProxy是一个抽象类,需要被继承使用. SMProxy抽象类的框架如下: public class SMProxy { public SMProxy(Args args) { //完成初始化和向ISMG登录等工作 } public SMProxy(Map args) { //完成初始化和向ISMG登录等工作 } /** * 发送消息,阻塞直到收到响应或超时. * 返回为收到的消息 * @exception PException 超时或通信异常. */ public CMPPMessage send(CMPPMessage message) { //发送消息 } /** * 连接终止的处理,由API使用者实现 * SMC连接终止后,需要执行动作的接口 */ public void onTerminate() { } /** * 对收到消息的处理.由API使用者实现. * @param msg 从短消息中心来的消息. * @return 应该回的响应,由API使用者生成. */ public CMPPMessage onDeliver(CMPPDeliverMessage msg) { } /** * 终止连接.调用之后连接将永久不可用. */ public void close() { } /** * 提供给业务层调用的获取连接状态的方法 */ public String getConnState() { //返回连接状态的描述 } } 4.2.3 使用SMProxy抽象类 可以直接使用SMProxy类提供的Send、close和getConnState方法 但是如果SP有接收ISMG下发的短信的要求或ISMG断开连接的时候要求得到事件通知的时候,就必须声明一个新的类继承SMProxy,重载实现onDeliver( )和onTerminate( ).使用例子如下: //定义MySMProxy所在的包是com.huawei.SMProxy package com.huawei.SMProxy; import com.huawei.insa2.comm.cmpp.message.*; import com.huawei.insa2.util.Args; public class MySMProxy extends SMProxy { public MySMProxy(Args args) { //调用父类的构造函数,完成初始化和登录ISMG的功能,不能省略 super(args); } public CMPPMessage onDeliver(CMPPDeliverMessage msg) { //添加收到短消息中心下发消息的处理代码 ... //实际上是返回响应消息,一定要有 return super.onDeliver(msg); } public void OnTerminate() { //可以添加ISMG和SMProxy断开连接的处理代码 } } 实际使用SMProxy封装的send、close和getConnState的接口方法的时候,只需要生成MySMProxy的对象,然后调用MySMProxy的send、close和getConnState方法即可. 4.2.4 配置参数使用说明 SMProxy需要的配置参数如下表 参数名称 参数例值 参数描述 host 10.76.148.147 ISMG主机地址的IP地址 port 7 890 ISMG主机开发的端口号 heartbeat-interval 10 心跳信息发送间隔时间 (单位:秒) reconnect-interval 10 连接中断时重连间隔时间(单位:秒) heartbeat-noresponseout 5 需要重连时,连续发出心跳而没有接收到响应的个数(单位:个) transaction-timeout 10 操作超时时间(单位:秒) source-addr d86138 SP向ISMG申请的ID(最大为六位字符) version 1 双方协商的版本号(大于0,小于256) shared-secret pass 由中国移动与ICP事先商定,SP向ISMG申请的ID所对应的密码 debug true true表示属于调试状态,所有的消息被打印输出到屏幕,false表示不属于调试状态,所有的消息不被输出 配置文件可以采用我们提供的XML格式,也可以采用其他格式,只要构造的时候能通过Map类型或Arg类型的参数传入指定的参数就可以了.例如可以用java的property文件保存参数,或将配置和ICP的应用程序配置放在一起. 下面是以XML格式定义的配置文件 SMProxy.xml是在SMProxy.jpx的工程目录下,是使用XML写的配置文件,具体内容如下 其中以"
10.76.148.147 7890 10 10 5 10 d86138 0 true 使用的时候可以根据实际情况配置 ISMG主机地址
10.76.148.147 ISMG主机端口号
7890 心跳信息发送间隔时间(单位:秒)
10 连接中断时重连间隔时间(单位:秒)
10 需要重连时,连续发出心跳而没有接收到响应的个数(单位:个)
5 操作超时时间(单位:秒)
10 SP向ISMG申请的ID(最大为六位字符)
d86138 双方协商的版本号(大于0,小于256)
0 shared-secret由中国移动与ICP事先商定,SP向ISMG申请的ID所对应的密码
true表示属于调试状态,所有的消息被打印输出到屏幕,false表示不属于调试状态,所有的消息不被输出
true 举例说明:如果ISMG的IP地址为10.76.148.168,则只需要修改
10.76.148.147为
10.76.148.168即可,同样可以根据实际情况修改其他的配置项. 4.2.5 使用SMProxy收发短信 1 直接使用SMProxy发送短信 当不需要接收ISMG下发的短信和不需要获得ISMG的断连通知的时候,可以直接使用SMProxy类方法发送/查询/删除短信和退出ISMG 具体使用方法如下 生成SMProxy的实例 (a)Args args = new Cfg("SMProxy.xml").getArgs("ismg"); (b)args.set("source-addr",loginName); (c)args.set("shared-secret",loginPass); (d)SMProxy proxy = new SMProxy(args); 注释: (a)类Cfg在com.huawei.insa2.util的包中,主要负责基于XML格式的配置文件读写类,使用Cfg类解析SMProxy.xml配置文件,Cfg的构造函数的原形如下 public Cfg(String url),其中参数url表示解析的配置文件.通过调用Cfg对象的getArgs方法获得Args对象. (b,c)根据配置文件解析生成Args对象,SP还可以修改其中的配置项,b和c就是修改配置参数中的SP登录ISMG的ID和密码,同样也可以修改其他的配置项. (d)生成SMProxy对象 proxy 调用proxy.send(CMPPMessage msg) 完成发送/删除/查询短信. 调用proxy.close()与ISMG断开连接. 调用proxy.getConnState()获得和ISMG的TCP连接的状态描述. 具体使用情况请参看5.2 2 使用SMProxy收发短信 当需要接收ISMG下发的短信或在ISMG下发断连命令的时候需要得到事件通知的情况需要做如下处理 1:首先需要声明MySMProxy类,并且从com.huawei.SMProxy包中的SMProxy类继承,根据实际情况处理. 如果SP有接收短信的要求在MySMProxy的类中重载实现SMProxy的onDeliver方法,在MySMProxy类中增加 public CMPPMessage onDeliver(CMPPDeliverMessage msg) { //添加收到短消息中心下发消息的处理代码 ... //实际上是返回响应消息,一定要有 return super.onDeliver(msg); } 如果SP需要在ISMG 向SMProxy下发断开连接后收到类似于事件的通知,则需要重载SMProxy的onTerminate方法,需要在MySMProxy类中增加 public void OnTerminate() { //可以添加ISMG和SMProxy断开连接的处理代码 } 2:生成MySMProxy的实例 (a)Args args = new Cfg("SMProxy.xml").getArgs("ismg"); (b)args.set("source-addr",loginName); (c)args.set("shared-secret",loginPass); (d)MySMProxy myProxy = new MySMProxy(args); 注释: (a)类Cfg在com.huawei.insa2.util的包中,主要负责基于XML格式的配置文件读写类,使用Cfg类解析SMProxy.xml配置文件,Cfg的构造函数的原形如下 public Cfg(String url),其中参数url表示解析的配置文件.通过调用Cfg对象的getArgs方法获得Args对象. (b,c)根据配置文件解析生成Args对象,SP还可以修改其中的配置项,b和c就是修改配置参数中的SP登录ISMG的ID和密码,同样也可以修改其他的配置项. (d)生成MySMProxy对象 myProxy 3:使用MySMProxy对象发送短消息 向ISMG下发短信 CMPPSubmitMessage submitMsg = new CMPPSubmitMessage( int pk_Total, int pk_Number, int registered_Delivery, int msg_Level, String service_Id, int fee_UserType, String fee_Terminal_Id, int tp_Pid, int tp_Udhi, int msg_Fmt, String msg_Src, String fee_Type, String fee_Code, Date valid_Time, Date at_Time, String src_Terminal_Id, String[] dest_Terminal_Id, byte[] msg_Content, String reserve ) 调用MySMProxy对象myProxy的send方法发送, CMPPSubmitRepMessage repMsg = myProxy.send(submitMsg); 注释: /** * 创建一个发送短信消息,传入消息的各字段的值,并对各参数值进行判断,不符合要求则抛出异常 * 按要求把输入的参数转换为一个byte类型的数组 * 1 @pk_Total 相同msg_Id消息总条数 * 2 @pk_Number 相同msg_Id的消息序号 * 3 @registered_Delivery 是否要求返回状态报告 * 4 @msg_Level 信息级别 * 5 @service_Id 业务类型 * 6 @fee_UserType 计费用户类型字段 * 7 @fee_Terminal_Id 被计费用户的号码 * 8 @tp_Pid GSM协议类型 * 9 @tp_Udhi GSM协议类型 * 10 @msg_Fmt 消息格式 * 11 @msg_Src 消息内容来源 * 12 @fee_Type 资费类别 * 13 @fee_Code 资费代码(以分为单位) * 14 @valid_Time 存活有效期 * 15 @at_Time 定时发送时间 * 16 @src_Terminal_Id 源终端MSISDN号码 * 17 @dest_Terminal_Id 接收业务的MSISDN号码 * 18 @msg_Content 消息内容 * 19 @reserve 保留 */ 这些消息与CMPP2.0文档中的CMPP_Submit消息的格式相对应. repMsg提交submit的响应消息,是ISMG返回给SP的消息. 4:使用MySMProxy对象发送删除短信 CMPPCancelMessage cancelMsg = new CMPPCancelMessage(byte[] msg_Id) CMPPCancelRepMessage repMsg = myProxy.send(cancelMsg); 注释: msg_Id 信息标识,CMPP2.0文档中的CMPP_Cancel消息的格式相对应. repMsg提交cancel的响应消息,是ISMG返回给SP的消息. 5:使用MySMProxy对象发送查询短信 CMPPQueryMessage queryMsg = new CMPPQueryMessage( Date time, int query_Type, String query_Code, String reserve) CMPPQueryRepMessagemy repMsg = myProxy.send(queryMsg); 注释: /** * 定义一发送短信查询消息 * @time 时间 * @query_Type 查询类别 * @query_Code 查询码(业务类型) * @reserve 保留 */ CMPPQueryMessage与CMPP2.0文档中的CMPP_Query消息一致. repMsg是查询命令的响应消息. 4.3 使用SMProxy收发短信的例子 4.3.1 直接使用SMProxy发送短信的Demo 当不需要接收ISMG下发的短信和不需要获得ISMG的断连通知的时候,可以直接使用SMProxy类方法发送/查询/删除短信和退出ISMG 使用MySMProxy收发短信的Demo demo.java代码如下 package com.huawei.SMProxy; import com.huawei.SMProxy.*; import com.huawei.insa2.comm.cmpp.message.*; import com.huawei.insa2.util.*; public class Demo { private static Args args; /** 短信收发接口*/ private SMProxy myProxy= null; public Demo() { } /** * 程序入口. */ public static void main(String[] a) throws Exception { try { //生成MySMProxy对象,完成向ISMG的登录 args = new Cfg("SMProxy.xml",false).getArgs("ismg"); args.set("source-addr",loginName.getText().trim()); args.set("shared-secret",loginPass.getText().trim()); smp = new SMProxy(this,args); //发送短信 CMPPSubmitMessage submitMsg = new CMPPSubmitMessage( int pk_Total, int pk_Number, int registered_Delivery, int msg_Level, String service_Id, int fee_UserType, String fee_Terminal_Id, int tp_Pid, int tp_Udhi, int msg_Fmt, String msg_Src, String fee_Type, String fee_Code, Date valid_Time, Date at_Time, String src_Terminal_Id, String[] dest_Terminal_Id, byte[] msg_Content, String reserve ) ; CMPPSubmitRepMessage submitRepMsg = myProxy.send(submitMsg); // 可以增加处理响应消息submitRepMsg的代码 //删除短信 CMPPCancelMessage cancelMsg = new CMPPCancelMessage(byte[] msg_Id) CMPPCancelRepMessage cancelRepMsg = myProxy.send(cancelMsg); // 可以增加处理响应消息cancelRepMsg的代码 //查询短信 CMPPQueryMessage queryMsg = new CMPPQueryMessage( Date time, int query_Type, String query_Code, String reserve) CMPPQueryRepMessagemy queryRepMsg = myProxy.send(queryMsg); // 可以增加处理响应消息queryRepMsg的代码,获得查询结果 //查询SMProxy与ISMG的TCP连接状态 String stateDesc = myProxy.getConnState(); //退出 myProxy.close() } Catch(Exception e) { //异常处理 } } 4.3.2 使用SMProxy收发短信的例子 当SP需要接收ISMG下发的短信或者需要获得ISMG和SMProxy断连通知的时候,需要如下处理 1:从SMProxy类继承的MySMProxy类MYSMProxy.java具体内容如下 package com.huawei.SMProxy; import com.huawei.insa2.comm.cmpp.message.*; import com.huawei.insa2.util.Args; public class MySMProxy extends SMProxy { private Demo demo = null; public MySMProxy(Demo demo,Args args) { super(args); this.demo = demo; } /** * 对ISMG主动下发的消息的处理. * @param msg 收到的消息 * @return 返回的相应消息. */ public CMPPMessage onDeliver(CMPPDeliverMessage msg) { /**@todo do some thing to handle this message. then return a response */ demo.ProcessRecvDeliverMsg(msg); return super.onDeliver(msg); } public void OnTerminate() { demo.Terminate(); } } 2:使用MySMProxy收发短信的DEMO demo.java代码如下 package com.huawei.SMProxy; import com.huawei.SMProxy.*; import com.huawei.insa2.comm.cmpp.message.*; import com.huawei.insa2.util.*; public class Demo { private static Args args; /** 短信收发接口*/ private MySMProxy myProxy= null; public Demo() { } /** * 程序入口. */ public static void main(String[] a) throws Exception { try { //生成MySMProxy对象,完成向ISMG的登录 args = new Cfg("SMProxy.xml",false).getArgs("ismg"); args.set("source-addr",loginName.getText().trim()); args.set("shared-secret",loginPass.getText().trim()); smp = new MySMProxy(this,args); //发送短信 CMPPSubmitMessage submitMsg = new CMPPSubmitMessage( int pk_Total, int pk_Number, int registered_Delivery, int msg_Level, String service_Id, int fee_UserType, String fee_Terminal_Id, int tp_Pid, int tp_Udhi, int msg_Fmt, String msg_Src, String fee_Type, String fee_Code, Date valid_Time, Date at_Time, String src_Terminal_Id, String[] dest_Terminal_Id, byte[] msg_Content, String reserve ) ; CMPPSubmitRepMessage submitRepMsg = myProxy.send(submitMsg); // 可以增加处理响应消息submitRepMsg的代码 //删除短信 CMPPCancelMessage cancelMsg = new CMPPCancelMessage(byte[] msg_Id) CMPPCancelRepMessage cancelRepMsg = myProxy.send(cancelMsg); // 可以增加处理响应消息cancelRepMsg的代码 //查询短信 CMPPQueryMessage queryMsg = new CMPPQueryMessage( Date time, int query_Type, String query_Code, String reserve) CMPPQueryRepMessagemy queryRepMsg = myProxy.send(queryMsg); // 可以增加处理响应消息queryRepMsg的代码,获得查询结果 //查询SMProxy与ISMG的TCP连接状态 String stateDesc = myProxy.getConnState(); //退出 myProxy.close() } Catch(Exception e) { //异常处理 } } 第六五章 API应用FAQ 1. API目前有那些版本? Ans:目前华为SP开发的API有NT版和Unix版本 ,其中NT版叫Smeidll.dll 最新版本为: SmeidllV100R001.1D200 支持SMPP3.4,CMPP2.0 ,SMGP V1.3定义的短消息收 发时所需要的基本函数. nix版叫Smproxy,有linux,IBM,HP,SUN,Java版本、具体程序和相关文 档可向华为索取. 2. 调用API时经常碰到有那些错误? Ans: 在实际应用中经常碰到的问题主要有以下三个:第一、是版本不对,表现为 文档和动态库不配套,版本比较低不支持一些比较新的接口函数.出现此问题时可以向当地用服要求最新版本的接口说明.第二、调用API函数是参数填错,比如应该用整形用字符形,应该用长度为5的字符用了长度为6的字符.第三、调用了老版本的函数,比如利用CMPP协议调用CMPPSubmit 函数时应该调用SubmitAEXEX 却调用了SubmitA 等.碰到问题或者连接不上网关时请首先检查这几个问题. 4.描述: Demo程序链接时出错 Linking... demoDlg.obj : error LNK2001: unresolved external symbol "int __stdcall GetDeliverSMExEx(unsigned long *,unsigned char *,unsigned char *,char *,unsigned char *,unsigned char *,char *,unsigned char *,unsigned char *,unsigned char *,unsigned char *,uns igned char *,char *,unsigned long *,char *,unsigned char *)" (?GetDeliverSMExEx@@YGHPAKPAE1PAD112111112021@Z) Debug/demo.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. Ans: 没有使用最新版本的Smeidll请验证其版本是否最新. Smeidll的最早的版本只支持到 GetDeliverSMEx..同时也可以在export.h中查看是否有相应的函数申明.此外如果发现所有调用动态库的函数都有这个提示:请检查VC菜单:project ……>settings->link Tab的object/library modules 是不是填上要连接的SMEIDLL.LIB 5.连接infoX综合信息平台失败? Ans:首先 检查所采用的协议和端口号是否配对,可参考 IFInitInterface 函数的参数说明. 其次检查帐号名和密码是否正确.物理网络是否正常. 6. 图片和铃声的传输无法完成? Ans:检查UDHI和DCS取值是否正确,具体可参考附录2. 7.网络正常只能接收不能发送消息? SP服务器和infoX网关网络连接正常(ping网络时没有问题)但是确只能收消息不能发消息? ANS:请检查infoX网关的防火墙是否开通此机器IP的上提消息权限. 8.调用SubmitAExEx发送消息,为什么总是发送不成功? ANS:应先确认是否已经登陆,然后检查目的地址是否填写正确(中间不能包含有非法的字符),再看其定时发送时间及有效时间是否格式填写正确(yy/mm/dd hh:mm:ss),并确认没有超时. 9. (UNIX版本)CMPPSnd()返回0,有输出信息 输出下面的内容: "sendqueue full:len:59880,maxlen:60000, read:34229,write:34109,msglen = 243" ANS:发送队列满导致发送失败,可以在配置文件中修改发送缓冲区的大小,其有效值大于0小于102400. 10. (UNIX版本)CMPPGetSndAck()时取到的sub ack是别的进程的CMPPSnd()的 当我们有多个API和SMPROXY联系时, CMPPSnd()一条内容,CMPPGetSndAck()时取到的sub ack有可能是别的进程的CMPPSnd()的.也就是说CMPPSnd() 和CMPPGetSndAck()是完全独立的,不能保证进程可以取到自己的sub ack. ANS:这是由于多个SMPROXY连接到了网关上同一个账号下所致,只需要为不同的SMPROXY建立不同的账号即可解决上述问题. 11. (UNIX版本)SMPROXY 出错,不能重新启动 当SMPROXY 出错时,用smproxy stopX 停止后,用smproxy startX 不能重新启动SMPROXY,出错内容如下: #error, create shared memory, error#43 Identifier removed ANS:如果想重启SMPROXY,除了要将SMPROXY停掉外,还需要将自己的应用停掉才行. 12. 调用函数,返回失败错误值怎么办 调用函数 SubmitA 和SubmitAExEx、 SubmitAExExEx, GetDeliverSMExEx, GetDeliverSMExExEX , 返回失败错误值怎么办? Ans:初始化和登录成功后,调用这两个函数如果失败可以考虑以下解决办法,让维护人员用维测台跟踪infoX信息平台看是否有消息到达infoX 或者从infoX下发,消息是否有异常.如果是 提交消息出错,查看查看对SubmitAEx等的函数参数赋值是否有错. 13.关于IFInitInterface的调用 我使用了你们的默认错误处理机制,那么是否我的应用程序只需要进行1次IFInitInterface的调用?如果以后出现网络问题,是否我就不再调用此方法?API内部自动的建立接口? ANS : 是的,除非接口退出. 14. 接口什么时候能够监测到当低层链路出现故障 接口什么时候能够监测到当低层链路出现故障?如果我调用SubmitAExEx等(或接收)方法时如果出现网络错误,API内部是否会自动建立新的接口? ANS: 这个有个握手的超时时间在 smeidll.ini 的配置文件配置.如果5次握手失败就重连. 15. 是否支持多线程的并发访问 我们需要建立2个线程,1个负责发送,1个负责接收,这2个线程是否可以共享1次IFInitInterface调用产生的接口?如果允许共享,那么1次IFInitInterface调用内部是否产生2个socket?如果不是的话,就会出现问题,因为不能在2个线程中同时对一个socket进行接收、发送操作(因为您内部要进行握手等操作) ANS:可以. 一次IFInitInterface 产生一个Socket 它即可以收也可以发.这个我们程序中有保护.程序中的方法都支持多线程访问. 16.调用SubmitAExEX 返回99号错误? ANS:此时可通过维测台观察在返回的应答中error_code中是多少,根据这个值来查找infoX关于此错误值的说明.根据分析最有可能产生99的情况是动态库和信息平台创建连接没有成功,导致接口无效,或者用户名密码错误. 第六章 API开发注意事项 CMPP2.0协议规定ICP与网关之间保持长连接,并且API可自动提供重连机制,所以在对接口函数的调用时应注意只需在程序启动时调用InitInterface()、及Login_R();无需在自己程序的其它线程中再次调用,而导致登陆多个接口. CMPP协议中的目的地址最多可输入100个,在调用SubmitAExEx 时应注意sDestAddrs的定义为21*100字节的数组,每个号码固定的长度21个字节,不足21位的应赋空(十六进制0).没有特殊情况,请尽量不要使用多目的地址发送.以免消息发送速度信息平台对接口的限制值而发送失败率过高. 短信长度应填写短信的实际字节长度,不应每次都填写短信的最大字节长度140. 调用SubmitAExEx后API会自动等待应答消息,并将应答消息的MsgID通过指针回传.MsgID应注意是一个21位的字符串.10位时间戳+5位的网关代码+5位的序列号. 通过调用GetDeliverExExEx可以将状态报告的MsgID解析出来,可通过此MsgID与调用SubmitAExEx得到的MsgID进行匹配.此API可同时支持SMPP协议、CMPP协议、SGMP协议、应注意其端口号的区别:这些端口号是在登录infoX信息平台的时的端口号. 登录 短消息中心时端口号不同. 协议类型 dwCodeProtocol 端口号 SMPP 3 5018 CMPP 5 7890 SMGP 6 8890 如果利用华为的API,SP可以自动配置握手间隔时间,SP和infoX相连应采用长连接,但是infoX信息平台一般在50秒如果没有收到握手消息时就会断掉和SP的接口.建议SP在程序中对接口的断连写详细的日志,以便查看. 7、关于重发机制.如果SP开发的程序使用重发机制,建议重发的间隔最好设为5分钟之后, 重发次数不要超过5次.具体需要重发的消息也要根据错误码来决定,对于特定的错误码 (比如接口断连,应答超时,SCP应答超时)才采用重发机制,而对于一些错误码(如SCP鉴权失败,用户不存在)则不要重发,以免造成不必要的网络负担. SP获取用户提交上来的消息应该采用内存拷贝方式,不要采用字符串拷贝,否则会导致SP获取不到用户提交上来的消息;消息的长度按照协议和实际长度填写,经常有SP因消息长度填写异常导致程序异常;还有msgid,固网中有一次一个CP此值填写过小,导致CP一提交消息CP的程序就异常退出.而infoX信息平台这边却看不到消息. 利用VB开发中如果发现调用SubmitAExEx 错误, 请检查这个对调用的动态库函数是不是有申明正确. 具体可参考例子程序. 附录1:编制历史 短讯API接口说明 版本号 时间 主要内容和修改说明 对应版本动态库和接口程序版本 短讯API接口说明1.0 2001年11月 主要写适用关于SMPP的接口 SMEIDLL V100R001B01D072P1 短讯API接口说明1.2 2002年8月 增加CMPP,SMGP接口说明 SMEIDLL V100R001B01D20 短讯API接口说明2.1 2002年9月 修订增加Unix下的接口说明和Java接口说明. SMEIDLL V100R001.1D200 短讯API接口说明2.11 2002年10月 修订错误码转换部分,增加支持资费模块的CMPP参数缺省配置 SMEIDLL V100R001.1D301 短讯API接口说明2.12 2003年1月 增加CMPPDeliver函数,增加常见问题. 支持到SMEIDLL V100R001.4D101 短讯API接口说明2.13 2003年3月 根据评审专家意见修改部分错误,完善文档. 支持到SMEIDLL V100R001.1D201 短讯API接口说明2.2 2004-4-10 增加支持SGIP , 重新构造CMPP2.0函数接口 支持到Smeidll V100R001.3D501 附录2:手机铃声图片对应参数表 手机类型 名称 支持的手机型号(测试通过) Tp_pid Tp_udhi ()表示应填的值 DCS 备注 诺基亚 待机图标(Operator logo) 3310 0 40(1) 4 大待机图标(Operator logo) 7110 0 40(1) 4 分组图标(CLI icon) 8210 0 40(1) 4 屏保(screen saver) 3310 0 40(1) 4 单音轨铃声(Monophonic ringtone) 3310 0 40(1) 4 闪烁短信 3310 0 40(1) 4 传情贺卡(Picture message) 3310 0 40(1) 4 音乐贺卡(Downloadable Profile) 3310 0 40(1) 4 西门子 待机图标(Operator logo) 6618 0 0 f5 屏保(screen saver) 6618 0 0 f5 单音轨铃声(Monophonic ringtone) 6618 0 0 f5 爱立信 图片 T20e 0 40(1) 4 单音轨铃声(Monophonic ringtone) T20e 0 40(1) 4 阿尔卡特 屏保 OT511 OT310 7d 40(1) f5 开机图片 OT511 OT310 7d 40(1) f5 单音轨铃声(Monophonic ringtone) OT511 OT310 7d 40(1) f5 摩托罗拉 单音轨铃声(Monophonic ringtone) 6288 0 40(1) 4 其他 免提短信 诺基亚、部分西门子、爱立信、摩托罗拉 0 40(1) 4 注:表中凡是Tp_udhi 等于40, 在调用API函数发送时此参数应该填为1 表示带头结构,到短训中心后会自动被转化成值.40. 附录3: infoX响应消息错误码详细说明. 由于infoX连接系统较多,并且每个系统都有自己的错误码体系,infoX系统很难将它们统一起来,以下列出了infoX系统的常见错误,但也有可能出现错误码重叠的情况,所以还应具体情况,具体分析. SMPP协议 CMPP协议 错误码含义 备注 status=0 result=0 成功 status=49 result=1 消息结构错 注:这些错误码一般不会在infoX的网关出现,只可能此错误是其他网关前转过来. status=51 result=2 命令字错 status=52 result=3 MsgID错误 status=53 result=4 消息长度错 status=54 result=5 资费代码错误 status=55 result=6 超过的最大信息长度 status=56 result=7 业务代码错误 status=57 result=8 流量控制错 status=59 result=9 前转判断错 status=58 result=10 超过了最大网关前传节点 注:网关常见错误码,这些错误码一般是消息在网关被拒绝掉而产生的. status= 30 result=11 找不到路由 status=16 result=12 定时发送时间或有效时间错 status= 12 result=13 各种鉴权失败 status=27 result=14 应答超时 status= 19 result=15 接口无效 status=102 result=16 SCP应答超时 其它 result=17~255 短消息中心或SCP处出错 status=60 result=60 黑名单用户 D200版本才支持此特性 常见的SCP出错的错误码(详细内容请参考SCP错误码表) status=40 result=40 未登记的SP 注:SCP扣费鉴权常见错误码表,详细 status=44 result=44 未登记的SP业务类型 status=50 result=50 移动用户不存在 status=60 result=60 余额不足 常见短消息中心回错误码(华为公司短消息中心) status=19 result=19 无提交权限 注:短消息中心拒绝掉此消息常见错误. status=64 result=64 地址错误 status=65 result=65 超过最大提交数 status=66 result=66 超过最大下发数 华为infoX信息平台返回的错误码可参考如下: 错误值 错误说明 备注 0 表返回成功(除非特别说明) 1 接入码错误 2 主叫错误 3 帐号指针不符 4 SmType错误 5 生成帐号对象失败 6 帐号名错,查无此帐号 7 编码类型错 8 生成IF对象失败 9 超过的最大IF数10 无效的IF的ID 11 帐号的密码错误 12 没有权限 13 PID错误 14 无效的路由表 15 通过HDRV不能找到IF 16 参数错 17 状态错误 18 无效的账号 19 无效接口 20 没有Submit提交权限 21 没有Deliver 消息权限 22 鉴权类型错误 23 号段重复 24 没有指定的号段 25 等待应答队列消息错误 26 解码时DCS有错误 27 应答超时 28 向短消息中心提交消息错误 29 用户输入消息解析错误 30 指定服务未启动 31 接口类型错误 32 地址格式错误 33 错误的参数 34 缓区错误 35 增加跟踪失败 36 终止跟踪失败 38 增加统计任务失败 39 统计类型错误 40 统计记录错误 41 统计ID错误 42 用户管理模块发送错误 43 用户管理状态转换错误 44 用户过多 45 无需要应答用户的消息 46 一般的错误 47 资源不足 48 连接设备的IP错误 49 消息结构错 50 版本太高 51 命令字错 52 消息序号错 53 消息长度错 54 资费代码错 55 超过最大信息长度 56 业务代码错 57 流量控制错 58 经过了过多次数的转发 59 前转判断错误 60 黑名单错误 61 SPID 为空 62 业务类型为空 63 资费类别为空 64 计费类型异常(值不在[00,09]之间 65 定时时间错误 66 SPID错误 67 双机切换错,单机模式收到双机命令 99 其它错误 100 向SCP发送消息时失败 200 SMMC鉴权失败 如果infoX连接短讯中心是华为的短讯中心,短讯中心错误码如下表:如果infoX连接的是别的厂家的短讯中心请向此厂家咨询错误码意义. 错误号 错误类型 错误原因 方向(FROM) 1 未知用户(unknownSubscriber) 用户未开户 HLR 2 未定义用户 (unidentifiedSubscriber) HLR指明路由,但目的MSC没有该MS的注册信息.可能MSC向HLR注册错误,或VLR相关信息删除后没有通知HLR MSC 3 非法用户 illegalSubscriber) 本次短消息发送过程用户鉴权未通过,可能MSC认为该手机鉴权密码非法 MSC 4 电信业务不支持(teleserviceNotProvisioned) 该用户没开通短消息业务 HLR 5 呼叫被禁止(callBarred) 该用户的短讯业务被禁止了 HLR 6 闭合用户群拒绝 (RP_CUG_REJECTED) 主叫用户没有呼叫群外用户的权限,却呼叫群外用户 HLR 7 设备不支持(facilityNotSupported) 手机所在的HLR不支持"移动终结的短消息" 手机所在的MSC不支持"移动终结的短消息" HLR MSC 8 用户不在服务区(absentSubscriber) 上次给该用户发短消息时,msc认为它不在服务区内,所以HLR认为这一次也不用再尝试了,就给短消息中心回这个错误. 手机没上网 HLR MSC 9 用户不在服务区MWDSET HLR报告的用户不在服务区,可能引起的情况有: (1)HLR中MNRF标志置位,手机确实不在服务区,属正常情况. (2)HLR中MNRF标志置位,手机在服务区.这是由于HLR的MNRF标志位更新不及时造成的 HLR 10 SM发送失败 1、如果MSC paging或search过程成功完成,但MS不具备MT能力MSC返回SM转发失败,并带原因"equipment not SM Equipped". 2、MSC向MS传送短消息后,MS返回此错误.可能包含下列原因之一:协议错误或内存已满. MSC/VLR 11 消息等待队列满 (RP_MESSAGE_WAITING_LIST_FULL) 等待向该手机下发消息的SC过多,导致HLR的NWD队列溢出. HLR 12 系统失败 1、MapServer多发过程等待再次下发超时; 2、MapServer收到MSC或HLR响应中送来的提供者错误 MapServer 13 数据丢失(dataMissing) HLR收到的消息包不完整,怀疑是在传输的环节中遭到破坏. MSC收到的消息包不完整,怀疑是在传输的环节中遭到破坏. HLR MSC 14 非预期数据(unexpectedDataValue) 消息包中某一个数据的值超过协议规定的范围. HLR MSC 15 协议错误 (RP_MS_PROTOCOL_ERROR) 手机无法处理短消息相应业务 MSC 16 MS未装备 (RP_MS_NOT_EQUIPED) 手机侧错误 MSC 17 内存满(RP_MEMORY_CAPACITY_EXCEEDED) 该手机的SIM卡的内存已满,不能再存储该短消息. MSC 18 sc拥塞 调度中心拥塞或超过最大提交或下发数 SMSC 19 MS非SC用户 该用户在短消息调度中心鉴权失败 SMSC 20 不正确SME地址 短消息主叫或被叫号码无效 SMSC 21 未知SC 短消息中的短消息中心地址不正确 SMSC 22 非法设备(illegalEquipment) 该设备的设备号(IMEI)非法 MSC 23 用户忙(RP_SUBSCRIBER_BUSY_FOR_MT_SMS) 该手机因为正在进行某一项业务,如发送短消息等等,不能接收短消息. MSC 30 HLR消息解码错误 (RP_UNDECODE_DATA_HLR) HLR消息包中某一个数据的值超过协议规定的范围. HLR 31 MSC消息解码错误 (RP_UNDECODE_DATA_MSC) MSC消息包中某一个数据的值超过协议规定的范围. MSC 32 INFORM_SC消息解码错误 (RP_UNDECODE_INFORM_SC_HLR) HLR消息包(INFORM_SC消息)中某一个数据的值超过协议规定的范围. HLR 33 没有取到足够的路由信息 (RP_NOT_ENOUGH_ROUTING_INFO) 没有取到足够的路由信息 HLR 34 来自HLR的意外数据 (RP_UNEXPECTED_DATA_VALUE_HLR) HLR消息包中某一个数据的值超过协议规定的范围. HLR 35 来自MSC的意外数据 (RP_UNEXPECTED_DATA_VALUE_MSC) MSC消息包中某一个数据的值超过协议规定的范围. MSC 36 来自MSC的未知错误 (RP_UNKNOWN_FAILURE_REASON_MSC) 来自MSC的未知错误 MSC 37 来自HLR的未知错误 (RP_UNKNOWN_FAILURE_REASON_HLR) 来自HLR的未知错误 HLR 40 发路由请求后HLR无应答 MapServer向HLR发送路由后超过60秒HLR仍无回应. 协议规定的超时时间为15秒-30秒 一般由于HLR性能上处理不过来,或找不到SMC的路由引起 MapServer 41 发置位消息后HLR无应答 MapServer向HLR发置位/清位请求后超过60秒HLR仍无回应. 协议规定的超时时间为3秒-10秒 一般由于HLR性能上处理不过来,或找不到SMC的路由引起 MapServer 45 MAPSERVER模块版本错误 没有使用 MapServer 46 HLR版本协商错误 MapServer中下列函数之一返回错误值: 1、SendGetRoutingMsgP2 2、SendGetRoutingMsgP1 MapServer 48 MSC无应答 (RP_MSC_NOACK) MSC对短消息中心发送的MT消息在所设置的时间内没有回应答消息,可能是无线环境比较差造成的. MSC 49 HLR无应答 (RP_HLR_NOACK) HLR对短消息中心发送的取路由消息不回应答消息,可能是HLR性能不够 HLR 51 MSC拒绝 (RP_MSC_REFUSE) 一般是MSC的TCAP层负荷过大,流控后回的消息 MSC 52 HLR拒绝 (RP_HLR_REFUSE) 一般是HLR的TCAP层负荷过大,流控后回的消息 HLR 56 HLR系统错误(HLR-systemFailur): 一般是HLR的MAP层负荷过大,流控后回的消息 HLR 57 MSC系统错误 (MSC system error) 一般是MSC的MAP层负荷过大,流控后回的消息 MSC 58 SGSN系统错误 暂时不使用 61 因流控下发错误 MapServer本地处理错误:因资源受限、会话状态超时、输入参数错误等原因使MapServer自身处理过程出错 MapServer 62 因流控下发错误 MtiServer本地处理错误: 因资源受限、会话状态超时输入参数错误等原因使MtiServer自身处理出错 MtiServer 63 目的信令点或信令转接点SCCP无法传送该消息 目的地或转接点SCCP无法传送该消息:MtiServerUDTS消息.可能是1)目的用户是国际号码,而国际号码的下发路由无法正确解析,中间网络节点就会返回UDTS消息;2)用户随意输入一些目的号码,对该短消息下发取路由的过程中,中间网络节点无法解析出路由,返回UDTS消息 1、排队机 2、STP 3、MSC/VLR 4、HLR 65 GIW无应答 如果大量出现可能的原因为网关负荷很大处理不过来须升级MPU板. SMSC 66 接口临时错误 主要是相关业务模块的接口退出导致,比如梦网网关同短消息中心接口临时断连后可能出现该现象,请检查调度中心与该短消息下发帐号下的接口已经断连 smsc 67 无效接口 下发该短消息的路由对应的接口不存在,请检查该路由对于的接口 SMSC 128 电信业务设备交互未被支持 电信业务设备交互未被支持 SMSC 129 短消息类型0未被支持 短消息类型0未被支持 SMSC 130 不能替换短消息 不能替换短消息 SMSC 143 未指定的TP-PID错误 短消息类型不支持 SMSC 144 字母表数据编码方案(DCS)未被支持 提交的短消息的编码方案不支持 SMSC 145 消息类未被支持 该短消息级别不支持 SMSC 159 指定的TP-DCS错误 短消息中指定的DCS错误 SMSC 160 操作未能被执行 该命令调度中心不支持 SMSC 175 未指定的TP-Command错误 为指明命令字 SMSC 176 TPDU未被支持 该字段不支持 SMSC 192 SC忙 调度中心实体数用完、超过最大提交或下发数 SMSC 193 没有SC指定 该短消息在调度中心鉴权失败 SMSC 194 SC系统错误 调度中心创建短消息失败,可能是资源用尽 SMSC 195 扩展短消息实体地址无效 从短消息实体提交的MO短消息中实体地址错误 SMSC 196 短消息实体被禁止使用 目的短消息实体已经被禁止使用 SMSC 208 SIM中存储短消息的区域满 手机SIM卡已满 SMSC 209 SIM中没有存储短消息能力 手机SIM卡不能存储短消息 SMSC 210 MS错误 手机错误 SMSC 211 扩展短消息实体内存溢出 暂不使用 SMSC 255 未确定的错误原因 SMSC 附录4:Smeidll动态库函数返回值说明 smeidll动态库返回的错误码值在export.h里有详细的定义.这些值一般返回在返回应答的状态值字段里.具体可参考下表. 返回值 值说明 主要发生的函数 0 成功 1 接口没有初始化没有调用初始化函数 2 回包命令字错误 3 分配内存错误 4 其他错误 5 SEND缓冲区太大 6 SEND包不完整 7 协议错 8 协议不支持该格式 9 编码其他错误 10 传送超时 11 接收缓冲区不够大 12 等待失败 13 发送失败 14 源地址错误 SUBMIT函数 15 目的地址错误 SUBMIT函数 16 参数定时时间错误 SUBMIT函数 17 参数超时时间错误 SUBMIT函数 18 参数DCS错误 SUBMIT函数 19 数据变换错误 SUBMIT函数 20 参数UDHI错误 SUBMIT函数 21 用户数据错误 SUBMIT函数 22 超过最大提交数 SUBMIT函数 23 超过最大下发数 SUBMIT函数 24 无效用户,或者用户无权 SUBMIT函数 25 无效数据格式 SUBMIT函数 26 地址错误 SUBMIT函数 27 生成短讯错误 SUBMIT函数 28 短讯不存在 29 查询其他错误 30 地址错误 31 查询不到此消息 32 查询失败 33 用户数据编码出错 34 LEN参数出错 35 地址错误 36 回包的STATUS指示出错 37 源地址错误 38 定时数据错误 39 超时数据错误 40 DCS错误 41 用户数据编码出错 42 用户数据错误 43 短讯正在下发 44 短讯地址错误 45 无效的源地址 46 没有指定的短讯 47 无效数据类型 48 替换失败 49 参数DIR错50 参数用户地址错误 51 参数开始时间错误 52 参数结束时间错误 53 参数查询条数错误 54 回包的STATUS指示出错 55 参数用户号码错误 56 参数用户姓名错误 57 参数用户地址错误 58 参数用户密码错误 59 用户已经存在 60 添加用户失败 61 参数用户号码错误 62 用户不存在 63 删除用户失败 64 参数用户号码错误 65 参数用户姓名错误 66 参数用户地址错误 67 参数用户密码错误 68 修改用户失败 69 用户不存在 70 参数用户号码错误 71 用户不存在 72 握手失败 73 GETDATA失败 74 解码出错 75 没有权限 76 REPLACE UDHI invalid 77 QUERYSMDETAIL LEN INVALID 200 PPS用户鉴权超时 201 PPS用户鉴权失败 202 PPS用户鉴权发送失败 203 通知超时 204 通知客户端返回错误 205 通知临时错误 206 通知严重错误 附录5 :有关CMPP协议和MD5算法的网址 CMPP: http://www.monternet.com/moneditor/zongzhan/sp/ http://www.gmcc.net/others/spjr.html MD5: http://neon.onchina.net/