/* --------------- BNR ver. js.10.0068 --------------- */ //スクリプトバージョン var version = 10.0068 //ダウンロード試行ファイル var downFiles = Array( Array( 'SAKURA', 'https://www.musen-lan.com/speed/data/dat/down.php' ), Array( 'WebArena', 'https://suites.musen-lan.com/speed/data/dat/down.php' ) ); //アップテストサイズ倍数 var upSizes = 1024 * 50; //アップロードデータ(1KB) var upBase = 'FFD8FFE00010JFIF0001010100H00H0000FFDB00C0006040506050406060506070706080A100A0A09090A140E0F0C1017141818171416161A1D251F1A1B231C1616202C20232627292A29191F2D02D28025282928FFDB00C010707070A080A130A0A13281A161A2828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828FFC000110802C002BF03012200021101031101FFC4001C0000020203010100000000000000000000040503060102070008FFC400R100002010303020404030604030405080B0102030004110512211A061322Q14aq810729123BRA1B1C115bD1F03E1F11624r82C92A2B2D20817254St93A3C2D326Tcds83D8494FFC4001B01000301010101010000000000000000000001020304050607FFC40029110002020202020300030100020300000000010211032112104A1322Q2aqB238114RC1FFDA000C03010002110311003F00FA9C6MmBB4E41CmE4T8B2929B8AF401BC8E10dD422E87J82YLCC001D2A6vN8B9A0099E53BC1CE2BV91D97D2DBA872D2370B81SC62xEAzD00488C49008C1A8ng21B007J21E3ELB360D0A6DDA4fDAF050006C6v9810AAWF9D11EJB38724923B0ED45Cp6013D7BD4C224CE7BD000ABnCCE09008F9D4DEW963A0A20F23D279A16XE4DDBBDA8001B804B6140CFBRF7D3E592Q23923DC0A790AEA2D20FA'; var upData = ''; for (var i = 0; i < upSizes; i++) { upData = upData + upBase; } //アップロード試行ファイル var upFiles = Array( Array( 'SAKURA', 'https://www.musen-lan.com/speed/data/dat/up.php' ), Array( 'WebArena', 'https://suites.musen-lan.com/speed/data/dat/up.php' ) ); //下り計測設定 //タイムアウト秒数(ミリ秒) var Dtimeout = 1000 * 6; //ゲージの横の「現時点の速度」の表示更新間隔(ミリ秒) var Dswap = 300; //平均速度の母数の時間(ミリ秒) var Dchop = 1500; //モード // 0 : 最終数値 // 1 : 最速値 // 2 : 2番目に早い数値 // 3以降:2に準じる(x番目に早い数値) // * 過大値を指定すると最も遅い数値となる var Dmode = 1; //上り計測設定 //タイムアウト秒数(ミリ秒) var Utimeout = 1000 * 6; //ゲージの横の現時点の速度の表示間隔(ミリ秒) var Uswap = 300; //平均速度の母数の時間(ミリ秒) var Uchop = 1500; //モード // 0 : 最終数値 // 1 : 最速値 // 2 : 2番目に早い数値 // 3以降:2に準じる(x番目に早い数値) // * 過大値を指定すると最も遅い数値となる var Umode = 1; /* ボタンクリックで起動 */ $(function() { $('#down-start').on('click', function(){ $('#down').find('[name=result]').removeClass('start'); $('#down').find('[name=result]').html('準備中'); $('#down').find('button').html('測定中'); $('#down').find('button').addClass('progress'); $('#down').find('button').attr('disabled', true); $('#up').find('button').attr('disabled', true); getLineInfo('down'); }); $('#up-start').on('click', function(){ $('#up').find('[name=result]').removeClass('start'); $('#up').find('[name=result]').html('準備中'); $('#up').find('button').html('測定中'); $('#up').find('button').addClass('progress'); $('#down').find('button').attr('disabled', true); $('#up').find('button').attr('disabled', true); getLineInfo('up'); }); }); /* 秒間サイズ計測 @param {number} size バイト数 @param {number} sec 経過秒数 @return 秒間バイト数 */ function calcbytes (size, sec) { var bytes = size / sec * 1000; return bytes; } /* 指定秒間の平均速度算出 @param {array} ary progressごとの経過秒数とサイズの配列 @param {number} chop 母数となる秒数の指定 @param {array} result 結果配列 @return 与えられた結果配列に今回の結果を加えた配列 */ function sumChop (ary, chop, result) { var l = ary.length - 1; var tmpT = 0; var tmpB = 0; while (l >= 0) { tmpT = tmpT + ary[l][0]; tmpB = tmpB + ary[l][1]; if (tmpT >= chop) { break; } l--; } var byte = calcbytes(tmpB, tmpT); var calc = calcbps(byte); result.push(byte); return calc; } /* 下り計測開始 */ function downStart(lineinfo) { //計測中 var now = new Date(); var dayOfWeek = now.getDay() ; // 曜日(数値) var dayOfWeekStr = [ "日", "月", "火", "水", "木", "金", "土" ][dayOfWeek] ; // 曜日(日本語表記) datetime = now.getFullYear() + "年" + zeroPad((now.getMonth() + 1)) + "月" + zeroPad(now.getDate()) + "日(" + dayOfWeekStr +") " + zeroPad(now.getHours()) + "時" + zeroPad(now.getMinutes()) + "分" + zeroPad(now.getSeconds()) + "秒"; var output = '------ BNRスピードテスト (ダウンロード速度) ------
'; output += '測定サイト: https://www.musen-lan.com/speed/ Ver' + version + '
'; output += '測定日時: ' + String(datetime) + '
'; if(lineinfo != ""){output += '回線/ISP/地域: ' + lineinfo + '
';} output += '--------------------------------------------------
'; $('#down').find('[name=result]').html(output); downResult = Array(); downTest(0); } /* 上り計測開始 */ function upStart(lineinfo) { //計測中 var now = new Date(); var dayOfWeek = now.getDay() ; // 曜日(数値) var dayOfWeekStr = [ "日", "月", "火", "水", "木", "金", "土" ][dayOfWeek] ; // 曜日(日本語表記) datetime = now.getFullYear() + "年" + zeroPad((now.getMonth() + 1)) + "月" + zeroPad(now.getDate()) + "日(" + dayOfWeekStr +") " + zeroPad(now.getHours()) + "時" + zeroPad(now.getMinutes()) + "分" + zeroPad(now.getSeconds()) + "秒"; var output = '------ BNRスピードテスト (アップロード速度) ------
'; output += '測定サイト: https://www.musen-lan.com/speed/ Ver' + version + '
'; output += '測定日時: ' + String(datetime) + '
'; if(lineinfo != ""){output += '回線/ISP/地域: ' + lineinfo + '
';} output += '--------------------------------------------------
'; $('#up').find('[name=result]').html(output); upResult = Array(); upTest(0); } /* ダウンロードテスト @param {number} num テストサーバ番号 @return なし */ function downTest (num) { var output = downFiles[num][0]+':0%0%'; $('#down').find('[name=result]').append(output); chkStart = chopStart = startTime = new Date(); loaded = 0; var file = downFiles[num][1] + '?t=' + startTime.getTime(); var tmpAry = Array(); var svResult = Array(); var xhr = new XMLHttpRequest(); xhr.addEventListener('loadend', function(e){ if (Dmode == 0) { var result = svResult[svResult.length - 1]; } else { //降順ソート svResult.sort(function (a, b){ if( a > b ) return -1; if( a < b ) return 1; return 0; }); if (svResult.length < Dmode) { var result = svResult[svResult.length - 1]; } else { var result = svResult[Dmode - 1]; } } var calc = calcbps(result); var output = String(calc['bps']) + ' (' + String(calc['bytes']) + ')
'; $('#down').find('[name=sv' + num + ']').html(output); downResult.push(result); clearInterval(interval); if (downFiles[num + 1]) { downTest(num + 1); } else { fin('down', downResult); logging('down', downResult); } }); xhr.addEventListener('progress', function(e){ endTime = new Date(); var sec = endTime.getTime() - startTime.getTime(); var elp = endTime.getTime() - chkStart.getTime(); var wait = endTime.getTime() - chopStart.getTime(); var chunk = e.loaded - loaded; loaded = e.loaded; tmpAry.push(Array(sec, chunk)); if (wait > Dswap) { var calc = sumChop(tmpAry, Dchop, svResult); $('#down').find('[name=sv' + num + '] .bps').html(calc['bps']); chopStart = new Date(); } startTime = new Date(); //開始からの経過秒数で中断 if (elp > Dtimeout) { xhr.abort(); } }); xhr.open('GET', file); xhr.send(null); var standby = true; interval = setInterval(function() { if (svResult.length > 0) { if (standby) { chkStart = new Date(); standby = false; } thistime = new Date(); var elp = thistime.getTime() - chkStart.getTime(); var progress = Math.round(elp / Dtimeout * 100); if (progress > 100) { progress = 100; } $('#down').find('[name=sv' + num + '] progress').attr('value', progress); $('#down').find('[name=sv' + num + '] progress').html(progress + '%'); $('#down').find('[name=sv' + num + '] .progress').html(progress + '%'); } }, 50); } /* アップロードテスト @param {number} num テストファイル番号 @return なし */ function upTest (num) { var output = upFiles[num][0]+':0%0%'; $('#up').find('[name=result]').append(output); chkStart = chopStart = startTime = new Date(); loaded = 0; var file = upFiles[num][1]; var tmpAry = Array(); var svResult = Array(); var formData = new FormData(); formData.append('d', upData); var xhr = new XMLHttpRequest(); xhr.upload.addEventListener('loadend', function(e){ if (Umode == 0) { var result = svResult[svResult.length - 1]; } else { //降順ソート svResult.sort(function (a, b){ if( a > b ) return -1; if( a < b ) return 1; return 0; }); if (svResult.length < Umode) { var result = svResult[svResult.length - 1]; } else { var result = svResult[Umode - 1]; } } var calc = calcbps(result); var output = String(calc['bps']) + ' (' + String(calc['bytes']) + ')
'; $('#up').find('[name=sv' + num + ']').html(output); upResult.push(result); clearInterval(interval); if (upFiles[num + 1]) { upTest(num + 1); } else { fin('up', upResult); logging('up', upResult); } }); xhr.upload.addEventListener('progress', function(e){ endTime = new Date(); var sec = endTime.getTime() - startTime.getTime(); var elp = endTime.getTime() - chkStart.getTime(); var wait = endTime.getTime() - chopStart.getTime(); var chunk = e.loaded - loaded; loaded = e.loaded; tmpAry.push(Array(sec, chunk)); if (wait > Uswap) { var calc = sumChop(tmpAry, Uchop, svResult); $('#up').find('[name=sv' + num + '] .bps').html(calc['bps']); chopStart = new Date(); } startTime = new Date(); //開始からの経過秒数で中断 if (elp > Utimeout) { xhr.abort(); } }); xhr.open('POST', file); xhr.send(formData); var standby = true; interval = setInterval(function() { if (svResult.length > 0) { if (standby) { chkStart = new Date(); standby = false; } thistime = new Date(); var elp = thistime.getTime() - chkStart.getTime(); var progress = Math.round(elp / Utimeout * 100); if (progress > 100) { progress = 100; } $('#up').find('[name=sv' + num + '] progress').attr('value', progress); $('#up').find('[name=sv' + num + '] progress').html(progress + '%'); $('#up').find('[name=sv' + num + '] .progress').html(progress + '%'); } }, 50); } /* データ収集完了して画面に反映 @param {element} elm 出力先エレメント @param {array} ary 結果配列 @return なし */ function fin (key, ary) { var elm = $('#'+key) var fastest = Math.max.apply(null, ary); var calc = calcbps(fastest); var output = 'データ転送速度: ' + String(calc['bps']) + ' (' + String(calc['bytes']) + ')'; elm.find('[name=result]').append(output); if (key == 'down') { var tw_t = 'BNRスピードテスト(インターネット通信速度)' + "\n" + '測定日時: ' + String(datetime) + "\n" + '測定結果: ' + String(calc['bps']) + "\n"; var tw_w = ' Tweet'; elm.find('[name=result]').append(tw_w); } elm.find('button').html('測定開始'); elm.find('button').removeClass('progress'); $('#down').find('button').attr('disabled', false); $('#up').find('button').attr('disabled', false); } /* ファイルに記録 @param {string} key 上り下り区別 @param {array} ary 結果配列 @return なし */ function logging (key, ary) { var fastest = Math.max.apply(null, ary); var bps = fastest * 8; var kbps = bps / 1000; kbps = orgRound(kbps, 100); //ログ記録は下りのみ if (key == 'down') { //save var xhr = new XMLHttpRequest(); xhr.addEventListener('loadend', function(){ }); xhr.open('POST', './flash_post.cgi'); xhr.send('ACTION=REGIST&VERSION='+version+'&SPEED='+kbps); } } /* bps計算 @param {number} bytes 秒間読込バイト数 @return {array} 結果配列 */ function calcbps (bytes) { var o_bytes; var o_bps; var kb = bytes / 1000; if (kb > 1000) { var mb = kb / 1000; o_bytes = orgRound(mb, 100) + 'MB/sec' } else { o_bytes = orgRound(kb, 100) + 'KB/sec' } var bps = bytes * 8; var kbps = bps / 1000; if (kbps > 1000) { var mbps = kbps / 1000; o_bps = orgRound(mbps, 100) + 'Mbps' } else { o_bps = orgRound(kbps, 100) + 'Kbps' } return { 'bytes' : o_bytes, 'bps' : o_bps } } /* 任意の桁で四捨五入する関数 @param {number} value 四捨五入する数値 @param {number} base どの桁で四捨五入するか(10→10の位、0.1→小数第1位) @return {number} 四捨五入した値 */ var orgRound = function (value, base) { return Math.round(value * base) / base; } /* 桁数合わせ(2桁) @param {number} num 2桁にしたい数値 @return {number} 2桁にした値 */ var zeroPad = function (num) { return ('00' + num).slice(-2); } /* 回線情報取得 @return {array} クッキーから得た回線情報テキスト(PHP経由で文字コード変換、成型済) */ function getLineInfo(key){ var xhr = new XMLHttpRequest(); xhr.addEventListener('loadend', function(){ if (key == 'down') { downStart(xhr.responseText); } else if (key == 'up') { upStart(xhr.responseText); } }); xhr.open('GET', './cookie.php'); xhr.send(); }