#ifndef CHAN_PROTOCOL_H #define CHAN_PROTOCOL_H #pragma once #define ACM_SUGGEST_MAX_PKT_SIZE (10<<20) #define ACM_PROTOCOL_VERSION 2 #define ACM_TYPE_PING 0x0000 //ping only, keep connection alive #define ACM_TYPE_SYNC 0x0001 //窗体同步 #define ACM_TYPE_CMD 0x0002 //操作命令 #define ACM_TYPE_PHT 0x0003 //拍照 #define ACM_TYPE_SRN 0x0004 //抓屏 #define ACM_TYPE_CTX 0x0005 //上下文 #define ACM_TYPE_FLW 0x0006 //流程控制 #define ACM_TYPE_INFO 0x0007 //坐席端基本信息 #define ACM_TYPE_IM 0x0008 //交互框架控制 #define ACM_TYPE_AGENTCTX 0x0009 //柜员上下文 #define ACM_TYPE_MODE 0x000a //允许控制 #define ACM_TYPE_CAMSWITCH 0x000b //摄像头切换 #define ACM_TYPE_DEVICE 0x000c //设备管理 #define ACM_TYPE_CALLTRANS 0x000d //呼叫转移 #define ACM_TYPE_VIDEOFREQ 0x000e //视频帧频 #define ACM_TYPE_AGENTVIDEOTYPE 0x000f //坐席视频类型,单/双向 #define ACM_TYPE_H5_SYNC 0x0010 //H5窗体同步 #define ACM_ERROR_NONE 0x01 #define ACM_ERROR_CORRUPT 0x02 #define ACM_ERROR_UNKNOWN 0x7f #define ACM_VIDEO_MODE_SQUARE 0 // 320x320 #define ACM_VIDEO_MODE_QVGA 1 // 320x240 #define ACM_VIDEO_MODE_VGA 2 // 640x480 #define ACM_VIDEO_ENCODE_H264 0 // x264 #define ACM_VIDEO_ENCODE_VP8 1 // google vp8 #define ACM_VIDEO_FPS_BASELINE 0 // 8fps #define ACM_VIDEO_FPS_MAIN 1 // 16fps #define ACM_VIDEO_FPS_HIGH 2 // 24fps #define ACM_VIDEO_FPS_MOBILE 3 // 5fps #define ACM_VIDEO_FPS_MOBILEAGENT 4 // 2fps #pragma pack(push, 1) #pragma warning(disable: 4200) typedef struct acm_hdr { unsigned char compress : 1; // 压缩标志 unsigned char type : 7; unsigned char encrypt : 1; unsigned char error : 7; unsigned short sub_type; unsigned int length; // 需要注意的是长度最大为2^16-1,65535 unsigned int id; // 包id unsigned int hash; unsigned char data[0]; // 长度由length决定 }acm_hdr; typedef struct proxy_hdr { char tag[3]; // 必须为’ACM’ char version; // 版本号,目前为1 char caller_id[20]; // 主叫ID,为ACM终端号,不足后面补空格 char callee_id[20]; // 被叫ID,即业务代码,用作路由分析 unsigned int rtp_port; // 视频rtp端口 int media_desc; // 媒体描述 char client_id[20]; // 用户身份证号码,用与视频面签 unsigned int encrypt_keyhash; // 加密key hash code char encrypt_key[16]; // encodestring(密钥),传送过去之后利用decodestring解密 }proxy_hdr; typedef struct proxy_ack_hdr { char tag[3]; // 必须为’ACM’ char version; // 版本号,目前为1 unsigned int rtp_port; // 视频rtp端口 int media_desc; // 媒体描述 char client_id[20]; // peer request client_id unsigned int encrypt_keyhash; // 加密key hash code char encrypt_key[16]; // encodestring(密钥),传送过去之后利用decodestring解密 }proxy_ack_hdr; #pragma pack(pop, 1) // // photo capture // /* how to communicate ACM AGENT REQ <--------------- SUB ---------------> ACK <--------------- SUB ---------------> <--------------- ... ANS ---------------> */ #define ACM_PHT_CAT(x) ((x) & 0xF0) #define ACM_PHT_ID(x) ((x) & 0x0F) #define ACM_PHT_REQ 0x10 //最高位0表示请求 #define ACM_PHT_ANS 0x20 // 最高位1表示返回 #define ACM_PHT_SNAPSHOT 0x01 // 拍照 // // screen capture // #define ACM_SRN_CAT(x) ((x) & 0xF0) #define ACM_SRN_ID(x) ((x) & 0x0F) #define ACM_SRN_REQ 0x10 //最高位0表示请求 #define ACM_SRN_ANS 0x20 // 最高位1表示返回 #define ACM_SRN_SNAPSHOT 0x01 // 拍照 // // CMD // #define ACM_CMD_REQ 0x00 //最高位0表示请求 #define ACM_CMD_ANS 0x80 // 最高位1表示返回 #define ACM_CMD_SUB 0x00 // 多包返回 #define ACM_CMD_ACK 0x80 // 多包返回确认 #define ACM_CMD_GETVOLUME 0x04 // 获取音量大小(0-100) #define ACM_CMD_SETVOLUME 0x08 // 设置音量大小(0-100) // // IM 交互框架控制协议 // #define ACM_IM_REQ 0x00 #define ACM_IM_ANS 0x80 #define ACM_IM_EXITFLOW 0x01 // 业务流程退出 #define ACM_IM_ENTERFLOW 0x02 // 业务流程进入 #define ACM_IM_GOHOME 0x03 // 进入主页 #define ACM_IM_SHOWTEXT 0x04 // 推送文本 #define ACM_IM_AGENTSTATE 0x05 // 坐席端状态 #define ACM_IM_FORWARD 0x06 // 前进 #define ACM_IM_BACK 0x07 // 后退 #define ACM_IM_MENUTREE 0x08 // 设置菜单树 #define ACM_IM_MENUPATH 0x09 // 设置当前菜单路径 #define ACM_IM_MENUGOPARENT 0x0A // 菜单,上一层 #define ACM_IM_MENUGOCHILD 0x0B // 菜单,下一层 #define ACM_IM_FRONTSYNC 0x0C // 前端->后端 ,同步 #define ACM_IM_BACKSYNC 0x0D // 后端->前端,同步 // // Sync 由大师定义 // // // FLW 流程交互 // #define ACM_SUBTYPE_REQ_FLOW 0x01 // 后端对前端的流程请求,以及前端对后端的请求 #define ACM_SUBTYPE_ANS_FLOW 0x02 // 流程调用的返回 #define ACM_SUBTYPE_NTF_ENTFLOW 0x03 // 通知进入流程 #define ACM_SUBTYPE_DIS_CONTROL 0x04 // 拒绝控制 // // INFO 通道之间的协议 // #define ACM_INFO_TRANSFER 0x01 // 呼叫转移 // // CTX 交互上下文 杨诗友定义 // #define ACM_CTX_MACHINE 0x01 // 全局 #define ACM_CTX_SESSION 0x02 // 会话 // // AGENTCTX 柜员上下文 // #define ACM_AGENTCTX_INFO 0x01 // 柜员基本信息 // // CAMSWITCH 摄像头切换 // #define ACM_CAMSWITCH_ENV 0x01 // 环境摄像头(上横) #define ACM_CAMSWITCH_OPT 0x02 // 操作摄像头(下竖) #define ACM_CAMSWITCH_AUTO 0x03 // 自动模式,让前端决定 // // 设备管理 // #define ACM_SET_HANDFREE_OUTVOLUMN 0x01 // 设置免提放音音量 #define ACM_SET_PICKUP_OUTVOLUMN 0x02 // 设置话筒放音音量 #define ACM_SET_CAMERABRIGHT 0x03 // 设置摄像头亮度 #define ACM_CHANGE_HANDFREE 0x04 // 切换免提放音 #define ACM_CHANGE_PICKUP 0x05 // 切换话筒放音 //前端传给agent #define ACM_HANDFREE_OUTVOLUMN 0x06 // 免提当前放音音量,前端-->后端 #define ACM_PICKUP_OUTVOLUMN 0x07 // 话筒当前放音音量,前端-->后端 #define ACM_AUDIO_DEVICE 0x08 // 当前声音设备,前端-->后端 #define ACM_CAMERA_BRIGHT 0x09 // 当前相机亮度,前端-->后端 #define ACM_DEVICE_ERROR 0x0A // 前端设备故障告警推送 #define ACM_ENTITY_STATE_REQ 0x0B // 坐席请求查询实体状态 #define ACM_ENTITY_STATE_ANS 0x0C // 前端推送实体状态 #define ACM_SET_HANDFREE_INVOLUMN 0x0D // 设置免提收音音量 #define ACM_SET_PICKUP_INVOLUMN 0x0E // 设置话筒收音音量 #define ACM_HANDFREE_INVOLUMN 0x0F // 免提当前收音音量,前端-->后端 #define ACM_PICKUP_INVOLUMN 0x10 // 话筒当前收音音量,前端-->后端 //呼叫转移 #define ACM_CALLTRANS_NUM 0x01 // 呼叫转移号码 #define ACM_VIDEOFREQ_UP 0x01 //视频上行帧频 #define ACM_VIDEOFREQ_DOWN 0x02 //视频下行帧频 //坐席视频类型, #define ACM_AGENTVIDEOTYPE_ONEWAY 0x01 //单向视频 #define ACM_AGENTVIDEOTYPE_TWOWAY 0x02 //双向视频 ////////////////////////////////////////////////////////////////////////// /// some media desc functions ////////////////////////////////////////////////////////////////////////// static int media_desc_encode(int local_mode, int local_encode, int local_fps, int remote_mode, int remote_encode, int remote_fps) { int local_desc = local_mode | (local_encode << 5) | (local_fps << 10); int remote_desc = remote_mode | (remote_encode << 5) | (remote_fps << 10); return local_desc | (remote_desc << 16); } static void __media_desc_decode(int part_desc, int *mode, int *encode, int *fps) { if (mode) *mode = part_desc & 0x1f; if (encode) *encode = (part_desc & 0x3e0) >> 5; if (fps) *fps = (part_desc & 0x7C00) >> 10; } static void media_desc_decode(int desc, int *local_mode, int *local_encode, int *local_fps, int *remote_mode, int *remote_encode, int *remote_fps) { int local_desc = desc & 0xffff; int remote_desc = (desc & 0xffff0000) >> 16; __media_desc_decode(local_desc, local_mode, local_encode, local_fps); __media_desc_decode(remote_desc, remote_mode, remote_encode, remote_fps); } #endif // CHAN_PROTOCOL_H