> This page is for Portal.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.emnify.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.emnify.com/_mcp/server.

# Test the Quectel CC660D-LS radio module

> Configuration and test instructions for the Quectel CC660D-LS radio module and evaluation board

The Quectel CC660D-LS is a 3GPP non-terrestrial network (NTN) satellite communication module.
This guide contains the configuration and AT commands for the module and evaluation board.

## Set up the evaluation board

> **Info**
>
> These instructions are for Windows users.
> If you have a different operating system, adjust the steps accordingly.

Insert the emnify SIM card into the SIM reader slot of the Quectel board.

Attach the antennae (NTN and GNSS) to the board to the board using the antenna connectors.
Use the image below as a reference.

Connect the USB cable to your PC and the board's UART port.
Make sure you've installed the USB-to-UART driver on your PC.

Set the jumpers to ensure the correct voltage as described in the Quectel CC660D-LS TE-B User Guide.

![Evaluation board with labeled NTN antenna, GNSS antenna, USIM slot, and USB cable connection](/_fern-img/5bee8a63b1e71449dfd11ab831af0f6a99e5284fa24136ccf693d28e45d11075.webp)

In your Windows PC, go to the **Control Panel** and check your **Device Manager** for the assigned communications port (COM port) of the evaluation board (EVB).

Open [PuTTY](https://putty.org/index.html) (or another SSH client), then set the connection type to **Serial**.

Enter the COM port assigned to the EVB and set the speed to a baud rate of **115200**.

After establishing a connection between your SSH client and the module, refer to the Quectel AT Command Guide to complete the initial configuration.

## Available AT commands for testing

To test the satellite connectivity the CC660D-LS module provides, use the following AT commands.

> **Note**
>
> CC660D-LS only supports NTN (that is, `NBNTN`), so there's no radio access technology (RAT) selection available.

> **Tip**
>
> For more information about using AT commands to configure devices, see emnify's [Introduction to AT commands webinar](https://support.emnify.com/hc/en-us/articles/4401884056466-AT-Commands-Introduction-commands-for-a-proper-network-connection-disconnection-and-device-configuration-examples).

### Retrieve modem manufacturer and revision

```txt
ATI
```

#### Example response

```txt
Quectel_Ltd
Quectel_CC660D-LS
Revision: CC660DLSAAR01A01
```

### Query IMEI

```txt
AT+CGSN=1
```

#### Example response

```txt
+CGSN: 860952060001998
```

### Query ICCID

```txt
AT+QCCID
```

#### Example response

```txt
+QCCID: 89883030000007437921
```

### Query IMSI

```txt
AT+CIMI
```

#### Example response

```txt
901430003909019
```

### Set and query APN

Set the [Access Point Name (APN)](https://www.emnify.com/iot-glossary#apn) to `em`:

```txt
AT+QCGDEFCONT="IP","em"
```

#### Example response

```txt
OK
```

Query the current APN:

```txt
AT+QCGDEFCONT?
```

#### Example response

```txt
+QCGDEFCONT: "IP","em"
```

### Configure band

See available bands:

```txt
AT+QBAND=?
```

#### Example response

```txt
+QBAND: (0-6),(24,15,65,23,255,256)
```

Get the currently active bands:

```txt
AT+QBAND?
```

#### Example response

```txt
+QBAND: 15,24,65,23,255,256
```

Skylo uses bands 255 and 256.
Setting both frequencies is safe, but this slows down the network search and attachment time.

```txt
AT+QBAND=1,255,256
```

#### Example response

```txt
OK
```

To save time, only configure one band.
Currently, 255 is used in North America and 256 in Europe.
Choose the band that corresponds to your region.

```txt
AT+QBAND=1,256
```

#### Example response

```txt
OK
```

| Band |  FWD (UE Tx)  |    RTN (UE Tx)    | Separation |     Region    |
| :--- | :-----------: | :---------------: | :--------: | :-----------: |
| B255 | 1525-1559 MHz | 1626.5-1660.5 MHz | -101.5 MHz |     Global    |
| B256 | 2170-2200 MHz |   1980-2010 MHz   |   190 MHz  |     Europe    |
| B23  | 2180-2200 MHz |   2000-2020 MHz   |   180 MHz  | North America |

### Request GNSS information

```txt
+QGNSSINFO: STATUS
```

Replace *`STATUS`* with an integer that indicates whether the embedded microcontroller unit (MCU) needs to provide GNSS information.

| Value | Description                                  |
| :---- | :------------------------------------------- |
| 0     | MCU doesn't need to provide GNSS information |
| 1     | MCU needs to provide GNSS information        |

The following example command indicates that the MCU needs to provide GNSS information:

```txt
+QGNSSINFO: 1
```

#### Example response

```txt
OK
```

### Set GNSS information

The MCU uses this command to actively set and query the terminal's current GNSS position information.
The module uses the inputted GNSS position information for satellite communication timing and frequency compensation.

```txt
AT+QGNSSINFO 
```

#### Example response

```txt
OK
```

When the module needs GNSS position information, it actively reports the unsolicited result code (URC) `+QGNSSINFO: 1` to notify the MCU to input GNSS position information to the module.

```txt
AT+QGNSSINFO=LATITUDE,LONGITUDE,ALTITUDE,SPEED,ACCURACY
```

Replace the placeholders according to your GNSS information using the following table as a reference.

| Placeholder   | Data type | Description                                                                                     |
| :------------ | :-------- | :---------------------------------------------------------------------------------------------- |
| *`LATITUDE`*  | Double    | Latitude value in degrees. Maximum length is 11.                                                |
| *`LONGITUDE`* | Double    | Longitude value in degrees. Maximum length is 11.                                               |
| *`ALTITUDE`*  | Float     | Altitude value in meters above the WGS84 reference ellipsoid.                                   |
| *`SPEED`*     | Double    | Speed in meters per second. Maximum length is 11.                                               |
| *`ACCURACY`*  | Integer   | Estimated horizontal accuracy radius in meters at the sixty-eighth percentile confidence level. |

The following example command sets the GNSS information to the emnify office on the nineteenth floor in Berlin, Germany:

```txt
AT+QGNSSINFO=52.506284,13.393259,89,0,0
```

#### Example response

```txt
OK
```

### Turn on registration status notifications

```txt
AT+CEREG=2
```

#### Example response

```txt
OK
```

### Query available networks

```txt
AT+COPS=?
```

#### Example response

```txt
+COPS: (0,,,"90198",9),,(0-3),(0-2)
```

> **Note**
>
> `90198` is the Skylo network code.
> You're ready to attach to an NTN network if you see it in your response.

### Query registration status

```txt
AT+COPS?
```

#### Example response - Not registered to any networks

```txt
+COPS: 0

OK
```

#### Example response - Registered to Skylo

```txt
+COPS: 0,2,"90198",9

OK
```

### Register on a specific network

```txt
AT+COPS=1,2,"90198",9
```

> **Tip**
>
> Typically, the module attaches to the Skylo network quicker automatically (that is, `AT+COPS=0`).
> But for debugging, you can use the preceding command to manually attach to the Skylo network.

As a result, you should see a reported `CEREG` state change.
The following table outlines the possible values.

| Value | Description                                                                          |
| :---- | :----------------------------------------------------------------------------------- |
| 0     | Not registered and MT isn't currently searching for an operator                      |
| 1     | Registered to the home network                                                       |
| 2     | Not registered, but MT is currently trying to attach or is searching for an operator |
| 3     | Registration denied                                                                  |
| 4     | Unknown                                                                              |
| 5     | Registered and roaming                                                               |

### Check network status

> **Info**
>
> This command is used in engineering mode.

```txt
AT+QENG=0
```

There are four available modes to pass to this command:

| Value | Description                                                                                                   |
| :---- | :------------------------------------------------------------------------------------------------------------ |
| 0     | Displays radio information for serving and neighbor cells                                                     |
| 1     | Only used if the modem is in the `RRC-CONNECTED` state                                                        |
| 2     | Displays the total working duration time of the Tx (transmitting GPS satellite) and Rx (receiving spacecraft) |
| 3     | Displays the public land mobile network (PLMN) status                                                         |

#### Example response

```txt
+QENG: 0,229360,2,26,"27BBFA",-133,-13,-120,0,256,"0FBA",0,,3
```

The response contains the following values:

```txt
+QENG: 0,SC_EARFCN,SC_EARFCN_OFFSET,SC_PCI,SC_CELLID,SC_RSRP,SC_RSRQ,SC_RSSI,SC_SINR,SC_BAND,SC_TAC,SC_ECL,SC_TX_PWR,OPERATION_MODE
```

### Generate IP data traffic by PING over ICMP

```txt
AT+PING=8.8.8.8
```

#### Example response

```txt
OK
+ping: begin, 8.8.8.8, data size= 64
+ping: finish, Packets: Sent = 1, Received =1, Lost = 0 (0% loss)
+ping: RTT statistics: Minimum = 8142, Maximum =8142, Average = 8142
```

![Delete PDP Context event on Skylo NonTerrestrial 883 with a description of the used data](/_fern-img/13ecc7cdf9d19cf653a3478943d532db1702da8ca06144a14f26c5076e38c146.webp)

### Generate IP data traffic over UDP

> **Note**
>
> Skylo NTN doesn't support Transmission Control Protocol (TCP) connections.

#### Create UDP socket

Creates an IPv4 UDP/IPv4 socket.
The modem's response establishes the socket ID so it can be used to send or receive IP data over UDP.

```txt
AT+ESOC=1,2,1
```

#### Example response

```txt
+ESOC=1

OK
```

#### Establish UDP connection with a remove server

```txt
AT+ESOCON=SOCKET_ID,REMOTE_PORT,REMOTE_ADDRESS
```

Replace *`SOCKET_ID`* with the integer response from the preceding [`+ESOC` command](#create-udp-socket), *`REMOTE_PORT`* with the remote listener port, and *`REMOTE_ADDRESS`* with the IPv4 address of the remote server.

#### Example response

```txt
OK
```

#### Send UDP packet to a remote server

```txt
AT+ESOSEND=SOCKET_ID,DATA_LEN,DATA
```

Replace *`SOCKET_ID`* with the integer response from the preceding [`+ESOC` command](#create-udp-socket), *`DATA_LEN`* with the length of the data you're sending in bytes, and *`DATA`* with the data you're sending encoded as hex digits.

The following example command sends "text message" to the remote server.
The response in ASCII read: "9999test message0000"

```txt
AT+ESOSEND=1,12,74657374206D657373616765
```

#### Example response

```txt
OK

+ESONMI=1,20,3939393974657374206d65737361676530303030
```

#### Close socket

```txt
AT+ESOCL=SOCKET_ID
```

Replace *`SOCKET_ID`* with the integer response from the preceding [`+ESOC` command](#create-udp-socket).

The following example command closes the socket with ID `1`:

```txt
AT+ESOCL=1
```

#### Example response

```txt
OK
```

![Delete PDP Context event on Skylo NonTerrestrial 883 with a description of the used data](/_fern-img/80833a947a738a0ba8a4db4dc647c60b74f3e075a2764191bc7f534943761036.webp)