# 智能硬件

在实现手机端与智能硬件之间的互通功能时,开发者往往会遇到不同的通话场景:iOS 手机呼叫 Android 手表,iOS 手机呼叫 ASR 手表,ASR 手表呼叫 iOS 手机等。在不同的场景下需要设置不同的媒体参数,作为主被叫的时候集成流程也存在一定差异,开发者需要根据自己的场景调整集成内容。

# 场景一:当 iOS 手机和 Android 手表互通时

当 iOS 手机端和 Android 手表互通的时候,两端的集成方式类似,区别在于媒体模式的选择:

  1. 在发起通话前,调用 generateByMode (opens new window) 函数生成媒体配置参数 JCCallMediaConfig (opens new window) 对象。传入的参数即为媒体模式,不同的终端设备需要选择其对应的模式。

    终端 模式
    iOS 手机 选择 JCCallMediaConfigModeIntelligentHardware 模式
    Android 手表 选择 MODE_INTELLIGENT_HARDWARE_SMALL 模式
  2. 设置 JCCall 对象的 mediaConfig (opens new window) 属性。

  3. 调用 call (opens new window) 发起通话。

iOS 手机端示例代码

// 获取 JCCallMediaConfig 对象并更新 JCCall 对象的 mediaConfig 属性
JCManager.shared.call.mediaConfig = [JCCallMediaConfig generateByMode:JCCallMediaConfigModeIntelligentHardware];
// 发起语音呼叫
JCCallParam *param = [[JCCallParam alloc] init];
[call call:@"对方账号" video:false callParam:param];

# 场景二:当 iOS 手机呼叫 ASR 手表时

在手机作为主叫,ASR 手表作为被叫的情况下,时序图如下:

asr_phone2watch_ios

ASR 设备的集成参考智能硬件(ASR)。手机端作为主叫时的具体集成步骤如下:

  1. 在发起通话前,调用 generateByMode (opens new window) 函数生成媒体配置参数 JCCallMediaConfig (opens new window) 对象。传入的参数即为媒体模式,不同的终端设备需要选择其对应的模式。

    终端 模式
    iOS 手机 选择 JCCallMediaConfigModeIOT 模式
    ASR 设备 /
  2. 设置 JCCall 对象的 mediaConfig (opens new window) 属性。

  3. 调用 call (opens new window) 发起通话。

    其中 call 函数的第三个参数 callParam 需要传入自定义的唯一 ticket 以便服务器精确标识会话。ticket (opens new window) 是指开发者自定义的 64 位的唯一 ID。对呼时, 必须使用相同的ticket, 以便服务器精确标识会话。

  4. 在发起通话的同时发送长连接至被叫,通知被叫(需要开发者自行实现)。

  5. 调用 startSelfVideo (opens new window) 创建本地视频画面,SDK 会发送手机端的视频数据到服务器。

  6. 若对呼成功则触发 onCallItemUpdate (opens new window) 回调,通话通道状态变为 JCCallStateConnecting (opens new window)

  7. 在服务器收到来自手表端的视频数据后,服务器会向手机端发送视频数据。此时手机端会再次触发 onCallItemUpdate (opens new window) 回调,通话通道状态变为 JCCallStateTalking (opens new window),调用 startOtherVideo (opens new window) 渲染远端视频画面。

# 场景三:当 ASR 手表呼叫 iOS 手机时

在手机作为主叫,ASR 手表作为被叫的情况下,时序图如下:

asr_watch2phone_ios

ASR 设备的集成参考智能硬件(ASR)。手机端作为被叫时的具体集成步骤如下:

  1. 在发起通话前,调用 generateByMode (opens new window) 函数生成媒体配置参数 JCCallMediaConfig (opens new window) 对象。传入的参数即为媒体模式,不同的终端设备需要选择其对应的模式。

    终端 模式
    iOS 手机 选择 JCCallMediaConfigModeIOT 模式
    ASR 设备 /
  2. 在收到来自手表端的长连接通知,并触发了 onCallItemAdd (opens new window) 回调时,调用 call (opens new window) 应答通话。

    (在回调中调用 call 函数将提前接通流程,减少画面渲染过程中的时间) 其中 call 函数的第三个参数 callParam 需要传入自定义的唯一 ticket 以便服务器精确标识会话。ticket (opens new window) 是指开发者自定义的 64 位的唯一 ID。对呼时, 必须使用相同的ticket, 以便服务器精确标识会话。

  3. 若对呼成功则触发 onCallItemUpdate (opens new window) 回调,通话通道状态变为 JCCallStateConnecting (opens new window)

  4. 调用 startSelfVideo (opens new window) 创建本地视频画面,SDK 会发送手机端的视频数据到服务器。

  5. 在服务器收到来自手表端的视频数据后,服务器会向手机端发送视频数据。此时手机端会再次触发 onCallItemUpdate (opens new window) 回调,通话通道状态变为 JCCallStateTalking (opens new window),调用 startOtherVideo (opens new window) 渲染远端视频画面。