四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2925|回复: 0
打印 上一主题 下一主题

QQ物联-状态同步

[复制链接]
  • TA的每日心情
    萌哒
    2016-4-15 13:02
  • 139

    主题

    191

    帖子

    2091

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2091
    跳转到指定楼层
    楼主
    发表于 2015-12-14 12:13:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 gaoxianqu 于 2015-12-14 12:21 编辑

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

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

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

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



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



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

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

    接下来寻找我们感兴趣的两个功能点:歌曲信息 & 播放进度


    功能名称
    功能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}
    播放进度
    700123
    30%
    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










    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-5-6 22:27 , Processed in 1.046875 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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