diff --git a/src/EngineEntrance.js b/src/EngineEntrance.js
index 8be7f4f..6ef3bf7 100644
--- a/src/EngineEntrance.js
+++ b/src/EngineEntrance.js
@@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter {
     super();
     this.lastClassActiveTime=0;//最后一次课堂激活的时间戳
     //sdk 信息
-    GlobalConfig.sdkVersion = "v2.31.12.20171122";
+    GlobalConfig.sdkVersion = "v2.32.1.20171123";
     loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
     console.log("sdkVersion:" + GlobalConfig.sdkVersion);
     //设置
@@ -1177,7 +1177,7 @@ export default class MessageEntrance extends Emiter {
   _mcuJoinMCUClassSuccessHandler(_data) {
     //loger.log('MCU 课堂成功.');
     loger.warn('=====================STEP9=======================');
-    //console.log("当前课堂人员列表",GlobalConfig.rosterNumber,GlobalConfig.rosters)
+    //console.log("当前课堂人员列表",GlobalConfig.rosterNum,GlobalConfig.rosters)
     GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_2);
     GlobalConfig.classJoinSuccess = true;
 
@@ -2742,11 +2742,11 @@ export default class MessageEntrance extends Emiter {
     let interval=new Date().getTime()-parseInt(this.lastClassActiveTime);
     interval=interval/1000;
     //loger.log("最后一次记录的时间->"+this.lastClassActiveTime,"当前时间:"+new Date().getTime(),"间隔:"+interval+"秒");
-    loger.log("文档加入频道成功->isHost=", GlobalConfig.isHost, "当前总人数:", GlobalConfig.rosterNumber, "sassDoclength=", GlobalConfig.docListPrepare.length);
+    loger.log("文档加入频道成功->isHost=", GlobalConfig.isHost, "当前总人数:", GlobalConfig.rosterNum, "sassDoclength=", GlobalConfig.docListPrepare.length);
     //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
     if (GlobalConfig.docListPrepare && GlobalConfig.docListPrepare.length > 0) {
       //如果当前身份是老师或者当前课堂内只有一个人并且不是H5,有权限同步文档到MCU
-      if (GlobalConfig.isHost || (GlobalConfig.rosterNumber <= 1&&GlobalConfig.deviceType!=GlobalConfig.deviceH5)) {
+      if (GlobalConfig.isHost || (GlobalConfig.rosterNum <= 1&&GlobalConfig.deviceType!=GlobalConfig.deviceH5)) {
         for (let i = 0; i < GlobalConfig.docListPrepare.length; i++) {
           let value = GlobalConfig.docListPrepare[i];
           if (value) {
@@ -2774,7 +2774,7 @@ export default class MessageEntrance extends Emiter {
   musicShareApeJoinChannelSuccess() {
     //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
     if (GlobalConfig.musicListPrepare&& GlobalConfig.musicListPrepare.length > 0) {
-      if (GlobalConfig.isHost || (GlobalConfig.rosterNumber <= 1&&GlobalConfig.deviceType!=GlobalConfig.deviceH5)) {
+      if (GlobalConfig.isHost || (GlobalConfig.rosterNum <= 1&&GlobalConfig.deviceType!=GlobalConfig.deviceH5)) {
         for (let i = 0; i < GlobalConfig.musicListPrepare.length; i++) {
           let value = GlobalConfig.musicListPrepare[i];
           if (value) {
@@ -2805,7 +2805,7 @@ export default class MessageEntrance extends Emiter {
   mediaShareApeJoinChannelSuccess() {
     //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
     if (GlobalConfig.sharedMediaList&& GlobalConfig.sharedMediaList.length > 0) {
-      if (GlobalConfig.isHost || (GlobalConfig.rosterNumber <= 1&&GlobalConfig.deviceType!=GlobalConfig.deviceH5)) {
+      if (GlobalConfig.isHost || (GlobalConfig.rosterNum <= 1&&GlobalConfig.deviceType!=GlobalConfig.deviceH5)) {
         for (let i = 0; i < GlobalConfig.sharedMediaList.length; i++) {
           let value = GlobalConfig.sharedMediaList[i];
           if (value) {
diff --git a/src/GlobalConfig.js b/src/GlobalConfig.js
index 5a2c9cb..e72b29c 100644
--- a/src/GlobalConfig.js
+++ b/src/GlobalConfig.js
@@ -641,7 +641,7 @@ GlobalConfig.serverTime = 0; //服务器当前时间戳
 GlobalConfig.serverAndLoacTimeDistanc = 0; //本地时间和服务器时间错的差值;
 GlobalConfig.logUrl = ""; //日志上报地址;
 
-GlobalConfig.rosterNumber = 0;//当前总人数
+GlobalConfig.rosterNum = 0;//当前总人数
 GlobalConfig.rosters = {};//当前课堂内的人员数据
 
 GlobalConfig.isMobile = false; //是否是移动端
diff --git a/src/apes/Ape.js b/src/apes/Ape.js
index cc818e6..1e2c02e 100644
--- a/src/apes/Ape.js
+++ b/src/apes/Ape.js
@@ -81,6 +81,17 @@ export default class Ape extends Emiter {
   // 数据同步处理
   _pduRegAdapterHandler(regBuffer, seekTime) {
     let regPdu = pdu['RCAdapterPdu'].decode(regBuffer);
+    if(!regPdu){
+      console.warn("regPdu 无效");
+      return;
+    }
+    //console.log("regPdu",regPdu);
+    let newUserNum=regPdu.userNum||0;
+    if(newUserNum!=GlobalConfig.rosterNum){
+      GlobalConfig.rosterNum=newUserNum;
+      this._emit(MessageTypes.CLASS_UPDATE_ROSTER_NUM,{rosterLen:GlobalConfig.rosterNum});
+    }
+
     let regItems = regPdu.item;
     let regItemSize = regItems.length;
     //console.log("RCAdapterPdu数据同步处理",regPdu);
diff --git a/src/apes/ConferApe.js b/src/apes/ConferApe.js
index c85a595..aa80403 100644
--- a/src/apes/ConferApe.js
+++ b/src/apes/ConferApe.js
@@ -26,7 +26,6 @@ class ConferApe extends Ape {
     this.isSendInsterRoster=false;//这个很重要,每次MCU连接成功之后只发一次
     this.isLeave=false;//记录自己是否已经离开
     this.rosters = {}; //用户列表
-    this.rosterLen = 0;//当前课堂人数
     this.timerCounter = new TimerCounter(); //计时器
     this.startRecordTimer;//开始录制的计时器
     this.recordStatus=false;//记录录制状态
@@ -290,13 +289,13 @@ class ConferApe extends Ape {
       return;
     }
     //如果已经开始录制就不再开启
-    if (GlobalConfig.recordStatus && this.rosterLen > 1) {
-      loger.warn('目前已经是录制状态->当前课堂人数:' + this.rosterLen);
+    if (GlobalConfig.recordStatus && GlobalConfig.rosterNum > 1) {
+      loger.warn('目前已经是录制状态->当前课堂人数:' + GlobalConfig.rosterNum);
       return false;
     }
     //如果是host或者当前课堂只有1个人,并且不是H5
     if (this.checkHasRecordControl()) {
-      loger.warn('开启录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus, "当前人数:" + this.rosterLen);
+      loger.warn('开启录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus, "当前人数:" +GlobalConfig.rosterNum);
       //如果录制的文件名不存在,需要创建一个名字
       let timestampYMD = EngineUtils.creatTimestampYMD();
       if (!GlobalConfig.recordFileName) {
@@ -313,7 +312,7 @@ class ConferApe extends Ape {
   checkHasRecordControl() {
     //loger.warn('检测是否有控制录制操作的权限', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus,"当前人数:"+this.rosterLen);
     //1.如果自己是老师或者当前课堂只有一个人
-    if (GlobalConfig.isHost || (this.rosterLen <= 1&&GlobalConfig.deviceType!=GlobalConfig.deviceH5)) {
+    if (GlobalConfig.isHost || (GlobalConfig.rosterNum <= 1&&GlobalConfig.deviceType!=GlobalConfig.deviceH5)) {
       return true;
     }
     //2.如果自己不是老师,需要判断当前课堂内是否有老师,如果有老师就不做操作
@@ -973,8 +972,8 @@ class ConferApe extends Ape {
       //loger.log("自己加入课堂的消息->",nodeId,"role-->", nodeData.role, ApeConsts.userTypes[nodeData.role]);
       //自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂:
       // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中)
-      this.rosterLen = Object.keys(this.rosters).length;
-      GlobalConfig.rosterNumber = this.rosterLen;//记录当前的总人数
+      //this.rosterLen = Object.keys(this.rosters).length;
+      //GlobalConfig.rosterNum = this.rosterLen;//记录当前的总人数
       /*  if (this.rosterLen <=1 && !GlobalConfig.isHost && GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) {
        loger.warn("当前课堂没有老师->暂停课堂");
        this.pauseClass({isForce: true});
@@ -1030,9 +1029,10 @@ class ConferApe extends Ape {
       return;
     }
     if (!rosterExists) {
-      this.rosterLen = Object.keys(this.rosters).length;
-      GlobalConfig.rosterNumber = this.rosterLen;//记录当前的总人数
-      newNodeData.rosterLen = this.rosterLen;
+      //this.rosterLen = Object.keys(this.rosters).length;
+      //GlobalConfig.rosterNum = this.rosterLen;//记录当前的总人数
+      //newNodeData.rosterLen = this.rosterLen;
+      newNodeData.rosterLen=GlobalConfig.rosterNum
       if(GlobalConfig.classType!= ApeConsts.CLASS_TYPE_ZHIBO){
         loger.log("人员加入->", newNodeData);
       }
@@ -1043,9 +1043,9 @@ class ConferApe extends Ape {
       }
     } else {
       //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists);
-      this.rosterLen = Object.keys(this.rosters).length;
-      GlobalConfig.rosterNumber = this.rosterLen;//记录当前的总人数
-      newNodeData.rosterLen = this.rosterLen;
+      //this.rosterLen = Object.keys(this.rosters).length;
+      //GlobalConfig.rosterNum = this.rosterLen;//记录当前的总人数
+      newNodeData.rosterLen = GlobalConfig.rosterNum;
       if (nodeId != GlobalConfig.nodeId) {
         if(GlobalConfig.classType!= ApeConsts.CLASS_TYPE_ZHIBO){
           loger.log("人员更新信息->", newNodeData);
@@ -1079,13 +1079,13 @@ class ConferApe extends Ape {
       //如果推流的人员已经不存在,并且当前课堂内人员大于0;
       // 如果不判断当前的人数,会出现把正常的视频消息释放的情况;
       // 因为会出现先收到视频消息后收到人员加入和更新的消息
-      if(this.rosters[_param.fromNodeId] == null&&this.rosterLen>0){
+      if(this.rosters[_param.fromNodeId] == null&&GlobalConfig.rosterNum>0){
         //H5不做释放处理
         if(GlobalConfig.deviceType==GlobalConfig.deviceH5){
-          loger.warn("H5不做媒体模块的频道释放->当前总人数->"+this.rosterLen, _param);
+          loger.warn("H5不做媒体模块的频道释放->当前总人数->"+GlobalConfig.rosterNum, _param);
           return ;
         }
-        loger.warn("媒体模块被占用->占有人已经不存在课堂中->释放->当前总人数->"+this.rosterLen, _param);
+        loger.warn("媒体模块被占用->占有人已经不存在课堂中->释放->当前总人数->"+GlobalConfig.rosterNum, _param);
         this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": _param.fromNodeId});
       }
     }
@@ -1118,12 +1118,12 @@ class ConferApe extends Ape {
       }
       delete this.rosters[nodeId];
       GlobalConfig.rosters = this.rosters;
-      this.rosterLen = Object.keys(this.rosters).length;
-      GlobalConfig.rosterNumber = this.rosterLen;//记录当前的总人数
+      //this.rosterLen = Object.keys(this.rosters).length;
+      //GlobalConfig.rosterNum = this.rosterLen;//记录当前的总人数
 
       if(!GlobalConfig.isH5) {
         this.emitRosterChange();
-        this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId": nodeId, "rosterLen": this.rosterLen});
+        this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId": nodeId, "rosterLen": GlobalConfig.rosterNum});
 
         //当前人员列表中抽一个人来检查离开人员是否占用频道
         for (let key in this.rosters) {
@@ -1131,7 +1131,7 @@ class ConferApe extends Ape {
           //判断是否是自己就处理以下操作
           if (randNodeId == GlobalConfig.nodeId) {
             loger.log("检查离开的人员是否占用channel");
-            this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": nodeId, "rosterLen": this.rosterLen});
+            this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": nodeId, "rosterLen": GlobalConfig.rosterNum});
             //如果离开的人员是老师,需要暂停当前的课堂
             if (user && user.role == ApeConsts.NR_HOST) {
               this.pauseClass();
@@ -1145,9 +1145,9 @@ class ConferApe extends Ape {
 
   //广播当前的人数
   emitRosterChange() {
-    if(!GlobalConfig.isH5){
-      this._emit(MessageTypes.CLASS_UPDATE_ROSTER_NUM, Object.keys(this.rosters).length);
-    }
+    //if(!GlobalConfig.isH5){
+      this._emit(MessageTypes.CLASS_UPDATE_ROSTER_NUM,{rosterLen:GlobalConfig.rosterNum});
+    //}
   }
 
   ///////数据的封包和解包/////////////////////////////////////////
@@ -1222,8 +1222,7 @@ class ConferApe extends Ape {
 
   stopApe() {
     this.rosters = {};
-    this.rosterLen = 0;
-    GlobalConfig.rosterNumber = this.rosterLen;
+    GlobalConfig.rosterNum = 0;
     GlobalConfig.rosters = this.rosters;
     this.isLeave=true;
     this.isSendInsterRoster=false;
diff --git a/src/apes/DocApe.js b/src/apes/DocApe.js
index 10dda1d..43fa30a 100644
--- a/src/apes/DocApe.js
+++ b/src/apes/DocApe.js
@@ -684,7 +684,7 @@ class DocApe extends Ape {
       return;
     }
     //如果自己不是老师,并且当前课堂内人数大于1,不能操作
-    if (!GlobalConfig.isHost && GlobalConfig.rosterNumber > 1) {
+    if (!GlobalConfig.isHost && GlobalConfig.rosterNum > 1) {
       return;
     }
 
diff --git a/src/pdus/pro.js b/src/pdus/pro.js
index 550f824..f0cae72 100644
--- a/src/pdus/pro.js
+++ b/src/pdus/pro.js
@@ -253,6 +253,7 @@ message RCAdapterItemPdu {
 message RCAdapterPdu {
     optional RCPduType_E type = 1 [default = RCPDU_REG_ADAPTER];
     repeated RCAdapterItemPdu item = 2;
+    optional uint32 user_num = 3;//rosterLen
 }
 
 // table operation pdu