Tange Cloud for Device
Rev.333 |
低功耗设备的特点在于唤醒后要立即进入可用状态。包括:
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 状态触发要满足两个条件:
以下情形没有通知,应用层要自己处理:
无论有没有通知,应用层最好设置一个最大上电时长,超过这个时间强制下电。用这个机制来保护系统出现异常的情形.
进入休眠前要先与唤醒服务器建立连接。视网络模块配置方式的不同,休眠准备有两种不同的进入方式:
在主控里建立到唤醒服务器的tcp连接,网络模块继承主控的tcp连接属性(不是建立新连接。例如Hi1131)
调用 TciPrepareHiberation() 建立与唤醒服务器的初次连接。使用返回的socket配置wifi模块在主控下电后与唤醒服务器保持心跳
认证字符串
.认证字符串
.连接建立后, 主控下电. 网络模块每50"向服务器发送64字节的心跳包,包内容任意.
4G模块EC20的心跳连接建立流程图
唤醒时,服务器发送唤醒串: 0x98,0x3b,0x16,0xf8,0xf3,0x9c
前面已经提到, 要在TciInit()后立即调用 TciAllocCloudBuffer() 分配云存缓冲, 随后SDK就可以接
收并缓存数据,到联网注册成功后再开始上传.
低功耗设备从唤醒到系统和应用初始化完成,可能要花好几秒时间,这会导致录像实际比事件触发的时间
要晚好几秒, 从而可能漏掉一些关键信息。
为改善这种情况,有一种设备的实现, 把启动音视频编码放在上电后尽量早的地方、主程序启动之前。当
主程序起来时,系统已经在主程序外缓存了几秒钟的音视频数据。在调用了TciAllocCloudBuffer()后,
再把这些数据批量填充下来。
因为TciSendFrameEx()接口没有传送帧的实际发生时间, SDK默认把接收帧(调用TciSendFrameEx())的时间
作为帧的实际发生时间, 这种批量数据需要在填充前通过额外的方式告诉SDK.
如上,应用在批量填入缓冲的帧前,调用 TciSetKeyVideoTime()告诉SDK待填入数据的第一帧的发生时间(T).
之后上报事件的时间如果等于或早于T, 则认为缓冲的数据属于本事件,事件云录像从缓冲区中最早的帧(如果
没有发生滚动的话,就是批量填充的第一帧) 开始. 如果事件时间晚于T, 录像默认预录5"(从缓冲区尾后推5"
的第一个I帧开始).