Tange Cloud for Device
 Rev.333
载入中...
搜索中...
未找到
低功耗设备开发

低功耗设备要求

BatteryCam = "Dormant" | "Solar"

低功耗设备的特点在于唤醒后要立即进入可用状态。包括:

  • SDK初始化要快
  • p2p功能要尽早可用
  • 云录像模块要马上开始缓存数据
  • 事件上报尽可能早

低功耗设备初始化

  1. 设置回调 TciSetCallback()TciSetCmdHandler()
  2. 调用 TciInit()初始化基本信息
  3. 调用 TciAllocCloudBuffer() 分配云存储缓冲区
  4. 初始化音视频模块,从RTC恢复本地时间(重要!)后即可马上调用 TciSendFrameEx() 将数据送入缓存
  5. 确保本地网络准备好后,立即调用TciSetEventEx()上报事件
  6. 调用 TciStart() 开始其它注册过程(P2P服务在里面启动)

TciStart()会首先启动P2P块以接收App的连接,然后再执行其它与平台的交互。交互过程
可能会由于域名解析或其它网络的问题用较长时间,而这里App已经连上来了。所以应用在
TciStart()返回前就要开始送数据。

如果事件时敏性很高,可以放到TciStart()前调用, SDK内部会延时到与事件相关的平台交互
完成后(TciStart()还没有返回)才真正执行。

上述流程也可以用于普通设备**。

设备休眠

设备注册成功(TciStart()返回0)后, SDK通过 TciCB::on_status(STATUS_IDLE, NULL, len) 回调与应用层作下电协商。

STATUS_IDLE 至少会被调用两次。前面是下电协商, 最后一次是下电通知。协商阶段的调用需要应用返回一个值。

len 为非0时为下电协商, 此时SDK内部的事务已经处理完毕(见下面说明)。如果设备同意下电,
应用在此时要做清理(例如停止SD卡录像)和下电准备(与唤醒服务器建立连接),并且返回0。
如果应用暂时不能进入休眠,可以返回一个大于0的值N,sdk会在N秒后再次查询.

返回0后,sdk内部会做清理。清理完成后会以 len=0 再次调用 STATUS_IDLE. SDK清理完成后,
p2p和其它服务已经不可用,设备必须立即下电. 此时的返回值已经没有意义.
【应用层不能在设备完成清理前下电,这会导致唤醒不正常!!!】

如果返回-1,sdk 不会再调用 STATUS_IDLE (除非调用了 TciSetPowerMode(PM_SLEEPABLE), 这是另一种类型的设备 )

STATUS_IDLE 状态触发要满足两个条件:

  1. 用户没有在APP端操作。包括以下情形:
    • 设备被APP唤醒,但10"内没有连接进入(意味着连接失败)
    • 连接都断开
    • 有连接上但没有在看实时和回放,也没有进入设置界面
  2. 事件触发的云录像已经结束.

以下情形没有通知,应用层要自己处理:

  • 调用 TciStart()前(设备处于添加状态,或正在连接本地网络等...)
  • TciStart()返回非0(设备无法注册)
  • TciStart()长时间不返回(网络或服务器问题, TciStart()内部在一直重试). 设备可以在30"后下电

无论有没有通知,应用层最好设置一个最大上电时长,超过这个时间强制下电。用这个机制来保护系统出现异常的情形.

休眠准备

进入休眠前要先与唤醒服务器建立连接。视网络模块配置方式的不同,休眠准备有两种不同的进入方式:

  • 在主控里建立到唤醒服务器的tcp连接,网络模块继承主控的tcp连接属性(不是建立新连接。例如Hi1131)

    调用 TciPrepareHiberation() 建立与唤醒服务器的初次连接。使用返回的socket配置wifi模块在主控下电后与唤醒服务器保持心跳

  • 网络模块无法继承主控的tcp连接属性,需要自行建立到唤醒服务器的连接(例如4G模块和Hi3861)
    1. 应用调用 TciGetWakeupServers() 获取唤醒服务器的地址.
    2. 网络模块建立到唤醒服务器的连接, 接收由服务器返回的randkey.
    3. 应用使用此randkey调用 TciPrepareAuthString(). 该api返回一个认证字符串.
    4. 网络模块向服务器发送这个认证字符串.

连接建立后, 主控下电. 网络模块每50"向服务器发送64字节的心跳包,包内容任意.

例子

4G模块EC20的心跳连接建立流程图

4G模块EC20的心跳连接建立流程图

设备唤醒

唤醒时,服务器发送唤醒串: 0x98,0x3b,0x16,0xf8,0xf3,0x9c

低功耗设备的云存

一般性处理

前面已经提到, 要在TciInit()后立即调用 TciAllocCloudBuffer() 分配云存缓冲, 随后SDK就可以接
收并缓存数据,到联网注册成功后再开始上传.

预缓存录像数据的处理

低功耗设备从唤醒到系统和应用初始化完成,可能要花好几秒时间,这会导致录像实际比事件触发的时间
要晚好几秒, 从而可能漏掉一些关键信息。

为改善这种情况,有一种设备的实现, 把启动音视频编码放在上电后尽量早的地方、主程序启动之前。当
主程序起来时,系统已经在主程序外缓存了几秒钟的音视频数据。在调用了TciAllocCloudBuffer()后,
再把这些数据批量填充下来。

因为TciSendFrameEx()接口没有传送帧的实际发生时间, SDK默认把接收帧(调用TciSendFrameEx())的时间
作为帧的实际发生时间, 这种批量数据需要在填充前通过额外的方式告诉SDK.

TciSetKeyVideoTime()

如上,应用在批量填入缓冲的帧前,调用 TciSetKeyVideoTime()告诉SDK待填入数据的第一帧的发生时间(T).

之后上报事件的时间如果等于或早于T, 则认为缓冲的数据属于本事件,事件云录像从缓冲区中最早的帧(如果
没有发生滚动的话,就是批量填充的第一帧) 开始. 如果事件时间晚于T, 录像默认预录5"(从缓冲区尾后推5"
的第一个I帧开始).