`
逆风的香1314
  • 浏览: 1437159 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用spapi.jar开发包通过联通平台发长短信

阅读更多
      最近项目中遇到用java程序通过中国联通G网短信平台发送长短信的需求,所谓长短信就是将内容超过70个字符的短消息拆分成多条70字符以内的短信分别发送,而在用户的手机上将所有的内容在一条消息中显示出来。因为我之前一直是做j2ee开发的,对短信这一块并不熟悉,拿到需求之后请教了几位做SP的朋友。从他们哪里得知运营商处理短信发送有两种方式,移动采取CMPP协议、联通采用SGIP协议,由于这两个协议都是由所谓SMPP协议派生出来的,所以两者许多共同之处。虽然如此在项目实施过程中仍然遇到了一些问题,鉴于blogjava鼓励原创的风格,也尝试写一篇小文,记录解决这些问题的过程,希望对需要的朋友有帮助,也简单总结一下本人在调用他人jar包和处理java编码问题时积累的一点小经验,有不当之处请朋友们指正。
一、关于spapi.jar短信发送包br /> 要让用户的手机能够识别该短信是否是长短信,根据协议规定,应在内容字段中增加包头: 
包头一共6个字节,如下: 
1、字节一:包头长度,固定填写0x05;
2、字节二:包头类型标识,固定填写0x00,表示长短信;
3、字节三:子包长度,固定填写0x03,表示后面三个字节的长度;
4、字节四到字节六:包内容:
  
1)字节四:长消息参考号,每个SP给每个用户发送的每条参考号都应该不同,可以从0开始,每次加1,最大255,便于同一个终端对同一个SP的消息的不同的长短信进行识别;
  
2)字节五:本条长消息的的总消息数,从1到255,一般取值应该大于2;
  
3)字节六:本条消息在长消息中的位置或序号,从1到255,第一条为1,第二条为2,最后一条等于第四字节的值。
包头和内容部分经过本人试验必须采用UCS2也就是Unicode编码方式发送给短信网关,发送过程采用spapi.jar包中的spApi.Submit类的对象绑定Socket流的方式。这里要特别指出,Submit类的默认初始化方法对编码方式和字符缓冲区进行了区分,造成UCS2编码发送短信时加上包头后手机显示乱码。所幸该类还提供了setContent()方法,只要通过该方法以指定的编码方式传入String型的短信内容,即可解决乱码问题。

Submit submit = null;
   .......
//获得输入输出流,可参考spapi.jar示例程序


submit 
= new Submit(spConfig.getSmsNodeID(), // node id同上
    spConfig.getSmsSpNumber(), // cp_phone
    spConfig.getSmsCPNUMBER(), // 付费号码
    1// 接收短消息的手机数
    "86130xxxxxxx"// 手机号码前面加86
    spConfig.getSmsCPID(), // cp_id
    "",// 业务代码
    0,// 计费类型
    "500",// 短消息收费值
    "500",// 赠送话费
    1,// 代收标志
    1,// 引起MT的原因
    9,// 优先级
    "",// 短消息终止时间
    "",// 011125120000032+短消息定时发送时间
    1,// 状态报告标志
    1,// GSM协议类型
    1,// GSM协议类型
    8,// 短消息编码格式
    0,// 信息类型
    2,// 短消息长度,此处仅为了得到对象任意填入
   new byte[]{0x00,0x00});//内容,任意填入
//该方法才真正写入内容。
submit.setContent(8, new String (byte_content);

submit.write(out);
// 发送submit
当然,最佳的方法是重写Submit类的初始化方法,希望该开发包在下一版本推出时候已经解决了此问题。
二、关于编码
    通过String.getByte(String charsetName)方法以指定编码格式产生字符串的byte数组,而String的构造方法String(byte[] bytes, String charsetName),可以将byte数组以指定的编码格式解析为字符串。在这里采用iso-10646-ucs-2编码方式:
String message="xxxx";//中英文混合字符串
byte[] messageUCS2 = message.getBytes("iso-10646-ucs-2");
byte[] tp_udhiHead = new byte[6];
tp_udhiHead[
0= 0x05;
tp_udhiHead[
1= 0x00;
tp_udhiHead[
2= 0x03;
tp_udhiHead[
3= 0x0A;
tp_udhiHead[
4= 0x02;// 共两条短信
tp_udhiHead[5= 0x01;// 默认为第一条
byte[] tp_udhiHead = byteAdd(tp_udhiHead,messageUCS2);//将messageUCS2加入到tp_udhiHead后面
String strContent=new String (tp_udhiHead,"ISO8859-1")
message和strContent(除去包头部分)的内部编码是一致的,这样保证了发送的短信在用户手机上不会因为内容部分增加了包头而显示乱码。
    小结如下:
1、在采用项目外部提供的公共类包时候,要有怀疑态度,不能想当然认为原程序作者已经实现了所有你要的功能,毕竟写程序的是人,他也可能犯错。
2、遇到乱码问题,最好能将程序化繁为简,并尽可能在测试平台上多做测试,光凭想象有时候并不能很快解决问题,反而容易浪费时间。
3、在遇到问题时要和有经验的人多讨论,这有助于你找到解决问题方法,但是记住最终解决问题的,只有你自己,不能完全寄希望于他人。
分享到:
评论
1 楼 yong0902 2011-12-13  
这个确实可以,感谢楼主

相关推荐

    根据SGIP协议连接联通网关spApi.jar

    在本文中,我们将深入探讨如何使用`spApi.jar`这个库来根据SGIP协议连接到联通网关。 首先,`spApi.jar`是一个Java库,包含了一系列接口和类,用于实现SGIP协议的客户端功能。开发人员可以利用这些工具与联通网关...

    联通SGIP协议开发包源码,实现对中国联通SGIP短信发送协议对接

    该联通SGIP协议开发包源码旨在提供对中国联通SGIP短信发送协议的完美对接,并通过Java源码实现Bing命令和Submit命令。这意味着您可以轻松地使用这个开发包来快速集成SGIP协议,从而更加高效地发送短信。此外,该开发...

    联通短信开发spApi

    联通短信开发jar包,此版本为1.0 。根据SGIP协议连接联通网关jar包

    smproxy(20040730).jar

    总的来说,"smproxy(20040730).jar"是基于CMPP3.0协议的高效短信发送工具,为开发者提供了便捷的API,降低了开发难度,提升了短信服务的实施效率。通过合理地利用这个工具,企业或个人可以快速构建起短信发送系统,...

    联通SGIP短信发送程序举例(java)

    4. **Java库的使用**:在Java项目中,开发者可以通过`import`语句引入外部库,比如SPApi.jar,以使用其中封装好的方法和类。这通常是通过在构建路径中添加库文件或使用Maven、Gradle等依赖管理工具实现的。 5. **...

    华为短信开发包(Java)

    华为短信开发包主要针对的是企业级的短信服务,它提供了多种协议的支持,包括CMPP2、CMPP3、CNGP、SGIP、SMGP和SMPP,这些协议是通信行业中用于短信传输的标准协议。下面将详细介绍这些协议以及与它们相关的Java开发...

    API of EMPP

    2. **客户短信提交**:客户通过某种方式(如Web界面、API等)向SP提交短信的过程。 3. **提交方式**:包括但不限于Web界面提交、HTTP POST请求提交、EMPP协议提交等。 4. **提交成功**:表示短信已由SP接收并准备...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    JAVA版_SGIP协议的API

    API文件名为`spApi.jar`,其中包含了实现SGIP协议所需的所有类。这些类按照功能进行了分类,并继承自基类`SGIP_Command`。为了确保API能够被正确使用,需要将其添加至项目的CLASSPATH环境变量中。 #### 3. 类SGIP_...

    集成安卓主流优秀第三方组件框架.zip

    这是一个集成目前Android主流优秀第三方组件、优秀好用的自定义控件、实用工具类封装、以及一些APP共通模块(比如:版本更新、意见反馈、引导界面等等)的开发包,帮助程序员快速开发自己的APP   已集成第三方...

    Android例子源码集成安卓主流优秀第三方组件框架.zip

    这是一个集成目前Android主流优秀第三方组件、优秀好用的自定义控件、实用工具类封装、以及一些APP共通模块(比如:版本更新、意见反馈、引导界面等等)的开发包,帮助程序员快速开发自己的APP 已集成第三方开源...

    Android集成主流优秀第三方组件框架

    以及一些APP共通模块(比如:版本更新、意见反馈、引导界面等等)的开发包,帮助程序员 快速开发自己的APP 已集成第三方开源组件: 网络请求库android-async-http 图片异步加载库universal-image-loader Sqlite...

    集成目前Android主流优秀第三方组件

    这是一个集成目前Android主流优秀第三方组件、优秀好用的自定义控件、实用工具类封装、以及一些APP共通模块(比如:版本更新、意见反馈、引导界面等等)的开发包,帮助程序员快速开发自己的APP 已集成第三方开源...

Global site tag (gtag.js) - Google Analytics