diff --git a/src/EngineEntrance.js b/src/EngineEntrance.js
index 966b338..8178735 100644
--- a/src/EngineEntrance.js
+++ b/src/EngineEntrance.js
@@ -62,7 +62,7 @@ export default class MessageEntrance extends Emiter {
   constructor() {
     super();
     //sdk 信息
-    GlobalConfig.sdkVersion = "v2.13.5.20170927";
+    GlobalConfig.sdkVersion = "v2.14.5.20170927";
     loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
 
     //设置
@@ -560,7 +560,7 @@ export default class MessageEntrance extends Emiter {
       GlobalConfig.portal= GlobalConfig.replacePort(GlobalConfig.portal,":80","");
     }
 
-    GlobalConfig.userId = _param.userId || "0";
+    GlobalConfig.userId = ""+_param.userId || "0";
     //H5处理
     GlobalConfig.isH5 = _param.isH5 || false;//外部传入的参数,是否是H5
     if (GlobalConfig.isH5 == true) {
@@ -575,13 +575,6 @@ export default class MessageEntrance extends Emiter {
       GlobalConfig.microphones = _param.microphones || [];
     }
 
-    //如果没有名字,随机起一个名字
-    GlobalConfig.userName = _param.userName || "user_" + (new Date().getTime() % 1000000);
-
-    //如果没有userId或者为"0",随机生成
-    if (GlobalConfig.userId == "0") {
-      GlobalConfig.userId = "user_" + (new Date().getTime() % 1000000);
-    }
     //设置角色身份
     GlobalConfig.userRole = _param.userRole || ApeConsts.normal;
     if (GlobalConfig.userRole != ApeConsts.host &&
@@ -591,6 +584,25 @@ export default class MessageEntrance extends Emiter {
       GlobalConfig.userRole != ApeConsts.invisible) {
       GlobalConfig.userRole = ApeConsts.normal;
     }
+    //如果没有名字或没有userId的时候,需要随机生成
+    let timestampStr=new Date().getTime().toString();
+    timestampStr=timestampStr.substr(timestampStr.length-4);
+    if(GlobalConfig.userRole==ApeConsts.host){
+      timestampStr="T"+timestampStr;
+    }else if(GlobalConfig.userRole==ApeConsts.assistant) {
+      timestampStr = "A" + timestampStr;
+    }else if(GlobalConfig.userRole==ApeConsts.presenter){
+      timestampStr="P"+timestampStr;
+    }else {
+      timestampStr="S"+timestampStr;
+    }
+    //如果没有名字,随机起一个名字
+    GlobalConfig.userName = _param.userName ||timestampStr;
+    //如果没有userId或者为"0",随机生成
+    if (!GlobalConfig.userId||GlobalConfig.userId == "0") {
+      GlobalConfig.userId = timestampStr;
+    }
+
     //客户端决定是否延迟接收消息
     GlobalConfig.messageDelay = _param.messageDelay || false;
 
@@ -1697,8 +1709,10 @@ export default class MessageEntrance extends Emiter {
     loger.log('获取课堂课堂信息完成.',_data.appConfig);
     //包含整个课堂最全的信息,储存数据
     if (_data) {
-      //老师默认启用画笔功能,其他身份默认禁用画笔功能
-      if(GlobalConfig.userRole==ApeConsts.host){
+      //老师\助教默认启用画笔功能,其他身份默认禁用画笔功能
+      if(GlobalConfig.userRole==ApeConsts.host||
+        GlobalConfig.userRole==ApeConsts.assistant||
+        GlobalConfig.userRole==ApeConsts.presenter){
         GlobalConfig.selfDisEnableDrawTime=0;
       }
 
diff --git a/src/apes/VideoApe.js b/src/apes/VideoApe.js
index 6bfb464..6f279c3 100644
--- a/src/apes/VideoApe.js
+++ b/src/apes/VideoApe.js
@@ -286,7 +286,7 @@ class VideoApe extends Ape {
       publishType = 'live';
     }
     //老师能开启屏幕共享
-    if (GlobalConfig.isHost) {
+    if (GlobalConfig.isHost||GlobalConfig.isAssistant||GlobalConfig.isPresenter) {
       //获取屏幕共享推流的地址
       let shareResult = this.mediaModule.getMediaPublishPathForScreenShare(this.shareApe.channelId, publishType);
       shareResult.ip = _param.ip || "";//外部可以设置屏幕共享的IP
@@ -303,7 +303,7 @@ class VideoApe extends Ape {
       return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"};
     }
     //只有老师能停止屏幕共享
-    if (GlobalConfig.isHost) {
+    if (GlobalConfig.isHost||GlobalConfig.isAssistant||GlobalConfig.isPresenter) {
       let channelInfo = this.shareApe.getDefaultChannelInfo();
       channelInfo.status = ApeConsts.CHANNEL_STATUS_RELEASED;
       this.sendTableUpdateHandler(channelInfo);
diff --git a/src/apes/WebRtcApe.js b/src/apes/WebRtcApe.js
index d63a57d..54db159 100644
--- a/src/apes/WebRtcApe.js
+++ b/src/apes/WebRtcApe.js
@@ -144,50 +144,6 @@ class WebRtcApe extends Emiter {
       let stream = evt.stream;
       this.addRemoetStreamView(stream);
     });
-    /*    this.client.on('stream-subscribed', (evt)=> {
-     let stream = evt.stream;
-     if(stream){
-     //let viewDiv=`<div id="${this.xdyRemote + stream.getId()}" style="width:${this.hostRemoteVideoWidth}px;height:${this.hostRemoteVideoHeight}px;"></div>`;
-     let uid=stream.getId();
-     let user=GlobalConfig.getUserInfoFromeNodeId(uid);
-     let userName="";
-     let userRole=""
-     if(user){
-     userName=user.name||"";
-     userRole=user.userRole;
-     }
-
-     let nameDiv=`<div style="width:98%;height:20px; position: absolute; z-index: 1;left: 4px;overflow:hidden;font-size: 14px; color: #cccccc;display:${this.nameDisplay}">${userName}</div>`;
-
-     if(userRole==ApeConsts.invisible){
-     //把远程视频添加到监课列表
-     loger.log("获取远程视频流成功->监课:"+userName+"->" + uid,new Date().getTime());
-     let viewDiv=`<div id="${this.xdyRemote + uid}" style="width:${this.invisibleVideoWidth}px;height:${this.invisibleVideoHeight}px;float: left;margin-right: 1px;pointer-events: none;">${nameDiv}</div>`;
-     $(this.invisibleViewId).append(viewDiv);
-     }else if(userRole==ApeConsts.host){
-     //把远程视图添加到老师列表
-     loger.log("获取远程视频流成功->老师:"+userName+"->" + uid,new Date().getTime());
-     let viewDiv=`<div id="${this.xdyRemote + uid}" style="width:${this.hostRemoteVideoWidth}px;height:${this.hostRemoteVideoHeight}px;float: left;margin-right: 1px;pointer-events: none;">${nameDiv}</div>`;
-     $(this.hostRemoteViewId).append(viewDiv);
-     }else {
-     //把视图添加到学生列表
-     loger.log("获取远程视频流成功->学生:"+userName+"->" +uid,new Date().getTime());
-     let viewDiv=`<div id="${this.xdyRemote + uid}" style="width:${this.normalRemoteVideoWidth}px;height:${this.normalRemoteVideoHeight}px;float: left;margin-right: 1px;pointer-events: none;">${nameDiv}</div>`;
-     $(this.normalRemoteViewId).append(viewDiv);
-     }
-     //播放视频,隐藏控制条
-     try{
-     $("bar_"+stream.getId()).hide();
-     stream.play(this.xdyRemote + stream.getId());
-     }catch (err){
-     }
-     if(user.deviceType==1||user.deviceType==2){
-     this.remoteVideoList[user.nodeId]=stream;
-     }
-     console.log("移动端远程视频流集合->",this.remoteVideoList);
-     }
-     });*/
-
     this.client.on('stream-removed', (evt)=> {
       let stream = evt.stream;
       if (stream) {
@@ -215,7 +171,6 @@ class WebRtcApe extends Emiter {
 
   addRemoetStreamView(stream) {
     if (stream) {
-      //let viewDiv=`<div id="${this.xdyRemote + stream.getId()}" style="width:${this.hostRemoteVideoWidth}px;height:${this.hostRemoteVideoHeight}px;"></div>`;
       let uid = stream.getId();
       let user = GlobalConfig.getUserInfoFromeNodeId(uid);
       let userName = "";
@@ -224,16 +179,16 @@ class WebRtcApe extends Emiter {
         userName = user.name || "unknow";
         userRole = user.userRole;
       }
-      let nameDiv = `<div style="width:98%;height:20px; position: absolute; z-index: 1;left: 4px;overflow:hidden;font-size: 14px; color: #cccccc;display:${this.nameDisplay}">${userName}</div>`;
+      let nameDiv = `<div style="width:98%;height:20px; position: absolute;bottom: 0; z-index: 1;left: 4px;overflow:hidden;font-size: 14px;text-align: right; color: #cccccc;display:${this.nameDisplay}">${userName}</div>`;
 
       if (userRole == ApeConsts.invisible) {
         //把远程视频添加到监课列表
         loger.log("获取远程视频流成功->监课:" + userName + "->" + uid, new Date().getTime());
         let viewDiv = `<div id="${this.xdyRemote + uid}" style="width:${this.invisibleVideoWidth}px;height:${this.invisibleVideoHeight}px;float: left;margin-right: 1px;pointer-events: none;">${nameDiv}</div>`;
         $(this.invisibleViewId).append(viewDiv);
-      } else if (userRole == ApeConsts.host) {
+      } else if (userRole == ApeConsts.host||userRole == ApeConsts.assistant||userRole == ApeConsts.presenter) {
         //把远程视图添加到老师列表
-        loger.log("获取远程视频流成功->老师:" + userName + "->" + uid, new Date().getTime());
+        loger.log("获取远程视频流成功->userRole:"+userRole+":" + userName + "->" + uid, new Date().getTime());
         let viewDiv = `<div id="${this.xdyRemote + uid}" style="width:${this.hostRemoteVideoWidth}px;height:${this.hostRemoteVideoHeight}px;float: left;margin-right: 1px;pointer-events: none;">${nameDiv}</div>`;
         $(this.hostRemoteViewId).append(viewDiv);
       } else {
@@ -251,7 +206,6 @@ class WebRtcApe extends Emiter {
       if (user && (user.deviceType == 1 || user.deviceType == 2)) {
         this.remoteVideoList[user.nodeId] = stream;
       }
-      console.log("移动端远程视频流集合->", this.remoteVideoList);
     }
   }
 
@@ -277,7 +231,7 @@ class WebRtcApe extends Emiter {
         setTimeout(()=> {
           loger.warn("连接远程的流失败->尝试重新连接", err);
           this.reAddRemoteStream(_stream);
-        }, 1400);
+        }, 1200);
       } else {
         loger.warn("添加一个远程视频流->失败", err);
       }
@@ -431,7 +385,7 @@ class WebRtcApe extends Emiter {
       if (user) {
         userName = user.name || "";
       }
-      let nameDiv = `<div id="${"videoOwnerName_" + this.uid}" style="width:98%;height:20px; position: absolute; z-index: 1;left: 4px;overflow:hidden;font-size: 14px; color: #cccccc;display:${this.nameDisplay}">${userName}</div>`;
+      let nameDiv = `<div id="${"videoOwnerName_" + this.uid}" style="width:98%;height:20px; position: absolute;bottom: 0; z-index: 1;left: 4px;overflow:hidden;font-size: 14px;text-align: right; color: #cccccc;display:${this.nameDisplay}">${userName}</div>`;
       $(this.localViewId).prepend(nameDiv);
 
       loger.log("webRtc->推流->", viewName, new Date().getTime());