# 智能硬件
ASR 设备的集成场景大致分为手表端互通、手机端呼叫手表和手表端呼叫手机三种。在这三种场景下 ASR 手表端的集成步骤基本相同,故以 ASR 手表对呼为例来介绍集成步骤。
# 通话集成
当 ASR 手表端与其他设备的时候,ASR 设备对呼的时序图如下:
当 ASR 设备与其他设备对呼的时候,ASR 端的集成步骤如下:
获取通讯秘钥,用于传入下一步中的 jrtc_config 函数。
调用 jrtc_config 配置环境,只需调用一次。
调用 jrtc_open 打开通话通道,返回 jrtc_t 对象。
主叫方,通过厂商自身长连接发起呼叫的时候调用
被叫方,通过厂商自身长连接收到主叫的呼入请求的时候调用
调用 jrtc_activate 激活通话通道。
在 UI 线程, 更新视频或预览, 参考 渲染流程 。
调用 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 手表端按照下列步骤进行视频渲染:
获取 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++;//增加写计数 }
检查当前是否处于连接(JRTC_JOINED)状态,若不是,则无需渲染:
if (jrtc_state(jc) < JRTC_JOINED) break;
建立 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 时需要传入通讯秘钥,按照下列步骤获取通讯秘钥:
进入 Juphoon官网 (opens new window) 并登录。
点击右上角用户名 -> 切换成 IOT控制台(若无此界面请联系客服 (opens new window)开通IOT服务)。
点此访问应用管理 (opens new window)。或者通过 服务管理 -> 应用管理 -> 设置 访问。
查看安全信息 -> 秘钥
# 主要函数
# 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_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_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 | 摄像头 |