快速入门

更新时间:

本文主要介绍,如何基于TuyaOS SDK开发包实现一个简单的demo应用。

前置条件

下载阿里IOT LinkSDK,了解LinkSDK设备端接入:

https://help.aliyun.com/zh/iot/developer-reference/equipment-development-guide/?spm=a2c4g.11186623.help-menu-30520.d_4_1.2b6336c9zktiTT&scm=20140722.H_461824._.OR_help-T_cn~zh-V_1

开发方式

TuyaOS SDK开发包以静态库的形式提供,主要包含以下内容

  • include头文件

  • lib库文件

  • apps包含demo文件

  • external包含阿里IOT LinkSDK需要更新的内容

image

通过TuyaOS SDK开发包中的lib库文件和include头文件,接入SDK如下功能:

  • RTSP拉流

  • P2P实时预览

  • 云存储视频上传

说明

当前提供Ubuntu环境下的TuyaOS SDK开发包,需要其他平台的TuyaOS SDK开发包,请提供编译工具链。

MQTT信令接入

topic订阅

运行TuyaOS SDK,需要订阅下面的topic:

"/ext/visual/${productKey}/${deviceName}/in"

"/ext/visual/${productKey}/${deviceName}/get_reply"

MQTT消息处理

收到的MQTT消息,通过如下接口,接入到TuyaOS SDK中:

/**
 * @brief notify mqtt data to tuya sdk
 *
 * @param[in] topic mqtt topic
 * @param[in] data mqtt data
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
OPERATE_RET tuya_imm_mqtt_notify(IN CHAR_T *topic, IN CHAR_T *data);
  • 参数说明

参数

说明

取值

topic

mqtt topic

字符串

data

mqtt消息内容

字符串

快速启动接口

demo提供如下接口,快速启动TuyaOS SDK。

/**
 * @brief start TuyaOS SDK
 *
 * @param[in] product_key product key
 * @param[in] device_name device name
 * @param[in] cloud_storage_ca_cert ca cert for cloud storage module
 * @param[in] p_rtsp_infos rtsp info
 * @param[in] p_media_info media info
 * @param[in] media_singaling_send_cb callback to send mqtt signaling
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
OPERATE_RET TUYA_IMM_SDK_START(IN CONST CHAR_T *product_key,
 IN CONST CHAR_T *device_name,
 IN CONST CHAR_T *cloud_storage_ca_cert,
 IN TUYA_IMM_SDK_RTSP_INFO_S *p_rtsp_infos,
 IN IMM_MEDIA_INFO_T *p_media_info,
 IN MEDIA_SIGNALING_SEND_CB media_signaling_send_cb);

RTSP参数

demo默认通过RTSP协议获取视频流,送给TuyaOS SDK。

typedef struct
{
 CHAR_T url[RTSP_URL_LEN]; /* url for rtsp server */
 CHAR_T username[RTSP_USERNAME_LEN]; /* username for rtsp server */
 CHAR_T password[RTSP_PASSWORD_LEN]; /* password for rtsp server */
}TUYA_IMM_SDK_RTSP_INFO_S;
  • 参数说明

参数

说明

取值

url

拉流的url地址

1256个字符

username

rtsp用户名

164个字符

password

rtsp密码

164个字符

流媒体参数

流媒体参数主要包括,音视频码流的编解码参数。

typedef struct
{
 BOOL_T stream_enable[E_IMM_STREAM_MAX]; ///<set to true if this stream has data
 UINT_T video_fps[E_IMM_STREAM_VIDEO_MAX]; ///<video fps
 UINT_T video_gop[E_IMM_STREAM_VIDEO_MAX]; ///<video gop size
 TUYA_VIDEO_BITRATE_E video_bitrate[E_IMM_STREAM_VIDEO_MAX]; ///<video bitrate
 UINT_T video_width[E_IMM_STREAM_VIDEO_MAX]; ///<video width
 UINT_T video_height[E_IMM_STREAM_VIDEO_MAX]; ///<video height
 UINT_T video_freq[E_IMM_STREAM_VIDEO_MAX]; ///<video frequency
 TUYA_CODEC_ID_E video_codec[E_IMM_STREAM_VIDEO_MAX]; ///<video codec
 TUYA_CODEC_ID_E audio_codec[E_IMM_STREAM_MAX]; ///<audio codec
 UINT_T audio_fps[E_IMM_STREAM_MAX]; ///<audio fps
 TUYA_AUDIO_SAMPLE_E audio_sample[E_IMM_STREAM_MAX]; ///<audio sample
 TUYA_AUDIO_DATABITS_E audio_databits[E_IMM_STREAM_MAX]; ///<audio databits
 TUYA_AUDIO_CHANNEL_E audio_channel[E_IMM_STREAM_MAX]; ///<audio channel
}IMM_MEDIA_INFO_T;
  • 参数说明

参数

说明

取值

stream_enable

码流使能开关

true/false

video_fps

视频帧率

无符号整型

video_gop

视频gop大小

无符号整型

video_bitrate

视频码率

<=TUYA_VIDEO_BITRATE_5M

video_width

视频宽度

无符号整型

video_freq

视频频率

无符号整型

video_codec

视频编码方式

仅支持H264H265

audio_codec

音频编码方式

仅支持PCM、G711UG711A

audio_fps

音频帧率

音频帧率

audio_sample

音频采样率

参考TUYA_AUDIO_SAMPLE_E

audio_databits

音频位宽

参考TUYA_AUDIO_DATABITS_E

audio_channel

音频声道数

参考TUYA_AUDIO_CHANNEL_E

信令发送回调

/**
 * @brief callback to send mqtt signaling
 *
 * @param[in] topic mqtt topic
 * @param[in] message mqtt message
 * @param[in] qos mqtt qos
 */
typedef VOID (*MEDIA_SIGNALING_SEND_CB)(IN CONST CHAR_T *topic,
 IN CONST CHAR_T *message,
 IN BYTE_T qos);
  • 参数说明

参数

说明

取值

topic

mqtt topic

字符串

message

mqtt message to send

字符串

qos

mqtt qos

0, 1, 2

示例代码

VOID tuya_media_signaling_send_cb(IN CONST CHAR_T *topic, IN CONST CHAR_T *message, IN BYTE_T qos)
{
    int32_t res = 0;

    if (topic == NULL || message == NULL) {
        return;
    }

    res = aiot_mqtt_pub(mqtt_handle, (char *)topic, (uint8_t *)message, strlen(message), qos);
    if (res < 0) {
        printf("aiot_mqtt_pub failed, res: -0x%04x\n", -res);
    }
}

void tuya_sdk_test(void)
{
    /* 设置主码流rtsp拉流参数 */
    TUYA_IMM_SDK_RTSP_INFO_S rtsp_infos[E_IMM_STREAM_VIDEO_MAX];
    memset(&rtsp_infos, 0, sizeof(rtsp_infos));
    strcpy(rtsp_infos[E_IMM_STREAM_VIDEO_MAIN].url, "rtsp://xxx");
    strcpy(rtsp_infos[E_IMM_STREAM_VIDEO_MAIN].username, "xxx");
    strcpy(rtsp_infos[E_IMM_STREAM_VIDEO_MAIN].password, "xxx");

    /* 设置视频主码流参数 */
    IMM_MEDIA_INFO_T media_info;
    memset(&media_info, 0, sizeof(media_info));
    media_info.stream_enable[E_IMM_STREAM_VIDEO_MAIN] = TRUE;
    media_info.video_fps[E_IMM_STREAM_VIDEO_MAIN] = 30;  /* FPS */
    media_info.video_gop[E_IMM_STREAM_VIDEO_MAIN] = 30;  /* GOP */
    media_info.video_bitrate[E_IMM_STREAM_VIDEO_MAIN] = TUYA_VIDEO_BITRATE_1M; /* Rate limit */
    media_info.video_width[E_IMM_STREAM_VIDEO_MAIN] = 640; /* Single frame resolution of width*/
    media_info.video_height[E_IMM_STREAM_VIDEO_MAIN] = 360;/* Single frame resolution of height */
    media_info.video_freq[E_IMM_STREAM_VIDEO_MAIN] = 90000; /* Clock frequency */
    media_info.video_codec[E_IMM_STREAM_VIDEO_MAIN] = TUYA_CODEC_VIDEO_H264; /* Encoding format */

    /* 设置音频码流参数 */
    media_info.stream_enable[E_IMM_STREAM_AUDIO_MAIN] = TRUE;         /* Whether to enable local sound collection */
    media_info.audio_codec[E_IMM_STREAM_AUDIO_MAIN] = TUYA_CODEC_AUDIO_G711U;/* Encoding format */
    media_info.audio_sample [E_IMM_STREAM_AUDIO_MAIN]= TUYA_AUDIO_SAMPLE_8K;/* Sampling Rate */
    media_info.audio_databits [E_IMM_STREAM_AUDIO_MAIN]= TUYA_AUDIO_DATABITS_16;/* Bit width */
    media_info.audio_channel[E_IMM_STREAM_AUDIO_MAIN]= TUYA_AUDIO_CHANNEL_MONO;/* channel */
    media_info.audio_fps[E_IMM_STREAM_AUDIO_MAIN] = 25;/* Fragments per second */

    TUYA_IMM_SDK_START(product_key,
                       device_name,
                       cloud_storage_ca_cert,
                       rtsp_infos,
                       &media_info,
                       tuya_media_signaling_send_cb);
}

注意事项

说明

音视频码流参数,需要根据实际情况进行调整。

主码流E_IMM_STREAM_VIDEO_MAIN必须存在。

子码流E_IMM_STREAM_VIDEO_SUB可选,如不存在,不需要配置。

预览和云存储默认使用音频主码流E_IMM_STREAM_AUDIO_MAIN。

设备如无音频,无需配置音频参数。

云存储业务

  • 云存储开始上传

/**
 * @brief report an event, cloud storage will start
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
OPERATE_RET tuya_imm_cloud_storage_event_start(VOID);
  • 云存储结束上传

/**
 * @brief report the end of event, synchronous api
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
OPERATE_RET tuya_imm_cloud_storage_event_stop(VOID);

DEMO编译

  • 解压TUYAOS SDK开发包,将解压出TuyaOS文件夹,拷贝到LinkSDK目录下

  • 更新mbedtls库:使用TuyaOS/external/mbedtls库,替换LinkSDK/external/mbedtls

  • 更新证书:使用TuyaOS/external/ali_ca_cert.c,替换LinkSDK/external/ali_ca_cert.c文件

  • 更新Makefile: 使用TuyaOS/external/Makefile,替换LinkSDK/Makefile文件

  • make编译生成演示demo

说明

!!!TuyaOS/external/ali_ca_cert.c证书只是临时证书,仅用于demo演示,产品开发需要自己维护和更新证书。

嵌入式SDK下载

下载地址