找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1252|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

Android logs 分析 :機(jī)智云SDK Logs 分析教程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:729078 發(fā)表于 2021-7-13 12:33 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
一,概述

機(jī)智云的SDK日志中包含了大量的信息,極大的方便開(kāi)發(fā)者定位問(wèn)題,但很多開(kāi)發(fā)者都看不懂這些日志,因此該份教程講述如何從SDK的日志中找到自己需要的信息以及定位問(wèn)題。

該份文檔的閱讀前提是開(kāi)發(fā)者已經(jīng)具備獲取Android日志的條件和能力,并且已經(jīng)熟悉機(jī)智云SDK相關(guān)使用方法。如不具備這些前提,請(qǐng)先參考網(wǎng)絡(luò)上的相關(guān)資料。

二,設(shè)置SDK級(jí)別

要查看SDK的日志,首先需要調(diào)用SDK設(shè)置日志級(jí)別的方法,將其設(shè)為所有級(jí)別,以及設(shè)置在后臺(tái)輸出二進(jìn)制數(shù)據(jù)。
調(diào)用方法:

XPGWifiSDK.setLogLevel(XPGWifiLogLevel logLevel, String logFile, boolean bPrintDataInDebug);
參數(shù)說(shuō)明:


三,過(guò)濾日志

SDK的日志主要有兩個(gè)“TAG”,一個(gè)是“xpgc”,一個(gè)是“XPGWifiSDK”。一般情況下,LogCat的Log Tag 設(shè)置為“xpg”即可。
如圖:


“xpgc”代表該日志屬于SDK底層邏輯所打印的日志。

“XPGWifiSDK”代表該日志屬于SDK外部公共接口所打印的日志。
如圖:





四,日志分析


SDK在執(zhí)行每一步操作的時(shí)候,都會(huì)打印出相關(guān)信息,具體信息課參考如下說(shuō)明:

云端請(qǐng)求

SDK里包含的大量的云端交互操作,其中與云端交互部分,會(huì)以“W”(警告)級(jí)別打印,在Eclipse的Log Cat中會(huì)以橘黃色來(lái)標(biāo)記。如下圖:


該日志包含了請(qǐng)求的相關(guān)信息,如請(qǐng)求的Header以及Body。

其中Header包含了AppID以及Token等比較重要的信息,App發(fā)布的時(shí)候請(qǐng)注意關(guān)閉日志輸出。

SDK內(nèi)部使用的網(wǎng)絡(luò)接口都是使用機(jī)智云OpenAPI的相關(guān)接口,接口的詳情可參考官網(wǎng)的文檔。
根據(jù)該日志,可以看出發(fā)出自己的接口調(diào)用是否正確,例如缺少token或者缺少AppID等;同時(shí)也可以判斷自己的網(wǎng)絡(luò)質(zhì)量,是否發(fā)起請(qǐng)求以后長(zhǎng)時(shí)間未收到云端回復(fù)。

一些常見(jiàn)的問(wèn)題分析會(huì)在該文檔后面再詳細(xì)描述。

云端響應(yīng)

SDK發(fā)起請(qǐng)求后,在網(wǎng)絡(luò)正常的情況下,SDK會(huì)收到云端的響應(yīng),響應(yīng)結(jié)果也會(huì)打印在日志中。如圖:


具體的reponse會(huì)以“W”級(jí)別標(biāo)出。上圖是獲取賬號(hào)下綁定的設(shè)備的請(qǐng)求響應(yīng)。一般情況下,開(kāi)發(fā)者無(wú)需理會(huì)具體的網(wǎng)絡(luò)請(qǐng)求和響應(yīng),SDK會(huì)自行處理并作出回調(diào)。只有在網(wǎng)絡(luò)情況不好的情況下,開(kāi)發(fā)者才需要從日志中分析網(wǎng)絡(luò)請(qǐng)求是否正常。

發(fā)現(xiàn)設(shè)備

SDK發(fā)現(xiàn)本地設(shè)備的過(guò)程實(shí)際上是UDP的收發(fā)過(guò)程。SDK會(huì)往路由器發(fā)送一個(gè)UDP廣播,燒寫(xiě)了機(jī)智云模塊的設(shè)備在收到改廣播后,會(huì)回復(fù)一個(gè)響應(yīng)幀到SDK端。具體的過(guò)程可由下圖看出來(lái):


“xpgBroadcast(),port = 12414”該日志說(shuō)明SDK向路由器的12414端口發(fā)送了一個(gè)UDP廣播,具體的指令內(nèi)容可參考協(xié)議文檔。如果發(fā)送成功,SDK會(huì)打印“udp package send success”。
當(dāng)設(shè)備收到了指定的UDP廣播以后,會(huì)回復(fù)相關(guān)響應(yīng)幀,該響應(yīng)幀包含了設(shè)備的Productkey、Did、IP地址、MAC地址等信息。具體的指令內(nèi)容可參考協(xié)議文檔。

SDK收到設(shè)備的回復(fù)以后,會(huì)回調(diào)didDiscoverd接口。
從該日志可以看出SDK發(fā)出廣播后,是否有設(shè)備回復(fù)。如果沒(méi)有收到回復(fù),說(shuō)明有幾點(diǎn)原因:
  • 本地沒(méi)有設(shè)備
  • 路由器不支持UDP廣播
  • 可根據(jù)實(shí)際情況定位問(wèn)題和解決問(wèn)題。



小循環(huán)登錄設(shè)備
小循環(huán)登錄即是手機(jī)與設(shè)備在同一路由器內(nèi),通過(guò)設(shè)備IP建立TCP連接。登錄的過(guò)程如下圖:


由圖中的“Connected to server 192.168.1.102:12416”可以看出SDK發(fā)起的是小循環(huán)登錄,連接的是設(shè)備的IP地址,端口號(hào)為12416。

登錄成功后,SDK內(nèi)部會(huì)打印“OnLogin(int): 0”,返回值0說(shuō)明登錄成功了,會(huì)回調(diào)“didLogin”接口通知UI進(jìn)行處理。
通過(guò)該日志,可以判斷設(shè)備是進(jìn)行大循環(huán)還是小循環(huán)連接,并且可以看出連接成功或者失敗,以及失敗的原因。具體失敗的原因會(huì)在本文檔后面進(jìn)一步描述。

大循環(huán)登錄設(shè)備

大循環(huán)登錄即是手機(jī)與設(shè)備不在同一路由器(網(wǎng)段)內(nèi),通過(guò)機(jī)智云云端建立MQTT連接。登錄的過(guò)程如下圖:


由圖中的“Connected to server m2m.gizwits.com:1883”可以看出SDK發(fā)起的是大循環(huán)登錄,連接的是機(jī)智云云端域名地址,端口號(hào)為1883。

登錄成功后,SDK內(nèi)部會(huì)打印“OnLogin(int): 0”,返回值0說(shuō)明登錄成功了,會(huì)回調(diào)“didLogin”接口通知UI進(jìn)行處理。
通過(guò)該日志,可以判斷設(shè)備是進(jìn)行大循環(huán)還是小循環(huán)連接,并且可以看出連接成功或者失敗,以及失敗的原因。具體失敗的原因會(huì)在本文檔后面進(jìn)一步描述。

小循環(huán)收發(fā)指令

小循環(huán)發(fā)送指令通過(guò)TCP/IP進(jìn)行收發(fā)。開(kāi)發(fā)者調(diào)用SDK方法,傳入JSON格式的指令,由SDK內(nèi)部解析成為二進(jìn)制指令,并發(fā)送給設(shè)備。設(shè)備收到后做出狀態(tài)改變,按照機(jī)智云串口協(xié)議要求,把自己的狀態(tài)用二進(jìn)制指令返回,SDK收到后再封裝為JSON格式,回調(diào)給相關(guān)接口。詳見(jiàn)下圖:


其中“writePi()”說(shuō)明是通過(guò)IP的方式發(fā)送的指令,也即是小循環(huán)發(fā)送。
通過(guò)該日志,可以看出二進(jìn)制指令是否按照協(xié)議文檔收發(fā),是否能正常解析為JSON格式,解析的JSON格式是否正確。具體的分析過(guò)程會(huì)在本文檔后面進(jìn)一步描述。

收發(fā)指令詳解

SDK收發(fā)指令的過(guò)程,均在SDK中打印顯示,App的調(diào)試,也可以從日志中獲得大量很有用的信息。一個(gè)收發(fā)指令的過(guò)程如下圖:





一次指令的收發(fā),具體經(jīng)過(guò)了以下幾個(gè)步驟:

1.調(diào)用SDK的“write()”方法發(fā)送JSON指令
如上圖日志中的JSON指令,包含了“fan_speed”這個(gè)數(shù)據(jù)點(diǎn)。通過(guò)該日志,可以看出發(fā)送的JSON格式是否正確,數(shù)據(jù)點(diǎn)是否正確,數(shù)據(jù)點(diǎn)的key跟value是不是目標(biāo)數(shù)據(jù)。

2.SDK把JSON指令解析為原始業(yè)務(wù)指令
“writeP0()”代表了SDK把JSON格式的指令解析為二進(jìn)制指令,下面會(huì)打印出字節(jié)格式的指令。

3.SDK把二進(jìn)制指令小循環(huán)發(fā)往設(shè)備或大循環(huán)發(fā)往云端
“writePm()”代表了SDK加入了機(jī)智云協(xié)議的包頭后把指令發(fā)往云端。
如果是“writePi()”,則說(shuō)明是小循環(huán)發(fā)送指令。
通過(guò)該日志,可以看出當(dāng)前發(fā)送的指令屬于大循環(huán)還是屬于小循環(huán)。

4.SDK接收到本地或云端的二進(jìn)制指令
“readPm()”代表了SDK接收到了云端返回的二進(jìn)制指令,如果是”readPi()”,則說(shuō)明SDK接收到了本地設(shè)備返回的二進(jìn)制指令。
通過(guò)該日志,可以看出當(dāng)前接收的指令屬于大循環(huán)還是屬于小循環(huán)。

5.SDK把二進(jìn)制指令去除包頭后變?yōu)樵紭I(yè)務(wù)指令
如果SDK接收到了云端的指令,會(huì)去除機(jī)智云協(xié)議的包頭,保留原始的字節(jié)業(yè)務(wù)指令并打印在控制臺(tái)中。

6.SDK把原始業(yè)務(wù)指令封裝為JSON格式
SDK獲取到二進(jìn)制指令后會(huì)根據(jù)自動(dòng)加載的配置文件解析為JSON格式指令。如上圖的“receive data”中打印出的JSON指令。通過(guò)該日志,可以看出解析是否正常以及具體每個(gè)數(shù)據(jù)點(diǎn)的key和value。

7.SDK把JSON格式指令通過(guò)接口回調(diào)給UI層
SDK解析結(jié)束后會(huì)通過(guò)回調(diào)接口把數(shù)據(jù)回調(diào)到UI層,TAG為“XPGWiFiSDK”,接口名一般是”did”開(kāi)頭,例如圖中的”didReceiveData”。
通過(guò)該日志可以看出SDK是否已經(jīng)成功調(diào)用了回調(diào)接口,以及調(diào)用的回調(diào)接口具體的接口名。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表