# 智能硬件

ASR 设备的集成场景大致分为手表端互通、手机端呼叫手表和手表端呼叫手机三种。在这三种场景下 ASR 手表端的集成步骤基本相同,故以 ASR 手表对呼为例来介绍集成步骤。

# 通话集成

当 ASR 手表端与其他设备的时候,ASR 设备对呼的时序图如下:

asr2asr

当 ASR 设备与其他设备对呼的时候,ASR 端的集成步骤如下:

  1. 获取通讯秘钥,用于传入下一步中的 jrtc_config 函数。

  2. 调用 jrtc_config 配置环境,只需调用一次。

  3. 调用 jrtc_open 打开通话通道,返回 jrtc_t 对象。

    • 主叫方,通过厂商自身长连接发起呼叫的时候调用

    • 被叫方,通过厂商自身长连接收到主叫的呼入请求的时候调用

  4. 调用 jrtc_activate 激活通话通道。

  5. 在 UI 线程, 更新视频或预览, 参考 渲染流程

  6. 调用 jrtc_close 关闭通话通道,通话通道状态将变为 JRTC_LEAVING 或 JRTC_CLOSED 。通过 jrtc_error 可以获取挂断的原因。

手表端最简函数流程
jrtc_config(...); // 配置环境,只需调用一次
jc = jrtc_open(...); // 打开通话通道,返回对象
jrtc_activate(jc,JRTC_AUDIO|JRTC_CAMERA); //激活通话通道
//在 UI 线程,更新视频或预览,参考下面的 渲染流程
jrtc_close(jc, JRTC_EBYE); //关闭通话通道, 并且等待网络线程结束

# 渲染流程

ASR 手表端按照下列步骤进行视频渲染:

  1. 获取 jrtc_image_t 对象 —— jrtc_open 中传入的最后两个参数:

    jrtc_image_t* img = "jrtc_open函数中传入的video或camera对象";
    

    内部会自动更新图像(无需集成)

    if (img->get == img->put) {
    	//'更新图像内容: 即对img中的data, width, height, format 赋值'
    	img->put++;//增加写计数
    }
    
  2. 检查当前是否处于连接(JRTC_JOINED)状态,若不是,则无需渲染:

    if (jrtc_state(jc) <  JRTC_JOINED) break;
    
  3. 建立 UI 线程(App 界面层)负责绘制图像:

    if (img->get != img->put) {
      '界面绘制操作: 即使用img中的data, 更新界面控件'
        img->get = img->put;//增加读计数
    }
    

    由于界面系统不同,界面绘制需要由开发者自行实现。例如 ASR 原生 LittlevGL 的 lv_watch 界面中, 界面绘制操作如下:

    //yuv420_2_rgb565 是内置的格式转换函数
    extern void yuv420_2_rgb565(int width, int height, const unsigned char *src, unsigned short *dst, unsigned semi);
    yuv420_2_rgb565(img->width, img->height, img->data, img_dsc->data, img->format);
    img->get = img->put;
    lv_img_set_src(img, img_dsc);//img, img_dsc 都是界面中的相应UI控件
    

# 获取通讯秘钥

调用 jrtc_config 时需要传入通讯秘钥,按照下列步骤获取通讯秘钥:

  1. 进入 Juphoon官网 (opens new window) 并登录。

  2. 点击右上角用户名 -> 切换成 IOT控制台(若无此界面请联系客服 (opens new window)开通IOT服务)。

    image-20201221143754093

  3. 点此访问应用管理 (opens new window)。或者通过 服务管理 -> 应用管理 -> 设置 访问。

    image-20201105161152358

  4. 查看安全信息 -> 秘钥

    image-20201105161033693

# 主要函数

# jrtc_config

配置环境。

函数原型:

void jrtc_config (const char* appkey, const char* uid, const char* srvURL, const char key[16]);

参数详细如下:

WARNING

内部直接引用参数内存地址,需要由外部保证其内存地址的有效性。

参数 说明
appkey AppKey 是应用在 菊风云平台 中的唯一标识,类似应用的身份证。通过在控制台创建应用获取。
uid 自己的账号 id (调测期间微信请联系客服 (opens new window),我们将手动导入)
srvURL 手表端服务器地址:cn.iot.justalkcloud.com:2198;119.3.204.221:2198
特殊说明:
- 分号前的部分cn.iot.justalkcloud.com:2198为入口地址
- 分号后的部分119.3.204.221:2198为备用地址
key[] 通讯秘钥,在控制台获取,参考获取通讯秘钥

# jrtc_open

打开通话通道,分配通话资源,返回 jrtc_t 对象。

函数原型:

struct jrtc_t* jrtc_open (const char* roomid, const char* ticket, struct jrtc_image_t* video, struct jrtc_image_t* camera);

参数详细如下:

WARNING

内部直接引用参数内存地址,需要由外部保证其内存地址的有效性。

参数 类型 说明
roomid char* 对方的账号 id
ticket char* 开发者自定义的唯一 ID 。对呼时, 必须使用相同的ticket, 以便服务器精确标识会话。注意:不能包含JSON需转义的字符。且不能超过 64 位
video struct jrtc_image_t* 期望接收的视频尺寸和帧速,码率. 若 NULL,则不接收视频
camera struct jrtc_image_t* 用于预览图像,建议的发送尺寸和帧速,码率. 若 NULL, 则不使用镜头

# jrtc_activate

激活通话通道,开启发送能力。

函数原型:

void jrtc_activate (struct jrtc_t* jc, int devices);

参数详细如下:

参数 类型 说明
jc struct jrtc_t* jrtc_t 对象,通过 jrtc_open 获取
devices int jrtc_device 的集合:
  • JRTC_SPEAKER = 1
  • JRTC_MICROPHONE = 2
  • JRTC_AUDIO = 3
  • JRTC_CAMERA = 4

# jrtc_close

关闭通话通道,释放通话资源,并等待网络线程结束。

函数原型:

void jrtc_close (struct jrtc_t* jc, enum jrtc_error err);

参数详细如下:

参数 类型 说明
jc struct jrtc_t* jrtc_t 对象,通过 jrtc_open 获取
err enum jrtc_error jrtc_error 的集合:
  • 关闭通话通道可设置为 JRTC_EBYE
  • 语音中断可设置为JRTC_EAUDIOCALL
  • 其他未知情况可设置为 JRTC_ENIL

# 次要函数

# jrtc_set_camera

动态设置前后镜头。

函数原型:

void jrtc_set_camera (struct jrtc_t* jc, int camera);

# jrtc_deactivate

停止通话通道, 关闭发送能力。

函数原型:

void jrtc_deactivate (struct jrtc_t* jc, int devices);

# jrtc_state

获取通话通道状态。

函数原型:

enum jrtc_state jrtc_state  (const struct jrtc_t *jc);

# jrtc_error

返回最近的出错值。

函数原型:

enum jrtc_error jrtc_error  (const struct jrtc_t *jc);

# 枚举说明

# jrtc_state

通话通道状态。

参数 说明
JRTC_CLOSED = 0 初始状态
JRTC_LEAVING jrtc_leave 或内部出错后的状态
JRTC_OPENED 调用jrtc_open 后的状态
JRTC_JOINING 加入中的状态
JRTC_JOINED 成功加入会话
JRTC_TALKING 收到媒体后的状态

# jrtc_error

通话错误值。

参数 说明
JRTC_ENIL = 0 unknown error
JRTC_EPERM = 1 Operation not permitted
JRTC_ENONET = 64 Machine is not on the network
JRTC_EPROTO = 71 Protocol error
JRTC_EMSGSIZE = 90 Message too long
JRTC_ECONNRESET=104 Connection reset by peer
JRTC_ETIMEDOUT =101 Connection timed out
JRTC_ECONNREFUSED=111 Connection refused or closed
JRTC_EDECLINE = 129 Peer decline the call
JRTC_EINVOKETIMEOUT = 130 IoTUnit invoke timeout
JRTC_ECALLSERVERERROR = 131 Call server error
JRTC_EROOMNOTFND = 132 Room or callee not found
JRTC_ECALLTIMEOUT = 133 Call timeout
JRTC_ENOTREG = 134 device id not registered
JRTC_ELOGIN = 135 device id login failed
JRTC_EAUDIOCALL = 252 external audio call, don't close audio deivce
JRTC_EAUDIO=253 Audio device error
JRTC_EVIDEO=254 Video device error
JRTC_EBYE = 255 Success, Closed by peer leave

# jrtc_device

通话中的媒体设备。

参数 说明
JRTC_SPEAKER = 1 喇叭
JRTC_MICROPHONE = 2 麦克风
JRTC_AUDIO = 3 所有音频设备 包含JRTC_SPEAKER 和 JRTC_MICROPHONE
JRTC_CAMERA = 4 摄像头