chan_protocol.h 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. #ifndef CHAN_PROTOCOL_H
  2. #define CHAN_PROTOCOL_H
  3. #pragma once
  4. #define ACM_SUGGEST_MAX_PKT_SIZE (10<<20)
  5. #define ACM_PROTOCOL_VERSION 2
  6. #define ACM_TYPE_PING 0x0000 //ping only, keep connection alive
  7. #define ACM_TYPE_SYNC 0x0001 //窗体同步
  8. #define ACM_TYPE_CMD 0x0002 //操作命令
  9. #define ACM_TYPE_PHT 0x0003 //拍照
  10. #define ACM_TYPE_SRN 0x0004 //抓屏
  11. #define ACM_TYPE_CTX 0x0005 //上下文
  12. #define ACM_TYPE_FLW 0x0006 //流程控制
  13. #define ACM_TYPE_INFO 0x0007 //坐席端基本信息
  14. #define ACM_TYPE_IM 0x0008 //交互框架控制
  15. #define ACM_TYPE_AGENTCTX 0x0009 //柜员上下文
  16. #define ACM_TYPE_MODE 0x000a //允许控制
  17. #define ACM_TYPE_CAMSWITCH 0x000b //摄像头切换
  18. #define ACM_TYPE_DEVICE 0x000c //设备管理
  19. #define ACM_TYPE_CALLTRANS 0x000d //呼叫转移
  20. #define ACM_TYPE_VIDEOFREQ 0x000e //视频帧频
  21. #define ACM_TYPE_AGENTVIDEOTYPE 0x000f //坐席视频类型,单/双向
  22. #define ACM_TYPE_H5_SYNC 0x0010 //H5窗体同步
  23. #define ACM_ERROR_NONE 0x01
  24. #define ACM_ERROR_CORRUPT 0x02
  25. #define ACM_ERROR_UNKNOWN 0x7f
  26. #define ACM_VIDEO_MODE_SQUARE 0 // 320x320
  27. #define ACM_VIDEO_MODE_QVGA 1 // 320x240
  28. #define ACM_VIDEO_MODE_VGA 2 // 640x480
  29. #define ACM_VIDEO_ENCODE_H264 0 // x264
  30. #define ACM_VIDEO_ENCODE_VP8 1 // google vp8
  31. #define ACM_VIDEO_FPS_BASELINE 0 // 8fps
  32. #define ACM_VIDEO_FPS_MAIN 1 // 16fps
  33. #define ACM_VIDEO_FPS_HIGH 2 // 24fps
  34. #define ACM_VIDEO_FPS_MOBILE 3 // 5fps
  35. #define ACM_VIDEO_FPS_MOBILEAGENT 4 // 2fps
  36. #pragma pack(push, 1)
  37. #pragma warning(disable: 4200)
  38. typedef struct acm_hdr {
  39. unsigned char compress : 1; // 压缩标志
  40. unsigned char type : 7;
  41. unsigned char encrypt : 1;
  42. unsigned char error : 7;
  43. unsigned short sub_type;
  44. #if defined(RVC_OS_WIN)
  45. unsigned long length; // 需要注意的是长度最大为2^16-1,65535
  46. unsigned long id; // 包id
  47. unsigned long hash;
  48. #else
  49. unsigned int length; // 需要注意的是长度最大为2^16-1,65535
  50. unsigned int id; // 包id
  51. unsigned int hash;
  52. #endif //RVC_OS_WIN
  53. unsigned char data[0]; // 长度由length决定
  54. }acm_hdr;
  55. typedef struct proxy_hdr {
  56. char tag[3]; // 必须为’ACM’
  57. char version; // 版本号,目前为1
  58. char caller_id[20]; // 主叫ID,为ACM终端号,不足后面补空格
  59. char callee_id[20]; // 被叫ID,即业务代码,用作路由分析
  60. unsigned int rtp_port; // 视频rtp端口
  61. int media_desc; // 媒体描述
  62. char client_id[20]; // 用户身份证号码,用与视频面签
  63. #if defined(RVC_OS_WIN)
  64. unsigned long encrypt_keyhash; // 加密key hash code
  65. #else
  66. unsigned int encrypt_keyhash; // 加密key hash code
  67. #endif //RVC_OS_WIN
  68. char encrypt_key[16]; // encodestring(密钥),传送过去之后利用decodestring解密
  69. }proxy_hdr;
  70. typedef struct proxy_ack_hdr {
  71. char tag[3]; // 必须为’ACM’
  72. char version; // 版本号,目前为1
  73. unsigned int rtp_port; // 视频rtp端口
  74. int media_desc; // 媒体描述
  75. char client_id[20]; // peer request client_id
  76. #if defined(RVC_OS_WIN)
  77. unsigned long encrypt_keyhash; // 加密key hash code
  78. #else
  79. unsigned int encrypt_keyhash; // 加密key hash code
  80. #endif //RVC_OS_WIN
  81. char encrypt_key[16]; // encodestring(密钥),传送过去之后利用decodestring解密
  82. }proxy_ack_hdr;
  83. #pragma pack(pop, 1)
  84. //
  85. // photo capture
  86. //
  87. /* how to communicate
  88. ACM AGENT
  89. REQ
  90. <---------------
  91. SUB
  92. --------------->
  93. ACK
  94. <---------------
  95. SUB
  96. --------------->
  97. <---------------
  98. ...
  99. ANS
  100. --------------->
  101. */
  102. #define ACM_PHT_CAT(x) ((x) & 0xF0)
  103. #define ACM_PHT_ID(x) ((x) & 0x0F)
  104. #define ACM_PHT_REQ 0x10 //最高位0表示请求
  105. #define ACM_PHT_ANS 0x20 // 最高位1表示返回
  106. #define ACM_PHT_SNAPSHOT 0x01 // 拍照
  107. //
  108. // screen capture
  109. //
  110. #define ACM_SRN_CAT(x) ((x) & 0xF0)
  111. #define ACM_SRN_ID(x) ((x) & 0x0F)
  112. #define ACM_SRN_REQ 0x10 //最高位0表示请求
  113. #define ACM_SRN_ANS 0x20 // 最高位1表示返回
  114. #define ACM_SRN_SNAPSHOT 0x01 // 拍照
  115. //
  116. // CMD
  117. //
  118. #define ACM_CMD_REQ 0x00 //最高位0表示请求
  119. #define ACM_CMD_ANS 0x80 // 最高位1表示返回
  120. #define ACM_CMD_SUB 0x00 // 多包返回
  121. #define ACM_CMD_ACK 0x80 // 多包返回确认
  122. #define ACM_CMD_GETVOLUME 0x04 // 获取音量大小(0-100)
  123. #define ACM_CMD_SETVOLUME 0x08 // 设置音量大小(0-100)
  124. //
  125. // IM 交互框架控制协议
  126. //
  127. #define ACM_IM_REQ 0x00
  128. #define ACM_IM_ANS 0x80
  129. #define ACM_IM_EXITFLOW 0x01 // 业务流程退出
  130. #define ACM_IM_ENTERFLOW 0x02 // 业务流程进入
  131. #define ACM_IM_GOHOME 0x03 // 进入主页
  132. #define ACM_IM_SHOWTEXT 0x04 // 推送文本
  133. #define ACM_IM_AGENTSTATE 0x05 // 坐席端状态
  134. #define ACM_IM_FORWARD 0x06 // 前进
  135. #define ACM_IM_BACK 0x07 // 后退
  136. #define ACM_IM_MENUTREE 0x08 // 设置菜单树
  137. #define ACM_IM_MENUPATH 0x09 // 设置当前菜单路径
  138. #define ACM_IM_MENUGOPARENT 0x0A // 菜单,上一层
  139. #define ACM_IM_MENUGOCHILD 0x0B // 菜单,下一层
  140. #define ACM_IM_FRONTSYNC 0x0C // 前端->后端 ,同步
  141. #define ACM_IM_BACKSYNC 0x0D // 后端->前端,同步
  142. //
  143. // Sync 由大师定义
  144. //
  145. //
  146. // FLW 流程交互
  147. //
  148. #define ACM_SUBTYPE_REQ_FLOW 0x01 // 后端对前端的流程请求,以及前端对后端的请求
  149. #define ACM_SUBTYPE_ANS_FLOW 0x02 // 流程调用的返回
  150. #define ACM_SUBTYPE_NTF_ENTFLOW 0x03 // 通知进入流程
  151. #define ACM_SUBTYPE_DIS_CONTROL 0x04 // 拒绝控制
  152. //
  153. // INFO 通道之间的协议
  154. //
  155. #define ACM_INFO_TRANSFER 0x01 // 呼叫转移
  156. //
  157. // CTX 交互上下文 杨诗友定义
  158. //
  159. #define ACM_CTX_MACHINE 0x01 // 全局
  160. #define ACM_CTX_SESSION 0x02 // 会话
  161. //
  162. // AGENTCTX 柜员上下文
  163. //
  164. #define ACM_AGENTCTX_INFO 0x01 // 柜员基本信息
  165. //
  166. // CAMSWITCH 摄像头切换
  167. //
  168. #define ACM_CAMSWITCH_ENV 0x01 // 环境摄像头(上横)
  169. #define ACM_CAMSWITCH_OPT 0x02 // 操作摄像头(下竖)
  170. #define ACM_CAMSWITCH_AUTO 0x03 // 自动模式,让前端决定
  171. //
  172. // 设备管理
  173. //
  174. #define ACM_SET_HANDFREE_OUTVOLUMN 0x01 // 设置免提放音音量
  175. #define ACM_SET_PICKUP_OUTVOLUMN 0x02 // 设置话筒放音音量
  176. #define ACM_SET_CAMERABRIGHT 0x03 // 设置摄像头亮度
  177. #define ACM_CHANGE_HANDFREE 0x04 // 切换免提放音
  178. #define ACM_CHANGE_PICKUP 0x05 // 切换话筒放音
  179. //前端传给agent
  180. #define ACM_HANDFREE_OUTVOLUMN 0x06 // 免提当前放音音量,前端-->后端
  181. #define ACM_PICKUP_OUTVOLUMN 0x07 // 话筒当前放音音量,前端-->后端
  182. #define ACM_AUDIO_DEVICE 0x08 // 当前声音设备,前端-->后端
  183. #define ACM_CAMERA_BRIGHT 0x09 // 当前相机亮度,前端-->后端
  184. #define ACM_DEVICE_ERROR 0x0A // 前端设备故障告警推送
  185. #define ACM_ENTITY_STATE_REQ 0x0B // 坐席请求查询实体状态
  186. #define ACM_ENTITY_STATE_ANS 0x0C // 前端推送实体状态
  187. #define ACM_SET_HANDFREE_INVOLUMN 0x0D // 设置免提收音音量
  188. #define ACM_SET_PICKUP_INVOLUMN 0x0E // 设置话筒收音音量
  189. #define ACM_HANDFREE_INVOLUMN 0x0F // 免提当前收音音量,前端-->后端
  190. #define ACM_PICKUP_INVOLUMN 0x10 // 话筒当前收音音量,前端-->后端
  191. //呼叫转移
  192. #define ACM_CALLTRANS_NUM 0x01 // 呼叫转移号码
  193. #define ACM_VIDEOFREQ_UP 0x01 //视频上行帧频
  194. #define ACM_VIDEOFREQ_DOWN 0x02 //视频下行帧频
  195. //坐席视频类型,
  196. #define ACM_AGENTVIDEOTYPE_ONEWAY 0x01 //单向视频
  197. #define ACM_AGENTVIDEOTYPE_TWOWAY 0x02 //双向视频
  198. //////////////////////////////////////////////////////////////////////////
  199. /// some media desc functions
  200. //////////////////////////////////////////////////////////////////////////
  201. static int media_desc_encode(int local_mode, int local_encode, int local_fps, int remote_mode, int remote_encode, int remote_fps)
  202. {
  203. int local_desc = local_mode | (local_encode << 5) | (local_fps << 10);
  204. int remote_desc = remote_mode | (remote_encode << 5) | (remote_fps << 10);
  205. return local_desc | (remote_desc << 16);
  206. }
  207. static void __media_desc_decode(int part_desc, int *mode, int *encode, int *fps)
  208. {
  209. if (mode)
  210. *mode = part_desc & 0x1f;
  211. if (encode)
  212. *encode = (part_desc & 0x3e0) >> 5;
  213. if (fps)
  214. *fps = (part_desc & 0x7C00) >> 10;
  215. }
  216. 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)
  217. {
  218. int local_desc = desc & 0xffff;
  219. int remote_desc = (desc & 0xffff0000) >> 16;
  220. __media_desc_decode(local_desc, local_mode, local_encode, local_fps);
  221. __media_desc_decode(remote_desc, remote_mode, remote_encode, remote_fps);
  222. }
  223. #endif // CHAN_PROTOCOL_H