mroczis / netmonster-core Goto Github PK
View Code? Open in Web Editor NEWAndroid Telephony SDK bridge with some additional features
License: Apache License 2.0
Android Telephony SDK bridge with some additional features
License: Apache License 2.0
Some users have reported to me a strange behavior of TA when connected to 4G TDD (specifically WindTre's B38).
So I collected some data (40 points) and got this graph:
The result is that TA TDD approximate to: y = x/2 + 20.5
Where y is the TA reported by Android and x is the real TA (from baseband)
We have seen this behavior on Sony XZ1 (G8341), Xiaomi 10T (M2007J3SY), Realme GT Master (RMX3363).
Note that on these same devices TA FDD = TA / 2
Can anyone else reproduce this issue?
I am occasionally getting null band name and number for NR (Phone Samsung A32, Carrier T-Mobile). I realize that these values are defined as nullable int? and String?
I just wanted to make sure that I am not doing something wrong. Here is my code for collecting band info for NR:
` @OverRide
public ICellInfo processNr(CellNr cell) {
Log.d(TAG, "processNr() called with: cell = [" + cell + "]");
CellInfoNR nr = new CellInfoNR();
try {
nr.isRegistered = cell.getConnectionStatus() instanceof PrimaryConnection;
Network network = cell.getNetwork();
if (network != null) {
nr.iso = normalize(network.getIso());
nr.mcc = normalize(network.getMcc());
nr.mnc = normalize(network.getMnc());
}
BandNr band = cell.getBand();
if (band != null) {
nr.downArfcn = normalize(band.getDownlinkArfcn());
nr.downFreq = normalize(band.getDownlinkFrequency());
nr.band.channelNumber = normalize(band.getChannelNumber());
nr.band.bandName = normalize(band.getName());
nr.band.bandNumber = normalize(band.getNumber());
nr.band.bandFreq = normalize(band.getDownlinkFrequency());
}
nr.nci = normalize(cell.getNci());
nr.tac = normalize(cell.getTac());
nr.pci = normalize(cell.getPci());
SignalNr signal = cell.getSignal();
nr.dbm = signal.getDbm() != null ? signal.getDbm() : signal.getSsRsrp() != null ? signal.getSsRsrp() : Integer.MAX_VALUE;
nr.asu = signal.getCsiRsrpAsu() != null ? normalize(signal.getCsiRsrpAsu()) : signal.getSsRsrpAsu() != null ? normalize(signal.getSsRsrpAsu()) : "";
nr.csiRsrp = normalize(signal.getCsiRsrp());
nr.csiRsrq = normalize(signal.getCsiRsrq());
nr.csiSinr = normalize(signal.getCsiSinr());
nr.csiRsrpAsu = normalize(signal.getCsiRsrpAsu());
nr.ssRsrp = normalize(signal.getSsRsrp());
nr.ssRsrq = normalize(signal.getSsRsrq());
nr.ssSinr = normalize(signal.getSsSinr());
nr.ssRsrpAsu = normalize(signal.getSsRsrpAsu());
return nr;
} catch (Exception e) {
Log.e(TAG, "processNr: Caught Exception=" + e.getMessage());
return null;
}
}`
when is the null value for band name and number expected?
Is the NetMonster Core library still being developed? I've seen many updates to NetMonster app but no changes here for almost half a year.
Hello,
I am trying to use netMonster-Core in my android project.
NetMonster app shows LTE primary cell + secondary bands used in LTE-Advance.
In the meantime, what I get with netMonsterCore sample is only the primary cell and "None Connection" cells, but I don't get the secondary cell.
I am missing something or maybe it is an issue in this library ?
Have a nice day
Hi mroczis,
My crashlitics report crash with nm-core with some Oppo phones: Reno4 5G and Find X2 Pro.
Thats the report:
Fatal Exception: java.lang.IllegalStateException: Pid 22150 has exceeded the number of permissible registered listeners. Ignoring request to add.
at android.os.Parcel.createExceptionOrNull(Parcel.java:2397)
at android.os.Parcel.createException(Parcel.java:2373)
at android.os.Parcel.readException(Parcel.java:2356)
at android.os.Parcel.readException(Parcel.java:2298)
at com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy.listenForSubscriber(ITelephonyRegistry.java:1105)
at android.telephony.TelephonyRegistryManager.listenForSubscriber(TelephonyRegistryManager.java:231)
at android.telephony.TelephonyManager.listen(TelephonyManager.java:5775)
at cz.mroczis.netmonster.core.feature.config.SignalStrengthsSource$getFresh$1.run(SignalStrengthsSource.kt:59)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:254)
at android.os.HandlerThread.run(HandlerThread.java:67)
And another report:
Fatal Exception: java.lang.IllegalStateException: Pid 23469 has exceeded the number of permissible registered listeners. Ignoring request to add.
at android.os.Parcel.createExceptionOrNull(Parcel.java:2381)
at android.os.Parcel.createException(Parcel.java:2357)
at android.os.Parcel.readException(Parcel.java:2340)
at android.os.Parcel.readException(Parcel.java:2282)
at com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy.listenForSubscriber(ITelephonyRegistry.java:1201)
at android.telephony.TelephonyRegistryManager.listenForSubscriber(TelephonyRegistryManager.java:231)
at android.telephony.TelephonyManager.listen(TelephonyManager.java:5776)
at cz.mroczis.netmonster.core.feature.config.CellLocationSource$getFresh$1.run(CellLocationSource.kt:56)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:233)
at android.os.HandlerThread.run(HandlerThread.java:67)
Thanks :)
while running this app on 5g enable network with vivo x50 pro i am getting NET - WCDMA. is this right for 5g network ?
Hi,
Thanks for a great app! Dug through some of your source and wow, I had no idea it was such a pain to get the information displayed in the app.
I had a friend download the app and try it on a Xiaomi Mi 10 and got some interesting results. NetMonster correctly identifies LTE-A 3CA carrier agg with B1+B7+B20, but the bandwidth identified is not correct. Looking at 4636 it's evident that the phone is using 3CA 10+10+10MHz on B1+7+20, but NetMonster only shows 10 MHz. Speed tests are also reaching speeds which should be technically impossible on only 10 MHz.
I'm attaching some screenshots, as well as OCR'd LTE physical cell config since I saw in the source that you use that as an information source.
{
{
mConnectionStatus=PrimaryServing,
mCellBandwidthDownlinkKhz=10000,
mRat=19,
mFrequencyRange=2,
mChannelNumber=2147483647,
mContextlds=[I@bd5822d,
mPhysicalCellld=118
},
{
mConnectionStatus=SecondaryServing,
mCellBandwidthDownlinkKhz=10000,
mRat=19,
mFrequencyRange=2,
mChannelNumber=2147483647,
mContextlds=[I@3605362,
mPhysicalCellld=94
},
{
mConnectionStatus=SecondaryServing,
mCellBandwidthDownlinkKhz=10000,
mRat=19,
mFrequencyRange=2,
mChannelNumber=2147483647,
mContextlds=[I@9378cf3,
mPhysicalCellld=94
}
}
I have noticed the G-MoN Pro app is able to reliably detect the bandwidths of all primary and secondary cells on the Galaxy S21 5G, while Netmonster is not. I have been investigating the situation and i have found the source of this information. I have also looked around the codebase in an attempt to implement it by myself, but i'm not sure about the best implementation.
The Galaxy S21 gives the following serviceState info:
{mVoiceRegState=0(IN_SERVICE), mDataRegState=0(IN_SERVICE), mChannelNumber=3700, duplexMode()=1, mCellBandwidths=[10000, 20000, 20000, 15000, 10000], isManualNetworkSelection=false(automatic), getRilVoiceRadioTechnology=14(LTE), getRilDataRadioTechnology=14(LTE), mCssIndicator=unsupported, mCdmaRoamingIndicator=-1, mCdmaDefaultRoamingIndicator=-1, VoiceRegType=0, ImsVoiceAvail=2, Snap=0, MobileVoice=IN_SERVICE, MobileData=IN_SERVICE, MobileDataRoamingType=home, MobileDataRat=LTE, PsOnly=false, FemtocellInd=0, SprDisplayRoam=false, NrBearerStatus=0, 5gStatus=1, mIsEmergencyOnly=false, isUsingCarrierAggregation=true, mLteEarfcnRsrpBoost=0, mNetworkRegistrationInfos=[NetworkRegistrationInfo{ domain=CS transportType=WWAN registrationState=HOME roamingType=NOT_ROAMING accessNetworkTechnology=LTE rejectCause=0 emergencyEnabled=false availableServices=[VOICE,SMS,VIDEO] cellIdentity=CellIdentityLte:{ mCi=68165141 mPci=408 mTac=563 mEarfcn=3700 mBands=[] mBandwidth=2147483647 mMcc=204 mMnc=16 mAlphaLong=T-Mobile NL mAlphaShort=TMO NL mAdditionalPlmns={} mCsgInfo=null} voiceSpecificInfo=VoiceSpecificRegistrationInfo { mCssSupported=false mRoamingIndicator=0 mSystemIsInPrl=0 mDefaultRoamingIndicator=0} dataSpecificInfo=null nrState=NONE rRplmn=20416}, NetworkRegistrationInfo{ domain=PS transportType=WWAN registrationState=HOME roamingType=NOT_ROAMING accessNetworkTechnology=LTE rejectCause=0 emergencyEnabled=false availableServices=[DATA] cellIdentity=CellIdentityLte:{ mCi=68165141 mPci=408 mTac=563 mEarfcn=3700 mBands=[] mBandwidth=2147483647 mMcc=204 mMnc=16 mAlphaLong=T-Mobile NL mAlphaShort=TMO NL mAdditionalPlmns={} mCsgInfo=null} voiceSpecificInfo=null dataSpecificInfo=android.telephony.DataSpecificRegistrationInfo :{ maxDataCalls = 16 isDcNrRestricted = false isNrAvailable = true isEnDcAvailable = true LteVopsSupportInfo : mVopsSupport = 2 mEmcBearerSupport = 3 mIsUsingCarrierAggregation = true } nrState=NOT_RESTRICTED rRplmn=20416}], mNrFrequencyRange=0, mIsDataRoamingFromRegistration=false, mIsIwlanPreferred=false}
The interesting bit is in the following part:
mCellBandwidths=[10000, 20000, 20000, 15000, 10000]
This contains the bandwidths for the primary (index 0) and secondary cells. The mBandwidth
field of a cell object is always empty. As far as i can see this entire information blob is only used for detecting CA and 5G activity, and it is not linked to the cell scanning itself.
Can you point me into the direction where and how i can implement the detection based on this field? I like to help, but i'm not yet fully comfortable with the Netmonster core codebase.
Since Android 12 update, new api (CellSource.ALL_CELL_INFO) reports LTE TAC with wrong byte order.
Example:
TAC is 0x55F1 (2201), api reports 0xF155 (61781)
TAC is 0x4658 (18008), api reports 0x5846 (22598)
Netmonster debug log: report.txt
I'D
Some Huawei devices, specifically HUAWEI ELS-NX9 API 29, report NR (both NSA and SA) signal values in absolute value.
SS-RSRP and SS-RSRQ are affected for sure, while SS-SINR isn't affected. Extract of netmonster debug log attached.
Here you will find a quick fix that has been tested and solves the issue: handymenny@81c1df1
The values after the fix were compared to those read directly from the modem (bypassing Android and RIL), so I can confirm that the issue is really solved
The downlink and uplink frequencies can be easily calculated from the data the core library already provides. This will give the users better information than broader band categorizations.
Boring
Hello,
Since Android N, READ_PHONE_STATE permission is now considered as dangerous.
Since Android R, it's now required to access SERVICE_STATE intent.
It must be asked at runtime and the system ask for access to all the "Phone" permission group which can afraid users.
Do you know a workaround to detect 5G NSA without relying on SERVICE_STATE intent?
BR,
As the title suggests.
What I've been able to determine is the issue seems to be because you're not reading the NR cell given by TelephonyManager.getSignalStrength().getSignalStrengths(CellSignalStrengthNr.class).
That, from my own experience, appears to be the only place where the phone will report values for the NR cell in this circumstance, and even though it doesn't contain any identifiers, I would consider it better to include a cell from this source in any situation where you can detect a 5G connection state and no other NR cell available from other sources.
I have tried to use this together with the CellIdentities stored internally by ServiceState but have had mixed results, but who knows, maybe you might have an idea to get it working.
I think NR_LTE is more appropriate for NSA NE-DC mode (e.g NR primary, LTE EUTRA secondary), than EN-DC mode
I have been searching online for this and didn't find an answer, so I am opening this issue for little guidance.
I am building an application that collects signal information. I ran my application alongside Netmonster and when LTE_CA is discovered Netmonster's UI shows a Primary cell followed by some secondary cells. From Netmonster Core I get the list of cell infos, but how to Identify secondary cells which are being aggregated in LTE_CA or LTE_CA_NR.
Any links or directions will be really helpful.
Your NrNsaStateParser
uses the ServiceState.toString() to parse some internal variables.
It used to work until Android 12. It does not work anymore on Android 12 Beta 3.
On Android 12 Beta 3 I get nrState=****
.
Will the current implementation of NrNsaStateParser
be broken on Android 12? Please notice that this happen even if you do not target API 31.
The base CellInfo
class has a mTimestamp
member variable. Would be awesome if it were included in the measurements.
This GitHub page is more for the API than the Netmonster app directly, but still:
In the past Netmonster showed all sectors of a selected cell tower in the map screen. In an update that feature was removed and replaced by only showing logged sectors at a tower.
It was great to look in the map what sectors there are.
Now the app still knows all that through its databases, but does not show it to the user in that great extent.
Could this be added in again?
HI, I am new this library and android. Is there any sample code to show how to use this library? This will help new comers. TIA.
Every single time I start this app, it goes "Inactive" mod and does not scan any cells. I can't find any option for this. Excluded the app from battery optimisation, no other apps force end this app, even disabled Huawei's darn app that kills apps, nothing worked at all. I'm getting sick of this, even old versions worked well than this new feature. How can I overcome this issue?
Hello,
I can't find where is the bandwidth and frequency aggregation in lib, to get for example : 20+10+15 mhz and the frequency assiociated ?
Thanks MrOczis !
Cedric
Hello mroczis,
When data is disable on phone, nm-core make a request gps each time we call getCells(CellSource.ALL_CELL_INFO).
Thanks fix it :)
Cédric
The source code mentions 3 devices (Pixel 3 XL, OnePlus 6T, Xiaomi Mi 9T) that support the PhysicalChannelConfig API.
Are there any newer devices (with 5G NR support) that also support the PhysicalChannelConfig API?
Hi,
Array aggregatedCells in PrimaryCOnnection is always empty.
And Bandwith in neighbourgs cells is not mapped. My netmonster app have this info.
Can you check ?
Thanks
When network operator isn't "synchronized" with cellinfo, MOCN post processor may replace the correct PLMN with the wrong one.
Example:
pre : CellLte(network=Network(mcc=222, mnc=10, iso=IT), eci=2***5, tac=4***, pci=0, band=BandLte(downlinkEarfcn=3025, number=7, name=2600), bandwidth=null, signal=SignalLte(rssi=-83, rsrp=-116.0, rsrq=-12.0, cqi=null, snr=null, timingAdvance=null), connectionStatus=PrimaryConnection(), subscriptionId=12, timestamp=602895)
service state network = Network(mcc=222, mnc=01, iso=IT)
network operator = Network(mcc=222, mnc=01, iso=IT)
post: CellLte(network=Network(mcc=222, mnc=01, iso=IT), eci=2***5, tac=4***, pci=0, band=BandLte(downlinkEarfcn=3025, number=7, name=2600), bandwidth=null, signal=SignalLte(rssi=-83, rsrp=-116.0, rsrq=-12.0, cqi=null, snr=null, timingAdvance=null), connectionStatus=PrimaryConnection(), subscriptionId=12, timestamp=602895)
## After 5 seconds
pre : CellLte(network=Network(mcc=222, mnc=10, iso=IT), eci=2***5, tac=4***, pci=0, band=BandLte(downlinkEarfcn=3025, number=7, name=2600), bandwidth=null, signal=SignalLte(rssi=-81, rsrp=-118.0, rsrq=-16.0, cqi=null, snr=null, timingAdvance=null), connectionStatus=NoneConnection(), subscriptionId=2147483647, timestamp=608775)
service state network = null
network operator = null
post: CellLte(network=Network(mcc=222, mnc=10, iso=IT), eci=2***5, tac=4***, pci=0, band=BandLte(downlinkEarfcn=3025, number=7, name=2600), bandwidth=null, signal=SignalLte(rssi=-81, rsrp=-118.0, rsrq=-16.0, cqi=null, snr=null, timingAdvance=null), connectionStatus=NoneConnection(), subscriptionId=2147483647, timestamp=608775)
This happens mostly in roaming or "emergency only" and is temporary, lasting at most two minutes and usually about ten seconds or so. But for those who use this library for cell mapping, it can significantly increase the number of cells with wrong plmn.
So I was wondering if the problem could be somehow mitigated, maybe applying that postprocessor only for some Android versions?
For example I see that Google marked the bug as fixed and added specific tests/APIs for MOCN in Android R.
Hi,
we're using this library for signal preprocessing in our app (open-rmbt-android) and are really satisfied with it. Thank you for providing and maintaining it!
What we're however seeing is quite some crashes with Samsung devices (A and S-Series) with this stacktrace:
java.lang.IllegalStateException:
at android.os.Parcel.createExceptionOrNull (Parcel.java:2393)
at android.os.Parcel.createException (Parcel.java:2369)
at android.os.Parcel.readException (Parcel.java:2352)
at android.os.Parcel.readException (Parcel.java:2294)
at com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy.listenForSubscriber (ITelephonyRegistry.java:1105)
at android.telephony.TelephonyRegistryManager.listenForSubscriber (TelephonyRegistryManager.java:231)
at android.telephony.TelephonyManager.listen (TelephonyManager.java:6706)
at cz.mroczis.netmonster.core.feature.config.TelephonyManagerListenersKt$requestSingleUpdate$1.run (TelephonyManagerListeners.kt:60)
at android.os.Handler.handleCallback (Handler.java:938)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:246)
at android.os.HandlerThread.run (HandlerThread.java:67)
Caused by: android.os.RemoteException:
at com.android.server.TelephonyRegistry.add (TelephonyRegistry.java:1172)
at com.android.server.TelephonyRegistry.listen (TelephonyRegistry.java:847)
at com.android.server.TelephonyRegistry.listenForSubscriber (TelephonyRegistry.java:814)
at com.android.internal.telephony.ITelephonyRegistry$Stub.onTransact (ITelephonyRegistry.java:453)
at android.os.Binder.execTransactInternal (Binder.java:1195)
Do you have an idea on what could be causing these crashes?
Sorry for reporting this as an issue but you haven't enabled the Discussions
yet.
This is to ask you a question. Is there a way with this library to split the throughput on the basis of the carrier when using carrier aggregation?
The CA combinations doesn't show the right number. For example I have a tower that projects 900+1800+2100+2600mhz but since the new update It only shows 1800mhz all the time. Or showing only 3CA when Im connected to 4CA.
So the projecting of the LTE frequency in the app are not right.
This happens on my Pixel 7 with Google Fi service, which uses the T-Mobile US network. I'm attaching a log file to demonstrate.
Lib crashes continue :
Fatal Exception: java.lang.IllegalStateException: Pid 16907 has exceeded the number of permissible registered listeners. Ignoring request to add.
at android.os.Parcel.createExceptionOrNull(Parcel.java:2393)
at android.os.Parcel.createException(Parcel.java:2369)
at android.os.Parcel.readException(Parcel.java:2352)
at android.os.Parcel.readException(Parcel.java:2294)
at com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy.listenForSubscriber(ITelephonyRegistry.java:1105)
at android.telephony.TelephonyRegistryManager.listenForSubscriber(TelephonyRegistryManager.java:231)
at android.telephony.TelephonyManager.listen(TelephonyManager.java:6706)
at cz.mroczis.netmonster.core.feature.config.TelephonyManagerListenersKt$requestSingleUpdate$1.run(TelephonyManagerListeners.kt:60)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.os.HandlerThread.run(HandlerThread.java:67)
Hi,
I use the Netmonster App since a long time, but now since I have my new phone it does not work properly as it should. My Mi 11 Ultra is on MIUI 12.5.3 Android 11.
At home I have 2CA B1+20 from o2 Germany, but the app does not recognize it like with my old phone properly does.
I noticed that the system app phone info has wrong download and upload values, too. (Already told the MIUI Rom Developers)
I suspected that the current ROM of my phone sends wrong readouts, but today I traveled to another city and could read 2CA of B7+20 just fine.
The speeds are as expected and LTE+/4G+ icons are there.
Maybe it's also an issue with Netmonster Core. Idk.
For a long time I think that my phone didn't receive the N78 band, and that was a compeling reason to upgrade to Android 13 (which I don't like a lot). But I finally have just seen it "hidden" in the bands detailed listing. Netmonster (beta) does not reports its name (e.g. as "3500") but can be infered by the ARFCN by... power users on telephony.
These bands appear usually during data transfers, so it would be helpful not only to associate the name, but likely also to report them besides the "5G · NSA" legend and maybe in the notification (since the bands listing is continuously changing and scrolling up & down).
The fact that EARFCN and ARFCN are located at "different places" in the listing, makes it also more difficult to revise the listing before it refreshs. The lack of name and address "below" the N78 band also don't helps (I tend to associate these fields from the previous band):
In Spain N78 it is very popular; in the last day I recall having seen at my home 648384, 636576 and 640704 (from Vodafone, Telefonica, Orange: the related frequencies match the new ranges reassigned this very same year).
The N28 band also appears occasionally.
As an aside note, after upgrading to Android 13, my phone now only shows a single notification icon (instead of one for "each SIM") and not necessarily the one you'd like to see (in Android 11 it there were two icons, although the order was somewhat random).
All in all, Netmonster (I'm a betatester) is a great tool for everyone (e.g. it reveals the actual underlaying carrier in use, when a single SIM uses several networks, as in Spain with operator Yoigo, which may be using Yoigo/Orange/Movistar networks). In fact, an option to show the actual carrier name from the active SIM in the notification area would be a great feature (I currently don't use Yoigo, but at the time I would have loved the feature).
I've used netmonster-core on Realme 7 5G and on Xiaomi Redmi Note 9t 5G with Mediatek 800U. I've found a particular behaviour with NR cell. First time is detected without ARFCN and PCI. Second time is detected only NR carrier with only ARFCN and PCI. This appears on DSS and NR in LTE_NR configuration.
First, let me thank you guys for this wonderful project. really saved my life.
Second, I'm trying to extract WCDMA info from my Samsung devices (galaxy s21 ultra 5g, galaxy A22).
and I get a lot of RSCP null values from the primary and secondary cells.
if I install the app on Huawei phones I get much better RSCP and RSSI values.
can you please tell me why it is like this or even better which device will bring me the most accurate data in all the technologies?? (WCDMA, LTE, 5G)
thanks in advance, david
The "band in cell location" preference, we can pick 2100 or B1, but what if we want both? Perhaps add an additional choice to show both.
Hello,
Thanks for sharing your libray. I ran into a situation where a LTE cell reported as PrimaryConnection had a null value both for TAC and ECI. I don't know if this a bug or this case may happen. FYI, I'm using an Oppo Find X5 pro with two SIM cards (one with subscription supporting only LTE, and the other SIM can support 5G). The issue occurrend on the first SIM supporting only LTE.
Thanks for your answer.
I was wondering what permissions are really required? And which ones are optional?
What does missing some permissions cause?
Is it safe (e.g. no crash or exception thrown) to use the methods of this library even without all permissions?
For example I see that almost all methods require ACCESS_FINE_LOCATION, but some users have told me that netmonster (the app) seems to work fine with just ACCESS_COARSE_LOCATION.
It's more of a curiosity than an issue, although I'd like to see that in the documentation
So I went on a cruise ship with Cellular in it, and it was identified as 901-18 (Cellular at sea).
put on log the country was showing as -1.
maybe add it to the Database?
Some devices, mainly those with a Samsung baseband, use CONNECTION_SECONDARY_SERVING even for cells that aren't used for data. In some cases all neighbor cells have connectionStatus = CONNECTION_SECONDARY_SERVING.
This can be easily seen in the following examples, where multiple cells with the same ARFCN or even cells on different networks (ran sharing) are marked as primary/secondary serving.
For NR take the following issue into account: CellIdentityNr#getNrarfcn() is ambigous: SSB or Carrier centre?
These are some ways to fix/mitigate this issue:
LTE:
[CellLte(network=Network(mcc=222, mnc=88, iso=IT), eci=XXXX, tac=XXXX, pci=8, band=BandLte(downlinkEarfcn=3350, number=7, name=2600), bandwidth=20000, signal=SignalLte(rssi=-69, rsrp=-106.0, rsrq=-7.0, cqi=11, snr=1.0, timingAdvance=23), connectionStatus=PrimaryConnection(), subscriptionId=4, timestamp=1888172),
CellLte(network=Network(mcc=222, mnc=88, iso=IT), eci=null, tac=null, pci=3, band=BandLte(downlinkEarfcn=1650, number=3, name=1800), bandwidth=null, signal=SignalLte(rssi=null, rsrp=-111.0, rsrq=-19.0, cqi=null, snr=-1.0, timingAdvance=0), connectionStatus=SecondaryConnection(isGuess=false), subscriptionId=4, timestamp=1888172),
CellLte(network=Network(mcc=222, mnc=88, iso=IT), eci=null, tac=null, pci=5, band=BandLte(downlinkEarfcn=1650, number=3, name=1800), bandwidth=null, signal=SignalLte(rssi=null, rsrp=-112.0, rsrq=-19.0, cqi=null, snr=-1.0, timingAdvance=0), connectionStatus=SecondaryConnection(isGuess=false), subscriptionId=4, timestamp=1888172),
CellLte(network=Network(mcc=222, mnc=88, iso=IT), eci=null, tac=null, pci=2, band=BandLte(downlinkEarfcn=6200, number=20, name=800), bandwidth=null, signal=SignalLte(rssi=null, rsrp=-91.0, rsrq=-16.0, cqi=null, snr=-1.0, timingAdvance=0), connectionStatus=SecondaryConnection(isGuess=false), subscriptionId=4, timestamp=1888172),
CellLte(network=Network(mcc=222, mnc=88, iso=IT), eci=null, tac=null, pci=9, band=BandLte(downlinkEarfcn=6200, number=20, name=800), bandwidth=null, signal=SignalLte(rssi=null, rsrp=-92.0, rsrq=-18.0, cqi=null, snr=-1.0, timingAdvance=0), connectionStatus=SecondaryConnection(isGuess=false), subscriptionId=4, timestamp=1888172)]
NR NSA:
[CellInfoNr:{ mRegistered=YES mTimeStamp=66070163213557ns mCellConnectionStatus=1 CellIdentityNr:{ mPci = 349 mTac = 16777215 mNrArfcn = 650666 mBands = [] mMcc = 222 mMnc = 01 mNci = 9223372036854775807 mAlphaLong = mAlphaShort = mAdditionalPlmns = {} } CellSignalStrengthNr:{ csiRsrp = 2147483647 csiRsrq = 2147483647 csiCqiTableIndex = 2147483647 csiCqiReport = [0] ssRsrp = -115 ssRsrq = -15 ssSinr = 0 level = 0 parametersUseForLevel = 0 } }
CellInfoNr:{ mRegistered=NO mTimeStamp=66070163213557ns mCellConnectionStatus=2 CellIdentityNr:{ mPci = 350 mTac = 2147483647 mNrArfcn = 648768 mBands = [] mMcc = null mMnc = null mNci = 9223372036854775807 mAlphaLong = mAlphaShort = mAdditionalPlmns = {} } CellSignalStrengthNr:{ csiRsrp = 2147483647 csiRsrq = 2147483647 csiCqiTableIndex = 2147483647 csiCqiReport = [0] ssRsrp = -117 ssRsrq = -15 ssSinr = 2147483647 level = 0 parametersUseForLevel = 0 } }]
[CellInfoLte:{mRegistered=YES mTimeStamp=75439291239966ns mCellConnectionStatus=1 CellIdentityLte:{ mCi=XXX mPci=3 mTac=XXXX mEarfcn=1350 mBands=[3] mBandwidth=20000 mMcc=222 mMnc=01 mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=2147483647 rsrp=-98 rsrq=-12 rssnr=0 cqiTableIndex=2147483647 cqi=12 ta=2 level=2 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=75439291239966ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=2147483647 mPci=432 mTac=2147483647 mEarfcn=1350 mBands=[] mBandwidth=0 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=2147483647 rsrp=-103 rsrq=-14 rssnr=-1 cqiTableIndex=2147483647 cqi=0 ta=0 level=2 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}]
[CellNr(network=Network(mcc=222, mnc=50, iso=IT), nci=null, tac=null, pci=299, band=BandNr(downlinkArfcn=642000, downlinkFrequency=3630000, number=77, name=3700), signal=SignalNr(csiRsrp=null, csiRsrq=null, csiSinr=null, ssRsrp=-84, ssRsrq=-10, ssSinr=null), connectionStatus=PrimaryConnection(), subscriptionId=1, timestamp=189575682),
CellNr(network=Network(mcc=222, mnc=50, iso=IT), nci=null, tac=null, pci=298, band=BandNr(downlinkArfcn=641664, downlinkFrequency=3624960, number=null, name=null), signal=SignalNr(csiRsrp=null, csiRsrq=null, csiSinr=null, ssRsrp=-102, ssRsrq=-12, ssSinr=null), connectionStatus=SecondaryConnection(isGuess=false), subscriptionId=1, timestamp=189575682)]
[CellInfoLte:{mRegistered=YES mTimeStamp=650041382678013ns mCellConnectionStatus=1 CellIdentityLte:{ mCi=****** mPci=499 mTac=*** mEarfcn=37900 mBands=[38] mBandwidth=2147483647 mMcc=222 mMnc=88 mAlphaLong=FASTWEB mAlphaShort=VERY mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=-57 rsrp=-112 rsrq=-8 rssnr=1 cqiTableIndex=1 cqi=2147483647 ta=0 level=1 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=9 mTac=0 mEarfcn=1650 mBands=[3] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=2147483647 rsrp=-116 rsrq=-19 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=0 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=0 mTac=0 mEarfcn=1650 mBands=[3] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=2147483647 rsrp=-113 rsrq=-17 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=1 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=5 mTac=0 mEarfcn=1650 mBands=[3] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=2147483647 rsrp=-116 rsrq=-19 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=0 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=6 mTac=0 mEarfcn=125 mBands=[1] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=2147483647 rsrp=-113 rsrq=-16 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=1 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=9 mTac=0 mEarfcn=125 mBands=[1] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=2147483647 rsrp=-117 rsrq=-20 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=0 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=0 mTac=0 mEarfcn=6200 mBands=[20] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=2147483647 rsrp=-102 rsrq=-15 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=2 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=1 mTac=0 mEarfcn=6200 mBands=[20] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=2147483647 rsrp=-105 rsrq=-18 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=2 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=7 mTac=0 mEarfcn=6200 mBands=[20] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=2147483647 rsrp=-104 rsrq=-18 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=2 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=4 mTac=0 mEarfcn=3350 mBands=[7] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=-65 rsrp=-123 rsrq=-15 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=0 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=7 mTac=0 mEarfcn=3350 mBands=[7] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=-65 rsrp=-127 rsrq=-20 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=0 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=19 mTac=0 mEarfcn=3350 mBands=[7] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=-65 rsrp=-125 rsrq=-17 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=0 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=5 mTac=0 mEarfcn=10563 mBands=[] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=-69 rsrp=-113 rsrq=-24 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=1 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}
CellInfoLte:{mRegistered=NO mTimeStamp=650041382678013ns mCellConnectionStatus=2 CellIdentityLte:{ mCi=0 mPci=1 mTac=0 mEarfcn=3063 mBands=[7] mBandwidth=2147483647 mMcc=null mMnc=null mAlphaLong= mAlphaShort= mAdditionalPlmns={} mCsgInfo=null} CellSignalStrengthLte: rssi=2147483647 rsrp=-102 rsrq=-24 rssnr=0 cqiTableIndex=2147483647 cqi=0 ta=0 level=2 parametersUseForLevel=0 android.telephony.CellConfigLte :{ isEndcAvailable = false }}]
> The "band in cell location" preference, we can pick 2100 or B1, but what if we want both? Perhaps add an additional choice to show both.
Duplicate of #
Originally posted by @Rekoo52anzi in #65 (comment)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.