JAVA SGIP 调研文档(二)
三:短信下行
短信下行流程:JAVA程序-->联通网关-->短信中心-->测试手机
短信下行的原理:在程序里设定手机号以及一系列参数(大约20个左右),之后调用SGIP-API的短信发送程序,程序将短信发送至短信网关,短信网关接到短信后,返回状态码(此状态码只是代表短信网关接收成功or失败,并未真正下发至用户手机中),之后短信网关将短信下发至相关的短信中心,最后由短信中心发送至用户手机。待成功下发到用户手机后,短信网关会将一条回执报告推送至上行短信监听服务器。
注意事项:
测试机器必须可以连接外网,并且可以telnet通联通短信网关的IP地址,如果外网转内网的话,需要使用TCP-TRACE工具做IP转换。
发送短信返回码详解:
0 下发成功
-1 消息数据检测,格式不正确
-2 响应超时
-3 链路异常断链
-4 BIND异常,用户名或密码错误
短信下行主要用到的是SGIPClientDemo这个项目。
你需要修改test这个类。
第一步:修改一些参数~~~~
info.IP = "111.111.1.11";//联通运营商网关IP地址
info.port = 8801;//联通运营商网关端口
info.userName = "yang";//用户名
info.passWord = "yanglala";//密码
info.maxLink = 20;//最大连接数
第二步:修改一堆参数~~~~
submit.getBody().setSPNumber("100000000000");//特服号
submit.getBody().setChargeNumber("000000000000000000000");//21个0 付费的手机号码
submit.getBody().setUserCount(1);//用户数量 默认为1
submit.getBody().setUserNumber("8613333333333"); //用户号码 发送的目的手机号码 前面要加86
submit.getBody().setCorpId("22222");//企业ID,企业代码 5位代码 你们申请的
submit.getBody().setFeeType(0);//付费类型 默认0
submit.getBody().setFeeValue("0");//付费值 默认0
submit.getBody().setGivenValue("0");//下面都是默认值,就不写注释了。
submit.getBody().setAgentFlag(0);
submit.getBody().setMorelatetoMTFlag(0);
submit.getBody().setPriority(0);
submit.getBody().setExpireTime("");
submit.getBody().setScheduleTime("");
submit.getBody().setReportFlag(1);//1是返回状态报告, 0是不返回
submit.getBody().setTP_pid(0);
submit.getBody().setTP_udhi(0);
submit.getBody().setMessageCoding(8);//默认值
submit.getBody().setMessageType(3);//默认值
submit.getBody().setMessageContent("zhjt2222est".getBytes());//短信内容
submit.getBody().setReserve("dd");//不知道是什么东东,貌似没有用。
注释详解:
sgipBody.setAgentFlag(agentFlag);代收费标志 0
sgipBody.setChargeNumber(chargeNumber);付费号码 21个0
sgipBody.setCorpId(corpId);企业代码
sgipBody.setExpireTime(expireTime);消息终止时间 默认为空
sgipBody.setFeeType(feeType);计费类型 1
sgipBody.setFeeValue(feeValue);计费值 0
sgipBody.setGivenValue(givenValue);赠送话费 0
sgipBody.setMessageCoding(messageCoding); 0 ascii /编码格式 / 8 unicode / 15 GBK 广东网关为8
sgipBody.setMessageContent(messageContent);短信内容
sgipBody.setMessageLength(messageLength);短信长度 默认不填
sgipBody.setMessageType(messageType);消息类型 0
sgipBody.setMorelatetoMTFlag(morelatetoMTFlag);引起下行消息的原因 0
sgipBody.setPriority(priority); 优先级 0
sgipBody.setReportFlag(reportFlag);报告返回标志 1 返回 0 失败才返回,成功不返回。
sgipBody.setReserve(reserve);业务代码 按例子里的填
sgipBody.setScheduleTime(scheduleTime);计划执行时间 默认不填
sgipBody.setServiceType(serviceType);服务类型 默认不填
sgipBody.setSPNumber(number);特服号
sgipBody.setTP_pid(tp_pid);TSM协议类型 默认0
sgipBody.setTP_udhi(tp_udhi);长短信标志 默认0 1是长短信,0短短信
sgipBody.setUserCount(userCount);用户数 1
sgipBody.setUserNumber(userNumber);用户手机号
第三步:
设置完成之后就可以RUN了,就是这么简单!
RUN AS -->JAVA APPLICATION 不用我教你了吧?
PS:你的测试机器必须是能连接到外网的机器,如果telnet不通联通的IP和端口,那么一切都是徒劳无功的~
发送完毕后,在SGIPServerDemo项目中的receiveThread类里会有接收状态码哦,亲~
上述例子都是使用zte(中兴API)进行测试,因为我们用的是广州联通的短信网关,因此测试下行时用的手机需为中国联通的手机号,否则下行短信会收不到短信。
(短信下发后,并不是所有的短信都会发送成功。并且发送成功后,接收也会有延迟,望周知。)
SGIP技术支持:13189004174,不要随便骚扰他们,谢谢。
--------------------------------------------------
测试环境:
网关API:SGIP中兴API
短信网关:广东联通短信网关
测试手机:苹果手机(北京联通),安卓手机(沈阳联通)
测试描述:
1.循环发送20条短信至苹果手机(北京联通),其中1条短信发送失败,19条短信发送成功。
测试手机只能收到7条短信,而广东联通短信网关的技术支持答复:是手机的的问题,短信网关显示都已下发成功。
2.循环发送20条短信至安卓手机(沈阳联通),其中1条短信发送失败,19条短信发送成功。
测试手机能接收到全部19条短信,但是接收第一条短信与接收最后一条短信的时间间隔过大,大约20分钟。
广东联通短信网关的技术支持答复:这是正常情况,因为网络延迟或通道堵塞导致。
问题列表:
1.下发短信有可能会因为连不上短信网关而导致下发失败。
2.会出现短信回执报告显示“下发成功”,但实际手机没有收到短信的情况发生。
3.会出现短信接收延迟的情况,例如:程序成功下发一条短信至手机,而手机在20分钟后才收到这条短信。
有问题请在回复里留言,我会为大家解答相关问题。祝愿所有的程序员都会前途似锦,锦上添花,花红柳绿, XXXX。