LTE and NR Network scanner version 2026-04-02*This document is based on the latest test release.
Features may not be present in your current installed software. You may check their availability in change history or in your release documentation.
If you require an up to date release, ask for it in a ticket.
Features may not be present in your current installed software. You may check their availability in change history or in your release documentation.
If you require an up to date release, ask for it in a ticket.
Table of Contents
- 1 Introduction
- 2 Requirements
- 3 Installation
- 4 Configuration reference
- 5 Remote API
- 6 Command line monitor reference
- 7 Log file format
- 8 Change history
- 8.1 Version 2026-03-13
- 8.2 Version 2025-12-12
- 8.3 Version 2025-09-19
- 8.4 Version 2025-06-13
- 8.5 Version 2025-03-14
- 8.6 Version 2024-12-13
- 8.7 Version 2024-09-13
- 8.8 Version 2024-06-14
- 8.9 Version 2024-03-15
- 8.10 Version 2023-12-15
- 8.11 Version 2023-06-10
- 8.12 Version 2023-03-17
- 8.13 Version 2022-12-16
- 8.14 Version 2022-06-17
- 8.15 Version 2022-03-18
- 9 License
1 Introduction
LTESCAN is a tool using Amarisoft SDR50 boards to scan a band of the
RF spectrum searching for either LTE or NR (SA) cells.
LTESCAN can be greatly accelerated by using several boards together.
Depending on conditions, adding a LNA RF amplifier in front of the SDR50
board(s) may give a better detection performance.
Launching “ltescan” will use the default config file “ltescan.cfg”.
You can also specify a different config file by launching “ltescan myscan.cfg”
Once launched, there are two ways to use it:
- - user input on the console, with results on the screen
- - websocket API for automatization
2 Requirements
2.1 Hardware requirements
- - A fast PC:
- - For best performances, a quad core Intel Core i7 CPU (Haswell architecture or later) is recommended. Support of the AVX2 instruction set extension is required to run the software.
- - At least 2 GB of RAM.
- - At least 1 GB of hard disk space.
- - The video adapter does not matter.
- - Radio front end
one or more Amarisoft PCIe SDR50
- - Appropriate antennas for the intended LTE frequencies or cables and attenuators to connect to a UE.
- - Optional RF amplifier
2.2 Software requirements
- A 64 bit Linux distribution. Fedora 42 is the officially supported distribution.
The following distributions are known as compatible:- Fedora 22 to 42
- Cent OS 7
- Ubuntu 14 to 24
Your system requires at least GLIBC 2.17.
Other distributions can be used provided the radio frontend drivers are available for them.
3 Installation
3.1 Linux setup
3.1.1 Packages
3.1.2 OpenSSL
LTESCAN has been compiled against openssl version 3.5.4.
If your system does not have compatible version installed you may have this error message at startup:
error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory
To overcome this problem, you may:
- Copy libssl.so.3 and libcrypto.so.3 from
libssubdirectory of your release tarball.
If you have installed software with automatic install script, this should have been done automatically. - Compile and install proper openssl version yourself
In case of persisting issue, raise a ticket from our support site at https://support.amarisoft.com/ with the information provided by below commands executed in LTESCAN directory:
uname -a ls -l ldd ./ltescan openssl version
3.2 RRH setup
Please refer to sub section of your radio frontend to set it up.
3.2.1 Amarisoft PCIe SDR
Read the PCIe SDR documentation (trx_sdr.pdf).
3.3 LTESCAN installation
Decompress the LTESCAN archive to a convenient place. The executable ltescan can be launched from this directory.
4 Configuration reference
4.1 Configuration file syntax
The main configuration file uses a syntax very similar to the Javascript Object Notation (JSON) with few extensions.
- Supported types:
- - Numbers (64 bit floating point). Notation:
13.4 - - Complex numbers. Notation:
1.2+3*I - - Strings. Notation:
"string" - - Booleans. Notation:
trueorfalse. - - Objects. Notation:
{ field1: value1, field2: value2, .... } - - Arrays. Notation:
[ value1, value2, .... ]
- - Numbers (64 bit floating point). Notation:
- The basic operations
+,-,*and/are supported with numbers and complex numbers.+also concatenates strings. The operators!,||,&&,==,!=,<,<=,>=,>are supported too. - The numbers
0and1are accepted as synonyms for the boolean valuesfalseandtrue. - {} at top level are optional.
- " for property names are optional, unless the name starts with a number.
- Properties can be duplicated.
If properties are duplicated, they will be merged following JSON merge rules with overriding occuring in reading direction (last overrides previous).
Ex:{ value: "foo", value: "bar", sub: { value: "foo" }, sub: { value: "bar" } }Will be equivalent to:
{ value: "bar", sub: { value: "bar" } } - Files can be included using include keyword (must not be quoted) followed by a string (without :) representing the file to include (path is relative to current file) and terminating by a comma.
Arrays can’t be included.
Merge will be done as for duplicate properties.
If file1.cfg is:value: "foo", include "file2.cfg", foo: "foo"And file2.cfg is:
value: "bar", foo: "bar"Final config will be:
{ value: "bar", foo: "foo" } - A C like preprocessor is supported. The following preprocessor commands are available:
#define var exprDefine a new variable with value expr. expr must be a valid JSON expression. Note that unlike the standard C preprocessor, expr is evaluated by the preprocessor.
#undef varUndefine the variable var.
#include exprInclude the file whose filename is the evaluation of the string expression expr.
#if exprConsider the following text if expr is true.
#elseAlternative of
#ifblock.#elifComposition of
#elseand#if.#endifEnd of
#ifblock.#ifdef varShortcut for
#if defined(var)#ifndef varShortcut for
#if !defined(var)
In the JSON source, every occurrence of a defined preprocessor variable is replaced by its value.
- Backquote strings: JSON expression can be inserted in backquote delimited strings with the
${expr}syntax. Example:`abc${1+2}d`is evaluated as the string"abc3d". Preprocessor variables can be used inside the expression. Backquote strings may span several lines.
4.1.1 JSON merge rules
Merge overriding direction depends on context, i.e source may override destination or the opposite.
JSON merge is recursive for Objects and Arrays.
Example, merging
{
foo: { value: "bar" },
same: "one",
one: 1
}
with
{
foo: { value: "none", second: true },
same: "two",
two: 1
}
Will become:
{
foo: { value: "bar", second: true },
same: "one",
one: 1
two: 1
}
assuming first object overrides second one.
In case of Array merging, the final array length will be the maximum length of all merged arrays.
For each element of the final array, merge will be done considering defined elements only.
Ex:
{
array: [0, 1, 2, { foo: "bar" } ],
array: [3, 4],
array: [5, 6, 7, { bar: "foo" }, 8 ]
}
Will be merged to:
{
array: [5, 6, 7, { foo: "bar", bar: "foo" }, 8 ],
}
4.2 Global properties
Example of ltescan.cfg:
/* LTE scan configuration */
{
log_options: "all.level=debug,all.max_size=1,phy.signal=1",
log_filename: "/tmp/scan.log",
com_addr: "[::]:9009",
//sib_inter_rat: true,
rf_driver: {
name: "sdr",
args: `dev0=/dev/sdr0`,
/* For multiple boards */
//args: `dev0=/dev/sdr0,dev1=/dev/sdr1,dev2=/dev/sdr2,dev3=/dev/sdr3`,
},
rx_gain: 60,
scan: {
lock_timeout: 100, /* ms: waiting for Cell Lock */
pbch_timeout: 200, /* ms waiting for PBCH */
sib_timeout: 3000, /* ms: waiting for SIB */
snr_threshold: 3.0, /* only show cells with SNR greater than 3dB */
rssi_timeout: 1000, /* RSSI integration time (ms) */
rssi_width: 100, /* RSSI block width for rssi results (KHz) */
},
}
For UHD driver (B2x0 hardware), the rf_driver must be modified as follows:
rf_driver: {
name: "uhd",
args: "num_recv_frames=64,num_send_frames=64",
dl_sample_bits: 12,
ul_sample_bits: 12,
},
log_filenamelog_filename-
String. Set the log filename. If no leading
/, it is relative to the configuration file path. See Log file format. log_optionslog_options-
String. Set the logging options as a comma separated list of assignments.
- layer.level=verbosity. For each layer, the log verbosity can be set
to
none,error,infoordebug. In debug level, the content of the transmitted data is logged. - layer.max_size=n. When dumping data content, at
most
nbytes are shown in hexa. For ASN.1, NAS or Diameter content, show the full content of the message ifn > 0. - layer.payload=[0|1]. Dump ASN.1, NAS, SGsAP or Diameter payload in hexadecimal.
- layer.key=[0|1]. Dump security keys (NAS and RRC layers).
- layer.crypto=[0|1]. Dump plain and ciphered data (NAS and PCDP layers).
- time=[sec|short|full]. Display the time as seconds, time only or full date and time (default = time only).
- time.us=[0|1]. Dump time with microseconds precision.
- file=cut. Close current file log and open a new one.
- file.rotate=now. Move and rename to the same directory or to the directory pointed by
file.pathand open a new log file (Headers are kept). - file.rotate=size. Every time log file size reaches size bytes,
move and rename to the same directory or to the directory pointed by
file.path, and open a new log file (Headers are kept).
Size is an integer and can be followed by K, M or G. - file.rotate=#count. Everytime number of logs in log file reaches count,
move and rename to the same directory or to the directory pointed by
file.path, and open a new log file (Headers are kept).
Size is an integer and can be followed by K, M or G. - file.path=path. When log rotation is enabled (
file.rotateset), rename and move current log to this path instead of initial log path. - append=[0|1]. (default=0). If 0, truncate the log file when opening it. Otherwise, append to it.
Available layers are:
phy - layer.level=verbosity. For each layer, the log verbosity can be set
to
log_synclog_syncOptional boolean (default = false). If true, logs will be synchronously dumped to file.
Warning, this may lead to performances decrease.sib_inter_ratsib_inter_ratOptional boolean (default = false). If true, allow scanning of inter-RAT LTE SIBs 6, 7 and 24, and NR SIB 5. Warning: this may add extra timeout.
rx_gainrx_gainFloat. Receive gain in dB. The range is device dependent. For the PCIe SDR board, the range is between -11 and 77 dB (the exact limits depend on the RX frequency). For the USRP N2x0 device with the SBX daughterboard, the range is 0 to 31.5 dB. With an array of floats a different gain is specified for each channel. Ltescan uses this value as initial rx_gain fo each new frequenncy. The actual gain is automatically lowered as needed.
scanscanObject. Section for scanning parameters
lock_timeoutscan.lock_timeoutNumber. Timeout in ms waiting for cell lock on a frequency. (default = 100ms)
pcbh_timeoutscan.pcbh_timeoutNumber. Timeout in ms waiting for PBCH (LTE) or PDCCH (NR) when locked on a frequency. (default = 200ms)
sib_timeoutscan.sib_timeoutNumber. Timeout in ms waiting for cell SIB (LTE) or MIB (NR) on a frequency when locked. (default = 3000 ms)
snr_thresholdscan.snr_thresholdFloat. Minimum SNR in dB to accept SIB or MIB. (default = 3.0 dB)
rssi_timeoutscan.rssi_timeoutNumber. Time in ms integrating data when scanning RSSI (default = 100 ms)
rssi_widthscan.rssi_widthNumber. Frequency step in KHz when returning RSSI scan result. (granularity = 100KHz, default = 100 KHz)
bandscan.bandNumber or String. Optional parameter to force automatic scan when ltescan is launched. Accepts same syntax as the ’scan’ command on command line (see Chapter 6).
sib_format_jersib_format_jerOptional boolean (default = false). If set, sib ASN.1 content within Cell notification message will be a JSON structure (JER) instead base64 encoding.
com_addrcom_addrOptional string. Address of the WebSocket server remote API. See Remote API.
If set, the WebSocket server for remote API will be enabled and bound to this address.
Default port is 9009.
Setting IP address to [::] will make remote API reachable through all network interfaces.com_namecom_nameOptional string. Sets server name. SCAN by default
com_ssl_certificatecom_ssl_certificateOptional string. If set, forces SSL for WebSockets. Defines CA certificate filename.
com_ssl_keycom_ssl_keyOptional string. Mandatory if com_ssl_certificate is set. Defines CA private key filename.
com_ssl_peer_verifycom_ssl_peer_verifyOptional boolean (default is false). If true, server will check client certificate.
com_ssl_cacom_ssl_caOptional string. Set CA certificate. In case of peer verification with self signed certificate, you should use the client certificate.
com_log_lockcom_log_lockOptional boolean (default is false). If true, logs configuration can’t be changed via
config_setremote API.com_log_uscom_log_usOptional boolean (default is false). If true, logs sent by
log_getremote API response will have atimestamp_usparameters instead oftimestampcom_authcom_authOptional object. If set, remote API access will require authentication.
Authentication mechanism is describe in Remote API Startup section.
passfilecom_auth.passfileOptional string. Defines filename where password is stored (plaintext).
If not set,passwordmust be setpasswordcom_auth.passwordOptional string. Defines password.
If not set,passfilemust be set.unsecurecom_auth.unsecureOptional boolean (default false). If set, allow password to be sent plaintext.
NB: you should set it to true if you access it from a Web Browser (Ex: Amarisoft GUI) without SSL (https) as your Web Browser may prevent secure access to work.
com_log_countcom_log_countOptional number (Default = 8192). Defines number of logs to keep in memory before dropping them.
Must be between 4096 and 2097152).sim_eventssim_eventsArray of object. Each element defines a remote API request (Remote API) except that
messagefield is replaced byevent.
sim_events_loop_countsim_events_loop_countIf set, will define
loop_countfor each event ofsim_events, See loop_count.sim_events_loop_delaysim_events_loop_delayIf set, will define
loop_delayfor each event ofsim_events, See loop_delay.license_serverlicense_serverConfiguration of the Amarisoft license server to use.
Object with following properties:server_addrlicense_server.server_addrString. IP address of the license server.
namelicense_server.nameOptional string. Text to be displayed inside server monitor or remote API.
taglicense_server.tagOptional string. If set, server will only allow license with same tag.
Example:
license_server: { server_addr: "192.168.0.20", name: "My license", }
5 Remote API
You can access LTESCAN via a remote API.
Protocol used is WebSocket as defined in RFC 6455
(https://tools.ietf.org/html/rfc6455).
Note that Origin header is mandatory for the server to accept connections.
This behavior is determined by the use of nopoll library.
Any value will be accepted.
To learn how to use it, you can refer to our the following tutorial.
5.1 Messages
Messages exchanged between client and LTESCAN server are in strict JSON
format.
Each message is represented by an object. Multiple message can be sent to
server using an array of message objects.
Time and delay values are floating number in seconds.
There are 4 types of messages:
- Request
Message sent by client.
Common definition:messagerequest.messageString. Represent type of message. This parameter is mandatory and depending on its value, other parameters will apply.
message_idrequest.message_idOptional any type. If set, response sent by the server to this message will have same message_id. This is used to identify response as WebSocket does not provide such a concept.
start_timerequest.start_timeOptional float. Represent the delay before executing the message.
If not set, the message is executed when received.
absolute_timerequest.absolute_timeOptional boolean (default = false). If set,
start_timeis interpreted as absolute.
You can get current clock of system usingtimemember of any response.standalonerequest.standaloneOptional boolean (default = false). If set, message will survive WebSocket disconnection, else, if socket is disconnected before end of processing, the message will be cancelled.
loop_countrequest.loop_countOptional integer (default = 0, max = 1000000). If set, message will be repeated
loop_counttime(s) afterloop_delay(From message beginning of event).
Response will have aloop_indexto indicate iteration number.loop_delayrequest.loop_delayOptional number (min = 0.1, max = 86400). Delay in seconds to repeat message from its
start_time. Mandatory whenloop_countis set > 0.
- Notification
For some API, intermediate message may be sent by server before reception of response.
Common definition:messagenotification.messageString. Same as request.
message_idnotification.message_idOptional any type. Same as in request.
timenotification.timeNumber representing time in seconds of the message start, relative to the beginning of the process.
Useful to send command with absolute time.notificationnotification.notificationString. Notification purpose
utcnotification.utcNumber representing UTC seconds (local clock) when the response has been generated.
- Response
Message sent by server after any request message has been processed.
Common definition:messageresponse.messageString. Same as request.
message_idresponse.message_idOptional any type. Same as in request.
timeresponse.timeNumber representing time in seconds of the message start, relative to the beginning of the process.
Useful to send command with absolute time.utcresponse.utcNumber representing UTC seconds (local clock) when the response has been generated.
absolute_timeresponse.absolute_timeOptional string. If
absolute_timehas been set and message is reaching LTESCAN too late, this field is present and set tolate.
- Events
Message sent by server on its own initiative.
Common definition:messageevent.messageString. Event name.
timeevent.timeNumber representing time in seconds.
Useful to send command with absolute time.
5.2 Startup
When WebSocket connections is setup, LTESCAN will send a first message with
name set to com_name and type set to SCAN.
If authentication is not set, message will be ready:
{
"message": "ready",
"type": "SCAN",
"name": <com_name>,
"version": <software version>,
"product": <Amarisoft product name (optional)>
}
If authentication is set, message will be authenticate :
{
"message": "authenticate",
"type": "SCAN",
"name": <com_name>,
"challenge": <random challenge>
}
To authenticate, the client must answer with a authenticate message
and a res parameter where:
res = HMAC-SHA256( "<type>:<password>:<name>", "<challenge>" )
res is a string and HMAC-SHA256 refers to the standard algorithm
(https://en.wikipedia.org/wiki/HMAC)
If the authentication succeeds, the response will have a ready field
set to true.
{
"message": "authenticate",
"message_id": <message id>,
"ready": true
}
If authentication fails, the response will have an error field and will
provide a new challenge.
{
"message": "authenticate",
"message_id": <message id>,
"error": <error message>,
"type": "SCAN",
"name: <name>,
"challenge": <new random challenge>
}
If any other message is sent before authentication succeeds,
the error "Authentication not done" will be sent as a response.
5.3 Errors
If a message produces an error, response will have an error string field representing the error.
5.4 Sample nodejs program
You will find in this documentation a sample program: ws.js.
It is located in doc subdirectory.
This is a nodejs program that allow to send message to LTESCAN.
It requires nodejs to be installed:
dnf install nodejs npm npm install nodejs-websocket
Use relevant package manager instead of NPM depending on your Linux distribution.
Then simply start it with server name and message you want to send:
./ws.js 127.0.0.1:9009 '{"message": "config_get"}'
5.5 Common messages
config_getRetrieve current config.
Response definition:
typeconfig_get.typeAlways "SCAN"
nameconfig_get.nameString representing server name.
logsconfig_get.logsObject representing log configuration.
With following elements:layersconfig_get.logs.layersObject. Each member of the object represent a log layer configuration:
layer nameObject. The member name represent log layer name and parameters are:
levelconfig_get.logs.layers.root.levelSee log_options
max_sizeconfig_get.logs.layers.root.max_sizeSee log_options
keyconfig_get.logs.layers.root.keySee log_options
cryptoconfig_get.logs.layers.root.cryptoSee log_options
payloadconfig_get.logs.layers.root.payloadSee log_options
countconfig_get.logs.countNumber. Number of bufferizer logs.
rotateconfig_get.logs.rotateOptional number. Max log file size before rotation.
rotate_countconfig_get.logs.rotate_countOptional number. Max log count before rotation.
pathconfig_get.logs.pathOptional string. Log rotation path.
bcchconfig_get.logs.bcchBoolean. True if BCCH dump is enabled (eNB only).
mibconfig_get.logs.mibBoolean. True if MIB dump is enabled (eNB only).
lockedconfig_get.lockedOptional boolean. If
true, logs configuration can’t be changed withconfig_setAPI.
log_getGet logs.
This API has a per connection behavior. This means that the response will depend on previous calls to this API within the same WebSocket connection.
In practice, logs that have been provided in a response won’t be part of subsequent request unless connection is reestablished. To keep on receiving logs, client should send a newlog_getrequest as soon as the previous response has been received.
If a request is sent before previous request has been replied, previous request will be replied right now without considering specific min/max/timeout conditions.Message definition:
minlog_get.minOptional number (default = 1). Minimum amount of logs to retrieve.
Response won’t be sent until this limit is reached (Unless timeout occurs).maxlog_get.maxOptional number (default = 4096). Maximum logs sent in a response.
timeoutlog_get.timeoutOptional number (default = 1). If at least 1 log is available and no more logs have been generated for this time, response will be sent.
allow_emptylog_get.allow_emptyOptional boolean (default = false). If set, response will be sent after timeout, event if no logs are available.
rntilog_get.rntiOptional number. If set, send only logs matching rnti.
ue_idlog_get.ue_idOptional number. If set, send only logs with matching ue_id.
layerslog_get.layersOptional Object. Each member name represents a log layer and values must be string representing maximum level. See log_options.
If layers is not set, all layers level will be set to debug, else it will be set to none.
Note also the logs is also limited by general log level. See log_options.
shortlog_get.shortOptional boolean (default = false). If set, only first line of logs will be dumped.
headerslog_get.headersOptional boolean. If set, send log file headers.
start_timestamplog_get.start_timestampOptional number. Is set, filter logs older than this value in milliseconds.
end_timestamplog_get.end_timestampOptional number. Is set, filter logs more recent than this value in milliseconds.
max_sizelog_get.max_sizeOptional number (default = 1048576, i.e. 1MB). Maximum size in bytes of the generated JSON message. If the response exceeds this size, the sending of logs will be forced independently from other parameters.
Response definition:
logslog_get.logsArray. List of logs. Each item is a an object with following members:
datalog_get.logs.dataArray. Each item is a string representing a line of log.
timestamplog_get.logs.timestampNumber. Milliseconds since January 1st 1970. Not present if
com_log_usis set in configuration.
timestamp_uslog_get.logs.timestamp_usNumber. Microseconds since January 1st 1970. Only present if
com_log_usis set in configuration.
layerlog_get.logs.layerString. Log layer.
levellog_get.logs.levelString. Log level: error, warn, info or debug.
dirlog_get.logs.dirOptional string. Log direction: UL, DL, FROM or TO.
ue_idlog_get.logs.ue_idOptional number. UE_ID.
celllog_get.logs.cellOptional number (only for PHY layer logs). Cell ID.
rntilog_get.logs.rntiOptional number (only for PHY layer logs). RNTI.
framelog_get.logs.frameOptional number (only for PHY layer logs). Frame number (Subframe is decimal part).
channellog_get.logs.channelOptional string (only for PHY layer logs). Channel name.
srclog_get.logs.srcString. Server name.
idxlog_get.logs.idxInteger. Log index.
headerslog_get.logs.headersOptional array. Array of strings.
discontinuitylog_get.discontinuityOptional number. If set, this means some logs have been discarded due to log buffer overflow.
microsecondslog_get.microsecondsOptional boolean. Present and set to true if
com_log_usis set in configuration file.
log_setAdd log.
Message definition:loglog_set.logOptional string. Log message to add. If set, layer and level are mandatory.
layerlog_set.layerString. Layer name. Only mandatory if log is set.
levellog_set.levelString. Log level: error, warn, info or debug. Only mandatory if log is set.
dirlog_set.dirOptional string. Log direction: UL, DL, FROM or TO.
ue_idlog_set.ue_idOptional number. UE_ID.
flushlog_set.flushOptional boolean (default = false). If set, flushes fog file.
rotatelog_set.rotateOptional boolean (default = false). If set, forces log file rotation.
cutlog_set.cutOptional boolean (default = false). If set, forces log file reset.
log_resetResets logs buffer.
licenseRetrieves license file information.
Response definition:
productslicense.productsString. List of products, separated by commas.
userlicense.userString. License username.
validitylicense.validityString. License end of validity date.
idlicense.idOptional string. License ID.
id_typelicense.id_typeOptional string. License ID type. Can be
host_idordongle_iduidlicense.uidOptional string. License unique ID.
filenamelicense.filenameOptional string. License filename.
serverlicense.serverOptional string. License server URL.
server_idlicense.server_idOptional string. License server ID.
quitTerminates ltescan.
helpProvides list of available messages in messages array of strings and events to register in events array of strings.
statsReport statistics for LTESCAN.
Every time this message is received by server, statistics are reset.
Warning, calling this message from multiple connections simultaneously will modify the statistics sampling time.Response definition:
cpustats.cpuObject. Each member name defines a type and its value cpu load in % of one core.
instance_idstats.instance_idNumber. Constant over process lifetime. Changes on process restart.
registerRegister client for messages generated by LTESCAN. Message definition:
registerregister.registerOptional string or array of string. List of messages to register to.
Can becell,scanunregisterregister.unregisterOptional string or array of string. List of messages to unregister.
Can becell,scan
5.6 LTE messages
scanLaunches a scan on selected bands.
The response is sent when scanning is over.
During scanning, notification intermediate message will be sent to notify progress.
Closing connection before end of scan does not stop scanning.
If a scanning is already in progress, it will be stopped. Message definition:bandscan.bandNumber, string, object or array. Defines the list of bands to scan.
If an array is defined, all elements must be a number, string or object.
A number represents a LTE band number to scan.
A string represents a single band with the command line syntax (see below).7band LTE 7
7(3000)arfcn 30000 of band LTE 7
n78(7838,7850)gscn 7838 to 7850 on band NR 78
An object will have following properties:
bandscan.band.bandNumber. Band to scan
typescan.band.typeString. Can be
nrorlte.
Cell notification. Every time a cell is found, such notification is sent.
notificationscan.notificationString. Set as
cellbandscan.bandNumber. Band
typescan.typeString. Can be
nrorlte.frequencyscan.frequencyNumber. Cell center frequency in Hz.
dl_earfcnscan.dl_earfcnNumber. Downlink earfcn (LTE only).
dl_arfcnscan.dl_arfcnNumber. Downlink arfcn (NR only).
gscnscan.gscnNumber. SSB gscn (NR only).
nsascan.nsaOptional boolean. Cell only supports NSA (no SIB1 scheduled, NR only).
mibscan.mibString. Content of MIB in base64 encoding.
bandwidthscan.bandwidthNumber. Cell bandwidth in MHz.
n_rb_dlscan.n_rb_dlNumber. Number of resource blocks.
rssiscan.rssiNumber. RSSI in dBm.
rsrqscan.rsrqNumber. RSRQ in dB
rsrpscan.rsrpNumber. RSRP in dBm.
snrscan.snrNumber. SNR in dB.
n_antenna_pbchscan.n_antenna_pbchNumber. Number of antenna as reported in the PBCH (LTE only)
lte_mscan.lte_mBoolean. Cell supports LTE-M (LTE only)
n_ssbscan.n_ssbNumber. Number of SSB (antennas) from ’ssb-PositionsInBurst’ in SIB1 (NR only)
ssb_indexscan.ssb_indexNumber. SSB index as reported in MIB (NR only)
ssb_subcarrier_spacingscan.ssb_subcarrier_spacingNumber. SSB subcarrier spacing in KHz (NR only)
subcarrier_spacingscan.subcarrier_spacingNumber. subcarrier spacing in KHz (NR only)
uldl_configscan.uldl_configNumber. uldl config if TDD mode (LTE only)
special_subframe_configscan.special_subframe_configNumber. special subframe config if TDD mode (LTE only)
tp1_periodscan.tp1_periodNumber. Period in ms of TDD Pattern_1 if TDD mode (NR only)
tp1_dl_slotsscan.tp1_dl_slotsNumber. Number of DL slots in Pattern_1 if TDD mode (NR only)
tp1_ul_slotsscan.tp1_ul_slotsNumber. Number of UL slots in Pattern_1 if TDD mode (NR only)
tp1_dl_symbsscan.tp1_dl_symbsNumber. Number of DL symbols in special slot in Pattern_1 if TDD mode (NR only)
tp1_ul_symbsscan.tp1_ul_symbsNumber. Number of UL symbols in special slot in Pattern_1 if TDD mode (NR only)
tp2_periodscan.tp2_periodNumber. Period in ms of TDD Pattern_2 if TDD mode (NR only)
tp2_dl_slotsscan.tp2_dl_slotsNumber. Number of DL slots in Pattern_2 if TDD mode (NR only)
tp2_ul_slotsscan.tp2_ul_slotsNumber. Number of UL slots in Pattern_2 if TDD mode (NR only)
tp2_dl_symbsscan.tp2_dl_symbsNumber. Number of DL symbols in special slot in Pattern_2 if TDD mode (NR only)
tp2_ul_symbsscan.tp2_ul_symbsNumber. Number of UL symbols in special slot in Pattern_2 if TDD mode (NR only)
sib1scan.sib1String. Content of LTE or NR SIB1 (if broadcasted). May be base64 encoding or JER depending on sib_format_jer.
sib2scan.sib2String. Content of LTE or NR SIB2 (if broadcasted). May be base64 encoding or JER depending on sib_format_jer.
sib3scan.sib3String. Content of LTE or NR SIB3 (if broadcasted). May be base64 encoding or JER depending on sib_format_jer.
sib4scan.sib4String. Content of LTE or NR SIB4 (if broadcasted). May be base64 encoding or JER depending on sib_format_jer.
sib5scan.sib5String. Content of LTE or NR SIB5 (if broadcasted). May be base64 encoding or JER depending on sib_format_jer.
sib6scan.sib6String. Content of LTE SIB6 (if broadcasted). May be base64 encoding or JER depending on sib_format_jer.
sib7scan.sib7String. Content of LTE SIB7 (if broadcasted). May be base64 encoding or JER depending on sib_format_jer.
sib24scan.sib24String. Content of LTE SIB24 (if broadcasted). May be base64 encoding or JER depending on sib_format_jer.
Band notification. Every time a new band is being scanned, such notification is sent.
notificationscan.notificationString. Set as
cellbandscan.bandNumber. Band
typescan.typeString. Can be
nrorlte.
cellsReturns last scanning results. Response definition:
cellscells.cellsArray of object. Each item represents a cell as described in See Cell notification.
scanningcells.scanningBoolean. If true, a scanning is in progress.
scan_rssiLaunches a RSSI scan on selected bands.
Results are returneded by frequency step (defined by rssi_width parameter). During scanning, notification intermediate message will be sent to notify progress.
Closing connection before end of scan does not stop scanning.
If a scanning is already in progress, it will be stopped. Message definition:bandscan_rssi.bandNumber, object or array. Defines the list of bands to scan.
If an array is defined, all elements must be a number or an object.
A number represents a LTE band number to scan. An object will have following properties:bandscan_rssi.band.bandNumber. Band to scan
typescan_rssi.band.typeString. Can be
nrorlte.
RSSI notification. For every frequency step, a notification is sent.
notificationscan_rssi.notificationString. Set as
rssifrequencyscan_rssi.frequencyNumber. Frequency in Hz.
arfcnscan_rssi.arfcnNumber. Downlink arfcn (LTE only).
rssiscan_rssi.rssiNumber. RSSI in dBm.
rssisReturns last RSSI scanning results. Response definition:
rssisrssis.rssisArray of object. Each item represents a cell as described in See RSSI notification.
scanningrssis.scanningBoolean. If true, a scanning is in progress.
Exemple of scan command:
./ws.js -t 600 127.0.0.1:9009 '{"message": "scan","band":["7(3000)","n78"]}'
5.7 LTE events
Following events are sent by scanner to remote API client if they have been registered on WebSocket.
cellCell has been scanned. Same definition as See Cell notification.
scanProvides information on scanning progress
notificationscan.notificationString. Can be
bandwhen a new band is being scanned,endwhen scanning is over.
5.8 Examples
- Config
- Client sends
{ "message": "config_get", "message_id": "foo" } - Server replies
{ "message_id": "foo", "message": "config_get", "name": "UE", "logs": { "phy": { "level": "error", "max_size": 0 }, ... "rrc": { "level": "debug", "max_size": 1 } } }
- Client sends
- Error
- Client sends
{ "message": "bar", "message_id": "foo" } - Server replies
{ "message_id": "foo", "message": "bar", "error": "Unknown message: bar" }
- Client sends
6 Command line monitor reference
The following commands are available:
helpDisplay the help. Use
help commandto have a more detailed help about a command.t [port]Activate various traces on the console. The display is stopped when typing return. The default trace is the current scan status. An optional RF port may be given for cpu and spl traces.
Available traces:
scant scanDisplay current scan information.
cput cpuDisplay the CPU usage from the TRX (transceiver) API and the TX-RX latency statistics.
splt splDisplay various statistics about the sent and received complex samples (at the TRX API level). For the TX side, the RMS and maximum sample value are displayed. The number of saturation events (
abs(sample) > 1) are displayed too. For the RX side the RMS and maximum sample value are displayed. The unit is dB FS (dB Full Scale). 0 dB FS is reached with a square signal of amplitude 1.
scan bandsStart a cell scan on the specified band(s); LTE band: 1..256; NR band: n1..n256 You can also add arfcn/gscn limits for each band. Examples:
scan 7 20 will scan bands LTE 7 and 20
scan 7(3000) scan arfcn 3000 on band LTE 7
scan n78(7838,7850) scan gscn 7838 to 7850 on band NR 78
scan_rssi bandsStart a RSSI scan on the specified band(s); LTE band: 1..256; NR band: n1..n256
comCOM connection status.
7 Log file format
7.1 PHY layer
When a PHY message is dumped (debug level), the format is:
time layer dir ue_id cell rnti frame.subframe channel:short_content
long_content
timeTime using the selected format.
layerLayer (
[PHY]here).dirUL (uplink) or DL (downlink).
ue_ideNodeB UE identifier (hexadecimal, unique among all cells).
cellLow 8 bits of the cell identifier (hexadecimal).
rntiAssociated RNTI (hexadecimal) or
-if none.frame.subframeFrame number (0-1023) and either subframe number (0-9) for LTE and NB-IoT cells or slot number for NR cells.
channelPHY channel name (e.g. PUSCH, PUCCH, PRACH, SRS, PSS, PBCH, PDSCH, PHICH, PDCCH, EPDCCH, ...).
short_contentSingle line content.
long_contentHexadecimal dump of the message if
phy.max_size > 0.
8 Change history
8.1 Version 2026-03-13
- added LTE bands 246 and 249 definition
- added NR bands 68, 87, 88, 110 and 252 definition
- added
sib_inter_ratparameter. Note that NR SIB5 is now only reported when this parameter is set to true - added
sib6,sib7andsib24parameters tonotificationremote API event
8.2 Version 2025-12-12
- OpenSSL library is upgraded to 3.5.4
- added LTE bands 111, 112, 113 and 252 definition
- added NR bands 247, 248, 250, 251 and 253 definition
8.3 Version 2025-09-19
- dump MIB for NSA cells also in cell notification
- added SCS and BW for NR NSA cells in NR console display
8.4 Version 2025-06-13
- renamed ntx parameter to n_ssb for NR console display
8.5 Version 2025-03-14
- the crc=KO log is renamed to crc=FAIL
8.6 Version 2024-12-13
- added
sib_format_jerparameter
8.7 Version 2024-09-13
- added LTE bands 107 and 108 definition
- added
mibparameter to cell notification - added
licenseremote API -
com_logs_lockparameter is renamed tocom_log_lock.com_logs_lockis still supported for backward compatibility - added
com_log_usparameter
8.8 Version 2024-06-14
- OpenSSL library is upgraded to 1.1.1w
- added NR band 54 definition
- added
lte_mandnsaparameters to cell notification - added MIB info for WS API
8.9 Version 2024-03-15
- added LTE bands 106, 253 and 254 definition
- added NR bands 31, 72, 105, 109 and 254 definition
8.10 Version 2023-12-15
- added
loop_countandloop_delayto remote API messages - added
sim_events,sim_events_loop_countandsim_events_loop_delay - added
com_ssl_caparameter for SSL verification
8.11 Version 2023-06-10
-
com_logs_lockparameter added to disable logs configuration change via remote API
8.12 Version 2023-03-17
-
com_addrparameter now uses [::] address instead of 0.0.0.0 in the delivered configuration file to allow IPv6 connection
8.13 Version 2022-12-16
-
utcparameter is added to remote API response messages
8.14 Version 2022-06-17
- OpenSSL library is upgraded to 1.1.1n
-
start_timestampandend_timestampare added tolog_getAPI
8.15 Version 2022-03-18
- Added Introduction
- Added sample config file
- Use retransmission to improve all SIB decoding in low SNR conditions
- Indicate NSA cells
- Fixed cell detection when SSB spacing is different
- Fixed BWP parsing
9 License
ltescan is copyright (C) 2012-2026 Amarisoft. Its redistribution
without authorization is prohibited.
ltescan is available without any express or implied warranty. In
no event will Amarisoft be held liable for any damages arising from
the use of this software.
For more information on licensing, please refer to license terms.