一、概述
机智云的SDK日志中包含了大量的信息,极大的方便开发者定位问题,但很多开发者都看不懂这些日志,因此该份教程讲述如何从SDK的日志中找到自己需要的信息以及定位问题。 该份文档的阅读前提是开发者已经具备获取Android日志的条件和能力,并且已经熟悉机智云SDK相关使用方法。如不具备这些前提,请先参考网络上的相关资料。
二、设置SDK级别
要查看SDK的日志,首先需要调用SDK设置日志级别的方法,将其设为所有级别,以及设置在后台输出二进制数据。
调用方法:
XPGWifiSDK.setLogLevel(XPGWifiLogLevel logLevel, String logFile, boolean bPrintDataInDebug);
参数说明:
三、过滤日志
SDK的日志主要有两个“TAG”,一个是“xpgc”,一个是“XPGWifiSDK”。一般情况下,LogCat的Log Tag 设置为“xpg”即可。
如图:
“xpgc”代表该日志属于SDK底层逻辑所打印的日志。
“XPGWifiSDK”代表该日志属于SDK外部公共接口所打印的日志。
如图:
四、日志分析
SDK在执行每一步操作的时候,都会打印出相关信息,具体信息课参考如下说明:
云端请求
SDK里包含的大量的云端交互操作,其中与云端交互部分,会以“W”(警告)级别打印,在Eclipse的Log Cat中会以橘黄色来标记。如下图:
该日志包含了请求的相关信息,如请求的Header以及Body。
其中Header包含了AppID以及Token等比较重要的信息,App发布的时候请注意关闭日志输出。
SDK内部使用的网络接口都是使用机智云OpenAPI的相关接口,接口的详情可参考官网的文档, 点击这里可跳转。 根据该日志,可以看出发出自己的接口调用是否正确,例如缺少token或者缺少AppID等;同时也可以判断自己的网络质量,是否发起请求以后长时间未收到云端回复。
一些常见的问题分析会在该文档后面再详细描述。
云端响应
SDK发起请求后,在网络正常的情况下,SDK会收到云端的响应,响应结果也会打印在日志中。如图:
具体的reponse会以“W”级别标出。上图是获取账号下绑定的设备的请求响应。一般情况下,开发者无需理会具体的网络请求和响应,SDK会自行处理并作出回调。只有在网络情况不好的情况下,开发者才需要从日志中分析网络请求是否正常。
发现设备
SDK发现本地设备的过程实际上是UDP的收发过程。SDK会往路由器发送一个UDP广播,烧写了机智云模块的设备在收到改广播后,会回复一个响应帧到SDK端。具体的过程可由下图看出来:
“xpgBroadcast(),port = 12414”该日志说明SDK向路由器的12414端口发送了一个UDP广播,具体的指令内容可参考协议文档。如果发送成功,SDK会打印“udp package send success”。
当设备收到了指定的UDP广播以后,会回复相关响应帧,该响应帧包含了设备的Productkey、Did、IP地址、MAC地址等信息。具体的指令内容可参考协议文档。
SDK收到设备的回复以后,会回调didDiscoverd接口。
从该日志可以看出SDK发出广播后,是否有设备回复。如果没有收到回复,说明有几点原因: 本地没有设备 路由器不支持UDP广播 可根据实际情况定位问题和解决问题。
小循环登录设备
小循环登录即是手机与设备在同一路由器内,通过设备IP建立TCP连接。登录的过程如下图:
由图中的“Connected to server 192.168.1.102:12416”可以看出SDK发起的是小循环登录,连接的是设备的IP地址,端口号为12416。
登录成功后,SDK内部会打印“OnLogin(int): 0”,返回值0说明登录成功了,会回调“didLogin”接口通知UI进行处理。
通过该日志,可以判断设备是进行大循环还是小循环连接,并且可以看出连接成功或者失败,以及失败的原因。具体失败的原因会在本文档后面进一步描述。
大循环登录设备
大循环登录即是手机与设备不在同一路由器(网段)内,通过机智云云端建立MQTT连接。登录的过程如下图:
由图中的“Connected to server m2m.gizwits.com:1883”可以看出SDK发起的是大循环登录,连接的是机智云云端域名地址,端口号为1883。
登录成功后,SDK内部会打印“OnLogin(int): 0”,返回值0说明登录成功了,会回调“didLogin”接口通知UI进行处理。
通过该日志,可以判断设备是进行大循环还是小循环连接,并且可以看出连接成功或者失败,以及失败的原因。具体失败的原因会在本文档后面进一步描述。
小循环收发指令
小循环发送指令通过TCP/IP进行收发。开发者调用SDK方法,传入JSON格式的指令,由SDK内部解析成为二进制指令,并发送给设备。设备收到后做出状态改变,按照机智云串口协议要求,把自己的状态用二进制指令返回,SDK收到后再封装为JSON格式,回调给相关接口。详见下图:
其中“writePi()”说明是通过IP的方式发送的指令,也即是小循环发送。
通过该日志,可以看出二进制指令是否按照协议文档收发,是否能正常解析为JSON格式,解析的JSON格式是否正确。具体的分析过程会在本文档后面进一步描述。
大循环收发指令 小循环发送指令通过MQTT方式进行收发。开发者调用SDK方法,传入JSON格式的指令,由SDK内部解析成为二进制指令,并发送给设备。设备收到后做出状态改变,按照机智云串口协议要求,把自己的状态用二进制指令返回,SDK收到后再封装为JSON格式,回调给相关接口。详见下图:
其中“writePm()”说明是通过MQTT的方式发送的指令,也即是大循环发送。 “readPm()”说明时通过MQTT的方式接收到指令,也就是大循环接收。
通过该日志,可以看出二进制指令是否按照协议文档收发,是否能正常解析为JSON格式,解析的JSON格式是否正确。具体的分析过程会在本文档后面进一步描述。
收发指令详解 SDK收发指令的过程,均在SDK中打印显示,App的调试,也可以从日志中获得大量很有用的信息。一个收发指令的过程如下图:
一次指令的收发,具体经过了以下几个步骤: 1.调用SDK的“write()”方法发送JSON指令 如上图日志中的JSON指令,包含了“fan_speed”这个数据点。通过该日志,可以看出发送的JSON格式是否正确,数据点是否正确,数据点的key跟value是不是目标数据。
2.SDK把JSON指令解析为原始业务指令 “writeP0()”代表了SDK把JSON格式的指令解析为二进制指令,下面会打印出字节格式的指令。
3.SDK把二进制指令小循环发往设备或大循环发往云端 “writePm()”代表了SDK加入了机智云协议的包头后把指令发往云端。 如果是“writePi()”,则说明是小循环发送指令。 通过该日志,可以看出当前发送的指令属于大循环还是属于小循环。
4.SDK接收到本地或云端的二进制指令 “readPm()”代表了SDK接收到了云端返回的二进制指令,如果是”readPi()”,则说明SDK接收到了本地设备返回的二进制指令。 通过该日志,可以看出当前接收的指令属于大循环还是属于小循环。
5.SDK把二进制指令去除包头后变为原始业务指令 如果SDK接收到了云端的指令,会去除机智云协议的包头,保留原始的字节业务指令并打印在控制台中。
6.SDK把原始业务指令封装为JSON格式 SDK获取到二进制指令后会根据自动加载的配置文件解析为JSON格式指令。如上图的“receive data”中打印出的JSON指令。通过该日志,可以看出解析是否正常以及具体每个数据点的key和value。
7.SDK把JSON格式指令通过接口回调给UI层 SDK解析结束后会通过回调接口把数据回调到UI层,TAG为“XPGWiFiSDK”,接口名一般是”did”开头,例如图中的”didReceiveData”。 通过该日志可以看出SDK是否已经成功调用了回调接口,以及调用的回调接口具体的接口名。
|