Wi‑Fiチャネルプランナー(2.4 / 5 / 6GHz)
2.4 GHz、5 GHz、および6 GHzの周波数帯域におけるWi-Fiチャンネルを検索、分析、可視化します。チャンネル番号または周波数に基づいて異なる表記方法でチャンネルを検索し、20 MHzから320 MHzまでの帯域幅を表示できます。
クイック検索のヒント
以下の方法でチャネルを検索できます:
- 基本チャネル: チャネル番号を入力(例: "36"、"1")
- 結合チャネル: 完全な表記を入力(例: "42[36]" または "1+5")
- 中心チャネル: 中心チャネルのみ入力(例: "42")
- プライマリチャネル: 角括弧で指定(例: "[36]")
| チャネル | 帯域幅 | 周波数 | 注記 |
|---|
チャネルの可視化
Wi-Fiバンドとチャネル
周波数帯域
- 2.4 GHz 帯(802.11b/g/n): 混雑しやすく干渉が多いが、壁の貫通力が高い
- 5 GHz 帯(802.11a/n/ac/ax): 干渉が少なく高速通信可能だが、遮蔽物に弱い
- 6 GHz 帯(802.11ax/be): Wi-Fi 6Eから導入、空いていて高速、範囲は狭い
チャネル表記と命名
- 2.4 GHz帯: プライマリとセカンダリを組み合わせて表記(例: "1+5")
- 5/6 GHz帯: 中心周波数とプライマリチャネルで表記(例: "42[36]")
- 結合チャネルにマウスを重ねると代替表記(例: "36+40")が表示されます
- プライマリチャネルは管理フレームに使用される制御チャネルです
技術情報
- チャネル帯域幅: 広い帯域幅(40/80/160/320 MHz)は高速通信可能だが、干渉を受けやすい
- DFS(動的周波数選択): レーダーを検出し、自動的にチャネルを変更
- TPC(送信電力制御): 送信出力を自動調整
- BFWA(固定無線アクセス): 標準U-NII帯域外のチャネル。免許制や調整型のポイント・ツー・ポイント通信で使用(例: 5845 MHz のチャネル169)
- 地域制限: 地域(EU、米国など)により、特に6GHz帯で使用可能なチャネルが異なる
- Wi-Fi 7の特長: 6GHz帯での320 MHzチャネルに対応し、超高速通信が可能
`); printWindow.document.close(); } // Update the band info function updateBandInfo() { const bandInfoText = getBandInfo(aktuellesBand); calculatorForm.bandInfo.textContent = bandInfoText; calculatorForm.bandInfo.style.display = bandInfoText ? 'block' : 'none'; } // Update the bandwidth info function updateBandbreiteInfo() { const bandbreiteInfoText = getBandbreiteInfo(aktuelleBandbreite); calculatorForm.bandbreiteInfo.textContent = bandbreiteInfoText; calculatorForm.bandbreiteInfo.style.display = bandbreiteInfoText ? 'block' : 'none'; } // Update the frequency field depending on band function updateFrequenzFeld() { const anzeigeband = aktuellesBand === 'auto' ? (aktuellesSuchergebnis ? aktuellesSuchergebnis.band : '2.4GHz') : aktuellesBand; calculatorForm.frequenzLabel.textContent = `Frequency:`; // Update placeholder based on selected unit updateFrequenzPlaceholder(); // Set appropriate unit for the band updateFrequenzEinheit(); } // Update frequency placeholder based on selected unit and band function updateFrequenzPlaceholder() { const anzeigeband = aktuellesBand === 'auto' ? (aktuellesSuchergebnis ? aktuellesSuchergebnis.band : '2.4GHz') : aktuellesBand; const unit = calculatorForm.frequenzUnit.value; if (unit === 'GHz') { /* 60GHz-Bedingung auskommentiert if (anzeigeband === '60GHz') { calculatorForm.frequenz.placeholder = "e.g. 60.48 or 58.32"; } else */ if (anzeigeband === '6GHz') { calculatorForm.frequenz.placeholder = "e.g. 5.955 or 6.105"; } else if (anzeigeband.startsWith('5GHz')) { calculatorForm.frequenz.placeholder = "e.g. 5.18 or 5.5"; } else { calculatorForm.frequenz.placeholder = "e.g. 2.412 or 2.462"; } } else { /* 60GHz-Bedingung auskommentiert if (anzeigeband === '60GHz') { calculatorForm.frequenz.placeholder = "e.g. 60480 or 58320"; } else { */ calculatorForm.frequenz.placeholder = "e.g. 2412 or 5180"; /* Schließende Klammer auskommentiert } */ } } // Set appropriate frequency unit based on band function updateFrequenzEinheit() { const anzeigeband = aktuellesBand === 'auto' ? (aktuellesSuchergebnis ? aktuellesSuchergebnis.band : '2.4GHz') : aktuellesBand; // Auto-select GHz for 60GHz band, MHz for others /* 60GHz-Bedingung auskommentiert if (anzeigeband === '60GHz' && calculatorForm.frequenzUnit.value !== 'GHz') { calculatorForm.frequenzUnit.value = 'GHz'; } else */ if (calculatorForm.frequenzUnit.value === '') { calculatorForm.frequenzUnit.value = 'MHz'; } updateFrequenzPlaceholder(); } // Handle frequency unit change function handleFrequenzUnitChange() { updateFrequenzPlaceholder(); // If there's a value in the frequency field, convert it if (calculatorForm.frequenz.value) { const oldUnit = calculatorForm.frequenzUnit.value === 'MHz' ? 'GHz' : 'MHz'; const oldValue = parseFloat(calculatorForm.frequenz.value); if (!isNaN(oldValue)) { let newValue; if (oldUnit === 'GHz' && calculatorForm.frequenzUnit.value === 'MHz') { // Convert from GHz to MHz newValue = (oldValue * 1000).toFixed(0); } else if (oldUnit === 'MHz' && calculatorForm.frequenzUnit.value === 'GHz') { // Convert from MHz to GHz newValue = (oldValue / 1000).toFixed(3); // Remove trailing zeros newValue = newValue.replace(/\.?0+$/, ''); } calculatorForm.frequenz.value = newValue; } } } // Show or hide error function setzeError(inputElement, errorElement, message) { const inputContainer = inputElement.parentElement; if (message) { inputContainer.classList.add('error'); errorElement.style.display = 'block'; errorElement.textContent = message; } else { inputContainer.classList.remove('error'); errorElement.style.display = 'none'; } } // バンド情報を返す関数 function getBandInfo(bandName) { switch (bandName) { case 'auto': return '入力された周波数またはチャネル番号に基づき、自動的にバンドを判別します。'; case '2.4GHz': return '最大100mW(20dBm)。非常に混雑しているバンド。推奨チャネル:1、6、11(20 MHz、干渉なし)、または1+5(40 MHzの結合チャネル)。'; case '5GHz-U-NII-1': return '屋内専用。DFS/TPCは不要。最大200mW(23dBm)。周波数範囲:5150~5250 MHz。'; case '5GHz-U-NII-2': return '屋内専用。DFS/TPC 必須(レーダー検出)。最大200mW(23dBm)。周波数範囲:5250~5350 MHz。'; case '5GHz-U-NII-2E': return '屋外利用可能。DFS/TPC 必須(レーダー検出)。最大1000mW(30dBm)。周波数範囲:5470~5725 MHz。'; case '5GHz-BFWA': return '屋外利用可能。DFS/TPC 必須(5850 MHz以降はDFS不要)。最大4W(36dBm)。商用登録ユーザーのみ使用可。周波数範囲:5725~5875 MHz。'; case '6GHz': return 'Wi-Fi 6EおよびWi-Fi 7向けの新バンド。地域ごとに異なる規制。非常に高速だが、範囲は限定的で干渉も少ない。'; /* case '60GHz': return '屋内および屋外利用可能。最大10W、アンテナ利得30dBi超で最大316W(屋外固定局のみ)。超高速通信。周波数範囲:57~71 GHz。'; */ default: return ''; } } // 帯域幅情報を返す関数 function getBandbreiteInfo(bandbreite) { switch (bandbreite) { case 'all': return '利用可能なすべてのチャネル帯域幅を表示します。'; case '20': return '従来のネットワーク向け標準帯域幅。すべてのWi-Fiデバイスと互換性あり。'; case '40': return '802.11nで導入。20 MHzと比べてスループットが2倍。'; case '80': return '802.11acで導入。高速通信が可能だが、干渉のないチャネル数が限られる。'; case '160': return '802.11ac/axにおける最大チャネル幅。非常に高速だがチャネル数は非常に少ない。'; case '320': return 'Wi-Fi 7(802.11be)で新たに導入。超高速通信。6GHz帯のみ対応。'; /* case '2160': return '60GHz帯における802.11adの標準チャネル幅。超高速通信。'; case '4320': return '802.11ayにおけるチャネル結合(2×2160 MHz)。'; case '6480': return '802.11ayにおけるチャネル結合(3×2160 MHz)。'; case '8640': return '802.11ayにおけるチャネル結合(4×2160 MHz)。'; */ default: return ''; } } // チャネルに関する補足情報を返す関数 function getKanalHinweis(band, kanalNum, bandbreite) { if (band === '2.4GHz') { if (typeof kanalNum === 'string' && kanalNum.includes('+')) { const kanalTeile = kanalNum.split('+'); if (kanalTeile[0] === '1' || kanalTeile[0] === '2' || kanalTeile[0] === '3') { return '干渉が少ない推奨の結合チャネル'; } else if (kanalTeile[0] === '7' || kanalTeile[0] === '8' || kanalTeile[0] === '9') { return '近隣ネットワークと干渉する可能性があります'; } return '40 MHzチャネル(20 MHzチャネル2本を結合)'; } else { if (kanalNum === 1 || kanalNum === 6 || kanalNum === 11) { return '干渉のない推奨チャネル'; } else if (kanalNum === 9) { return '電子レンジの多くが2.455 GHzで動作し、このチャネルと干渉します!'; } else if (kanalNum === 12 || kanalNum === 13) { return 'EUのみ使用可能'; } else if (kanalNum === 14) { return '日本のみ使用可能'; } } } else if (band === '5GHz-U-NII-1') { if (bandbreite === '20') { return '屋内専用、DFS不要'; } else if (bandbreite === '40') { return '屋内専用、40 MHzチャネル結合(20 MHz × 2)'; } else if (bandbreite === '80') { return '屋内専用、80 MHzチャネル結合(20 MHz × 4)'; } else if (bandbreite === '160') { return '屋内専用、160 MHzチャネル結合(20 MHz × 8)、U-NII-1とU-NII-2を跨ぐ'; } } else if (band === '5GHz-U-NII-2') { const dfsHinweis = 'DFSおよびTPC必須。気象レーダー検出対応。'; if (bandbreite === '20') { return dfsHinweis; } else if (bandbreite === '40') { return dfsHinweis + ' 40 MHzチャネル結合(20 MHz × 2)。'; } else if (bandbreite === '80') { return dfsHinweis + ' 80 MHzチャネル結合(20 MHz × 4)。'; } } else if (band === '5GHz-U-NII-2E') { let hinweis = 'DFSおよびTPC必須。'; if (kanalNum === 120 || kanalNum === 124 || kanalNum === 128 || (typeof kanalNum === 'string' && kanalNum.includes('120'))) { hinweis += 'レーダー干渉エリア。'; } else if (kanalNum === 116 || kanalNum === 132 || (typeof kanalNum === 'string' && (kanalNum.includes('116') || kanalNum.includes('132')))) { hinweis += 'レーダー境界エリア。'; } if (bandbreite === '40') { hinweis += '40 MHzチャネル結合(20 MHz × 2)。'; } else if (bandbreite === '80') { hinweis += '80 MHzチャネル結合(20 MHz × 4)。'; } else if (bandbreite === '160') { hinweis += '160 MHzチャネル結合(20 MHz × 8)。'; } return hinweis; } else if (band === '5GHz-BFWA') { let hinweis = ''; if (kanalNum === 169 || kanalNum === 173 || (typeof kanalNum === 'string' && kanalNum.includes('169'))) { hinweis = '5850 MHz以上はDFS不要。'; } else { hinweis = 'DFS/TPC必須。'; } hinweis += '商用登録ユーザーのみ使用可能。'; if (bandbreite === '40') { hinweis += '40 MHzチャネル結合(20 MHz × 2)。'; } else if (bandbreite === '80') { hinweis += '80 MHzチャネル結合(20 MHz × 4)。'; } return hinweis; } else if (band === '6GHz') { let hinweis = 'Wi-Fi 6E/7専用。'; if (bandbreite === '320') { hinweis = 'Wi-Fi 7専用。超高速通信。'; if ( kanalNum === '31[1]' || kanalNum === '63[33]' || kanalNum === '95[63]' || (typeof kanalNum === 'string' && (kanalNum.includes('1-61') || kanalNum.includes('33-93') || kanalNum.includes('63-127'))) ) { hinweis += '米国では使用可能、EUでは使用不可。'; } } else if (parseInt(bandbreite) >= 160) { if (kanalNum === '15[1]' || kanalNum === '1-29') { hinweis += '米国およびEUで使用可能。'; } else { hinweis += '米国では使用可能、EUでは使用不可。'; } } if (bandbreite === '40') { hinweis += '40 MHzチャネル結合(20 MHz × 2)。'; } else if (bandbreite === '80') { hinweis += '80 MHzチャネル結合(20 MHz × 4)。'; } else if (bandbreite === '160') { hinweis += '160 MHzチャネル結合(20 MHz × 8)。'; } else if (bandbreite === '320') { hinweis += '320 MHzチャネル結合(20 MHz × 16)。'; } return hinweis; } return null; } // Show the search result function zeigeErgebnis(ergebnis) { if (!ergebnis) { calculatorForm.suchergebnis.style.display = 'none'; return; } calculatorForm.suchergebnis.style.display = 'block'; // Show main result calculatorForm.ergebnisBand.textContent = ergebnis.band; calculatorForm.ergebnisKanal.textContent = ergebnis.kanal; // Show bandwidth const bandbreitenText = ergebnis.band === '60GHz' ? `${(ergebnis.bandbreite / 1000).toFixed(2)} GHz` : `${ergebnis.bandbreite} MHz`; calculatorForm.ergebnisBandbreite.textContent = bandbreitenText; // Format frequency based on user's selected unit const unit = calculatorForm.frequenzUnit.value; if (unit === 'GHz') { calculatorForm.ergebnisFrequenz.textContent = `${(ergebnis.exakteFrequenz / 1000).toFixed(3).replace(/\.?0+$/, '')} GHz`; } else { calculatorForm.ergebnisFrequenz.textContent = `${ergebnis.exakteFrequenz} MHz`; } // Show note if available const hinweis = getKanalHinweis(ergebnis.band, ergebnis.kanal, ergebnis.bandbreite.toString()); if (hinweis) { calculatorForm.hinweisText.textContent = hinweis; calculatorForm.ergebnisHinweis.style.display = 'block'; } else { calculatorForm.ergebnisHinweis.style.display = 'none'; } // Show other matches if available if (ergebnis.alleErgebnisse && ergebnis.alleErgebnisse.length > 1) { calculatorForm.weitereTreeffer.style.display = 'block'; // Clear list calculatorForm.trefferListe.innerHTML = ''; // Add other matches (from the second match) ergebnis.alleErgebnisse.slice(1).forEach(treffer => { const listItem = document.createElement('li'); const bandbreitenText = treffer.band === '60GHz' ? `${(treffer.bandbreite / 1000).toFixed(2)} GHz` : `${treffer.bandbreite} MHz`; listItem.textContent = `Band: ${treffer.band}, Channel: ${treffer.kanal}, Bandwidth: ${bandbreitenText}, Frequency: ${ treffer.band === '60GHz' ? `${(treffer.frequenz / 1000).toFixed(2)} GHz` : `${treffer.frequenz} MHz` }`; calculatorForm.trefferListe.appendChild(listItem); }); } else { calculatorForm.weitereTreeffer.style.display = 'none'; } // Update visualization if on visualization tab if (document.getElementById('visualization-tab').classList.contains('active')) { renderChannelVisualization(); } } // Render the channel table function renderKanalTabelle() { // Determine current band const anzeigeband = aktuellesBand === 'auto' ? (aktuellesSuchergebnis ? aktuellesSuchergebnis.band : '2.4GHz') : aktuellesBand; // Determine channels to display based on bandwidth and band let anzuzeigende_kanäle = []; // Get all available bandwidths for the current band const verfügbareBandbreiten = Object.keys(kanalDaten[anzeigeband]); if (aktuelleBandbreite === 'all') { // Show all bandwidths verfügbareBandbreiten.forEach(bandbreite => { kanalDaten[anzeigeband][bandbreite].forEach(kanal => { anzuzeigende_kanäle.push({ ...kanal, bandbreite: parseInt(bandbreite) }); }); }); } else { // Show only specific bandwidth const bandbreitenKey = `${aktuelleBandbreite}MHz`; if (kanalDaten[anzeigeband][bandbreitenKey]) { anzuzeigende_kanäle = kanalDaten[anzeigeband][bandbreitenKey].map(kanal => ({ ...kanal, bandbreite: parseInt(aktuelleBandbreite) })); } } // Clear table calculatorForm.kanalTabelle.innerHTML = ''; // If no channels to display if (anzuzeigende_kanäle.length === 0) { const row = document.createElement('tr'); const cell = document.createElement('td'); cell.colSpan = 4; cell.textContent = 'No channels available for this bandwidth in the selected band.'; cell.style.textAlign = 'center'; row.appendChild(cell); calculatorForm.kanalTabelle.appendChild(row); return; } // Sort channels by number anzuzeigende_kanäle.sort((a, b) => { // Primary by bandwidth (larger first) const bandbreitenDiff = b.bandbreite - a.bandbreite; if (bandbreitenDiff !== 0) return bandbreitenDiff; // Secondary by channel number (numeric or string) if (typeof a.kanal === 'number' && typeof b.kanal === 'number') { return a.kanal - b.kanal; } else if (typeof a.kanal === 'string' && typeof b.kanal === 'string') { // Extract first number from string (e.g. "36+40" -> 36) const aNum = parseInt(a.kanal.split(/[+\-]/)[0]); const bNum = parseInt(b.kanal.split(/[+\-]/)[0]); return aNum - bNum; } else { // Mixed types, number before string return typeof a.kanal === 'number' ? -1 : 1; } }); // Add channels anzuzeigende_kanäle.forEach(kanal => { const row = document.createElement('tr'); // Highlight selected channel if (aktuellesSuchergebnis && aktuellesSuchergebnis.band === anzeigeband && aktuellesSuchergebnis.kanal.toString() === kanal.kanal.toString() && aktuellesSuchergebnis.bandbreite === kanal.bandbreite) { row.classList.add('highlight'); } // Add Wi-Fi 7 class if applicable if (kanal.wifi7) { row.classList.add('wifi7-channel'); } // Channel const kanalCell = document.createElement('td'); kanalCell.textContent = kanal.kanal; // Add tooltip for alternative notation if available if (kanal.altNotation) { kanalCell.title = `Alternative notation: ${kanal.altNotation}`; kanalCell.style.cursor = 'help'; } row.appendChild(kanalCell); // Bandwidth const bandbreiteCell = document.createElement('td'); if (anzeigeband === '60GHz') { bandbreiteCell.textContent = `${(kanal.bandbreite / 1000).toFixed(2)} GHz`; } else { bandbreiteCell.textContent = `${kanal.bandbreite} MHz`; } // Add Wi-Fi 7 badge for 320 MHz if (kanal.bandbreite === 320) { const badge = document.createElement('span'); badge.textContent = ' (Wi-Fi 7)'; badge.style.color = 'var(--wifi7-color)'; badge.style.fontSize = '0.9em'; bandbreiteCell.appendChild(badge); } row.appendChild(bandbreiteCell); // Frequency const frequenzCell = document.createElement('td'); const unit = calculatorForm.frequenzUnit.value; if (unit === 'GHz') { frequenzCell.textContent = `${(kanal.frequenz / 1000).toFixed(3).replace(/\.?0+$/, '')} GHz`; } else { frequenzCell.textContent = `${kanal.frequenz} MHz`; } row.appendChild(frequenzCell); // Note const hinweisCell = document.createElement('td'); const hinweis = getKanalHinweis(anzeigeband, kanal.kanal, kanal.bandbreite.toString()); hinweisCell.textContent = hinweis || '-'; row.appendChild(hinweisCell); calculatorForm.kanalTabelle.appendChild(row); }); } // Search for channels based on frequency function sucheKanalPerFrequenz(freq) { if (!freq) { aktuellesSuchergebnis = null; zeigeErgebnis(null); return; } // Convert input to MHz let frequenzNum; const unit = calculatorForm.frequenzUnit.value; if (unit === 'GHz') { // GHz format (e.g. 5.18 or 60.48) - convert to MHz frequenzNum = Math.round(parseFloat(freq) * 1000); } else { // MHz format (e.g. 5180 or 2412) frequenzNum = parseInt(freq, 10); } if (isNaN(frequenzNum)) { setzeError(calculatorForm.frequenz, calculatorForm.frequenzError, `Please enter a valid frequency in ${unit}`); aktuellesSuchergebnis = null; zeigeErgebnis(null); return; } // Automatically determine band and update UI let gefundenesBand = bestimmeBandAusFrequenz(frequenzNum); // Update band dropdown aktuellesBand = gefundenesBand; calculatorForm.band.value = aktuellesBand; updateBandInfo(); updateFrequenzFeld(); // Update bandwidth dropdown aktualisiereBandbreitenDropdown(); // Search for matching channel let allesuchErgebnisse = sucheKanalInAllenBändern(frequenzNum, gefundenesBand); if (allesuchErgebnisse.length > 0) { const gefundenerKanal = allesuchErgebnisse[0]; // Update bandwidth if (aktuelleBandbreite === 'all' || aktuelleBandbreite !== gefundenerKanal.bandbreite.toString()) { aktuelleBandbreite = gefundenerKanal.bandbreite.toString(); calculatorForm.bandbreite.value = aktuelleBandbreite; updateBandbreiteInfo(); } // Update channel field calculatorForm.kanal.value = gefundenerKanal.kanal; // Save search result aktuellesSuchergebnis = { exakteFrequenz: gefundenerKanal.frequenz, kanal: gefundenerKanal.kanal, band: gefundenerKanal.band, bandbreite: gefundenerKanal.bandbreite, alleErgebnisse: allesuchErgebnisse.slice(0, 5), // Top 5 matches wifi7: gefundenerKanal.wifi7, altNotation: gefundenerKanal.altNotation }; // Show result zeigeErgebnis(aktuellesSuchergebnis); renderKanalTabelle(); } else { setzeError(calculatorForm.frequenz, calculatorForm.frequenzError, `周波数 ${freq}${unit} に一致するチャンネルが見つかりませんでした`); aktuellesSuchergebnis = null; zeigeErgebnis(null); } } // Function to determine band from frequency function bestimmeBandAusFrequenz(frequenzNum) { if (frequenzNum >= 2400 && frequenzNum < 2500) { return '2.4GHz'; } else if (frequenzNum >= 5150 && frequenzNum < 5250) { return '5GHz-U-NII-1'; } else if (frequenzNum >= 5250 && frequenzNum < 5350) { return '5GHz-U-NII-2'; } else if (frequenzNum >= 5470 && frequenzNum < 5725) { return '5GHz-U-NII-2E'; } else if (frequenzNum >= 5725 && frequenzNum < 5875) { return '5GHz-BFWA'; } else if (frequenzNum >= 5925 && frequenzNum < 7125) { return '6GHz'; } /* 60GHz-Bedingung auskommentiert else if (frequenzNum >= 57000 && frequenzNum < 71000) { return '60GHz'; } */ return 'auto'; } // Function to search channels in all bands function sucheKanalInAllenBändern(frequenzNum, gefundenesBand) { const toleranz = 10; // Tolerance in MHz let allesuchErgebnisse = []; // Determine which bands to search const suchBänder = gefundenesBand !== 'auto' ? [gefundenesBand] : Object.keys(kanalDaten); suchBänder.forEach(bandName => { Object.keys(kanalDaten[bandName]).forEach(bandbreite => { // Skip if specific bandwidth is chosen and not this one if (aktuelleBandbreite !== 'all' && parseInt(aktuelleBandbreite) !== parseInt(bandbreite)) { return; } const kanäle = kanalDaten[bandName][bandbreite]; kanäle.forEach(kanal => { const abweichung = Math.abs(kanal.frequenz - frequenzNum); if (abweichung <= toleranz) { allesuchErgebnisse.push({ band: bandName, kanal: kanal.kanal, frequenz: kanal.frequenz, bandbreite: parseInt(bandbreite), abweichung: abweichung, wifi7: kanal.wifi7, altNotation: kanal.altNotation }); } }); }); }); // Sort by smallest deviation return allesuchErgebnisse.sort((a, b) => a.abweichung - b.abweichung); } // Event handler for frequency change function handleFrequenzChange(event) { const neuFrequenz = event.target.value; // Reset error field setzeError(calculatorForm.frequenz, calculatorForm.frequenzError, null); if (suchTimeout) { clearTimeout(suchTimeout); } if (neuFrequenz) { // Delayed call of the search function suchTimeout = setTimeout(() => { sucheKanalPerFrequenz(neuFrequenz); }, 500); } else { // Empty field, reset search result aktuellesSuchergebnis = null; zeigeErgebnis(null); renderKanalTabelle(); } } // Hilfsfunktion, um zu prüfen, ob ein Kanal mit der Suchanfrage übereinstimmt function matchesChannelSearch(kanalObj, suchKanal) { let matchPriority = 0; // Higher is better match // Exact string match (highest priority) if (kanalObj.kanal === suchKanal) { if (typeof suchKanal === 'string' && (suchKanal.includes('[') || suchKanal.includes('+'))) { return { match: true, priority: 4 }; // Exact notation match gets highest priority } return { match: true, priority: 3 }; // Exact match but not notation } // String in Zahl konvertieren, falls möglich const numSuchKanal = typeof suchKanal === 'string' ? parseInt(suchKanal, 10) : suchKanal; // Für numerische Suche (z.B. 47) in Mittenfrequenzformaten (z.B. "47[33]") if (!isNaN(numSuchKanal) && typeof kanalObj.kanal === 'string') { // Format "47[33]" - extrahiere Mittenfrequenz if (kanalObj.kanal.includes('[')) { const centerChannel = parseInt(kanalObj.kanal.split('[')[0], 10); if (centerChannel === numSuchKanal) { return { match: true, priority: 2 }; // Center channel match } } } // Suche nach Primärkanal mit []-Notation (z.B. "[36]") if (typeof suchKanal === 'string' && suchKanal.startsWith('[') && suchKanal.endsWith(']')) { const primaryChannelSearch = parseInt(suchKanal.replace(/[\[\]]/g, ''), 10); // Prüfe, ob das Objekt eine primärkanal-Eigenschaft hat if (kanalObj.primärkanal && kanalObj.primärkanal === primaryChannelSearch) { return { match: true, priority: 3 }; // Primary channel match with bracket notation } // Oder check im String-Format wie "47[36]" if (typeof kanalObj.kanal === 'string' && kanalObj.kanal.includes('[')) { const primaryChannelPart = kanalObj.kanal.split('[')[1].split(']')[0]; const primaryChannel = parseInt(primaryChannelPart, 10); if (primaryChannel === primaryChannelSearch) { return { match: true, priority: 3 }; // Primary channel match with bracket notation } } } return { match: false, priority: 0 }; } function sucheFrequenzPerKanal(kanalNum) { if (!kanalNum) { aktuellesSuchergebnis = null; zeigeErgebnis(null); return; } // Check for special notations first before trying to convert to number let suchKanal; if (typeof kanalNum === 'string' && (kanalNum.includes('+') || kanalNum.includes('['))) { // It's a special notation - keep as string suchKanal = kanalNum; } else { // Try to convert to number suchKanal = parseInt(kanalNum, 10); if (isNaN(suchKanal)) { suchKanal = kanalNum; } } // Check if it's a valid search if (typeof suchKanal === 'string' && !suchKanal.includes('[') && !suchKanal.includes('+') && isNaN(parseInt(suchKanal, 10))) { setzeError(calculatorForm.kanal, calculatorForm.kanalError, '有効なチャンネル番号または形式を入力してください。'); aktuellesSuchergebnis = null; zeigeErgebnis(null); return; } // Search in all bands for the channel let gefundeneKanäle = []; // First search in the current band if (aktuellesBand !== 'auto') { // Search in selected band Object.keys(kanalDaten[aktuellesBand]).forEach(bandbreite => { // Skip if specific bandwidth is chosen and not this one if (aktuelleBandbreite !== 'all' && parseInt(aktuelleBandbreite) !== parseInt(bandbreite)) { return; } const kanäle = kanalDaten[aktuellesBand][bandbreite]; kanäle.forEach(k => { const matchResult = matchesChannelSearch(k, suchKanal); if (matchResult.match) { gefundeneKanäle.push({ band: aktuellesBand, kanal: k.kanal, frequenz: k.frequenz, bandbreite: parseInt(bandbreite), abweichung: 0, wifi7: k.wifi7, altNotation: k.altNotation, priority: matchResult.priority }); } }); }); } // If nothing found in current band or "auto", search in all bands if (gefundeneKanäle.length === 0 || aktuellesBand === 'auto') { // Search in all bands Object.keys(kanalDaten).forEach(band => { if (band !== aktuellesBand || aktuellesBand === 'auto') { Object.keys(kanalDaten[band]).forEach(bandbreite => { // Skip if specific bandwidth is chosen and not this one if (aktuelleBandbreite !== 'all' && parseInt(aktuelleBandbreite) !== parseInt(bandbreite)) { return; } const kanäle = kanalDaten[band][bandbreite]; kanäle.forEach(k => { const matchResult = matchesChannelSearch(k, suchKanal); if (matchResult.match) { gefundeneKanäle.push({ band: band, kanal: k.kanal, frequenz: k.frequenz, bandbreite: parseInt(bandbreite), abweichung: 0, wifi7: k.wifi7, altNotation: k.altNotation, priority: matchResult.priority }); } }); }); } }); } // If at least one channel was found if (gefundeneKanäle.length > 0) { // Sort first by whether it matches the selected band, then by priority gefundeneKanäle.sort((a, b) => { // First sort by whether it matches the selected band (if not in auto mode) if (aktuellesBand !== 'auto') { if (a.band === aktuellesBand && b.band !== aktuellesBand) return -1; if (a.band !== aktuellesBand && b.band === aktuellesBand) return 1; } // Then sort by priority return b.priority - a.priority; }); const besterTreffer = gefundeneKanäle[0]; // Always update band to that of the found channel // This is the key change - update always, not just in auto mode aktuellesBand = besterTreffer.band; calculatorForm.band.value = aktuellesBand; updateBandInfo(); updateFrequenzFeld(); // Update bandwidth dropdown aktualisiereBandbreitenDropdown(); // Set bandwidth to match the found channel if (aktuelleBandbreite === 'all' || aktuelleBandbreite !== besterTreffer.bandbreite.toString()) { aktuelleBandbreite = besterTreffer.bandbreite.toString(); calculatorForm.bandbreite.value = aktuelleBandbreite; updateBandbreiteInfo(); } // Update frequency field based on the selected unit const unit = calculatorForm.frequenzUnit.value; if (unit === 'GHz') { calculatorForm.frequenz.value = (besterTreffer.frequenz / 1000).toFixed(3).replace(/\.?0+$/, ''); } else { calculatorForm.frequenz.value = besterTreffer.frequenz; } // Save search result aktuellesSuchergebnis = { exakteFrequenz: besterTreffer.frequenz, kanal: besterTreffer.kanal, band: besterTreffer.band, bandbreite: besterTreffer.bandbreite, alleErgebnisse: gefundeneKanäle, wifi7: besterTreffer.wifi7, altNotation: besterTreffer.altNotation }; // Show result zeigeErgebnis(aktuellesSuchergebnis); renderKanalTabelle(); } else { setzeError(calculatorForm.kanal, calculatorForm.kanalError, `選択された帯域幅では、チャンネル ${kanalNum} はどの周波数帯にも見つかりませんでした。`); aktuellesSuchergebnis = null; zeigeErgebnis(null); } } // Tab-Funktionalität function setupTabs() { const tabButtons = document.querySelectorAll('.tab-button'); tabButtons.forEach(button => { button.addEventListener('click', () => { // Aktiven Tab deaktivieren const activeButton = document.querySelector('.tab-button.active'); const activeContent = document.querySelector('.tab-content.active'); if (activeButton) activeButton.classList.remove('active'); if (activeContent) activeContent.classList.remove('active'); // Neuen Tab aktivieren button.classList.add('active'); const tabId = button.getAttribute('data-tab'); const tabContent = document.getElementById(`${tabId}-tab`); if (tabContent) { tabContent.classList.add('active'); // Bei Wechsel zur Visualisierung aktualisieren if (tabId === 'visualization') { renderChannelVisualization(); } } }); }); } // Initialize the app init(); });
関連ページ
著者: IBL-Editors Team
技術レビュー: Daniel Lenhardt - CEO & Owner | IB-Lenhardt AG この記事にフィードバックを送る