博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于SGIP协议编写短信网关接口
阅读量:6798 次
发布时间:2019-06-26

本文共 6174 字,大约阅读时间需要 20 分钟。

通过不断的调试和沟通,短信功能终于好使了

为了让更多的人少走弯路,特将编写方法和注意事项记录下来,希望能够对大家有帮助;

短信网关的申请流程(此部分工作我们有专门的同事去搞定,我仅略知一二,仅供参考);

向宽带公司(我们用的是联通在信平台)提交申请,然后一顿审核,

审核通过后,宽带公司在网关做数据(分配接入号、公司代码、绑定ip等)

做完数据后会通知接口人,并要求测试

基于SGIP协议的短信接口开发:

我是在华为的短信开发包的基础上开发的,由于不知道该包是否涉及版权问题,所以本人暂不提供了,可以到网上自行解决;

下载后就是一个jar包

短信发送的代码如下:

 

上行:

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import com.huawei.insa2.comm.sgip.message.SGIPMessage;
import com.huawei.insa2.comm.sgip.message.SGIPSubmitMessage;
import com.huawei.insa2.comm.sgip.message.SGIPSubmitRepMessage;
import com.huawei.insa2.util.Args;
import com.huawei.smproxy.SGIPSMProxy;
public 
class Mt {
    
private 
static String SPNumber = 
"
1065579112
";
//
接入号码
    
private 
static String ChargeNumber = 
"
000000000000000000000
"
//
 计费号码,我们是白名单
    
private 
static String ServiceType = 
"
JXHD
";
//
服务类型
    
private 
static String host = 
"
192.168.88.156
"
//
 主机名,网关IP
    
private 
static 
int port = 
8801
//
 端口号,这里特别注意下,接入协议中写的是8804,害得我调了很久,后来才知道改了,所以,这个在接入前,建议与网关人员确定
    
private 
static String CorpId = 
"
52322
"
//
 企业代码
    
private 
static String login_Name = 
"
fslt
"
//
 登陆名
    
private 
static String login_PassWord = 
"
fslt
"
//
 登陆密码
    
public 
static 
void main(String[] args) throws UnsupportedEncodingException {
        
int srcnode =
new BigInteger(
"
82322
").intValue();    
//
源节点编号,这一步非常重要,华为包中,该字段类型为int,而接入协议中要求在企业代码前加上30000,这样就超过了int的取值范围,所以需要用BigInteger转一下就可以了
        Args argstr = 
new Args();
        argstr.
set(
"
host
", host);
        argstr.
set(
"
port
", port);
        argstr.
set(
"
transaction-timeout
"
10); 
//
 操作超时时间(单位:秒)
        argstr.
set(
"
read-timeout
"
15); 
//
 物理连接读操作超时时间(单位:秒)
        argstr.
set(
"
source-addr
",  srcnode); 
//
 SP…ID(最大为六位字符)
        argstr.
set(
"
login-name
", login_Name);
        argstr.
set(
"
login-pass
", login_PassWord);
        argstr.
set(
"
debug
"
"
false
");
        
        
//
 连接登陆
        SGIPSMProxy sgipsmp = 
new SGIPSMProxy(argstr); 
//
 这里
        
try {
            
//
connect表示向SMG登陆,登录名与密码分别是SMG向SP分配的用户名与密码,调用这个接口方法,向SMG发送Bind命令消息。
            
//
如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理。
            boolean reslut = sgipsmp.connect(login_Name, login_PassWord); 
//
 登陆得到true和false
            
if (reslut) {
                System.
out.println(
"
连接成功...........
");
            } 
else {
                System.
out.println(
"
连接失败(用户名或密码错误)...........
");
                
return;
            }
        } 
catch (Exception ex) {
            System.
out.println(
"
网络异常...........
");
            ex.printStackTrace();
            
return;
        }
        String[] UserNumber = { 
"
8618686619970
",
"
8618686619977
"};
//
接收短信的手机号码,前边要加上86
        String content = 
"
抚松联通家校互动项目已成功启动,发送一个测试信息给您!
";
        
byte[] MessageContent = content.getBytes(
"
GB2312
");
        
try {
            
//
 下发短息
            SGIPSubmitMessage sgipsubmit = 
new SGIPSubmitMessage(
                    SPNumber, 
//
 SP的接入号码
                    ChargeNumber, 
//
 付费号码 string
                    UserNumber, 
//
 接收该短消息的手机号,最多100个号码 string[]
                    CorpId, 
//
 企业代码,取值范围为0~99999 string
                    ServiceType, 
//
 业务代码,由SP定义 stirng
                    
03
//
 计费类型 int
                    
"
0
"
//
 该条短消息的收费值 stirng
                    
"
0
"
//
 赠送用户的话费 string
                    
0
//
 代收费标志0:应收1:实收 int
                    
0
//
 引起MT消息的原因 int
                    
06
//
 优先级0~9从低 到高,默认为0 int
                    
null
//
 短消息寿命的终止时间 date
                    
null
//
 短消息定时发送的时间 date
                    
1
//
 状态报告标记 int
                    
0
//
 GSM协议类型 int
                    
0
//
 GSM协议类型 int
                    
15
//
 短消息的编码格式 int
                    
0
//
 信息类型 int
                    MessageContent.length, 
//
 短消息内容长度 int
                    MessageContent, 
//
 短消息的内容 btye[]
                    
"
0
" 
//
 保留,扩展用 string
            );
            
//
 收到的响应消息转换成rep
            
int status = ProcessSubmitRep(sgipsmp.send(sgipsubmit));
            System.
out.println(status);
            
if (status == 
0) {
                System.
out.println(
"
消息发送成功..........
");
            } 
else {
                System.
out.println(
"
消息发送失败..........
");
            }
        } 
catch (Exception ex) {
            ex.printStackTrace();            
        }
    }
    
private 
static 
int ProcessSubmitRep(SGIPMessage msg) {
        
//
 收到的响应消息转换成repMsg
        SGIPSubmitRepMessage repMsg = (SGIPSubmitRepMessage) msg;
        System.
out.println(repMsg.getSrcNodeId());
        System.
out.println(
"
status:::::::
" + repMsg.getResult());
        
if (repMsg != 
null && repMsg.getResult() == 
0) {
            System.
out.println(
"
发送成功:::
");
        }
        
return repMsg.getResult();
    }
}

 

 下行:

 

import com.huawei.insa2.comm.sgip.message.SGIPDeliverMessage;
import com.huawei.insa2.comm.sgip.message.SGIPMessage;
import com.huawei.insa2.comm.sgip.message.SGIPSubmitRepMessage;
import com.huawei.insa2.util.Args;
import com.huawei.smproxy.SGIPSMProxy;
public 
class Mo extends SGIPSMProxy {
    
//
SMG服务器信息
    
private 
static String serHost = 
"
192.168.88.156
";
    
private 
static 
int serviceport = 
8801;
    
    
//
本机信息
    
private 
static String localhost = 
"
192.168.88.156
";
    
private 
static 
int localport = 
8805;
    
    
//
private static String login_Name="huanghai";
    
//
private static String login_PassWord="123456";
    
    
public Mo(Args args) {
        super(args);
        System.
out.println(
"
进入启动监听........
");
        startService(localhost, localport); 
//
我想知道这里传递的host和port是本地的还是那的
    }
    
public 
static 
void main(String[] args)
    {
        Args argstr = 
new Args();
        argstr.
set(
"
serHost
", serHost);
        argstr.
set(
"
serviceport
", serviceport);
        argstr.
set(
"
localhost
", localhost);
        argstr.
set(
"
localport
", localport);
        argstr.
set(
"
transaction-timeout
"
10); 
//
 操作超时时间(单位:秒)
        argstr.
set(
"
read-timeout
"
15); 
//
 物理连接读操作超时时间(单位:秒)
        
//
这里的安全认证问题如何解决?
        
        Mo mymo=
new Mo(argstr);        
    }
    
/*
*
     * 收到用户回复的短信(上行)。
     * 
     * @param msg
     *            收到的消息
     * @return 返回的相应消息。
     
*/
    
public SGIPMessage onDeliver(SGIPDeliverMessage msg) {
        
/*
* @todo do some thing to handle this message. then return a response 
*/
        ProcessRecvDeliverMsg(msg);
        System.
out.println(
"
正在等待接收.......
");
        
return super.onDeliver(msg);
    }
    
/*
*
     * 对收到短讯中心下发的短消息的处理。 收到用户信息
     * 
     * @param msg
     *            短讯中心下发的短消息
     
*/
    
public 
void ProcessRecvDeliverMsg(SGIPMessage msg) {
        
if (msg instanceof SGIPSubmitRepMessage) {
            System.
out.println(
"
返回下发短信的相应消息
");
        }
        
if (msg instanceof SGIPDeliverMessage) {
            
//
 收到用户发送的短信(上行)
            SGIPDeliverMessage deliverMsg = (SGIPDeliverMessage) msg;
            String userNumber = deliverMsg.getUserNumber(); 
//
 手机号码
            String msgContent = deliverMsg.toString(); 
//
 短信内容
            
//
 byte[] msgId = deliverMsg.getMsgContent();
            System.
out.println(
"
userNumber::::::
" + deliverMsg.getUserNumber());
            System.
out.println(
"
msgcontent:::::::
" + deliverMsg.toString());
            System.
out.println(
"
spNumber::::::::
" + deliverMsg.getSPNumber());
            
//
log.info("收到消息:" + deliverMsg);
            System.
out.println(
"
收到消息 :
"+deliverMsg);
            
            
int commandId = deliverMsg.getCommandId(); 
//
 响应类型
            System.
out.println(
"
commandId:::::::::
" + commandId);
            
if (commandId == 
0) { 
//
上传短信(接收)
                System.
out.println(
"
dstaddr::::::
" + deliverMsg.getSPNumber());
                
try {
                } 
catch (Exception e) {
                    
//
 TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

 

代码参考:

 

JAR包下载+说明书下载+SGIP1.2官方文档:

转载地址:http://dyuwl.baihongyu.com/

你可能感兴趣的文章
通讯录设计
查看>>
课后作业
查看>>
浮点数类型转换的及其内存模型
查看>>
1090: 整数幂(多实例测试)
查看>>
配置了java环境变量后不起作用
查看>>
Swift 函数式数据结构 - 链表
查看>>
L1-011 A-B Java 部分解
查看>>
HTTP/1.1与HTTP/1.0的区别[转]
查看>>
css 引用图片 相对路径
查看>>
sql server 用户“sa”登陆失败
查看>>
DataGrid中嵌入CheckBox控件
查看>>
表单发送文件及加自定义参数
查看>>
软工个人作业4
查看>>
程序代码阅读与分析
查看>>
Linux 安装PHP PECL 百分百成功
查看>>
关于c++风格 code style
查看>>
svn 常用
查看>>
SVM支持向量机
查看>>
Asymptote 学习记录(2):例子阅读
查看>>
《常微分方程教程》习题2-2,4:一个跟踪问题
查看>>