暂无描述

pcSip备份.js 9.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. var outgoingSession = null,incomingSession = null,currentSession = null,nativeStream = null,callVideoState= null,callVideoFail = null,
  2. inComing = true,sip_uri_, sip_password_, ws_uri_,localStream = null,userAgent = null,currentVideoIndex = 0,registrationState = null;
  3. var getWidthScale = document.documentElement.clientWidth; //监测浏览器的宽度
  4. var myVideoView = document.getElementById('myVideo'); //我的本地视频
  5. var videoView_1 = document.getElementById('videoView'); //对方的视频信息
  6. console.log(getWidthScale)
  7. $(function(){
  8. $(".videoList").css({
  9. "height":getWidthScale*0.8/1.6+"px",
  10. })
  11. $(".videoMy").css({
  12. "height":getWidthScale*0.8/1.6+"px",
  13. })
  14. })
  15. //开启本地摄像头
  16. function captureLocalMediaVideo() {
  17. navigator.getUserMedia({
  18. video: true,
  19. audio: false
  20. }, function(stream) {
  21. nativeStream = stream;
  22. myVideoView.srcObject = stream;
  23. }, function(e) {
  24. alert('getUserMedia() error: ' + e.name);
  25. });
  26. }
  27. //获取本地媒体流
  28. function localMediaStream() {
  29. navigator.getUserMedia({
  30. video:true,
  31. audio: true
  32. }, function(stream) {
  33. if(callVideoState){
  34. localStream = stream;
  35. sipCallVideo();
  36. }
  37. }, function(e) {
  38. alert('getUserMedia() error: ' + e.name);
  39. });
  40. }
  41. // 关闭摄像头
  42. function closeMediaVideo() {
  43. //console.log("1213")
  44. if(nativeStream){
  45. nativeStream.getTracks().forEach(function(track) {
  46. track.stop();
  47. });
  48. }
  49. if(localStream){
  50. localStream.getTracks().forEach(function(track) {
  51. track.stop();
  52. });
  53. }
  54. }
  55. function testStart() {
  56. // sip_uri_ = "sip:" + selectExten + "@zmd.xjt.net.cn"; //zmd.xjt.net.cn sip.800100.com.cn
  57. // sip_password_ = selectExten.toString(); //zhumadian12345800100
  58. //sip_uri_ = "sip:" + selectExten + "@12345sp1.zhumadian.gov.cn"; // 12345sp.zwfw.anyang.gov.cn
  59. sip_uri_ = "sip:" + selectExten + "@12345sp.zwfw.anyang.gov.cn";
  60. sip_password_ = "123456"; //zhumadian12345800100
  61. //ws_uri_ = "wss://zmd.xjt.net.cn:7443";
  62. //ws_uri_ = "wss://12345sp2.zhumadian.gov.cn:7443";
  63. ws_uri_ = "wss://12345sp.zwfw.anyang.gov.cn:7443";
  64. console.info("get input info: sip_uri = ", sip_uri_, " sip_password = ", sip_password_, " ws_uri = ", ws_uri_);
  65. var socket = new JsSIP.WebSocketInterface(ws_uri_);
  66. var configuration = {
  67. sockets: [socket],
  68. outbound_proxy_set: ws_uri_,
  69. uri: sip_uri_, //与用户代理关联的SIP URI(字符串)。这是您的提供商提供给您的SIP地址
  70. password: sip_password_, //SIP身份验证密码
  71. contact_uri: 'sip:'+selectExten+'@12345sp1.zhumadian.gov.cn;transport=wss',
  72. //stun_servers: stun_servers,
  73. //contact_uri: 'sip:'+extno+'@'+returnCitySN["cip"]+';transport=ws',
  74. register: true, //指示启动时JsSIP用户代理是否应自动注册
  75. session_timers: false,//启用会话计时器(根据RFC 4028)
  76. };
  77. userAgent = new JsSIP.UA(configuration);
  78. //成功注册成功,data:Response JsSIP.IncomingResponse收到的SIP 2XX响应的实例
  79. userAgent.on('registered', function(data) {
  80. console.info("registered: ", data.response.status_code, ",", data.response.reason_phrase);
  81. $(".titText").show();
  82. $(".titText").html(selectExten + "注册成功");
  83. registrationState = true;
  84. top.Connect();
  85. });
  86. //由于注册失败而被解雇,data:Response JsSIP.IncomingResponse接收到的SIP否定响应的实例,如果失败是由这样的响应的接收产生的,否则为空
  87. userAgent.on('registrationFailed', function(data) {
  88. console.log("registrationFailed, ", data);
  89. //console.warn("registrationFailed, ", data.response.status_code, ",", data.response.reason_phrase, " cause - ", data.cause);
  90. });
  91. //1.在注册到期之前发射几秒钟。如果应用程序没有为这个事件设置任何监听器,JsSIP将像往常一样重新注册。
  92. userAgent.on('registrationExpiring', function() {
  93. //==console.warn("registrationExpiring");
  94. });
  95. //为传入或传出会话/呼叫激发。data:
  96. userAgent.on('newRTCSession', function(data) {
  97. //console.info('onNewRTCSession: ', data);
  98. console.info('onNewRTCSession: ', data);
  99. var originator = data.originator;
  100. var session = data.session;
  101. var request = data.request;
  102. if (data.originator == 'remote') { //incoming call
  103. //console.log(JSON.stringify(data));
  104. console.info("incomingSession, answer the call");
  105. incomingSession = data.session;
  106. $(".videoBtn").show();
  107. $(".vidDrop").hide();
  108. $(".videoCall").show();
  109. $(".videoList").hide();
  110. $(".videoMy").hide();
  111. $('.maxOpen').trigger("click");
  112. captureLocalMediaVideo()
  113. localMediaStream()
  114. } else {
  115. console.info("2");
  116. //console.info("outgoingSession");
  117. outgoingSession = data.session;
  118. outgoingSession.on('connecting', function(data) {
  119. //console.info('onConnecting - ', data.request);
  120. currentSession = outgoingSession;
  121. outgoingSession = null;
  122. });
  123. }
  124. //接受呼叫时激发
  125. data.session.on('accepted', function(data) {
  126. console.info("3");
  127. //console.info('onAccepted - ', data);
  128. if (data.originator == 'remote' && currentSession == null) {
  129. currentSession = incomingSession;
  130. incomingSession = null;
  131. //console.info("setCurrentSession - ", currentSession);
  132. }
  133. });
  134. //确认呼叫后激发
  135. data.session.on('confirmed', function(data) {
  136. console.info("4");
  137. //console.info('onConfirmed - ', data);
  138. $(".callStyle").text("通话中");
  139. if (data.originator == 'remote' && currentSession == null) {
  140. currentSession = incomingSession;
  141. incomingSession = null;
  142. //console.info("setCurrentSession - ", currentSession);
  143. }
  144. });
  145. //在将远程SDP传递到RTC引擎之前以及在发送本地SDP之前激发。此事件提供了修改传入和传出SDP的机制。
  146. data.session.on('sdp', function(data) {
  147. console.info("5");
  148. });
  149. //接收或生成对邀请请求的1XX SIP类响应(>100)时激发。该事件在SDP处理之前触发(如果存在),以便在需要时对其进行微调,甚至通过删除数据对象中响应参数的主体来删除它
  150. data.session.on('progress', function(data) {
  151. console.info("6");
  152. //console.info('onProgress - ', data.originator);
  153. if (data.originator == 'remote') {
  154. //console.info('onProgress, response - ', data.response);
  155. }
  156. });
  157. //创建基础RTCPeerConnection后激发。应用程序有机会通过在peerconnection上添加RTCDataChannel或设置相应的事件侦听器来更改peerconnection。
  158. data.session.on('peerconnection', function(data) {
  159. console.info('onPeerconnection ----创建基础RTCPeerConnection后激发 ');
  160. var datachannel;
  161. datachannel = data.peerconnection.createDataChannel('chat');
  162. console.log("1111" + datachannel)
  163. callVideoFail = false;
  164. if (inComing) {
  165. inComing =false;
  166. data.peerconnection.onaddstream = function(ev) {
  167. $(".videoMy").show();
  168. $(".videoBtn").hide();
  169. $(".videoList").show();
  170. $(".vidDrop").show();
  171. videoView_1.srcObject = ev.stream;
  172. }
  173. }
  174. });
  175. });
  176. //为传入或传出消息请求激发。data:
  177. // originator:'remote',新消息由远程对等方生成;'local',新消息由本地用户生成。
  178. // message:JsSIP.Message 实例。
  179. // request:JsSIP.IncomingRequest收到的MESSAGE请求的实例;JsSIP.OutgoingRequest传出MESSAGE请求的实例
  180. userAgent.on('newMessage', function(data) {
  181. console.info("8");
  182. if (data.originator == 'local') {
  183. //console.info('onNewMessage , OutgoingRequest - ', data.request);
  184. } else {
  185. //console.info('onNewMessage , IncomingRequest - ', data.request);
  186. }
  187. });
  188. console.info("call register");
  189. //连接到信令服务器,并恢复以前的状态,如果以前停止。重新开始时,如果UA配置中的参数设置为register:true,则向SIP域注册。
  190. userAgent.start();
  191. }
  192. // Register callbacks to desired call events
  193. var eventHandlers = {
  194. 'progress': function(e) {
  195. console.log('call is in progress');
  196. },
  197. 'failed': function(e) {
  198. console.log('call failed: ', e);
  199. if(callVideoFail){
  200. setTimeout(function(){videoCall()},2000)
  201. }
  202. },
  203. 'ended': function(e) {
  204. console.log('call ended : ', e);
  205. dropCall();
  206. },
  207. 'confirmed': function(e) {
  208. console.log('call confirmed');
  209. }
  210. };
  211. //视频呼叫
  212. function audioCall(callPhone) {
  213. if($("#numberCall").val()<1005||$("#numberCall").val()>1010){
  214. alert("账号不正确,请重新输入")
  215. } else{
  216. inComing = true
  217. callVideoState = true ;
  218. localMediaStream();
  219. captureLocalMediaVideo();
  220. $(".videoCall").show();
  221. $(".callStyle").text("连接中");
  222. }
  223. }
  224. function sipCallVideo(){
  225. callVideoFail = true;
  226. if(localStream){
  227. var sip_phone_number_ = $("#numberCall").val().toString();
  228. var options = {
  229. 'eventHandlers': eventHandlers,
  230. 'mediaConstraints': {
  231. 'audio': true,
  232. 'video': {
  233. 'width': 320,
  234. 'height': 240
  235. }
  236. },
  237. 'mediaStream': localStream
  238. };
  239. callVideoState = false;
  240. outgoingSession = userAgent.call(sip_phone_number_, options);
  241. }
  242. }
  243. //接听
  244. function answerCall() {
  245. inComing = true;
  246. console.log(incomingSession)
  247. if (incomingSession) {
  248. incomingSession.answer({
  249. 'mediaConstraints': {
  250. 'audio': true,
  251. 'video': {
  252. 'width': 320,
  253. 'height': 240
  254. }
  255. },
  256. 'mediaStream': localStream
  257. });
  258. incomingSession = null;
  259. }
  260. }
  261. //注销
  262. function unReg() {
  263. console.log('注销----------->');
  264. userAgent.unregister(true);
  265. }
  266. //挂断
  267. function dropCall() {
  268. console.log('挂断----------->');
  269. userAgent.terminateSessions();
  270. $(".callStyle").text("")
  271. closeMediaVideo();
  272. $(".videoCall").hide();
  273. }