Tange Cloud for Device
 Rev.333
载入中...
搜索中...
未找到
设备对接FAQ

0. 如何反馈问题?

反馈问题时描述清楚操作条件、现象,并提供level为6的设备日志

日志的默认等级是3。要调整日志等级,在程序开始时调用 TciSetLogLevel():

TciSetLogLevel(/*level=*/6);
void TciSetLogLevel(int level)
设置SDK日志输出等级.

Linux系统下,也可以在启动应用前设置环境变量:

export EC_LOGLEVEL_=6

默认会生成的SDK日志文件位于 /tmp/icam365.log,大小为512K。日志文件是滚动覆写,应该放到 tmpfs文件系统里。

可以调用 TciSetLogOption() 修改日志文件位置和大小。

建议固件实现成从TF卡上读取标志,根据标志对调试配置、日志文件位置等做修改。

1. 固件标识和版本有何用处?

每一款固件程序都要有一个全平台唯一标识firmware_id(不同型号设备可以有相同固件)。该固件标识用于设备**ota升级**和**厂测工具**对设备分类。

固件标识通过 TciCB::get_info() 回调在 TCIDEVICEINFO::firmware_id中返回。

firmware_id按 "厂家-产品类型-硬件平台-设计者内部定义描述" 的规则定义,以避免不同厂家的间命名冲突。

固件版本firmware_ver 是一个8个数字组成的字符串。ota前会用于判断平台端的版本是否更新。

int get_info(TCIDEVICEINFO *info)
{
strcpy(info->firmware_id, "tg_ipc_jl57_001"); //固件标识。必须
strcpy(info->vendor, "OEM");
strncpy(info->device_type, "IPC-xxx", sizeof(info->device_type)); //未用到
strcpy(info->firmware_ver, "01000001"); //固件版本。app上显示为 1.0.0.1
strcpy(info->model, "JL57-IPC-001"); //产品型号,app上会显示
return 0;
}
char firmware_ver[10]
固件主版本,8个数字组成的字符串。like: "03020201", means 3.2.2.1.
char vendor[16]
设备生产厂商 OEM
char device_type[16]
Not used
char firmware_id[32]
ota 升级用的固件标识, 平台唯一.
char model[32]
产品型号
设备基本信息

2. 关于配网

sdk直接支持**AP热点**和**设备扫描二维码**的方式配网。在TciInit()之后,TciStart()之前调用 TciConfigWifi(mode) 进入配网状态。 mode参数可以指定是 AP还是扫码方式还是二者同时。

选择AP配网,在TciConfigWifi()前要先进入AP模式。选择扫描配网,则要注册 qrcode_start()/qrcode_get_y_data()/qrcode_end() 回调。qrcode_get_y_data()用于返回原始图像的Y数据,SDK内部会调用二维码扫描功能。图片大小一般取标清(640*352或640*480)就可以了,要保持原始图像的长宽比。最高帧率则同芯片的处理能力有关。

TciConfigWifi()会阻塞直到配网操作完成。

**蓝牙**方式,需要设备端实现蓝牙连接下的数据收发。把接收到的配网命令的数据透传回SDK。蓝牙模式下传递的数据可能不只配网信息,固件要根据命令标识,有的数据自行处理,有的则要转交SDK。具体如何同应用有关。

3. 事件抓图用多高分辨率?

事件截图用于app端的事件列表展示,和AI服务器端的对象识别,取标清分辨率。

4. 音视频同步的问题

设备和客户端播放和回放时都使用时间戳来对音视频作同步。这个值一定要保证正确。时间戳不匹配会造成实时或回放的音视频不对上,音频时间戳不正确则可能会造成播放时被插入空白,听起来有噪声。

时间戳用 uint32_t 表示,单位是 ms。硬件平台底层输出时间戳一般需要转换。

有的平台输出的时间戳在音视频间并不匹配,或者在重启流后二者会失配,固件必须对此作处理。

不同步可能的原因

  • 芯片原厂SDK输出的音视频的时间戳是独立的,本来就不同步
  • 停止然后重新打开编码通道,时间戳被复位
  • 硬件编码输出没有及时取走,导致用户访问时获取的访问时间点之前的旧数据

SD卡回放时的同步

除了视频中的叠加的OSD 时间,APP可能还会在界面其它地方显示当前正在播放的画面所对应的时间(例如滚动时间轴)。这个时间需要额外的方式去同步。参见 a40_TimeSyncWhenPlayback,和 TciSendPbSyncFrame() 的说明。

5. 音频包大小、格式和时间戳

在实时和录像回放中,系统只支持g711a编码格式。采样格式为 8000/16位/mono

底层输出的音频包格式大小要合理。太大意味着在设备端就引入声音延迟(大包分多次发送没意义),太小则效率降低。

推荐每个音频包大小为 40ms ,亦即编码后的包大小为 320字节。App端做回声消除可能对包大小有为80倍数的要求。

因为音频包大小是固定的,只要硬件不停止采样,相邻包的**时间戳的差是一个固定值**。固件要确保这一点。

6. 视频流要求

设备需要同时输出两个视频流,分别以0和1作为第二个参数(stream)调用 TciSendFrameEx()

App端选择高清和标清时分别访问的是stream0和1。如果固件没有传递相应流,app看不到图像

7. 最大连接数

同时支持的最大连接数为5。如果系统内存紧张,可以在 TciStart()前调用 TciSetMaxP2pClientsNum() 将这最大连接数设小一点。

因为底层实现上的差异,实际能节省的内存占用以系统运行起来后用 free 命令观察到的结果为准

8. 用户扩展指令

用户扩展指令范围在 0x9000 ~ 0xfffe。因为指令的最低位用作应答标志,所以指令本身应是一个偶数(设备端调用 TciSendCmdResp()/TciSendCmdRespStatus() 时会对指令的最低位自动置1)

9. 时区设置

set_timezone() 回调里收到的时区是形如 "GMT+08:00" 的字符串。GMT后面的带符号数值表示 在标准时间上加上这个值得到当地时间。“GMT+08:00”表示东八区,"GMT-08:00"则表示西八区。

在Linux下,TZ 环境变量的这个符号的意义刚好与上相反:带符号的数值表示本地时间加上这个值得到 可得到标准时间。"GMT-08:00"表示东八区,"GMT+08:00"表示西八区。也就是说设置到Linux下时,+/- 要反一下。

非(类)Linux的设备例如RTOS系统,要按前述解释计算一个偏移,手动在UTC时间和本地时间之间作转换。

10. 内存使用优化

如果系统内存紧张,可以从以下方面配置SDK减少内存使用。

  • 设置较小的云存预录缓冲

    TciStart(is_registered, uCloudBuffSize) 第二个参数为事件云存预录缓冲大小。发生事件录像时,SDK从缓冲区向后查找3 ~ 5s 前的I帧(如果没有的话取最近的I帧)作为录像起始点。要预录这个缓存至少要能保存两个I帧之间的所有音视频数据。

    如果内存实在紧张,可以取消预录功能,把这个值设得很小(比最大的I帧大一点)

  • 强制限制云存文件大小

    TciSetSysOption()`"TciSetSysOption(TCOPT_MAX_DATAFILE_SIZE, ...)"`。 这会在文件过大时丢包

  • 设置较小的上传队列

    调用 TciSetBackStore(NULL, BUFFERHINT_SMALL), 可以将待上传的云存文件队列设为1,减少因网络不好占用的缓存

  • 减少支持的p2p连接数

    调用 TciSetMaxP2pClientsNum(), 减少支持的最大连接数。最大连接数默认为5。节省的内存以实测为准。

  • SD卡录像与云存共享缓存

    参看文档与 TgCloudApi_mufb.h 头文件里的说明

11. 4G设备上报连接方式

4G+有线 设备,要通过 TciReport4GInfo() 上报当前连网方式是4G还是有线。

12. 低功耗开发中的常见问题

  1. TciGetWakeupServers() 返回心跳服务器的 IPv4 地址数组。注意这个地址和端口都是网络字节序的,直接赋值给 struct sockaddr_insin_addr.s_addrsin_port,不要再转序了。
  2. 认证串是一个ascii编码的字符串。4G模块的发送指令,有的要求传hex字符串,有的要求传原始数据,这个要注意区分。
  3. 设备应该按文档说明响应STATUS_IDLE来下电。云录像上传、查看实时、SD卡回放、停在修改设备配置界面,这些都不应断电。设备端可以设一个最大上电工作时长,以在异常的时候下电
  4. 低功耗产品往往有快启和尽早发送事件的要求,需要确保系统时间/时区在触发事件前是正确的,这就要求设备 要在本地保存时区,在硬件RTC里保存时间并确保时间正确 。否则只能象常规产品一样在调用`TciStart()`与平台做了时间同步后才上报事件。
    这一点非常重要,做不到会导致云端事件和录像异常

13. 事件云录像的长度是如何确定的?

云录像时长T由平台配置。如果事件不断触发(例如移动侦测),设备要在5秒内重新再次上报。连续触发的事件录像会在最后一次事件之后T秒结束

同一种事件上报到平台的间隔最小30\“,间隔小于30"会延长事件录像,但不会出现在事件回看列表,也不会通知到App。

14. 如何保证云录像完整性?

云录像文件默认在内存里缓存,网络不好的时候,云上传会丢文件。可以开启sdk内置的后备存储功能(TciSetBackStore()), 传不动的文件会写到后备存储空间(通常是TF卡)在网络恢复的时候自动上传

15. 如何实现wifi/4G 双模添加?

  1. 在不同的线程调用 TciStart()TciConfigWifi(GWM_AP)
  2. 如果在收到 STATUS_LOGON 前没有收到 set_wifi()回调,表示有了有线添加方式,固件调用 TciStopConfigWifi(GWM_AP) 停止配网。
  3. 如果收到 set_wifi() 回调,表示走wifi添加。切换到wifi后,调用 TcnIpChanged() 通知sdk IP配置改变。
  4. TciStart()返回后,调用 TciReport4GInfoEx() 上报当前连网方式。如果用wifi联网,调用 TciReport4GInfoEx(NULL, -1)