gaoxianqu 发表于 2015-12-14 12:13:40

QQ物联-状态同步

本帖最后由 gaoxianqu 于 2015-12-14 12:21 编辑

内容概要
本文主要介绍智能设备的状态信息要如何同步到手机QQ,比如空调上的室内温度,比如门锁的开关状态,或者是SD卡格式化的进度等等。

不用消息?
您可能会问,直接让智能设备发CC消息(CC消息是腾讯内部的简称,全程是Client To Client Message) 给手机QQ同步信息不就行了吗?

很遗憾,这不是一个推荐的解决方案,我们看看会有什么问题:
(1)一台智能设备可能会有多个绑定者,状态的同步是不能只同步给一个绑定者的,所以用发消息的方案会需要知道所有绑定者,然后挨个发送一遍。
(2)状态的变更有可能是频繁的,很多情况下最后一次的状态才是最重要的,而QQ的消息通道是以可靠不丢消息为设计目标的,这就意味着您可能在早晨起床唤起QQ后收到上千条状态消息。

所以,我们专门为这种情况设计了更加适合的同步机制,如下图:

http://qzonestyle.gtimg.cn/qzone/vas/opensns/res/img/datapoint_sync_status_model.png

案例场景
本节引入的案例是如下一个场景:假如您的产品是一款WiFi智能音箱,它可以独立接入互联网,从网络上下载最新的音乐并且播放。如果现在这款音箱正在播放歌曲,那么您手机上的控制界面需要看到当前播放的歌曲名称和播放进度,下面我们将介绍如何实现这个功能。

http://qzonestyle.gtimg.cn/qzone/vas/opensns/res/img/datapoint_sync_status_wifi_speaker.png

联调攻略
接下来我们分如下三个步骤来讲述整个联调过程,这三个过程分别对应配置平台、设备端以及手机端三处。

Step 1 配置设备功能
首先进入功能配置平台,点击您的设备进入设备配置管理界面,之后再点击功能配置进入功能定制界面。您会看到我们已经为音箱定义了一些公共功能(如不能满足需求,你可以自己定义)。

接下来寻找我们感兴趣的两个功能点:歌曲信息 & 播放进度
http://qzonestyle.gtimg.cn/qzone/vas/opensns/res/img/datapoint_sync_status_music_name.png


功能名称功能ID参数格式
歌曲信息700111{"songname": "LoveYouTo","artist": "LoveYouTo", "album": "YellowSubmarine", "composer": "JohnLennon", "year": "1963", "track": "4","cover_url": "http://i.gtimg.cn/music/photo/mid_album_300/Y/S/001k8htW4JwAYS.jpg","time":300}
播放进度70012330%
Step 2 设备端代码编写
接下来我们需要在设备端编写同步状态的代码,如下所示,这段代码的主要功能是将设备的最新状态同步给QQ物联的状态服务器:

tx_report_data_point(700111, "...", 0, on_report_data_point);tx_report_data_point(700123, "30",0, on_report_data_point);
由于tx_report_data_point本质是一个向服务器的信令通讯,所以下面的写法在绝大多数情况下会更高效:

// 装填 datapoint 数据结构
tx_data_point points[2] = {
    {700111, "...", 0, 0},   // ... 省略了歌曲信息的json字符串
    {700123, "30" , 0, 0},   // seq 在发送时是不需要填写的, ret_code 也不需要填写
};
// 将状态上报给服务器
int cookie = 0,tx_report_data_point(points, 2, &cookie, on_report_data_point);

Step 3 手机端代码编写
最后要做的就是在手机端将最新状态拿到并展现出来,这里有两种解决方案,分别对应两种不同的情况:

方案一:针对高频变化的状态
如果某个时刻状态变化非常频繁,则推荐采用轮询的方式进行查询,比如进度信息,它的变化可能非常频繁,所以推荐的方案是每隔 n 秒的时间查询一次。在这个案例里,播放进度就是这样一个典型的场景,我们可以每10秒钟查询一次进度。

device.query({list : [700111, 700123],         // 需要查询状态的 datapoint id 列表
interval : 10000,                // 每隔10s查询一次状态,定时查询需慎用,容易把服务器拖垮
onSuccess : function (ret) {
          device.log('onSuccess: ' + JSON.stringify(ret));
}
});

更高效的方案
实际上,进度信息用音箱这个案例并不是非常合适,聪明的您可能已经发现,只需要同步一次歌曲的播放时间,后面的进度完全可以在手机端全部完成了,所以,这里仅仅是作为一个案例进行说明。

方案二:针对低频变化的状态 (手机QQ >= 5.9)
对于当前正在播放哪一首歌曲这种情况,状态是轻易不会发生变化的,所以轮询是比较浪费的解决方案,这种场景适合使用push通知,也就是当状态发生变化时,新的状态主动通知给手机,告知其状态发生了变化。

device.onServerPush(function (data) {
if (data.key == 'DPPushNotify' && data.value) { // DataPoint 变更通知
    device.query({
      list : data.value.PropIDs,
      onSuccess : function (ret) {
      device.log('onSuccess: ' + JSON.stringify(ret));
      }
    });
}
});

版本要求
device sdk: 1.2
mobile QQ: 5.7










页: [1]
查看完整版本: QQ物联-状态同步