高通工具QXDM、QCAT和QPST的使用

高通工具QXDM、QCAT和QPST的使用

 

QXDM,QPST和QCAT是Qualcomm高通公司针对高通芯片的抓包分析工具。QXDM抓包分析,QPST与手机com口连接,QCAT用来分析抓包产生的isf文件(log)。

工具名称

功能

QXDM

关闭打开备份还原NV、NV修改、抓modem log

QCAT

解析log工具,方便查看

QPST

手机NV备份(QCN)、资源管理器(EFS Explorer)、dump日志

1.QXDM抓取log的步骤

前言:

(1)安装QXDM之前请先安装QPST,因为QXDM是需要QPST Server支持的

(2)安装QXDM要用最新版本,否则是抓取不到完整的log的

主题:

(1)为了保证手机和PC间通讯,PC端已安装手机驱动,如下图(此时未打开手机端口)

(2)打开手机adb端口,比如某些手机暗码即可开启

(3)USB连接到设备,查看设备管理器-->端口-->检查有无Qualcomm驱动,COM口通信需要安装高通驱动。

(4) Load the QXDM Configurationfile (.dmc) that is provided by your Customer Engineering

比如我们要抓开机后不能注册到4G问题的dmc文件由核心模块厂家提供。打开QXDM后,选择File--->LoadConfiguration装载dmc文件,或是直接双击dmc文件同时还可以打开QXDM,这种方式更方便。

(5)运行QXDM,点击最左侧的快捷按键connect to device 或者 Options--->Communication

(6)正常连接情况下,port会自动识别到端口号,这时候选中设备所在端口号,点击Connect就可以开始抓log

(7)点击Tools--->CFG File Generator(或者快捷键F5)设置好Filter,根据不同的log需求,选择相应的选项

(8)抓取log结束,断开连接。然后File--->Save Items保存抓的log,log为isf格式。抓包生成isf文件默认在C:\Users\Public\Documents\Qualcomm\QXDM\ISF中,可以根据配置选择不同路径。

2.QCAT查看log

打开QCAT,直接将该文件拖进去,修改edit->filter,过滤common的ims包即可。

3.QXDM关闭/打开备份还原NV

(1)打开手机adb端口

(2)连上端口,如下图

(3)Command输入“send_data 75 250 01 00 01”,Enter

(4)Command Output 出现如下返回值表示修改成功,重启手机即生效。

4.QXDM修改NV值

(1)打开adb端口

(2)连上端口,如下图

(3)点击NV图标,输入NV代码,选中该条NV,点击右下角read

(4)修改完毕,点击write,重启手机

5.QPST备份NV(QCN)

(1)打开adb端口

(2)打开QPST Configure,待端口自动连上

(3)点击Start Clients,选择Software Download

(4)选择端口和导出QCN的路径和名称,然后点击Start,进度条到100%即备份完成。

6.QPST EFS explorer工具

(1)打开adb端口

(2)打开QPST Configure,待端口自动连上

(3)点击Start Clients,选择EFS explorer

(4)可直接在红框内拖入拖出文件

 

 

1. QXDM简介

QXDM(The QUALCOMM Extensible Diagnostic Monitor)是高通公司(Qualcomm)公司发布的可以对手机终端所发数据进行有效跟踪工具,通过对数据的分析可以诊断信令流程、分析数据包的正确与否等。在测试及研发分析中有重要作用。

2 如何制作和导入Filter

2.1 制作Filter

2.1.1 制作Windows环境下Filter

自己制作时可关闭除Item View以外的其他窗口,F12添加新的窗口,右键点击Configure选择需要过滤的配置。以过滤OTA log为例。File -> Save Configuration保存 .dmc文件。




2.1.2 制作Linux环境下Filter

F12添加新的窗口,右键点击Configure选择需要过滤的配置。以过滤OTA log为例。保存 .cfg文件。

 



2.2 Windows环境下导入Filter



3 Filter配置

3.1 注册拨号问题

3.1.1 LOG Packets(OTA)

Log Packets(OTA)中一般必须勾选LTE、NR5G、WCDMA、UMTS、IMS。

空口可以过滤出完整的注册流程及拨号流程。

LTE注册流程空口过滤LOG示意图:

NR5G注册流程空口过滤LOG示意图:

NR5G拨号流程空口过滤LOG示意图:

3.1.2 LOG Packets

Log Packets中必须勾选LTE、NR5G中的ML1、RRC、NAS、MAC,Common中勾选IMS、QMI。

MAC层包含随机接入的相关信息。

RRC层包含MIB信息、服务小区信息、PLMN选择、RRC connection release等信息。

ML1包含随机接入MSG、扫频信息、服务小区和临近小区信号质量信息等消息。

QMI显示AP侧和Modem侧的信息交互。

3.1.3 Event Reports

Event Reports勾选LTE、NR5G、WCDMA、UMTS。

3.1.4 Message Packets

Message Packets中勾选Date Service、UMTS、LTE、NR5G、Linux Data、USIM、Radio Frequency、MMODE QMI等。Date Service显示AT指令相关信息,Linux Data显示AP侧相关信息,USIM显示SIM卡相关信息。选择性勾选IMS、MCFG、Policy Manager,如果需要抓取语音、短信相关log,勾选Voice Recognition、Wireless Messaging Service。

Date Service显示DS层相关信息(比如AT指令相关信息)。

3.1.5 QTraces

QTraces中勾选LTE、NR5G、WCDMA、MMCP、Data Services、USIM、RF等,勾选MMCP主要看CM层、MM层log,可以选择性勾选IMS、COMMON、MCFG。

可以直接使用附件中的Filter抓取log。Windows平台下为Demo_Windows.dmc,Linux平台下为Demo_Linux.cfg

3.2 上网问题

上网问题在上述的基础上Log Packets中必须勾选LTE、NR5G中的RLC、DHCP,Common中Data Service需要勾选Data Protocol Logging和IPA,Data Protocol Logging为数据包,IPA可以查看速率。配置好的Filter见附件,Windows平台下为Demo_TCPIP_Windows.dmc,Linux平台下为Demo_TCPIP_Linux.cfg

3.2.1 TCP相关选项

DPL、IPA勾选示意图

DPL过滤LOG示意图:

3.2.2 Wiresharks查看TCP包

如果需要看具体TCP包信息,可以用QCAT打开转成.pcap文件,然后用Wireshark打开。

QCAT转换格式流程1:

QCAT转换格式流程2:

QCAT转换格式结果示意图:

Wiresharks显示TCP包示意图:

 

 

 高通5G平台(SDX55\SDX62\SDX65):ping包异常问题排查指南

1. 背景

移动通信延续着每十年一代技术的发展规律,已历经1G、2G、3G、4G的发展。每一次代际跃迁,每一次技术进步,都极大地促进了产业升级和经济社会发展。从1G到2G,实现了模拟通信到数字通信的过渡,移动通信走进了千家万户;从2G到3G、4G,实现了语音业务到数据业务的转变,传输速率成百倍提升,促进了移动互联网应用的普及和繁荣。当前,移动网络已融入社会生活的方方面面,深刻改变了人们的沟通、交流乃至整个生活方式。4G网络造就了繁荣的互联网经济,解决了人与人随时随地通信的问题,随着移动互联网快速发展,新服务、新业务不断涌现,移动数据业务流量爆炸式增长,4G移动通信系统难以满足未来移动数据流量暴涨的需求,急需研发下一代移动通信(5G)系统。

可能有人会问,5G到底是什么?对于个人而言有什么用?用官方解释5G就是第五代移动通信技术(5th Generation Mobile Communication Technology,简称5G),是具有高速率、低时延和大连接特点的新一代宽带移动通信技术,5G通讯设施是实现人机物互联的网络基础设施。对于我们最直观的感受,就是网速快了,比如1GB的电影,以前4G下载需要数分钟、甚至数十分钟,现在仅需1s左右即可下载完成,这就是5G。一句话就是高速率、低时延。

2019年是5G元年,到现在已经演进近三年,5G技术发展迅速,5G应用均也已走进千家万户,与我们生活息息相关,我们最直接接触到的有5G手机、5G家庭CPE、5G直播等,都极大的便利了我们的生活,提高了我们的用户体验。

5G作为一种新型移动通信网络,不仅要解决人与人通信,为用户提供增强现实、虚拟现实、超高清(3D)视频等更加身临其境的极致业务体验,更要解决人与物、物与物通信问题,满足移动医疗、车联网、智能家居、工业控制、环境监测等物联网应用需求。最终,5G将渗透到经济社会的各行业各领域,成为支撑经济社会数字化、网络化、智能化转型的关键新型基础设施。

要能够使用5G网络,就必须使用5G芯片,通常可以叫做modem或基带。行业内做的最好的有三家:高通、展锐、MTK,展锐5G模组有V510、UDX710等,MTK有T750、T830等,高通有过渡阶段的SDX55、支持R16的SDX62\SDX65、甚至速率达到10 Gbps的SDX70。但这么多的5G通信模组,在网络连接进行数据业务时经常出现链路异常问题,需要分析排查。今天就和大家分享一下高通5G平台ping包异常问题排查方法。

2. Ping包数据流走向及网络架构

2.1 终端与网络架构图

当终端在做ping包业务时,数据流走向如下图所示:

注:上图中蓝色箭头为上行Ping包的请求,红色为Ping Reply.

2.2 终端与基站之间协议栈数据流走向图

从协议栈角度来看,终端的上下行数据走向如下图(图中以LTE为例,SA类似)

注:图中红色箭头表示上行数据,下行的和上行数据流走向相反。

3. Ping包问题常见分析思路

常见的Ping问题现象一般为Ping不通,其实分为两类:Ping Request未发出去,及未收到Ping Reply

3.1 终端与基站之间协议栈数据流走向图

如果测试场景中,有网络侧参与,问题出现时,通常需要抓取终端的Wireshark,QXDM及基站侧数据包。

根据文中之前提到的终端与网络架构图可以看出,终端发送Ping Request时,数据流走向为:AP->PDCP->RLC->MAC->PHY,终端最终通过物理层将Ping Request发到基站的物理层。

如果有网络侧参与,需要基站抓取数据包,确认基站是否已经收到了终端的Ping Request。这样做的目的是可以快速地对问题定界,确认到底数据包丢在了哪个节点。

  • 对于Ping Request未发出去的问题: 如果基站侧已经收到了Ping Request,说明我们终端发送的没问题,需要排查host侧和网络侧各个节点。 如果基站未收到,极大可能是因为我们终端未发出去,出现这种情况,首先需要排查终端拨号状态,确认拨号正常,其次需要排查无线环境,RSRP,SINR等参数是否OK。如果无线环境排查无异常,就需要获取终端QXDM、WIRESHARK等log进一步排查
  • 对于未收到Ping Reply问题: 首先要确认Ping Request是否已经发送到服务器,这个可以和服务器端确认,如果未收到,请按照Ping Request的排查思路进行排查。如果收到,则需要按照逆向的数据流进行分析,排查基站侧是否有发给UE。

3.2 测试场景无网络侧参与

对于无网络侧参与的问题,需要先做简单的排查:

  • 排查终端注网及拨号是否正常
  • 排查无线环境是否正常。(RSRP,SINR各项参数)
  • 对比测试,Ping其他网站及服务器是否能Ping通。(如果能Ping通,大概率非终端问题) 上述三条排查完成后,确认无异常,则需要抓取终端的Wireshark及QXDM log。

3.3 QXDM Log分析思路

  • 抓到QXDM后,用QCAT打开,导出PCAP log,如下图所示:

  • 用QXDM打开PCAP log,过滤出Ping包内容(在过滤栏输入icmp进行筛选)

  • 在QCAT中输入0x11EB,过滤出数据包

  • 找到Ping包的数据包,在过滤器中输入0xB870,确认MAC是否已经把数据包发出去(物理层log是二进制码流,需要从MAC确认,下图以NR为例)

  • 如果基站侧收到了Ping Request,会在NR5G RLC DL Status PDU中返回ACK。

  • 基站回复Ping Reply, 可以通过PDCP DL Data Pdu消息查看

3.4 如何将PCAP log中的ping信息和QCAT log相应信息对应起来

  • 在PCAP log中,输入icmp过滤出Ping包信息,选择试图->时间显示格式->UTC时间,将时间显示格式设置和UE一样,下图以时延高为例:

  • 找到此数据包Ping Request和Reply对应的Data内容,如下图所示

  • 在QCAT log中过滤出消息,并找到与上面Data内容相同,且时间点对应的数据包(上图中,源IP为192.168.1.1, 服务器地址为192.168.1.4)

3.4 如何计算Ping消息在网络侧耗费的时间

  • 按照3.3描述找到问题发生点Ping Request消息

  • UE在SFN <112>发送了ping request消息,RLC SN=18。(Ping Request由应用侧发给协议栈后,首先进入PDCP,从NR5G PDCP UL States中能看到,Ping R equest属于数据业务,占用DRB资源,起对应的SN为18,进而通过查看NR5G L2 UL Data Pdu找出18所对应的SFN为112)

 

  • 网络侧在SFN<117>,SN<18>上回复ACK,表示网络侧已经收到终端发起的Ping Request,这期间耗时:(117-112)*10=50ms

  • 终端在SFN<129>上收到Ping Reply, 在网络侧耗时(129-117)*10=120ms。(如下图所示,从PCAP log中可以看到,Ping Reply的长度为60bytes,因此在PDCP DL Data Pdu中,找到60bytes对应的SFN,即为Ping Reply消息)

综上:网络侧耗时为50+120=170ms。

对于时延问题,如果确认时延主要集中在网络侧,首先要排查无线环境,查看RSRP,SINR等参数,如果客户对时延要求比较严格,参照以往经验,RSRP应不低于-75dbm, SINR需稳定在30左右。其次,如果无线环境OK,则需要告知客户,非终端问题,需要网络侧进行分析,按照文中之前网络架构图中,排查各个节点,确认时延或者丢包发生在哪个网元。

 

python + QXDM5高通平台通过自动化截取log方法及代码

准备工作:

1.安装QXDM5

2.配置adb 环境变量

3.使用python 3以上

4.完成代码如下

import sys
import time
import os

if sys.platform.startswith("linux"):
    sys.path.append('/opt/qcom/QXDM/Support/python')

elif sys.platform.startswith("win"):
    sys.path.append('C:\Program Files (x86)\Qualcomm\QXDM5\Support\python') #QXDM5的默认路径
    sys.path.append('C:\Program Files (x86)\Qualcomm\QUTS\Support\python')

elif sys.platform.startswith("darwin"):
    sys.path.append('/Applications/Qualcomm/QUTS/QUTS.app/Contents/Support/python')

import QutsClient
import QxdmAutomationClient
import QxdmAutomationService.ttypes


class deviceManager(object):
    #通过模块的devicesID获取QXDM需要连接设备的devicehandle, protocolHandle
    def getDeviceInfo(self,devid,getPortName="Diagnostics"):
        protocolHandle = ""
        deviceHandle = ""
        comport = ""
        try:
            try:
                client = QutsClient.QutsClient("QUTS Sample")
            except Exception as e:
                logging.info("Exception starting client:%s" %e)

            if client is None:
                logging.info('QUTS客户端未实例化,请确认是否安装....')
            else:
                logging.info('初始化客户端....')

            deviceManager = client.getDeviceManager()

            time.sleep(1)

            deviceList = deviceManager.getDeviceList()
            for element in deviceList:
                if element.adbSerialNumber == devid:
                    a = element.protocols
                    for x in a:
                        print(getPortName,x.description)
                        if getPortName in x.description:
                            protocolHandle = x.protocolHandle
                            deviceHandle = x.deviceHandle
                            comport = x.description.split("(")[-1].replace(")","")
                            break

            print(deviceHandle, protocolHandle,  comport)
            return deviceHandle, protocolHandle,  comport
        except Exception as e:
            logging.info("获取端口信息失败,失败原因%s" %e)
            return deviceHandle, protocolHandle,  comport




class ControlQXDM(object):
    def startQXDM(self,devid,dmcFile="yourdmcFiledir"):
        deviceHandle, protocolHandle, comport = deviceManager().getDeviceInfo(devid)
        print("Creating QXDM Automation client\n")
        qxdm_auto_client = QxdmAutomationClient.QxdmAutomationClient("OpenQXDMLog")
        qxdmAutomationHandle = qxdm_auto_client.getQxdmAutomationManager()

        # Init Service
        init = qxdmAutomationHandle.InitializeService()

        if (init == False):
            logging.info("初始化QXDM失败,已存在该服务....")

        qxdmAutomationHandle.SetVisible(True)

        retVal = qxdmAutomationHandle.LoadConfig(os.getcwd() + dmcFile)
        if not retVal:
            print("导入dmc配置文件失败,无法开启log,请查看是否存在该文件%s...." %os.getcwd() + dmcFile)
            return False
        # hdffile = "C:\\Temp\\testlog\\nas_logging.hdf"
        # retVal = qxdmAutomationHandle.LoadItemStore(hdffile)

        deviceInfo = QxdmAutomationService.ttypes.ConnectDeviceInfo(int(deviceHandle), int(protocolHandle))

        retVal = qxdmAutomationHandle.ConnectToDevice(deviceInfo)
        if not retVal:
            print("连接设备失败....")
            return False
        return qxdmAutomationHandle

# 仅保存可以使用如下方法:
#  retVal = obj.SaveItemStore(logName)

    def stopQxdm(self,obj,logName):
        try:
            obj.DisconnectFromDevice()
            retVal = obj.SaveItemStore(logName)
            if not retVal:
                print("保存QXDM log失败....")
                return False

            print("Closing QXDM session in 5 seconds")
            time.sleep(5)
            obj.Close()
        except Exception as e:
            print("保存log失败,失败原因:%s" %e)
            return False


if __name__ == '__main__':
    #调用参考如下:

    obj=ControlQXDM().startQXDM("1234567") #启动QXDM,你会看到QXDM窗口正在截取log

    time.sleep(10)



    logName = "d:\\123-1.hdf"
    retVal = obj.SaveItemStore(logName)  #保存并清空log
    print(retVal)
    logName = "d:\\1\\123-2.hdf"

    time.sleep(10)


    ControlQXDM().stopQxdm(obj,"d:\\456.hdf") #保存并关闭QXDM

 

============ End

 

posted @ 2025-02-25 15:33  lsgxeva  阅读(1299)  评论(0)    收藏  举报