关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析)

这是数年前给一个公司做的;使用WireShark抓包分析程序问题;是使用WireShark分析程序涉及到网络相关问题的一个很好案例。
    对于进行短彩信开发的人可以详细看一下;非短彩信开发人员可以了解一下WireShark的应用。

短彩信群发业务(SGIP协议),简单来说是这样。是一种电信增值业务。要做短彩信群发的单位,先去当地联通或移动,申请开通此项业务;然后它会提供一根专线,连接到公司的服务器;公司的程序,把要发送短信的用户号码和短信内容,包装为SGIP协议的数据包,一条条的,提交到联通或移动的短信网关,然后就不用管了;联通或移动的短信网关收到SGIP的协议数据,它自己会把短信发给用户手机。
    短信发送程序本质是一个TCP/IP套接字程序,不过要同时实现套接字的发送和接收;因为按SGIP协议要求,提交数据给短信网关,同时也要接收短信网关返回的状态。
    这里SGIP协议是位于TCP/UDP之上的一个应用层协议。SGIP协议,大约60、70页文字,可以全部描述清楚其细节。如果对TCP/IP协议比较了解,对上述应该不难理解。
    短信发送程序可以用C#或Java开发,可以直接用套接字,也可以用一些套接字的包装类。网上有参考源码。
    涉及到SGIP协议术语就不解释了,如需要可网上查阅SGIP资料。SP是指发送端,SMG是短信网关。
    具体的IP之类的一些内容,涉及商业信息的全部隐去,只讨论纯技术问题。
    开发通常先使用模拟网关,是一个程序,就是一个套接字的收发程序,不过它可以分析出SGIP协议数据;短信发送程序对模拟网关进行收发,测试都通过,再对实际网关进行发送。

SGIP这一类型的短信协议,在WireShark中识别出来,很多时候显示为SMPP协议。

一 开发过程中出现的现象

按照sgip协议的要求,SP对SMG发送时,如果ReportFlag字段设置为1,不论该条消息成功与失败,SMG都应返回一个report。
    在实际调试和测试中,不论用模拟网关,还是真实联通网关,在发送程序界面上均未显示有收到report。在SmsServer.cs中有添加代码,当收到report时在界面上添加提示。

需要分析是程序的问题,还是联通方面的问题。

二 分析

由于联通网关现在并不能deliver;SubmitResp是SP对SMG进行提交短信时,SMG被动返回的;Report和Deliver都是SMG主动发送的;所以可能是联通关闭了主动发送功能。
    该问题应该不影响短信发送。只要收到SubmitResp即可。
    但为了程序可靠性,通过实际分析测试来证实。

三 程序界面

在TcpSocketServer.cs的AcceptCallBack函数内,收到一个Bind之后,添加:
    this.addText(">>>>>>接收到网关Bind请求!!!");//测试用
    这样如果收到网关主动连接请求,就会在界面上提示;

在SmsServer.cs的ServerRecvEvent函数中的switch语句中,当分支条件为5时,即收到网关report时,添加:
    this.AddTextEvent(string.Concat(new object[] { ">==接收到SGIP_REPORT    手机号", report.UserNumber, ";状态:", report.ErrorCode }));
    这样如果收到网关Report,就会在界面上提示;

四 抓包工具WireShark的安装配置使用

在WireShark官网下载WireShark,然后安装,安装过程中弹出提示安装WinPcap, WireShark是用WinPcap开发的,要同时安装上WinPcap;安装结束即可使用。

抓包
    启动WireShark,选定网卡,点击开始,即开始包的捕获。
    如果网卡接口选择列表为空,或者弹出相关提示,表明NPF服务没有启动,WireShark抓包需要该服务。以管理员身份运行CMD,然后执行net start npf命令,启动npf服务。

需要选定合适的网卡或接口,如选择不对将不会捕获到需要的包,或者只能捕获一个方向(流进或流出)的包。

网卡与连接选择列表

五 对模拟网关的抓包分析

由短信发送程序对网关进行三次发送,每次25条。
    首先启动WireShark,开始抓包。然后启动发送程序进行发送。发送结束停止抓包。

所捕获的包包含此时段内所有在本机网卡上流进流出的包。数量比较多,难以进行分析,需要进行过滤,过滤出网关对发送程序返回的包进行分析。

编写过滤表达式如下:
    ip.dst==192.168.1.29 and ip.src==192.168.1.37 and !udp

即只需要目的地址为本机(192.168.1.29)、源地址(模拟网关部署地址)为192.168.1.37的包,并滤除所有UDP包。

过滤后的包数量较少,可进行分析。
    以第三次发送捕获后过滤后的包进行示例,如下图。

由模拟网关对短信发送程序返回的包可见,返回的包的类型主要有TCP的ACK包(即模拟网关对发送程序请求建立连接的确认包)、
    SMPP Query_sm - resp包(WireShark把SGIP协议认为SMPP协议)。

在所有返回的包中并未发现有report类型的包。

六 对真实的联通网关进行抓包分析

由短信发送程序进行四次发送,10条三次,20条一次。分别捕获每次发送时的包。

然后用WireShark打开所捕获的包,键入过滤表达式:
    ip.dst==xxx.x.xxx.xxx and ip.src==xxx.xx.xxx.xxx and !udp

即由联通网关对短信发送程序部署机器返回的包,并滤除所有UDP包;
    过滤后进行分析。

以10条第二次、20条第一次为例,如下图所示。

由联通网关对短信发送程序返回的包中主要包含三类包:联通网关对短信发送程序请求建立连接的包(TCP的SYN包)、联通网关对短信发送程序建立连接请求返回的确认包(TCP的ACK包)、联通网关对发送程序提交的短信返回的响应(SMPP Query_sm - resp,
WireShark把SGIP协议认为SMPP协议)。

在所有返回的包中并未发现有report类型的包。

七 结论、电话联系

由以上可知,联通网关收到短信后并未返回Report。程序本身没有问题。

电话联系联通陈工,陈工表示“状态报告是通过上行接口返回的”,联通的上行接口没有开放,不能收到返回的Report是正常的,与分析情况相符,和报告中 二 的意思是一致的。

关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析)相关推荐

  1. java 联通短信发送,做联通短信接口(JAVA)的开发遇到个有关问题

    Java codepublic static ZxsSGIPSMProxy sgipProxy = null; /** * 用SGIP长连接发送联通短信 * * @param mobile * @pa ...

  2. Java+Demo对接中国移动 云MAS短信发送(http协议详解,新测成功!)

    一.登录官网,下载http接入文档(随着官网不断更新,可参考官网的文档) 官网地址为:云mas业务平台 进入云MAS管理平台,找到 管理-接口管理 的列表页. (必读:本文对接方式是 java引用ja ...

  3. 开发短信发送程序的几则技巧

    主要针对smpp协议(扩展协议:cmpp等). 1. check resp status and process it, such as incorrect bind status; 2. contr ...

  4. java实现基于SGIP协议开发联通短信的方法

    本文实例讲述了java实现基于SGIP协议开发联通短信的方法.分享给大家供大家参考.具体如下: 近段时间,由于公司的业务需要,开发出了联通短信.此文章的编写也是根据网上的一些示例来完成的.闲话少说,下 ...

  5. java项目短信群发接口_JAVA实现第三方短信发送过程详解

    想使代码生效需要注册: 在muven项目里面导入jar包 commons-codec commons-codec 1.4 commons-httpclient commons-httpclient 3 ...

  6. android短信发送和接受

    短信发送 发短信第一件事是在manifest文件中添加权限 <uses-permission android:name="android.permission.SEND_SMS&quo ...

  7. C#基于联通短信Sgip协议构建短信网关程序.net

    此软件基于中国联通Sgip协议程序接口,适合在中国联通申请了短信发送端口的公司使用.短信已经成为现在软件系统.网络营销等必不可少的应用工具.可应用在短信验证.信息.游戏虚拟商品购买.事件提醒.送祝福等 ...

  8. python小程序短信发送助手

    文章目录 前言 一.短信发送助手是什么? 二.使用步骤 1.引入库 2.循环发送 3.全部代码 5.运行结果 总结 前言 在当今时代每个人已经离不开网络,在网上冲浪的过程中我们难免会遇到喷子.作为一名 ...

  9. android 发短信意图,安卓实现发送短信小程序代码示例

    这篇文章主要介绍了Android开发中实现发送短信的小程序示例,文中还附带了一个监听广播接收者的升级版短信发送例子,需要的朋友可以参考下 上图为代码结构图. 现在我们看下具体的代码. Send.jav ...

最新文章

  1. listen函数的第二个参数_【图像处理】OpenCV系列十七 --- 几何图像变换函数详解(一)...
  2. 小程序调用微信支付返回错误
  3. python装饰器原理-python装饰器原理与用法深入详解
  4. UIUC同学Jia-Bin Huang收集的计算机视觉代码合集
  5. 网易云助力云音乐短视频功能快速上线
  6. php mysql_query的的用法_PHPmysqli_query()函数定义与用法
  7. java中对集合操作的易错点01
  8. Facebook将在印度测试联网无人机,可连续飞行90天
  9. 2018-2019-1 20165214 《信息安全系统设计基础》第八周学习总结
  10. CNN进行新闻文本分类代码实战,包含分类文本
  11. 1777亿重罚,苹果瑟瑟发抖!
  12. java标识符的介绍_Java标识符所有关键字
  13. 文献笔记(7)(2017ISSCC 14.3)
  14. 一文看懂马尔科夫过程
  15. 【电脑使用】误删Win10自带应用如何恢复
  16. 初探Flowable流程引擎,偶遇多实例子流程
  17. 利用python进行假设检验
  18. 用认真的态度面对人生用心的思考
  19. 《1984》中所描绘的是怎样的一个存在
  20. Day13_06_openssl 对称加密算法enc命令详解

热门文章

  1. java ajax无刷分页_asp.net+ajax+json来实现无刷新分页功能
  2. 整合mybatis——使用纯注解整合、使用Mapper+Mapper.xml整合、使用mybatis.cfg.xml整合
  3. idea 开发 maven 项目
  4. java的知识点34——任务定时调度(多线程)
  5. JQuery移除事件
  6. 基于单片机的简单的任务调度器
  7. CTFshow php特性 web147
  8. delphi项目文件说明
  9. 【upc 9541 矩阵乘法】非正解
  10. 第4周实践项目1 建立单链表(非多组织结构)