PCI readings CellIdentityLte inaccurate, why? Can I do something?

I am working on an application that collects LTE parameters (RSRP, RSRQ, PCI, etc.). I have an LTE lab with several EnodeBs that emit Band 14 (a public safety group). And we programmed PCI (physical cell identifier) ​​in our EnodeB. The specific EnodeB that my phone connects to is PCI 183. None of the other EnodeB Band Band emits, so I thought that the only PCI that the phone will report about will be the one to which it is attached, i.e. 183. Indeed, my PCI reads 183, but not all the time. It will randomly say that PCI is 93 or 226 or some other number when it is connected to EnodeB with PCI 183. So, how and why does this happen? I assumed that calling the getPci () method will always return the PCI cells to which the phone was attached, but it seems that the PCI addresses of neighboring cells are sometimes reported; but all neighboring cells (commercial outside the laboratory, such as ATT, Verizon, etc.) are in different ranges. And the RSRP readings remain roughly the same, so I don’t think there was a handover, and it shouldn’t be if the simulator is provided for group 14. However, the hardware of the phones is able to work on bands other than 14. Is getPci () just returning the nearest cell with the strongest signal? You can find information about getPci () at https://developer.android.com/reference/android/telephony/CellIdentityLte.html

Here is an example timeline:

  • RSRP = -90; PCI = 183
  • RSRP = -90; PCI = 183
  • RSRP = -91; PCI = 226 - (my phone tried to connect to 226 ?!)
  • RSRP = -93; PCI = 183
  • RSRP = -91; PCI = 183

Most of my readings in PCI format will be the correct cell to which I am attached in the lab, but what should I do with random random reading of PCI?

I also tested this with commercial phones and got the same behavior. I know which cell (EnodeB) I am connected to and that it has the best signal strength, but sometimes I get some random PCI read from a weaker neighbor.

The class that I use to extract PCI is shown below. If you want to download the application or check all the code, you can find it on my github: https://github.com/parksjg/IndoorLTE3a

protected class SignalStrengthListener extends PhoneStateListener { @Override public void onSignalStrengthsChanged(android.telephony.SignalStrength signalStrength) { tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); ltestr = signalStrength.toString(); parts = ltestr.split(" "); try { cellInfoList = tm.getAllCellInfo(); for (CellInfo cellInfo : cellInfoList) { if (cellInfo instanceof CellInfoLte) { // cast to CellInfoLte and call all the CellInfoLte methods you need // Gets the LTE PCI: (returns Physical Cell Id 0..503, Integer.MAX_VALUE if unknown) cellPci = ((CellInfoLte) cellInfo).getCellIdentity().getPci(); } } } catch (Exception e) { Log.d("SignalStrength", "Exception: " + e.getMessage()); } super.onSignalStrengthsChanged(signalStrength); } } 

Please, can someone give me more information or understand what is happening? How and where can I find out more about what is happening?

Thank you and welcome!

0
source share

Source: https://habr.com/ru/post/1308977/


All Articles