快速入门
本文主要介绍,如何基于TuyaOS SDK开发包实现一个简单的demo应用。
前置条件
下载阿里IOT LinkSDK,了解LinkSDK设备端接入:
开发方式
TuyaOS SDK开发包以静态库的形式提供,主要包含以下内容
include头文件
lib库文件
apps包含demo文件
external包含阿里IOT LinkSDK需要更新的内容
通过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地址 | 1到256个字符 |
username | rtsp用户名 | 1到64个字符 |
password | rtsp密码 | 1到64个字符 |
流媒体参数
流媒体参数主要包括,音视频码流的编解码参数。
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 | 视频编码方式 | 仅支持H264和H265 |
audio_codec | 音频编码方式 | 仅支持PCM、G711U和G711A |
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演示,产品开发需要自己维护和更新证书。