将iOS SDK集成到XCode中

本章节主要介绍如何快速将SDK集成到XCode当中,编译通过,并且将图像显示在APP上。

准备工作


  1. XCode (本章节使用的版本为 12.4)
  2. iOS SDK文件。
  • 所有头文件
Cmd.h
IvyIoApi.h
IvyIoApi_Internal.h
IvyIoDef.h
IvyIoDef_Internal.h
  • 所有库文件
libavcodec.a
libavformat.a
libavutil.a
libcrypto.a
libFosDuoSdk.a
libIvyIoSdk.a
libIvySdk.a
libp2p.a
libssl.a
libswscale.a
libx265.a
libIOTCAPIs_ALL.a

开始集成SDK


  1. 新建一个项目

  1. 给工程命名,使用oc开发语言

  1. 工程下新建一个SDK目录,将头文件和库文件都拷贝进去

  1. IDE工程左侧增加一个SDK目录(不创建实际文件夹),将所有.h和.a添加到此目录下

  1. 再增加一个libc++.1.tbd库

  1. 将bitcode设置为no

  1. 引入头文件,调用初始化SDK接口 (IVYIO_Init接口必须要调用一次)

  1. 点击编译按钮,编译通过!

获取设备直播图像数据


  1. 搜索局域网内设备, 搜索到的每个设备节点包含IP/端口/MAC/UID等信息

IVYIO_DEV_NODE nodes[32] = {0};
int count = sizeof(nodes) / sizeof(IVYIO_DEV_NODE);
IVYIO_Discovery(nodes, &count);
  1. 创建设备句柄

IVYIO_URL url;
memset(&url, 0, sizeof(IVYIO_URL));

struct in_addr addr;
addr.s_addr = m_nodes[0].uIP;
char *szIP = inet_ntoa(addr);
strcpy(url.szUrl, szIP);
url.usPort = your_dev_pot;

// 设备的用户名是"admin"
// 如果设备UID的第22位(从0开始)为'89ABCDEF'其中的任意一个字符,
// 设备的默认密码需要通过算法生成,具体参见本章后边 <生成默认密码> 章节
// 其他情况,默认密码为""(长度为0的字符串)
IVYIO_HANDLE handle = IVYIO_CreateEx_1(&url, nodes[0].szUid, nodes[0].szMac, dev_username, dev_password, IVYIO_P2P_MODE_UDP, nodes[0].uType, 0);
  1. 登录设备,如果设备在复位状态,需要修改密码后重新登录。

IVYIO_RESULT rst = IVYIO_Login(handle, 1000 * 5); // 单位是毫秒
if (IVYIO_RESULT_OK == rst)
{
    // 登录设备成功。
}
else if (IVYIO_RESULT_OK_ON_RESET_STATE == rst)
{
    // 设备处于复位状态需要,重新设置一个密码
    // 如果不重新设置密码,打开直播将会失败。
}
else
{
    // 其他错误
}
  1. 打开直播

if (IVYIO_DEV_IPC == nodes[0].uType || IVYIO_DEV_NVR == nodes[0].uType || 
    IVYIO_DEV_FOS_IPC == nodes[0].uType ||  IVYIO_DEV_FOS_DOORBELL nodes[0].uType)
{
    IVYIO_OPEN_VIDEO_ARGS_TYPE0 iovat;
    iovat.openVideoArgsType = 0;
    iovat.streamType = 0;
    IVYIO_RESULT rst = IVYIO_OpenVideo(handle, &iovat, 1000 * 5, 0);
    if (IVYIO_RESULT_OK == rst)
    {
        // 打开直播成功
    }
}
  1. 获取直播数据

while (bRunning)
{
    IVYIO_FRAME *frame = NULL;
    int outlen = 0;
    int speed = 0;

    IVYIO_RESULT rst = IVYIO_GetStreamData(pDlg->m_handle, IVYIO_STREAM_VIDEO, (unsigned char **)&frame, &outlen, &speed, IVYIO_DECODE_ARGB32, 0);
    if (IVYIO_RESULT_OK == rst && frame->len > 0) 
    {
        // 获取到直播数据
        // 利用你的视频绘制模块展示直播数据
    }
    else
    {
        // 休眠10ms
    }
}

更改设备密码



    // After login successful
    char szResponse[1024] = {0}
    char szCmdJson[256] = {0};
    int lenOfResponse = sizeof(szResponse);
    sprintf(szCmdJson, "{\"usr\":\"%s\", \"pwd\":\"%s\", \"newUsr\":\"%s\", \"newPwd\":\"%s\"}",
            dev_username, dev_password, newUsername, newPassword);
    IVYIO_RESULT rst = IVYIO_SendCommand(handle, 22023, (unsigned char *)szCmdJson, (unsigned char *)szResponse, &lenOfResponse, 1000 * 5);
    if (IVYIO_RESULT_OK == rst)
    {
        // 如果szResponse中的ret字段为0,表示更改成功。
        // 否则,失败
    }
    else
    {
        // failed!
    }

生成默认密码


注意:需要导入iCryptoApi.h和libIvyCrypto.a两个文件到工程内,这个库用来生成设备默认密码的库


    char szPassword[64] = {0};
    if (GeneratePassword(nodes[0].szUid, szPassword) < 0)
    {
        // Generate password fail
    }
    else
    {
        // Success
        // szPassword为生成的密码
    }
文档更新时间: 2024-01-10 17:02   作者:庄小婵