chan_protocol.h 7.8 KB

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