收藏官网首页
查看: 3152|回复: 13

关于虚拟设备与Android APP数据收发

4

主题

13

帖子

104

积分

注册会员

Rank: 2

积分
104
发表于 2015-8-29 11:55:19 | 显示全部楼层 |阅读模式
注册成为机智云开发者,手机加虚拟设备快速开发
  • 情况描述



APP发送控制指令虚拟设备不响应
发送指令的回调会被调用,但是,回调的结果不对
  1. @Override
  2.         public void didReceiveData(XPGWifiDevice device,
  3.                         ConcurrentHashMap<String, Object> dataMap,
  4.                         int result){
  5. 。。。
  6. }
复制代码
如上所示,回调函数的3个参数里面,dataMap为空,result值为-20
经查API,-20对应的错误代码为
  1. public static final int XPGWifiError_INVALID_PARAM -20
复制代码
但是,我发送数据的格式
  1. int GWifiDevice::write(char const*): {"entity0":{"Switch":"1"},"cmd":1}
复制代码
跟IOE Demo发送数据的格式

  1. int GWifiDevice::write(char const*): {"entity0":{"Switch":"1"},"cmd":1}
复制代码
是完全一样的

但是,IOE Demo发送的控制指令虚拟设备完全能够正常响应

另,虚拟设备推送的数据也无法正常接收,接收到的结果值为213,我不知道这个213代表什么,我也不知道这是不是代表接收成功,但是日志的确没有像正常接收数据那样打印接收到的json格式的数据包


下面附上程序运行日志,各位大大帮帮忙看看我的问题出在哪里


  • 程序运行日志
  1. 84 matches in 83 lines for "22717" in buffer: log.txt
  2.       7:E/dalvikvm(22717): could not disable core file generation for pid 22717: Operation not permitted
  3.      39:W/xpgc    (22717): 11:31:16 succeed output log to file:/sdcard/XpgAirCondition.log
  4.      41:W/linker  (22717): library "libmaliinstr.so" not found
  5.      43:W/linker  (22717): error:
  6.      47:W/xpgc    (22717): 11:31:18 running gethostbyname(): api.gizwits.com
  7.      51:W/xpgc    (22717): 11:31:18 gethostbyname api.gizwits.com success: 182.254.227.66
  8.      53:W/xpgc    (22717): 11:31:18 running connect()
  9.      55:I/xpgc    (22717): 11:31:18 connect to 182.254.227.66, port 80 success, fd 77
  10.      57:I/xpgc    (22717):
  11.      59:W/xpgc    (22717): 11:31:18 Send http head: POST /app/login HTTP/1.1
  12.      62:W/xpgc    (22717): language: zh-CN
  13.      65:W/xpgc    (22717): User-Agent: XPGWiFiSDK (v1.3.0.15082322)
  14.      68:W/xpgc    (22717): Host: api.gizwits.com:80
  15.      71:W/xpgc    (22717): Connection: keep-alive
  16.      74:W/xpgc    (22717): Content-Type: application/json
  17.      77:W/xpgc    (22717): X-Gizwits-Application-Id: 1837bd3c335f409ba6dba16b8dd5747c
  18.      80:W/xpgc    (22717): Content-Length: 48
  19.      83:W/xpgc    (22717):
  20.      86:W/xpgc    (22717):
  21.      88:W/xpgc    (22717):
  22.      90:W/xpgc    (22717): 11:31:18 Send http body: {"username":"15077884905","password":"12345678"}
  23.      92:W/xpgc    (22717):
  24.      94:I/xpgc    (22717): 11:31:18 Http Content-Length or first ChunckedSize: 113
  25.      96:I/xpgc    (22717):
  26.      98:W/xpgc    (22717): 11:31:18 User 15077884905 login success, uid:404884c5a668434ebb552e15143a4e55, token:0e7f3a6434484597885885b0246daf71, expire_at:1441423879
  27.     100:I/xpgc    (22717): 11:31:18 _recvThread() httpStruct = 0x772e5298 type = 6
  28.     102:I/xpgc    (22717):
  29.     104:I/XPGWifiSDK(22717): Success callback didUserLogin, XPGWifiSDKListener != null
  30.     106:W/xpgc    (22717): 11:31:18 Success Callback in>>> static void GWifiSDK::onUserLoginResp(UserLoginResp_t*) (error:0, errorMessage:)
  31.     108:W/xpgc    (22717): 11:31:18 [_XPGWifiSDK.cpp][2061] bool GWifiSDK::DiscoverDevices(): udp package send success
  32.     110:W/xpgc    (22717): 11:31:18 running gethostbyname(): api.gizwits.com
  33.     114:W/xpgc    (22717): 11:31:18 gethostbyname api.gizwits.com success: 182.254.227.66
  34.     116:W/xpgc    (22717): 11:31:18 running connect()
  35.     118:I/xpgc    (22717): 11:31:18 connect to 182.254.227.66, port 80 success, fd 77
  36.     120:I/xpgc    (22717):
  37.     122:W/xpgc    (22717): 11:31:18 Send http head: GET /app/bindings?show_disabled=0&limit=10000&skip=0 HTTP/1.1
  38.     125:W/xpgc    (22717): language: zh-CN
  39.     128:W/xpgc    (22717): User-Agent: XPGWiFiSDK (v1.3.0.15082322)
  40.     131:W/xpgc    (22717): Host: api.gizwits.com:80
  41.     134:W/xpgc    (22717): Connection: keep-alive
  42.     137:W/xpgc    (22717): Content-Type: application/json
  43.     140:W/xpgc    (22717): X-Gizwits-Application-Id: 1837bd3c335f409ba6dba16b8dd5747c
  44.     143:W/xpgc    (22717): X-Gizwits-User-token: 0e7f3a6434484597885885b0246daf71
  45.     146:W/xpgc    (22717): Content-Length: 0
  46.     149:W/xpgc    (22717):
  47.     152:W/xpgc    (22717):
  48.     154:W/xpgc    (22717):
  49.     156:W/xpgc    (22717): 11:31:18 Send http body: (null)
  50.     158:W/xpgc    (22717):
  51.     162:I/xpgc    (22717): 11:31:18 Http Content-Length or first ChunckedSize: 309
  52.     164:I/xpgc    (22717):
  53.     166:W/xpgc    (22717): 11:31:18 Http response: {"devices": [{"is_disabled": false, "mac": "virtual:site", "is_online": true, "host": "sandbox.gizwits.com", "port": 1883, "remark": "", "did": "i6wbbMacUrBursbzysga5i", "wifi_soft_version": null, "product_key": "03a1c94f1e35439da9341c9dd228e9fa", "is_sandbox": true, "passcode": "123456", "type": "normal"}]}
  54.     168:W/xpgc    (22717):
  55.     170:W/xpgc    (22717): 11:31:18 Get 1 devices from api.gizwits.com success
  56.     172:I/xpgc    (22717): 11:31:18 _recvThread() httpStruct = 0x77362ef8 type = 14
  57.     174:I/xpgc    (22717):
  58.     176:W/xpgc    (22717): 11:31:18 Success Callback in>>> static void GWifiSDK::onGetBoundDeviesResp(GetBoundDevicesResp_t*) (error:0, errorMessage:)
  59.     178:I/xpgc    (22717): 11:31:18 static void GWifiSDK::onGetBoundDeviesResp(GetBoundDevicesResp_t*): Start UnBindAllDevices
  60.     180:I/xpgc    (22717): 11:31:18 static void GWifiSDK::onGetBoundDeviesResp(GetBoundDevicesResp_t*): End UnBindAllDevices
  61.     182:W/xpgc    (22717): 11:31:18 bool GWifiDevice::IsBind(char const*)():760, device VIRTUAL:SITE is not bind to uid 404884c5a668434ebb552e15143a4e55, because the cache uid is empty.
  62.     184:I/xpgc    (22717): 11:31:18 void GWifiSDK::MergeBindDevicesToTempDevices(): first, callback with bind list info.
  63.     186:I/xpgc    (22717): 11:31:18 void GWifiSDK::DiscoverCallback(int): ==> try to push device[1] mac:VIRTUAL:SITE, did:i6wbbMacUrBursbzysga5i, isLan:0, isOnline:1, isLogined:0, ip:, passcode: 123456 into devicelist
  64.     188:I/XPGWifiSDK(22717): Success callback didDiscovered 1 devices, XPGWifiSDKListener = com.snlion.gizwits.activity.BaseActivity$1@43625600: com.xtremeprog.xpgconnect.XPGWifiDevice@4364d620, mac: VIRTUAL:SITE
  65.     190:I/xpgc    (22717): 11:31:18 void GWifiSDK::DiscoverCallback(int): (2189) Discovered 1 devices and notified UI
  66.     192:I/xpgc    (22717): 11:31:18 void GWifiSDK::DiscoverCallback(int): (2190) getBoundDevices ack: 0
  67.     194:I/XPGWifiDevice(22717):  setListener: com.snlion.gizwits.activity.BaseActivity$2@43625610, com.xtremeprog.xpgconnect.XPGWifiDevice@4364d620: VIRTUAL:SITE
  68.     198:I/xpgc    (22717): 11:31:20 Start connecting to ip & port: 182.254.226.171:1883.
  69.     200:I/xpgc    (22717): 11:31:20 ------------------------>connect elapsed: 77.000.
  70.     202:I/xpgc    (22717): 11:31:20  ... succeed.
  71.     204:I/xpgc    (22717): 11:31:20 Connected to server sandbox.gizwits.com:1883, connId: 0.
  72.     206:W/xpgc    (22717): 11:31:20 xpgcLogin() clientid=usrPWnEU2aizHPXdlvMU2iq
  73.     208:W/xpgc    (22717):
  74.     210:I/xpgc    (22717): 11:31:20 mqtt_init_auth username:2$1837bd3c335f409ba6dba16b8dd5747c$404884c5a668434ebb552e15143a4e55 password:0e7f3a6434484597885885b0246daf71
  75.     212:W/xpgc    (22717): 11:31:20 _recvThread() mqtt callback 32
  76.     214:I/xpgc    (22717): 11:31:20 subscribing topic: dev2app/i6wbbMacUrBursbzysga5i
  77.     216:I/xpgc    (22717): 11:31:20 topic "dev2app/i6wbbMacUrBursbzysga5i" subscribed
  78.     218:W/xpgc    (22717): 11:31:20 _recvThread() mqtt callback 144
  79.     220:I/xpgc    (22717): 11:31:20 void GWifiDevicePrivate::OnLogin(int): 0
  80.     222:I/XPGWifiDevice(22717): Success callback didLogin, XPGWifiDeviceListener = com.snlion.gizwits.activity.BaseActivity$2@43625610, com.xtremeprog.xpgconnect.XPGWifiDevice@4364d620: VIRTUAL:SITE
  81.     224:I/xpgc    (22717): 11:31:20 int GWifiDevice::write(char const*): {"entity0":{"Switch":"1"},"cmd":1}
  82.     228:I/xpgc    (22717): 11:31:24 int GWifiDevice::write(char const*): {"entity0":{"Switch":"1"},"cmd":1}
  83.     230:I/xpgc    (22717): 11:31:26 int GWifiDevice::write(char const*): {"entity0":{"Switch":"1"},"cmd":1}
  84.     240:I/xpgc    (22717): 11:31:28 int GWifiDevice::write(char const*): {"entity0":{"Switch":"1"},"cmd":1}
复制代码
此日志的过滤条件是22717,即线程号,所以不用担心有用的信息会被过滤掉

  • 相关代码
发送数据的代码段:
  1. if(device.isOnline()){
  2.                         try{
  3.                                 final JSONObject jsonsend = new JSONObject();
  4.                                 jsonsend.put("cmd", 1);
  5.                                 JSONObject jsonparam = new JSONObject();
  6.                                 jsonparam.put("Switch", "1");
  7.                                 jsonsend.put("entity0", jsonparam);
  8.                                 device.write(jsonsend.toString());
  9.                         }catch(JSONException e){
  10.                                 e.printStackTrace();
  11.                         }
  12.                 }else{
  13.                         Toast.makeText(DeviceListActivity.this, "Error:Device Is Not Online !", Toast.LENGTH_SHORT).show();
  14.                 }
  15. <b></b><i></i><u></u><sub></sub><sup></sup><strike></strike>
复制代码

相关回调:
  1. @Override
  2.         public void didReceiveData(XPGWifiDevice device,
  3.                         ConcurrentHashMap<String, Object> dataMap,
  4.                         int result){
  5.                 Message msg = Message.obtain();
  6.                 //msg.obj = "Data Received Success";
  7.                 if(result == -20){
  8.                         msg.obj = "INVALID PARAMS";
  9.                 }else{
  10.                         msg.obj = "Other Error"+result;
  11.                 }
  12.                 msg.what = DATA_RECEIVE;
  13.                 mcHandler.sendMessage(msg);
  14.         };        // end of didReceiveData
复制代码
  • PS:我的SDK是昨天升级的,升级之前是收不到这个回调的,因为我不知道SDK具体更新了什么,相关代码也不知道该修改哪里,也许这是个线索

4

主题

13

帖子

104

积分

注册会员

Rank: 2

积分
104
 楼主| 发表于 2015-9-7 11:18:28 | 显示全部楼层

[已解决]

本帖最后由 MalcolmC 于 2015-9-7 12:27 编辑
Tom 发表于 2015-9-6 22:33
ERROR_INVALID_PARAM 出错的可能性,只有两个。一个是设备为空,一个是写入的数据为 null。看了你的原帖 ...

这才是正解!!!终于找到原因了!!!
感谢

4

主题

13

帖子

104

积分

注册会员

Rank: 2

积分
104
 楼主| 发表于 2015-8-31 09:48:29 | 显示全部楼层
bool GWifiDevice::IsBind(char const*)():760, device VIRTUAL:SITE is not bind to uid 404884c5a668434ebb552e15143a4e55, because the cache uid is empty.
这里,我发现了问题,但是不知道是怎么回事,字面意思是绑定没有成功,但是,isBind(uid)却通过了。。。
API里面说这个方法返回的是true或false,通过了应该是绑定成功了啊,那这句日志是怎么回事呢?
发表于 2015-9-1 14:43:52 | 显示全部楼层
v1.3.0.15082322这个版本的设备绑定有bug,下个版本已经修复,本周会发布到官网。

4

主题

13

帖子

104

积分

注册会员

Rank: 2

积分
104
 楼主| 发表于 2015-9-1 15:06:28 | 显示全部楼层
校园创客福利
pomia 发表于 2015-9-1 14:43
v1.3.0.15082322这个版本的设备绑定有bug,下个版本已经修复,本周会发布到官网。 ...

终于有人回复了,而且,对这个回复,我可以表示满意么?
这个bug是造成我收发数据失败的原因么?

27

主题

235

帖子

1053

积分

金牌会员

Rank: 6Rank: 6

积分
1053
发表于 2015-9-3 20:40:38 来自手机 | 显示全部楼层
MalcolmC 发表于 2015-9-1 15:06
终于有人回复了,而且,对这个回复,我可以表示满意么?
这个bug是造成我收发数据失败的原因么? ...

你好,帖子上提供的日志里面没有告诉我们 write 之后具体打印了什么信息,可以过滤 xpgc 的标签,然后打印出来,我可以分析一下。

27

主题

235

帖子

1053

积分

金牌会员

Rank: 6Rank: 6

积分
1053
发表于 2015-9-3 21:06:42 来自手机 | 显示全部楼层
MalcolmC 发表于 2015-8-31 09:48
bool GWifiDevice::IsBind(char const*)():760, device VIRTUAL:SITE is not bind to uid 404884c5a668434 ...

设备没有与这个 uid 绑定,才会有这个 log 打印。IsBind() 方法应返回 false。你说的通过了是返回 TRUE 吗?

4

主题

13

帖子

104

积分

注册会员

Rank: 2

积分
104
 楼主| 发表于 2015-9-6 12:20:08 | 显示全部楼层
Tom 发表于 2015-9-3 20:40
你好,帖子上提供的日志里面没有告诉我们 write 之后具体打印了什么信息,可以过滤 xpgc 的标签,然后打 ...

我是过滤的进程号,意思是只要是这个程序的所有日志都在这里了,write之后没有输出什么日志,我可以肯定

4

主题

13

帖子

104

积分

注册会员

Rank: 2

积分
104
 楼主| 发表于 2015-9-6 12:20:55 | 显示全部楼层
Tom 发表于 2015-9-3 21:06
设备没有与这个 uid 绑定,才会有这个 log 打印。IsBind() 方法应返回 false。你说的通过了是返回 TRUE  ...

是的,if(isBind)....通过了的

4

主题

13

帖子

104

积分

注册会员

Rank: 2

积分
104
 楼主| 发表于 2015-9-6 12:37:14 | 显示全部楼层
汉枫LPB120模块
Tom 发表于 2015-9-3 21:06
设备没有与这个 uid 绑定,才会有这个 log 打印。IsBind() 方法应返回 false。你说的通过了是返回 TRUE  ...

但是poima告诉我那个输出是正常的。。。

27

主题

235

帖子

1053

积分

金牌会员

Rank: 6Rank: 6

积分
1053
发表于 2015-9-6 22:33:32 | 显示全部楼层
MalcolmC 发表于 2015-9-6 12:20
我是过滤的进程号,意思是只要是这个程序的所有日志都在这里了,write之后没有输出什么日志,我可以肯定 ...

ERROR_INVALID_PARAM 出错的可能性,只有两个。一个是设备为空,一个是写入的数据为 null。看了你的原帖,写入数据格式没错。那么,能登录成功,设备也不会为空。有一种情况,设备登录之后,再调用获取设备列表,这样会有问题。我想问一下,你的 app 是否是这样做的?

27

主题

235

帖子

1053

积分

金牌会员

Rank: 6Rank: 6

积分
1053
发表于 2015-9-6 22:47:23 | 显示全部楼层
MalcolmC 发表于 2015-9-6 12:37
但是poima告诉我那个输出是正常的。。。

虚拟设备,在当前用户能得到列表,并且包含这个设备,我们认为这个设备是已经绑定的,则 IsBind 返回 true。出现没有绑定的日志,根据源码上得出 IsBind() 一定是返回 false。

27

主题

235

帖子

1053

积分

金牌会员

Rank: 6Rank: 6

积分
1053
发表于 2015-9-6 23:01:50 | 显示全部楼层
本帖最后由 Tom 于 2015-9-6 23:45 编辑

SDK 的做法是,IsBind 传入的 uid 会比对缓存的 uid 是否一致。如果一致,则为绑定成功。这个缓存的 uid,是最后一次登录、使用对应的 uid、token 获取设备列表的时候,SDK 会自动记录的一个值。

27

主题

235

帖子

1053

积分

金牌会员

Rank: 6Rank: 6

积分
1053
发表于 2015-9-6 23:44:32 | 显示全部楼层
再讲细一点吧

bool GWifiDevice::IsBind(char const*)():760, device VIRTUAL:SITE is not bind to uid 404884c5a668434ebb552e15143a4e55, because the cache uid is empty.

这个日志出现的原因,是因为 SDK 缓存的 uid 是空的。出现这种情况,device.IsBind() 返回一定为 false。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

© 2011-2017 Gizwits ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表