精华内容
下载资源
问答
  • 具体只要取出TCP或UDP IP协议的报文头就像wireshark工具那样点击报文 下面根据不同层解析出来。。求大神指点。。像这样 [img=https://img-bbs.csdn.net/upload/201503/03/1425368540_304747.jpg][/img]
  • WebService soap报文请求与响应报文解析

    万次阅读 多人点赞 2016-11-06 23:07:52
    需求  今日公司要做一个协同办公系统(OA),PC端已经完成。现在要做一个手机端网页端的。...以下重点来讲怎么发送Soap请求报文来获取响应报文你该进行解析。话说多不如上代码。代码中有必要的注释。 资料

    需求

            今日公司要做一个协同办公系统(OA),PC端已经完成。现在要做一个手机端网页端的。从登陆入手,需要向 服务端发送一段请求报文获取响应报文,对响应报文进行解析判断是否登录成功。

           当然手机客户端发送请求就不说了,就是普通的web请求。以下重点来讲怎么发送Soap请求报文来获取响应报文你该进行解析。话说多不如上代码。代码中有必要的注释。


    资料

            这是接口信息,描述了输入输出参数特征

      

     

                       这是需要发送的请求报文和服务地址,还有需要我们接收的响应报文



    当然,http://localhost:8080/v6sp2/WorkflowCommonService?xsd=1这个服务地址前部分是自己项目的地址,是要变得。

    这就是所有资料信息。

    解决方案

            思路:用HttpClinet 来获取响应报文,document文档解析响应报文

           为了结构明确,层次分明,我将冗长的方法封装在了多个方法中,在主方法中体现功能调用顺序,这样思路更清晰些。大家可以看主方法的中的调用顺序进行学习。调用方法出用红色字体标注.思路由黄色底色标注。

    public static void main(String[] args) {
    		StringBuilder soap=new StringBuilder(); //构造请求报文
    		soap.append(" <soapenv:Envelope  xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" ");
    		soap.append(" xmlns:wor=\"http://www.horizon.com/workflow/webservice/client/workflowCommon\">");
    		soap.append(" <soapenv:Header>");
    		soap.append(" <HZWFService  xmlns=\"http://www.huizhengtech.com/webservice/workflow\"");
    		soap.append(" xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"");
    		soap.append(" SOAP-ENV:actor=\"http://www.w3.org/2003/05/soap-envelope/role/next\">admin&admin</HZWFService>");
    		soap.append(" </soapenv:Header>");
    		soap.append(" <soapenv:Body>");
    		soap.append(" <wor:sysLogin>");
    		soap.append(" <loginName>loginname</loginName >");
    		soap.append(" <password>password</password>");
    		soap.append(" <dbidentifier>system</dbidentifier>");
    		soap.append(" </wor:sysLogin>");
    		soap.append(" </soapenv:Body>");
    		soap.append(" </soapenv:Envelope>");
    		String requestSoap=soap.toString();
    		
    		String serviceAddress="http://IP:Port/WorkflowCommonService?wsdl";   //服务地址(将XXXX替换成自己项目的地址)
    		String charSet="utf-8";
    		String contentType="text/xml; charset=utf-8";
    
                   <span style="font-size:24px;">//第一步:调用方法getResponseSoap。返回响应报文和状态码</span>
    
                  Map<String,Object> responseSoapMap=SoapUtil.getResponseSoap(requestSoap, serviceAddress, charSet, contentType);
                  Integer statusCode=(Integer)responseSoapMap.get("statusCode");
                  if(statusCode==200){
                         String responseSoap=(String)responseSoapMap.get("responseSoap");
                       String targetNodeName="isSuccess";
                    <span style="font-size:24px;">  //第二步:调用strXmlToDocument方法。
               将字符串类型的XML的响应报文 转化成Docunent结构文档</span>
                        Document doc=XMLUtil.strXmlToDocument(responseSoap);  
                      <span style="font-size:24px;"> //第三步:调用getValueByElementName方法。递归获得目标节点的值</span>
                       String result= XMLUtil.getValueByElementName(doc,targetNodeName);
                          if(!StringUtils.isEmpty(result)){                            
                                  System.out.println(result);
                          }  
                          else{                          
                               System.out.println("没有此节点或者没有值!");}
                            }
                  else{
                     System.out.println("请求失败!");
                   }                 
            }
    
    
    

    
    

    工具类    SoapUtil.class  。 

            

    /**
    	* <p>Description: 根据请求报文,请求服务地址获取 响应报文
    	 * @param requestSoap  请求报文
    	 * @param serviceAddress 响应报文
    	 * @param charSet 字符集
    	 * @param contentType  类型
    	 * @return  map封装的 服务器响应参数和返回报文.PS:statusCode :200正常响应。responseSoap:响应报文 
    	 * <p>thinking: </p>
    	 *
    	 * @author  huoge
    	 *</span>
      public  static Map<String,Object> responseSoap(String requestSoap,String serviceAddress,String charSet, String contentType){
    	  String responseSoap="";
    	  Map<String,Object> resultmap=new HashMap<String,Object>();
          PostMethod postMethod = new PostMethod(serviceAddress);
           byte[] b = new byte[0];
          try {
              b = requestSoap.getBytes(charSet);
          } catch (UnsupportedEncodingException e) {
              e.printStackTrace();
          }
          InputStream is = new ByteArrayInputStream(b, 0, b.length);
          RequestEntity re = new InputStreamRequestEntity(is, b.length, contentType);
          postMethod.setRequestEntity(re);
    
          HttpClient httpClient = new HttpClient();
          int statusCode = 0;
          try {
              statusCode = httpClient.executeMethod(postMethod);
              resultmap.put("statusCode", statusCode);
          } catch (IOException e) {
              throw new RuntimeException("执行http请求失败", e);
          }
          if (statusCode == 200) {
              try {
              	responseSoap = postMethod.getResponseBodyAsString();
              	resultmap.put("responseSoap", responseSoap);
              } catch (IOException e) {
                  throw new RuntimeException("获取请求返回报文失败", e);
              }
          } else {
              throw new RuntimeException("请求失败:" + statusCode);
          }
          return resultmap;
      }

    工具类   XMLUtil.class

         

      /**
         * <p>Description:将字符串类型的XML 转化成Docunent文档结构</p>
         * @param parseStrXml 待转换的xml 字符串
         * @return Document 
         *
         * @author  huoge
         */
    public static Document strXmlToDocument(String parseStrXml){
        	StringReader read = new StringReader(parseStrXml);  
            //创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入  
            InputSource source = new InputSource(read);  
            //创建一个新的SAXBuilder  
            SAXBuilder sb = new SAXBuilder();   // 新建立构造器  
            Document doc = null;
    		try {
    			doc = sb.build(source);
    		} catch (JDOMException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} 
        	return doc;
        	
        }
    	

    /**
         * <p>Description: 根据目标节点名获取值</p>
         * @param doc 文档结构
         * @param finalNodeName  最终节点名
         * @return
         *
         * @author  huoge
         */
        public static String getValueByElementName(Document doc,String finalNodeName){
     	   Element root = doc.getRootElement();
            HashMap<String,Object> map=new HashMap<String,Object>();
         <span style="font-size:24px;">   //调用getChildAllText方法。获取目标子节点的值 </span>
           Map<String,Object> resultmap=getChildAllText(doc, root,map);   
           String result=(String)resultmap.get(finalNodeName);
           return result;
        }


    /**
    	 * <p>Description: 递归获得子节点的值</p>
    	 * @param doc 文档结构
    	 * @param e  节点元素
    	 * @param resultmap  递归将值压入map中
    	 * @return  
    	 *
    	 * @author  huoge
    	 */
        public static Map<String ,Object> getChildAllText(Document doc, Element e,HashMap<String,Object> resultmap)  
        {  
            if (e != null)  
            {  
                if (e.getChildren() != null)   //如果存在子节点
                {  
                    List<Element> list = e.getChildren();   
                    for (Element el : list)    //循环输出
                    {  
                        if(el.getChildren().size() > 0)   //如果子节点还存在子节点,则递归获取
                        {  
                            getChildAllText(doc, el,resultmap);  
                        }  
                        else  
                        {  
                        	resultmap.put(el.getName(), el.getTextTrim());  //将叶子节点值压入map
                        }  
                    }  
                }  
            }  
            return resultmap;  
        }  

    这就是用webservice进行soap接口调用的思路。另外webservice接口调用还可以返回json数据格式然后进行对JSon进行解析,比较容易。

    如果对xml文档解析存在疑点,下篇文章我将带大家学习几种XML解析方法。

    扩展

         对webservice soap请求,可以借助一个功能强大的软件SoapUI进行测试。也是为了防止中途错误不迷途知返。

    打开界面是这样的



    点击左上角的soap,会弹出弹框让你写入你的项目名(随便起)和服务地址。


    如果地址正确的话,会出现这样的列表,选中一个双击点开是这样的:


    左右的输入框的请求报文中?是需要传入的参数,直接填入即可,然后点击左上角绿色三角会得到响应报文。是这样的:

    我相信这个工具会很有帮助的,当然他的功能远不止这些。。。

    祝大家学习工作愉快!

    展开全文
  • 常用报文解析与相互转换

    千次阅读 2009-12-14 18:41:00
    也可以是自由报文格式,只要遵循双方制定的标准,怎么定义都可以。 发送者将信息按照双方或者国际公约约定的格式发送给接收文,接收方再按双方约定的格式或国际公约组织并取出信息,这叫报文解析;也是报文操作的一

    常用报文的解析与相互转换

    1、报文定义

    报文是网络中信息交换的载体,是按约定格式组织好的信息流,报文格式可以是国际公约式,如TCP/IP协议报文;也可以是特定行业的报文,如8583金融报文;也可以是自由报文格式,只要遵循双方制定的标准,怎么定义都可以。

    发送者将信息按照双方或者国际公约约定的格式发送给接收文,接收方再按双方约定的格式或国际公约组织并取出信息,这叫报文解析;也是报文操作的一个必须步骤,这体现了报文最终意义。

    2、报文类型

    报文的类型是有很多种的,常用的有定长报文、键值报文、XML报语言及二进制报文等,以下就对这几种报文做相应的介绍,并配简单的示例。
       

    2.1 定长报文


       

    2.2 键值报文

       

    2.3 XML报文

       

    2.4 二进制报文

     

    3、报文之间的相互转换

    3.1 定长报文与键值报文之间的转换

    3.2 键值报文与XML报文之间的转换

    3.3 定长报文与XML报文之间的转换

     

     

    以上是目录,先列到这里,后期我会一步步补充,补充好了就会加上链接

    本文出自:冯立彬的博客




    展开全文
  • 8583报文解析程序

    2016-09-29 20:29:31
    网上搜了一堆,都不怎么好用,就用java写了一个自动解析ISO8583报文的小程序,支持自定义报文域长度和数据类型,以适应不同机构的8583报文 https://github.com/eric4784510/easy8583

    网上搜了一堆,都不怎么好用,就用java写了一个自动解析ISO8583报文的小程序,支持自定义报文域长度和数据类型,以适应不同机构的8583报文

    https://github.com/eric4784510/easy8583

    展开全文
  • [img=https://img-bbs.csdn.net/upload/201709/19/1505791160_658027.png][/img] 现在通过kafka接收到报文数据,打印出来都是乱码的,怎么按照报文格式进行解析
  • mqtt报文解析—超详细

    千次阅读 2020-08-12 22:09:43
    对 mqtt 是做什么还不知道,怎么简单使用还不知道的可以查看我的其他博客,以下对 mqtt 报文做简单分析 一、报文结构 表格1.1-报文结构 Fixed header 固定报头,所有控制报文都包含 Variable header 可变...


    对 mqtt 是做什么还不知道,怎么简单使用还不知道的可以查看我的其他博客,以下对 mqtt 报文做简单分析

    一、报文结构

    表格1.1-报文结构

    Fixed header 固定报头,所有控制报文都包含
    Variable header 可变报头,部分控制报文包含
    Payload 有效载荷,部分控制报文包含

    mqtt 报文结构 = 固定报头 + 可变报头 + 有效载荷

    二、固定报头

    表格2.1-固定报头格式

    Bit 7 6 5 4 3 2 1 0
    byte1 MQTT控制报文类型 用于指定控制报文类型的控制位
    byte2 剩余长度

    表格2.2-mqtt 控制报文类型(即表格2.1-固定报头中 4~7位置)

    名字 报文流动方向 描述
    Reserved 0 禁止 保留
    CONNECT 1 客户端到服务端 客户端请求连接服务端
    CONNACK 2 服务端到客户端 连接报文确认
    PUBLISH 3 两个方向都允许 发布消息
    PUBACK 4 两个方向都允许 QoS 1 消息发布收到确认
    PUBREC 5 两个方向都允许 发布收到(保证交付第一步)
    PUBREL 6 两个方向都允许 发布释放(保证交付第二步 )
    PUBCOMP 7 两个方向都允许 QoS 2 消息发布完成(保证交互第三步)
    SUBSCRIBE 8 客户端到服务端 客户端订阅请求
    SUBACK 9 服务端到客户端 订阅请求报文确认
    UNSUBSCRIBE 10 客户端到服务端 客户端取消订阅请求
    UNSUBACK 11 服务端到客户端 取消订阅报文确认
    PINGREQ 12 客户端到服务端 心跳请求
    PINGRESP 13 服务端到客户端 心跳响应
    DISCONNECT 14 客户端到服务端 客户端断开连接
    Reserved 15 禁止 保留

    表格 2.3 -标志位 (即表格2.1-固定报头 0~3位置)

    控制报文 固定报头标志 Bit3 Bit2 Bit1 Bit0
    CONNECT Reserved 0 0 0 0
    CONNACK Reserved 0 0 0 0
    PUBLISH Used in MQTT 3.1.1 DUP1 QoS2 QoS2 RETAIN3
    PUBACK Reserved 0 0 0 0
    PUBREC Reserved 0 0 0 0
    PUBREL Reserved 0 0 1 0
    PUBCOMP Reserved 0 0 0 0
    SUBSCRIBE Reserved 0 0 1 0
    SUBACK Reserved 0 0 0 0
    UNSUBSCRIBE Reserved 0 0 1 0
    UNSUBACK Reserved 0 0 0 0
    PINGREQ Reserved 0 v0 0 0
    PINGRESP Reserved 0 0 0 0
    DISCONNECT Reserved 0 0 0 0

    DUP1 =控制报文的重复分发标志

    QoS2 = PUBLISH 报文的服务质量等级

    RETAIN3 = PUBLISH 报文的保留标志

    三、剩余长度

    位置:从第 2 个字节开始。

    包括可变报头和负载的数据,变长度编码方案,每个字节可以编码 128 个数值和一个延续位,剩余长度字段最大 4 个

    字节,注意最高位为 1 表示后面至少还有一个字节,这允许应用发送最大 256MB(268,435,455) 大小的控制报

    文。这个数值在报文

    中的表示是:0xFF,0xFF,0xFF,0x7F

    表格3.1-报文标识符字段                                                                                 表格3.2-有效载荷

    控制报文 报文标识符字段 控制报文 有效载荷
    CONNECT 不需要 CONNECT 需要
    CONNACK 不需要 CONNACK 不需要
    PUBLISH 需要 (如果 QoS > 0) PUBLISH 可选
    PUBACK 需要 PUBACK 不需要
    PUBREC 需要 PUBREC 不需要
    PUBREL 需要 PUBREL 不需要
    PUBCOMP 需要 PUBCOMP 不需要
    SUBSCRIBE 需要 SUBSCRIBE 需要
    SUBACK 需要 SUBACK 需要
    UNSUBSCRIBE 需要 UNSUBSCRIBE 需要
    UNSUBACK 需要 UNSUBACK 不需要
    PINGREQ 不需要 PINGREQ 不需要
    PINGRESP 不需要 PINGRESP 不需要
    DISCONNECT 不需要 DISCONNECT 不需要

    四、mqtt控制报文

    Ⅰ、CONNECT

    客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是 CONNECT 报文在一个网络连接上,

    客户端只能发送一次 CONNECT 报文。服务端必须将客户端发送的第二个 CONNECT 报文当作协议违规处理并断开

    客户端的连接。

    1、固定报头

    表格4.1-固定报头

    Bit 7 6 5 4 3 2 1 0
    byte1 MQTT报文类型(1) Reserved 保留位
    0 0 0 1 0 0 0 0
    byte2 剩余长度
    根据 表格2.2-mqtt 控制报文类型 和 表格 2.3 -标志位 查询数据
    2、 可变报头

    某些 MQTT 控制报文包含一个可变报头部分。它在固定报头和负载之间。可变报头的内容根据报文类型的不同而不

    同。可变报头的报文标识符(Packet Identifier)字段存在于在多个类型的报文里。如:**CONNECT 报文的可变报头

    **按下列次序包含四个字段:协议名(Protocol Name),协议级别(Protocol Level),连接标志(Connect

    Flags)和保持连接(Keep Alive)。不同控制报文可变头部不同

    2.1、协议名

    表格4.2-协议名

    说明 7 6 5 4 3 2 1 0
    协议名
    byte1 长度 MSB (0) 协议长度 0 0 0 0 0 0 0 0
    bytE2 长度 LSB (4) 协议长度 0 0 0 0 0 1 0 0
    byte3 ‘M’ 0 1 0 0 1 1 0 1
    byte4 'Q' 0 1 0 1 0 0 0 1
    byte5 'T' 0 1 0 1 0 1 0 0
    byte6 'T' 0 1 0 1 0 1 0 0
    2.2、协议级别

    表格4.3-协议级别

    说明 7 6 5 4 3 2 1 0
    协议级别
    byte7 Level(4) 0 0 0 0 0 1 0 0
    Level(4) 为mqtt 3.1.1 版协议,协议级别字段的值是 4(0x04)。
    2.3、连接标志

    连接标志字节包含一些用于指定 MQTT 连接行为的参数。它还指出有效载荷中的字段是否存在。

    表格4.4-连接标志位

    Bit 7 6 5 4 3 2 1 0
    User Name Flag Password Flag Will Retain Will QoS Will Flag Clean Session Reserved
    Level(4) x x x x x x x 0
    服务端必须验证 CONNECT 控制报文的保留标志位(第 0 位)是否为 0,如果不为 0 必须断开客户端 连接。Reserved 为以保留。

    2.3.1、CleanSession

    第一位CleanSession指定了会话状态的处理方式,控制会话状态生存时间,0代表保留会话,当连接断开后,客户端和服务端

    必须保存会话信息,QoS 1 和 QoS 2 级别的消息保存为会话状态的一部分,服务端也可以保存满足相同条件的 QoS 0 级别的

    消息。1代表清除会话,不保留离线消息,重连会建立新的会话。

    2.3.2、遗嘱标志

    位置:连接标志的第 2 位。

    遗嘱标志(Will Flag)被设置为 1,表示如果连接请求被接受了,遗嘱(Will Message)消息必须被存储在 服务端并

    且与这个网络连接关联。之后网络连接关闭时,服务端必须发布这个遗嘱消息,除非服务端收到 DISCONNECT 报文时删除了这个遗嘱消息

    遗嘱消息发布的条件,包括但不限于: •

    • 服务端检测到了一个 I/O 错误或者网络故障。 •

    • 客户端在保持连接(Keep Alive)的时间内未能通讯。 •

    • 客户端没有先发送 DISCONNECT 报文直接关闭了网络连接。 •

    • 由于协议错误服务端关闭了网络连接。

    遗嘱消息连接标志位 WILL QOSWILL RETAIN 字段会被服务端用到,同时有效载荷中必须包含 WILL TOPIC

    WILL MESSAGE 字段,遗嘱标志被设置为 0,连接标志中的 WILL QOS 和 WILL RETAIN 字段必须设置为 0,并

    且有效载荷中不能 包含 WILL TOPIC 和 WILL MESSAGE 字段

    2.3.3、遗嘱Qos

    位置:连接标志的第 4 和第 3 位。

    如果遗嘱标志被设置为 0,遗嘱 QoS 也必须设置为 0。

    如果遗嘱标志被设置为 1,遗嘱 QoS 的值可以等于 0,1,2。

    2.3.3、遗嘱保留

    位置:连接标志的第 5 位。

    如果遗嘱标志(Will Flag)被设置为 0,遗嘱保留(Will Retain)标志也必须设置为 0。

    如果遗嘱标志(Will Flag)被设置为 1:

    • 如果遗嘱保留被设置为 0,服务端必须将遗嘱消息当作非保留消息发布。

    • 如果遗嘱保留被设置为 1,服务端必须将遗嘱消息当作保留消息发布

    2.3.4 、用户名标志

    位置:连接标志的第 7 位。

    如果用户名(User Name)标志被设置为 0,有效载荷中不能包含用户名字段。

    如果用户名(User Name)标志被设置为 1,有效载荷中必须包含用户名字段。

    2.3.5、密码标志

    位置:连接标志的第 6 位。

    如果密码(Password)标志被设置为 0,有效载荷中不能包含密码字段。

    如果密码(Password)标志被设置为 1,有效载荷中必须包含密码字段。

    如果用户名标志被设置为 0,密码标志也必须设置为 0。

    2.4 保持连接

    表格4.5-保持连接

    Bit 7 6 5 4 3 2 1 0
    byte9 保持连接 Keep Alive MSB
    byte10 保持连接 Keep Alive LSB

    保持连接(KEEP ALIVE)是一个以秒为单位的时间间隔,表示为一个 16 位的字,2^16/3600= 18 小时 12 分 15

    秒,即设置最大连接时长18.204H,指客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允

    许空闲的最大时间间隔,如果没有任何其它的控制报文可以发送,客户端必须发送一个 PINGREQ 报文,不管保

    持连接的值是多少,客户端任何时候都可以

    发送 PINGREQ 报文,客户端收到服务器返回 PINGRESP 报文判断网络和服务端的活动状态。

    在这里插入图片描述

    ①、如果保持连接的值非零,并且服务端在一点五倍的保持连接时间内没有收到客户端的控制报文,它必须断开客户端的网络连接,认为网络连接已断开。

    ②、客户端发送了 PINGREQ 报文之后,如果在合理的时间PINGRESP报文,它应该关闭到服务 端的网络连接。

    ③、保持连接值为0表示客户端不会断开连接,关闭保持连接功能,注意:不管保持连接的值是多少,
    只要服务器认为客户端不活跃或者无响应都可以断开连接

    2.5、可变报头示例

    表格4.6-可变报头示例

    描述 7 6 5 4 3 2 1 0
    协议名
    byte1 长度 MSB (0) 协议长度 0 0 0 0 0 0 0 0
    bytE2 长度 LSB (4) 协议长度 0 0 0 0 0 1 0 0
    byte3 ‘M’ 0 1 0 0 1 1 0 1
    byte4 'Q' 0 1 0 1 0 0 0 1
    byte5 'T' 0 1 0 1 0 1 0 0
    byte6 'T' 0 1 0 1 0 1 0 0
    描述 7 6 5 4 3 2 1 0
    协议级别
    byte7 Level(4) 0 0 0 0 0 1 0 0
    连接标志 Connect Flags
    byte 8 User Name Flag (1) 用户名标志 1 1 0 0 1 1 1 0
    Password Flag (1) 密码标志
    Will Retain (0) Will 保留标志
    Will QoS (01) Will 服务质量
    Will Flag (1) Will 标志
    Clean Session (1) 清理会话
    Reserved (0) 保留位
    保持连接时间
    byte9 保持连接 MSB (0) 0 0 0 0 0 0 0 0
    byte10 保持连接 LSB (10) 0 0 0 0 1 0 1 0
    3、有效载荷

    CONNECT 报文的有效载荷(payload)包含一个或多个以长度为前缀的字段,可变报头中的标志决定是否 包含这些字

    段。如果包含的话,必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密 码

    表格4.7-有效载荷

    Bit 说明 7 6 5 4 3 2 1 0
    Client ID
    byte1 Client ID Length 0 0 0 0 0 0 0 0
    byte2 0 0 0 0 0 1 1 1
    一定长度 Client ID 0 0 0 0 0 0 0 0
    Will Topic
    byte1 Will Topic Length 0 0 0 0 0 0 0 0
    byte2 0 0 0 0 0 1 1 1
    一定长度 Will Topic 0 0 0 0 0 0 0 0
    Will Message
    byte1 Will Message Length 0 0 0 0 0 0 0 0
    byte2 0 0 0 0 0 1 1 1
    一定长度 Will Message 0 0 0 0 0 0 0 0
    User Name
    byte1 User Name Length 0 0 0 0 0 0 0 0
    byte2 0 0 0 0 0 1 1 1
    一定长度 User Name 0 0 0 0 0 0 0 0
    Password
    byte1 Password Length 0 0 0 0 0 0 0 0
    byte2 0 0 0 0 0 1 1 1
    一定长度 Password 0 0 0 0 0 0 0 0
    3.1、 客户端标识符

    ①、服务端使用客户端标识符 (ClientId) 识别客户端。连接服务端的每个客户端都有唯一的客户端标识符(ClientId)。

    ②、客户端标识符 (ClientId) 必须存在而且必须是 CONNECT 报文有效载荷的第一个字段

    ③、服务端可以允许客户端提供一个零字节的客户端标识符,这样服务端会认为是特殊情况自动分配一个且唯一,那样必须将同时将清理会话标志设置为 1

    3.2、遗嘱主题

    如果可变报头连接标志部分遗嘱标志被设置为 1,则有效载荷的下一个字段是遗嘱主题(Will Topic)。

    3.3、 遗嘱消息

    如果可变报头连接标志部分遗嘱标志被设置为 1,有效载荷的下一个字段是遗嘱消息。

    3.4、 用户名

    如果可变报头连接标志部分用户名(User Name)标志被设置为 1,有效载荷的下一个字段就是它。

    3.5、 密码

    如果可变报头连接标志部分密码(Password)标志被设置为 1,有效载荷的下一个字段就是它。

    注意:客户端提供的 ClientId 为零字节且清理会话标志为 0,服务端必须发送返回码为 0x02(表示标识符不合格)的 CONNACK

    报文响应客户端的 CONNECT 报文,然后关闭网络连接

    也就是说如果你不指定 clientId ,必须清除连接(即将 cleansession 设置为 true)

    五、报文分析

    首先通过 Wireshark 抓包工具抓取 mqtt 报文,今天总结了 connect 就先对其进行分析吧。

    不会使用 Wireshark 软件进行抓包的的可以看看这篇博客,https://www.cnblogs.com/mq0036/p/11187138.html

    首先启动你的服务器并运行客户端,填写过滤条件进行抓取,过滤条件为 mqtt 服务器地址和客户端地址

    ip.addr == 39.99.222.146 or ip.addr == 192.168.20.72  and mqtt
    

    接下来根据上面讲述的 mqtt connect 报文格式对其进行分析如下
    在这里插入图片描述

    mqtt 是应用层协议就是蓝色那部分,将协议以二进制展示
    在这里插入图片描述
    报文数据

    10 27 00 04 4d 51 54 54 04 c2 00 5a 00 0a 31 35 39 37 32 37 39 
    
    33 33 34 00 07 63 6c 69 65 6e 74 41 00 06 31 32 33 34 35 36
    

    以上面报文数据映射到表格中如下
    表格5.1-connect报文

    Bit 描述(对应上面的报文数据) 7 6 5 4 3 2 1 0
    固定报头
    byte1 MQTT报文类型(1) Reserved 保留位
    10 0 0 0 1 0 0 0 0
    byte2 剩余长度
    27 0 0 1 0 0 1 1 1
    可变报头
    协议名
    byte1 长度 MSB (0)         00 0 0 0 0 0 0 0 0
    byte2 长度 LSB (4) 协议长度         04 0 0 0 0 0 1 0 0
    byte3 ‘M’        4d 0 1 0 0 1 1 0 1
    byte4 'Q'        51 0 1 0 1 0 0 0 1
    byte5 'T'        54 0 1 0 1 0 1 0 0
    byte6 'T'        54 0 1 0 1 0 1 0 0
    协议级别
    byte7 Level(4)        04 0 0 0 0 0 1 0 0
    连接标志 Connect Flags        c2
    byte 8 User Name Flag (1) 用户名标志 1 1 0 0 0 0 1 0
    Password Flag (1) 密码标志
    Will Retain (0) Will 保留标志
    Will QoS (01) Will 服务质量
    Will Flag (1) Will 标志
    Clean Session (1) 清理会话
    Reserved (0) 保留位
    保持连接时间
    byte9 保持连接 MSB (0)        00 0 0 0 0 0 0 0 0
    byte10 保持连接 LSB (10)        5a 0 1 0 1 1 0 1 0
    有效载荷(出现顺序为客户端标识符,遗嘱主题,遗嘱消息,用户名,密码,下面报文无遗嘱)
    客户端标识       其中 Client ID 报文是 char ,int 1 char 49,下列 Client ID 为1597279334
    byte11 客户端标识 length        00 0 0 0 0 0 0 0 0
    byte12 客户端标识 length        0a 0 0 0 0 1 0 1 0
    byte13 客户端标识 Client ID        31 0 0 1 1 0 0 0 1
    byte14 客户端标识 Client ID        35 0 0 1 1 0 1 0 1
    byte15 客户端标识 Client ID        39 0 0 1 1 1 0 0 1
    byte16 客户端标识 Client ID        37 0 0 1 1 0 1 1 1
    byte17 客户端标识 Client ID        32 0 0 1 1 0 0 1 0
    byte18 客户端标识 Client ID        37 0 0 1 1 0 1 1 1
    byte19 客户端标识 Client ID        39 0 0 1 1 1 0 0 1
    byte20 客户端标识 Client ID        33 0 0 1 1 0 0 1 1
    byte21 客户端标识 Client ID        33 0 0 1 1 0 0 1 1
    byte22 客户端标识 Client ID        34 0 0 1 1 0 1 0 0
    用户名      User Name Length: 7      User Name: clientA
    byte23 User Name Length        00 0 0 0 0 0 0 0 0
    byte24 User Name Length        07 0 0 0 0 0 1 1 1
    byte25 User Name         63 0 1 1 0 0 0 1 1
    byte26 User Name        6c 0 1 1 0 1 1 0 0
    byte27 User Name        69 0 1 1 0 1 0 0 1
    byte28 User Name        65 0 1 1 0 0 1 0 1
    byte29 User Name        6e 0 1 1 0 1 1 1 0
    byte30 User Name        74 0 1 1 1 0 1 0 0
    byte31 User Name        41 0 1 0 0 0 0 0 1
    密码      Password Length: 6      Password: 123456
    byte32 Password Length        00 0 0 0 0 0 0 0 0
    byte33 Password Length        06 0 0 0 0 0 1 1 0
    byte34 Password         31 0 0 1 1 0 0 0 1
    byte35 Password        32 0 0 1 1 0 0 1 0
    byte36 Password        33 0 0 1 1 0 0 1 1
    byte37 Password        34 0 0 1 1 0 1 0 0
    byte38 Password        35 0 0 1 1 0 1 0 1
    byte39 Password        36 0 0 1 1 0 1 1 0

    遗嘱消息如下
    在这里插入图片描述

    如上就是 mqtt 的 connect 报文详细映射,后续还会陆续写 mqtt 其他报文,哪里有写的不对或者不清晰留言讨论。想先了解其他报文格式的

    可以留言告诉我,提前写。

    展开全文
  • 返回报文示例如下: (取SCOREAVALIABLE的值) <uuid>abcdef <timestamp>2017-09-26 03:07:12.70 UTC <request__type>123456 <response__code>1 <server__version>00000001 <sender>club ...
  • ##0187ST=32;...PW=123456;MN=399HOLL0000219;CP=&&DataTime=20171219000 933;B01TOTAL-Rtd=3.75;011-Rtd=23.6,011-Flag=N;060-Rtd=0.16,060-Flag=N;...比如这个以分号和逗号来区分 解析成JSON 格式 求各位大腿帮帮忙!
  • java modbus TCP/IP 怎么解析modbus报文成为真是数据
  • 4G信令 如何转成需要的2/3G报文的对应字段? 我都不知道怎么提问了,请教一下。![图片说明](https://img-ask.csdn.net/upload/201704/11/1491882059_877704.jpg)![图片说明]...
  • 大家帮我解析一下报文吧!我用的是UDP通信拿到数据,数据的类型是这样的S5W1449!p1r!p1r003B1s!S6WGGG00!p2r!p2r00003 !...我要怎么解析报文!能写出具体函数最好,新人求解析!通信我已经做好了!
  • TCP连接过程及报文解析

    千次阅读 2018-08-07 14:39:00
    那么具体的握手挥手的过程是怎么样的呢? 这篇文章就通过WireShark抓包来了解TCP连接建立和断开的过程。 实验方法: 写一段简单的代码 代码客户端和服务端,分别部署,让客户端主动像服务器发起连接,随后断开。...
  • 我不太懂java是怎么进行处理的,因为一直收数据,我处理好之后要显示在界面上,要一直更新,我是收到一帧数据处理完之后,在接收,还是具体怎么接收的,要把之后的数据一直缓存吗?我要怎么写呢?
  • byte buf[] =new byte[10240]; InputStream in=socketClient.getInputStream(); int length=in.read(buf); String strResult=new String(buf,0,length);//strResult保存的就是xml ...
  • 报文解析工作。也就是我像要读取出来VCU、MCU这些程序里边的内容,好比如说实现车辆信息的监控。由于是小白一个。 对于车辆方面的只是不是很精通,想要请教哪位大神能够指导一下思路。如果有源码可供学习自始完美...
  • python爬虫之三:解析网络报文xml

    万次阅读 2018-05-03 12:54:05
    本节主要是讲解在项目中怎么解析获取的xml报文并获取相关字段,时间5.6-5.10
  • 很久没来csdn了。现在的工作地点在银行,妈的,不...关键是怎么去组装和解析8583报文? 这个代码还真不好找。在此,我把自己的研究写成一个工具类,看的懂其实很好改写,看不懂就直接拿去用吧。   package com.lsy.com
  • DNS 响应报文详解

    千次阅读 2018-03-25 03:49:02
    上一篇我已经解释了DNS请求报文怎么解析,不会的自己坐飞机(飞机入口)。这一篇主要从DNS服务器的角度来解释,如何自己创建响应报文返回给客户端。 就这个命题,可以罗列出DNS服务器在创建response响应报文时需要解决...
  • Java 解析 soap xml 报文

    2016-07-29 02:18:13
    怎么获取 PushSMSYMResult 中的内容?? ``` Yes:短信插入成功 ```
  • http://hi.baidu.com/ucells/item/eaa5761becf104426826bbf5 这里有人做了解析,有个问题: svID: LN1102_MU1_5810MUnn02 这个是怎么得到的?
  • 刚接触udp,在解析报文的时候,报文描述中有两个字节的Unsigned short...应该怎么解析处理啊?这两个字节存储的内容为2020,但是按照网上的教程,试了n多方法解析出来的都是不对...</p>
  • TCP报文头部结构详解和作用解析

    千次阅读 2019-07-22 14:30:53
    可以画出来并且可以说出来每个部分的作用是什么,主要是要会解释TCP怎么保证通讯的可靠机制的。 其中,32位序号是指通讯过程中,某个传输方向上的字节流的每个字节的编号。 32位确认号:用作另外一方发送来的TCP...
  • J8583CN解析ISO8583协议报文注意点

    千次阅读 2015-09-15 10:43:25
    最近在做POS接入涉及到如何正确解析ISO8583协议的问题,遇到了一些很讨厌的问题今天将他们总结一下写在博客中,供大家参考。...了解完ISO853协议以后,考虑用JAVA怎么解析8583协议报文。网上百度了下说到可以
  • 将 <cbs:Version>? <cbs:BusinessCode>? <cbs:MessageSeq>? <cbs:BEID>? <cbs:BRID>? <cbs:LoginSystemCode>? <cbs:Password>? <cbs:RemoteIP>? ...怎么解析
  •  有一阵子我觉得带有factor和bias的信号使用Simulink实现就是第一个定标的实现,后来我发现无论我怎么进行定标信息的修正始终出现数据类型的不匹配。直到有一天,随手拽了一个强制数据类型转换的模块实现了代码生成...
  • 怎么对gsm调制解调得到的数据转码形成报文数据包,用vb的实现原理是什么?怎么用vb将gsm数据解析报文数据?
  • ISO8583报文工具类

    2018-07-25 14:32:57
    关键是怎么去组装和解析8583报文? 这个代码还真不好找。在此,我把自己的研究写成一个工具类,看的懂其实很好改写,看不懂就直接拿去用吧。   package com.lsy.common.util;   import java.io.FileInputStream...
  • 现在在做can总线通讯,想问接收到can传回来的包,用C++怎么获取它的报文ID,和对报文中不同字节进行解析

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 136
精华内容 54
关键字:

报文怎么解析