はじめに
金沢駅から大阪駅までローカル線の旅をしてきたのでauLTEのCell IDを集めてきました。
Cell IDは基地局のセクターやバンド(周波数帯)ごとにユニークに割り当てられているようなので接続中のCell IDとバンドを紐付けすればバンドを確認できない端末でもCell IDを取得して間接的に接続しているバンドがわかるのではないかと思ったので収集してみました。
※GALAXY、一部のLG機種、iPhoneなどはメーカーが独自に実装したメニューを開くことで接続中のバンドを確認することができます。
収集方法
Cell ID取得方法
Android4.2から追加されたCellIdentityLte#getCi()で取得します。
AndroidManifestに以下の2つのパーミッションを追加して、
Activityを継承したクラス内にこんな感じで書くと取得出来ます。(適当ですいません)
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
private TelephonyManager telephonyManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); telephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); } @Override protected void onResume() { super.onResume(); telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CELL_INFO); } @Override protected void onPause() { super.onPause(); telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); } PhoneStateListener phoneStateListener = new PhoneStateListener(){ public void onCellInfoChanged(java.util.List<android.telephony.CellInfo> cellInfoList) { for (CellInfo cellInfo : cellInfoList) { if (cellInfo instanceof CellInfoLte) { CellInfoLte cellInfoLte = (CellInfoLte)cellInfo; CellIdentityLte cellIdentityLte= cellInfoLte.getCellIdentity(); int ci = cellIdentityLte.getCi(); Log.d("TestApp", "Cell ID is "+ci); } } }; };
また、CellIdentityLte#getCi()はリファレンスで次のように書いてあります。
public int getCi ()
Added in API level 17
Returns
28-bit Cell Identity, Integer.MAX_VALUE if unknown
というわけで28bitのCell IDが取得できるようです。
バンド取得方法
SCL22でダイアルから*#0011#を使ってサービスモードを起動してバンドを確認します。
SCL22はBand 1(2.1GHz), Band 11(1.5GHz), Band 18(800MHz)の3バンドに対応しています。
Band 41(2.5GHz)は対応端末を持っていなかったので収集できませんでした。
収集結果
250件ほどのCell IDとBandの組み合わせを収集できました。
Cell IDを昇順でソートしたものを一部を抜粋するとこのような感じです。
※ 左からCell IDの10進数、Cell IDの16進数、バンドとなっています。
このようにバンドごとにCell IDが固まっているように見えます。
また、移動通信方法及び無線基地局
【0011】にはこう書かれています。
なお、E-CGIの下位28ビットは、Cell ID(図10に示す情報要素「Cell Identity」に設定されるCell Identityに対応)によって構成されており、ハンドオーバ先候補無線基地局が、無線基地局HeNBである場合、Cell IDは、Home eNB IDによって構成されており、ハンドオーバ先候補無線基地局が、無線基地局eNBである場合、Cell IDは、20ビット長のMacro eNB IDと8ビットの無線基地局HeNB配下のセルの識別情報とによって構成されている。
この取得した28bitは20bitと8bitに分けられるみたいです。
実際に収集したCell IDの下位8bitはすべて0x00から0x03の範囲に収まっていました。
この下位8bitはセクターごとに変わると考えて良さそうです。
北陸エリア編
金沢市街、金沢駅から敦賀駅にかけての区間のCell IDは0x3000000台になっていて
Cell IDを昇順でソートするとBand18,Band1,Band11の順に並びます。
北陸エリアで収集したCell IDのバンドごとの最小値、最大値は次のようになりました。
この結果から0x3000000台がBand18, 0x3300000台がBand1,0x3400000台,0x3500000台がBand11というように上位8bitで判別できるかなという仮説を立てましたが関西エリアに入って調べるとそんなこともありませんでした…
関西エリア編
敦賀駅で乗換えし、滋賀県に入ってからはCell IDが0x5000000台になりました。
こちらも北陸エリアと同じようにCell IDを昇順でソートするとBand18,Band1,Band11の順に並んでいます。
関西エリアで収集したCell IDのバンドごとの最小値、最大値は次のようになりました。
まとめ
今回収集したauLTEのCell IDについてまとめてみると…
- Cell IDを収集して昇順でソートするとBand 18,Band 1,Band 11の順にバンドごとに固まって割り振られている。
- Cell IDの各バンドの正確な区切りはどこかわからない。
- エリアが変わるとCell IDが大きく変わる。
という感じになります。
今回集めたCell IDの各バンドごとの最小値と最大値の範囲内はそのバンドと判別しても良さそうな感じがします。
これを解明していくためには地道に広い範囲のCell IDを収集していくしかない気がします。
おまけ
今回の収集結果をもとにバンドを確認するサンプルを作るとこんな感じになりました。
バンド確認アプリ(適当 https://t.co/Icr7dZDcVd
— てっちゃん (@tetsu31415) 2014年10月4日