chan_protocol.h 7.9 KB

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