Iot SDK 4.0.0
载入中...
搜索中...
未找到
Unisoc_W317 平台集成说明

本文是 Juphoon RTOS RTC SDK 包的一部分。主要目标是帮助集成人员
了解基本流程,可以快速的集成并验证音视频功能。

  1. release_note.txt 版本的发布说明和历史记录
  2. C 语言头文件:
    • jrtc.h 应用层接口头文件,函数原型和详细的注释说明
    • jrtc0.h 较低层高级接口,可定制化的部分参数和对应的注释说明
  3. C 静态库 libjrtc.a 所在目录:
    • libs/unisoc_mocor_w317_debug W317 的可调试版本库
    • libs/unisoc_mocor_w317_user W317 的正式版库
  4. readme.md 该 SDK 说明文档

因为音视频功能依赖硬件支持, 所以 **不提供模拟器版本的库**。

一对一语音呼叫 Juphoon Cloud 终端

  1. 配置全局环境
    /* 配置参数:
    - AppKey 是应用在菊风云平台中的唯一标识,类似应用的身份证.
    必须通过在平台创建应用获取, 请参考如下文档:
    https://developer.juphoon.com/cn/juphoon_platform/03_console_description/03_app_management.html
    - UID 是设备在菊风云平台的账号,类似设备的身份证.
    自定义后, 必须在平台导入该账号, 请参考如下文档:
    https://developer.juphoon.com/cn/cat_1/01_import_iot_account.html
    - Key 是设备在通讯时的对称秘钥, 用于增强安全.
    必须在从平台获取或导入, 请参考如下文档:
    https://developer.juphoon.com/cn/cat_1/00_get_secret_key.html
    */
    jrtc_config (AppKey, UID, Key, "");
    void jrtc_config(const char appKey[24], const char license[64], const char aesKey[16], const char tokens[128], const struct jrtc_handler_t *handler)
    全局配置, 只需调用一次, 内部将复制所有参数
  2. 呼叫 Juphoon Cloud 终端
    /* 打开通话 */
    struct jrtc_t* jc = jrtc_open (对方账号, "", NULL, NULL);
    /* 开启音频发送 */
    void jrtc_activate(struct jrtc_t *jc, int devices)
    开启发送状态.
    struct jrtc_t * jrtc_open(const char channelId[64], const char uid[64], struct jrtc_image_t *video, struct jrtc_image_t *camera, struct jrtc_options_t *options)
    分配通话资源并启动网络线程.
    @ JRTC_AUDIO
    定义 jrtc.h:589

一对一视频呼叫 Juphoon Cloud 终端

  1. 呼叫 Juphoon Cloud 终端
    /* 配置环境, 请参考上面的'一对一语音呼叫' */
    jrtc_config (AppKey, UID, Key, "");
    /* width 和 height 必须是8的倍数.
    - 内部 H264 编码; kbps不启作用, 只须 > 0
    - fps 不启作用, 只须 > 0
    */
    static struct jrtc_image_t _video, _camera;
    _video.width = _camera.width = 240;
    _video.height = _camera.height = 240;
    _video.fps = _camera.fps = 10;
    _video.kbps = _camera.kbps = 120;
    struct jrtc_t* jc = jrtc_open (对方账号, "", &_video, &_camera);
    jrtc_activate(jc, JRTC_AUDIO|JRTC_CAMERA); /*< 开启音频和镜头的发送 */
    @ JRTC_CAMERA
    定义 jrtc.h:588
    视频流中的图像
    定义 jrtc.h:179
    unsigned short width
    图像宽
    定义 jrtc.h:182
  2. 渲染 默认在当前窗口渲染,如需另起窗口承载渲染,可参考新建窗口如下
LOCAL MMI_RESULT_E MMI_VT_WinProc( MMI_WIN_ID_T win_id,
MMI_MESSAGE_ID_E msg_id,
DPARAM param )
{
MMI_RESULT_E result = MMI_RESULT_TRUE;
//alpha value
uint32 alpha = 0xFF;
//color key
GUI_COLOR_T color_key = MMI_BLACK_COLOR;
//osd mode
GUIBLOCK_TYPE_E block_type = GUIBLOCK_TYPE_OSD;
//mmi dev info
GUI_LCD_DEV_INFO lcd_dev_ptr = {0, 0};
//screen rect
GUI_RECT_T screen_rect = {0};
switch (msg_id)
{
case MSG_OPEN_WINDOW:
{
screen_rect = MMITHEME_GetFullScreenRect();
//enable color key
GUIBLOCK_SetType(alpha, color_key, block_type, &lcd_dev_ptr);
//fill color key to all screen,which for transparent
LCD_FillRect(&lcd_dev_ptr, screen_rect, color_key);
break;
}
case MSG_CLOSE_WINDOW:
{
//disable color key
GUIBLOCK_ResetType(block_type, &lcd_dev_ptr);
break;
}
case MSG_GET_FOCUS:
{
screen_rect = MMITHEME_GetFullScreenRect();
//enable color key
GUIBLOCK_SetType(alpha, color_key, block_type, &lcd_dev_ptr);
//fill color key to all screen,which for transparent
LCD_FillRect(&lcd_dev_ptr, screen_rect, color_key);
break;
}
case MSG_LOSE_FOCUS:
{
//disable color key
GUIBLOCK_ResetType(block_type, &lcd_dev_ptr);
break;
}
default:
result = MMI_RESULT_FALSE;
break;
}
return (result);
}

Unisoc(展锐)Mocor 平台必须的 PDP 流程

Mocor 平台上,创建 socket 需要一个整型值。
因此使用 jrtc_open 前必须对 _jrtc_net_id 赋值,它在 jrtc.h 中声明

extern unsigned _jrtc_net_id;
unsigned _jrtc_net_id
展锐 Mocor 平台 需要设置PDP流程后获得的网络 ID

该值可以由 PDP 流程返回。简单的 PDP 代码流程,如下所示:

  1. 实现 PDP 流程的回调函数
    static void lwm2m_socket_Handle_PdpMsg(MMIPDP_CNF_INFO_T *msg_ptr) {
    int simindex = 0;
    SCI_TRACE_LOW("[lwm2m socket demo debug ------------>]%s %d\n", __FUNCTION__, __LINE__);
    if (PNULL == msg_ptr) {
    SCI_TRACE_LOW("[lwm2m socket demo error]%s %d\n", __FUNCTION__, __LINE__);
    return;
    }
    SCI_TRACE_LOW("[lwm2m socket demo debug]msg_ptr->msg_id = %d.", msg_ptr->msg_id);
    if (msg_ptr->app_handler != MMI_MODULE_SAMPLE) {
    SCI_TRACE_LOW("[lwm2m socket demo error]%s %d\n", __FUNCTION__, __LINE__);
    return;
    }
    switch (msg_ptr->msg_id) {
    /*Physical link established successfully we get IP/DSN ip by nsapi. */
    case MMIPDP_ACTIVE_CNF:
    if (MMIPDP_RESULT_SUCC == msg_ptr->result) {
    _jrtc_net_id = msg_ptr->nsapi;
    SCI_TRACE_LOW("[lwm2m pdp active success, nsapi = %d]%s %d\n", msg_ptr->nsapi, __FUNCTION__, __LINE__);
    }
    else {
    MMIAPIPDP_Deactive(MMI_MODULE_SAMPLE);
    }
    break;
    case MMIPDP_DEACTIVE_CNF:
    SCI_TRACE_LOW("[lwm2m socket demo debug deactive ok]%s %d\n", __FUNCTION__, __LINE__);
    break;
    case MMIPDP_DEACTIVE_IND:
    SCI_TRACE_LOW("[lwm2m socket demo debug start deactive]%s %d\n", __FUNCTION__, __LINE__);
    //MMIAPIPDP_Deactive(THIS_APP_MODULE_ID);
    break;
    default:
    break;
    }
    SCI_TRACE_LOW("[lwm2m socket demo debug <------------]%s %d\n", __FUNCTION__, __LINE__);
    }
  2. 激活 PDP 流程
    int result = -1;
    MMIPDP_ACTIVE_INFO_T active_info = { 0 };
    char* apn_str = PNULL;
    MMICONNECTION_LINKSETTING_DETAIL_T* linksetting = PNULL;
    uint8 linkNum = MMIAPICONNECTION_GetLinkSettingNum(SIM_ID);
    for (int i = 0; i < linkNum; i++) {
    linksetting = PNULL;
    linksetting = MMIAPICONNECTION_GetLinkSettingItemByIndex(SIM_ID, i);
    if (PNULL != linksetting && 0 != linksetting->apn_len) {
    apn_str = (char*)linksetting->apn;
    if (PNULL != apn_str) break;
    }
    }
    active_info.app_handler = MMI_MODULE_SAMPLE;
    active_info.dual_sys = SIM_ID;
    active_info.apn_ptr = apn_str;
    active_info.user_name_ptr = NULL;
    active_info.psw_ptr = NULL;
    active_info.priority = 1;
    active_info.ps_service_rat = MN_UNSPECIFIED;
    active_info.ps_interface = MMIPDP_INTERFACE_GPRS;
    active_info.handle_msg_callback = lwm2m_socket_Handle_PdpMsg;
    active_info.ps_service_type = BROWSER_E;
    active_info.storage = MN_GPRS_STORAGE_ALL;
    MMIAPIPDP_Active(&active_info);

编译说明

因为各平台的编译系统完全不同,所以最好 **根据实际情况灵活实现**。
C 语言头文件可以直接放在当前集成代码所在目录。
C 静态库 libjrtc.a 则按各平台的默认情况举例如下:

  1. 将 libjrtc.a 放在 lib 目录
  2. ANTISW3.modules 中添加
    LINKLIBLIST += lib/libjrtc.a