Testing scenarios

The following testing scenarios give detailed instructions for testing specific use cases. They list the required AT commands and the expected responses.

Some scenarios are generic and should work out of the box, while others require you to set up a server that you can test against.

See Building and running for instructions on how to build and run the Serial Modem application. Testing describes how to turn on the modem and conduct the tests.

Generic AT commands

Complete the following steps to test the functionality provided by the Generic AT commands:

  1. Retrieve the version of the Serial Modem application.

    AT#XSMVER
    #XSMVER: "v1.99.0-67-ga9e396bc3d58","3.3.99"
    OK
  2. Retrieve a list of all supported proprietary AT commands.

    AT#XCLAC
    AT#XSMVER
    AT#XSLEEP
    AT#XCLAC
    AT#XSOCKET
    AT#XSOCKETOPT
    AT#XBIND
    [...]
    OK
  3. Check the supported values for the sleep command, then put the kit in sleep mode.

    AT#XSLEEP=?
    #XSLEEP: (1,2)
    OK

TCP/UDP AT commands

The following sections show how to test the functionalities provided by the Socket AT commands.

Network connection is required for these tests, so insert a SIM card and connect to the network:

AT+CFUN=1

OK

TCP connection

The following steps assume that you have a TCP echo server available. You can connect to public HTTP servers (port 80), but you cannot send and receive data.

  1. Test the TCP connection with a TCP socket:

    1. Check the available values for the AT#XSOCKET command.

      AT#XSOCKET=?
      
      #XSOCKET: <handle>,(1,2),(1,2,3),(0,1),<cid>
      
      OK
    2. Open a TCP socket, read the information (handle, family, role, type and cid) about the open socket, and set the receive timeout of the open socket to 30 seconds.

      AT#XSOCKET=1,1,0
      
      #XSOCKET: 0,1,6
      
      OK
      
      AT#XSOCKET?
      
      #XSOCKET: 0,1,0,1,0
      
      OK
      
      AT#XSOCKETOPT=0,1,20,30
      
      OK
    3. Replace example.com with the hostname or IPv4 address of the TCP echo server, and 1234 with the corresponding port. 1 indicates that the connection is established.

       AT#XCONNECT=0,"example.com",1234
      
       #XCONNECT: 0,1
      
       OK
    4. Send plaintext data to the TCP server and retrieve the response.

      AT#XSEND=0,0,0,"Test TCP"
      
      #XSEND: 0,0,8
      
      OK
      
      AT#XRECV=0,0,0,0
      
      #XRECV: 0,0,8
      Test TCP
      OK
    5. Close the socket and confirm its state.

      AT#XCLOSE=0
      
      #XCLOSE: 0,0
      
      OK
      
      AT#XSOCKET?
      
      OK

UDP connection

The following steps assume that you have a UDP echo server available.

  1. Test the UDP connection with a UDP socket using AT#XSENDTO:

    1. Open a UDP socket and read the information (handle, family, role, type and cid) about the open socket.

      AT#XSOCKET=1,2,0
      
      #XSOCKET: 0,2,17
      
      OK
      
      AT#XSOCKET?
      
      #XSOCKET: 0,1,0,2,0
      
      OK
    2. Send plaintext data to a UDP echo server on a specified port. Replace example.com with the hostname or IPv4 address of a UDP server, and 1234 with the corresponding port. Then retrieve the response.

      AT#XSENDTO=0,0,0,"example.com",1234,"Test UDP"
      
      #XSENDTO: 0,0,8
      
      OK
      
      AT#XRECVFROM=0,0,0,0
      
      #XRECVFROM: 0,0,8,"<IP address>",<port>
      Test UDP
      OK
    3. Close the socket.

      AT#XCLOSE=0
      
      #XCLOSE: 0,0
      
      OK
  2. Test the UDP connection with a UDP socket, using AT#XCONNECT:

    1. Open a UDP socket and set connection to UDP server. Replace example.com with the hostname or IPv4 address of a UDP server, and 1234 with the corresponding port.

      AT#XSOCKET=1,2,0
      
      #XSOCKET: 0,2,17
      
      OK
      
      AT#XCONNECT=0,"example.com",1234
      
      #XCONNECT: 0,1
      
      OK
    2. Send plaintext data to the UDP server and retrieve the response.

      AT#XSEND=0,0,0,"Test UDP"
      
      #XSEND: 0,0,8
      
      OK
      
      AT#XRECV=0,0,0,0
      
      #XRECV: 0,0,8
      Test UDP
      OK
    3. Close the socket.

      AT#XCLOSE=0
      
      #XCLOSE: 0,0
      
      OK

TLS connection

The following steps assume that you have a TLS echo server available. You can connect to public HTTPS servers (port 443), but you cannot send and receive the data.

A TLS connection requires a valid certificate for the TLS server.

Update your TLS (root) certificate in PEM format with your selected security tag (in this example, 1000), and start the modem:

Note

Sending multi-line text to Serial Modem requires the terminal to be configured to use <CR><LF> as the line ending.

AT+CFUN=0

OK

AT%CMNG=0,1000,0,"-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----"

OK

AT+CFUN=1

OK
  1. Test the TLS connection with a TLS socket:

    1. Open a TLS socket that uses the security tag 1000 and connect to a TLS server on a specified port. Replace example.com with the hostname or IPv4 address of a TLS server and 1234 with the corresponding port.

      AT#XSSOCKET=1,1,0,1000
      
      #XSSOCKET: 0,1,258
      
      OK
      
      AT#XCONNECT=0,"example.com",1234
      
      #XCONNECT: 0,1
      
      OK
    2. Send plaintext data to the TLS server and retrieve the response.

      AT#XSEND=0,0,0,"Test TLS"
      
      #XSEND: 0,0,8
      
      OK
      
      AT#XRECV=0,0,0,0
      
      #XRECV: 0,0,8
      Test TLS
      OK
    3. Close the socket.

      AT#XCLOSE=0
      
      #XCLOSE: 0,0
      
      OK

DTLS connection

The following steps assume that you have a DTLS echo server available with pre-shared key (PSK) authentication.

Update your hex-encoded PSK and the PSK identity to be used for the DTLS connection in the modem, with your selected security tag (in this example, 1001):

AT+CFUN=0

OK

AT%CMNG=0,1001,3,"6e7266393174657374"

OK

AT%CMNG=0,1001,4,"nrf91test"

OK

AT+CFUN=1

OK
  1. Test the DTLS connection with a DTLS socket:

    1. Open a DTLS socket that uses the security tag 1001 and connect to a DTLS server on a specified port. Replace example.com with the hostname or IPv4 address of a DTLS server and 1234 with the corresponding port.

      AT#XSSOCKET=1,2,0,1001
      
      #XSSOCKET: 0,2,273
      
      OK
      
      AT#XCONNECT=0,"example.com",1234
      
      #XCONNECT: 0,1
      
      OK
      1. Send plaintext data to the DTLS server and retrieve the returned data.

      AT#XSEND=0,0,0,"Test DTLS"
      
      #XSEND: 0,0,9
      
      OK
      
      AT#XRECV=0,0,0,0
      
      #XRECV: 0,0,9
      Test DTLS
      OK
    2. Close the socket.

      AT#XCLOSE=0
      
      #XCLOSE: 0,0
      
      OK

UDP server

To act as a UDP server, the nRF91 Series DK must have a public IP address and the radio network must be configured to route incoming IP packets to the nRF91 Series DK. These depend on the network and SIM card used.

To check your current setup, use the AT+CGDCONT? command to check if the IP address allocated by the network is a reserved IPv4 private address of class A, B, or C (see Private addresses). If it is, the device is not reachable from the public network with this IPv4 address and you should try with an IPv6 address instead. Generally, IPv6 addresses are more likely to be reachable from the public network.

To test the UDP server functionality, complete the following steps:

  1. Create a Python script client_udp.py that acts as a UDP client. See the following sample code (make sure to use the correct IP addresses and port):

    import socket
    import time
    
    host_addr = '000.000.000.00'
    host_port = 1234
    host = (host_addr, host_port)
    local_addr = '9.999.999.99'
    local_port = 1234
    local = (local_addr, local_port)
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind(local)
    print("Sending: 'Hello, UDP#1!")
    s.sendto(b"Hello, UDP#1!", host)
    time.sleep(1)
    print("Sending: 'Hello, UDP#2!")
    s.sendto(b"Hello, UDP#2!", host)
    data, address = s.recvfrom(1024)
    print(data)
    print(address)
    
    print("Sending: 'Hello, UDP#3!")
    s.sendto(b"Hello, UDP#3!", host)
    time.sleep(1)
    print("Sending: 'Hello, UDP#4!")
    s.sendto(b"Hello, UDP#4!", host)
    time.sleep(1)
    print("Sending: 'Hello, UDP#5!")
    s.sendto(b"Hello, UDP#5!", host)
    data, address = s.recvfrom(1024)
    print(data)
    print(address)
    
    print("Closing connection")
    s.close()
    
  2. Establish and test a UDP connection:

    1. Open a UDP socket and bind it to the UDP port that you want to use. Replace 1234 with the correct port number.

      AT#XSOCKET=1,2,1
      #XSOCKET: 0,2,17
      OK
      
      AT#XBIND=0,1234
      OK
    2. Run the client_udp.py script to start sending data to the server.

    3. Start receiving and acknowledging the data. Replace example.com with the hostname or IPv4 address of the UDP client and 1234 with the corresponding port. A more complete example would use AT#XAPOLL to see when data has arrived and then read it with AT#XRECVFROM.

      AT#XRECVFROM=0,0,0,0
      #XRECVFROM: 0,0,13,"<IP address>",<port>
      Hello, UDP#1!
      OK
      
      AT#XRECVFROM=0,0,0,0
      #XRECVFROM: 0,0,13,"<IP address>",<port>
      Hello, UDP#2!
      OK
      
      AT#XSENDTO=0,0,0,"example.com",1234,"UDP1/2 received"
      #XSENDTO: 0,0,15
      OK
      
      AT#XRECVFROM=0,0,0,0
      #XRECVFROM: 0,0,13,"<IP address>",<port>
      Hello, UDP#3!
      OK
      
      AT#XRECVFROM=0,0,0,0
      #XRECVFROM: 0,0,13,"<IP address>",<port>
      Hello, UDP#4!
      OK
      
      AT#XRECVFROM=0,0,0,0
      #XRECVFROM: 0,0,13,"<IP address>",<port>
      Hello, UDP#5!
      OK
      
      AT#XSENDTO=0,0,0,"example.com",1234,"UDP3/4/5 received"
      #XSENDTO: 0,0,17
      OK
    4. Observe the output of the Python script:

      $ python client_udp.py
      
      Sending: 'Hello, UDP#1!
      Sending: 'Hello, UDP#2!
      b'UDP1/2 received'
      ('000.000.000.00', 1234, 0, 0)
      Sending: 'Hello, UDP#3!
      Sending: 'Hello, UDP#4!
      Sending: 'Hello, UDP#5!
      b'UDP3/4/5 received'
      ('000.000.000.00', 1234, 0, 0)
      Closing connection
      
    5. Close the socket.

      AT#XCLOSE=0
      #XCLOSE: 0,0
      OK

DNS lookup

  1. Look up the IP address for a hostname.

    AT#XGETADDRINFO="www.google.com"
    #XGETADDRINFO: "172.217.174.100"
    OK
    
    AT#XGETADDRINFO="ipv6.google.com"
    #XGETADDRINFO: "2404:6800:4006:80e::200e"
    OK
    
    AT#XGETADDRINFO="172.217.174.100"
    #XGETADDRINFO: "172.217.174.100"
    OK
    
    AT#XGETADDRINFO="2404:6800:4006:80e::200e"
    #XGETADDRINFO: "2404:6800:4006:80e::200e"
    OK

Socket options

After opening a client-role socket, you can configure various options.

  1. Check the available values for the XSOCKETOPT command.

    AT#XSOCKETOPT=?
    #XSOCKETOPT: <handle>,(0,1),<name>,<value>
    OK
  2. Open a client socket.

    AT#XSOCKET=1,1,0
    #XSOCKET: 0,1,6
    OK
  3. Test to set and get socket options. Note that not all options are supported.

    AT#XSOCKETOPT=0,1,20,30
    OK

ICMP AT commands

Complete the following steps to test the functionality provided by the ICMP AT commands:

  1. Ping a remote host, for example, www.google.com.

    AT#XPING="www.google.com",45,5000,5,1000
    OK
    #XPING: 0.637 seconds
    #XPING: 0.585 seconds
    #XPING: 0.598 seconds
    #XPING: 0.598 seconds
    #XPING: 0.599 seconds
    #XPING: average 0.603 seconds
    
    AT#XPING="ipv6.google.com",45,5000,5,1000
    OK
    #XPING: 0.140 seconds
    #XPING: 0.109 seconds
    #XPING: 0.113 seconds
    #XPING: 0.118 seconds
    #XPING: 0.112 seconds
    #XPING: average 0.118 seconds
  2. Ping a remote IP address, for example, 172.217.174.100.

    AT#XPING="172.217.174.100",45,5000,5,1000
    OK
    #XPING: 0.873 seconds
    #XPING: 0.576 seconds
    #XPING: 0.599 seconds
    #XPING: 0.623 seconds
    #XPING: 0.577 seconds
    #XPING: average 0.650 seconds