This is an example based on mbed-os cellular APIs that demonstrates a TCP or UDP echo transaction with a public echo server.

This code is forked from https://os.mbed.com/teams/mbed-os-examples/code/mbed-os-example-cellular/

This is an example showing how to use Skywire board with LE910-x module.

In this example, I had used the LE910-EUG module for 4G communication. Mbed OS code wasn't changed for LE910-x, because the Telit' HE910 is included mainline code on Mbed OS already. HE910 and LE910 are most similar. Therefore you can use LE910 via HE910 driver. Please check to configure of mbed_app.json, and initialize code for Skywire board of main.cpp.

Open mbed_app.json, you need to define a UART for the MCU to communicate with the xE910 module.

            "TELIT_HE910.tx"                 : "D1",
            "TELIT_HE910.rx"                 : "D0",
            "TELIT_HE910.provide-default"    : true

If you are using Pelion CM, make the following settings:

            "nsapi.default-cellular-apn"     : "\"stream.co.uk\"",
            "nsapi.default-cellular-username": "\"streamip\"",
            "nsapi.default-cellular-password": "\"streamip\"",

For your information, please see Pelion Connectivity Quick start guide.

320

You can find Skywire sensor shield information though NimbeLink site.

Tested with

  • DISCO_L475VG_IOT01A
  • K64F

1. Import the application into your desktop:

 mbed import https://os.mbed.com/users/Daniel_Lee/code/mbed-os-example-cellular-le910/

 cd mbed-os-example-cellular-le910

2. Compile and program:

mbed compile -t GCC_ARM -m DISCO_L475VG_IOT01A

(supported toolchains : GCC_ARM / ARM / IAR)

3. Download binary to a target board

4. Result

mbed-os-example-cellular


Built: Feb  7 2020, 07:02:27
Starting Skywire board with LE910-EUG Demo...
Waiting for Skywire to Boot...
Wait 15 seconds..
Establishing connection


Connection Established.
TCP: connected with echo.mbedcloudtesting.com server
TCP: Sent 4 Bytes to echo.mbedcloudtesting.com
Received from echo server 4 Bytes


Success. Exiting 
Committer:
mbed_official
Date:
Thu Mar 08 17:31:37 2018 +0000
Revision:
0:4611f6cf2413
Child:
1:ccaceb0dbbaf
Initial commit.
Commit copied from https://github.com/ARMmbed/mbed-os-example-cellular

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:4611f6cf2413 1 properties ([[$class: 'ParametersDefinitionProperty', parameterDefinitions: [
mbed_official 0:4611f6cf2413 2 [$class: 'StringParameterDefinition', name: 'mbed_os_revision', defaultValue: 'mbed-os-5.4', description: 'Revision of mbed-os to build'],
mbed_official 0:4611f6cf2413 3 [$class: 'BooleanParameterDefinition', name: 'smoke_test', defaultValue: true, description: 'Runs HW smoke tests on Cellular devices']
mbed_official 0:4611f6cf2413 4 ]]])
mbed_official 0:4611f6cf2413 5
mbed_official 0:4611f6cf2413 6 echo "Run smoke tests: ${params.smoke_test}"
mbed_official 0:4611f6cf2413 7
mbed_official 0:4611f6cf2413 8 try {
mbed_official 0:4611f6cf2413 9 echo "Verifying build with mbed-os version ${mbed_os_revision}"
mbed_official 0:4611f6cf2413 10 env.MBED_OS_REVISION = "${mbed_os_revision}"
mbed_official 0:4611f6cf2413 11 } catch (err) {
mbed_official 0:4611f6cf2413 12 def mbed_os_revision = "master"
mbed_official 0:4611f6cf2413 13 echo "Verifying build with mbed-os version ${mbed_os_revision}"
mbed_official 0:4611f6cf2413 14 env.MBED_OS_REVISION = "${mbed_os_revision}"
mbed_official 0:4611f6cf2413 15 }
mbed_official 0:4611f6cf2413 16
mbed_official 0:4611f6cf2413 17 // Map RaaS instances to corresponding test suites
mbed_official 0:4611f6cf2413 18 def raas = [
mbed_official 0:4611f6cf2413 19 "cellular_smoke_ublox_c027.json": "8072"
mbed_official 0:4611f6cf2413 20 // Currently dragonfly is not supported by RAAS, skip it
mbed_official 0:4611f6cf2413 21 //"cellular_smoke_mts_dragonfly.json": "8072"
mbed_official 0:4611f6cf2413 22 ]
mbed_official 0:4611f6cf2413 23
mbed_official 0:4611f6cf2413 24 // List of targets with supported modem families
mbed_official 0:4611f6cf2413 25 def target_families = [
mbed_official 0:4611f6cf2413 26 "UBLOX": ["UBLOX_C027"]
mbed_official 0:4611f6cf2413 27 ]
mbed_official 0:4611f6cf2413 28
mbed_official 0:4611f6cf2413 29 // Supported Modems
mbed_official 0:4611f6cf2413 30 def targets = [
mbed_official 0:4611f6cf2413 31 "UBLOX_C027"
mbed_official 0:4611f6cf2413 32 ]
mbed_official 0:4611f6cf2413 33
mbed_official 0:4611f6cf2413 34 // Map toolchains to compilers
mbed_official 0:4611f6cf2413 35 def toolchains = [
mbed_official 0:4611f6cf2413 36 ARM: "armcc",
mbed_official 0:4611f6cf2413 37 GCC_ARM: "arm-none-eabi-gcc",
mbed_official 0:4611f6cf2413 38 IAR: "iar_arm"
mbed_official 0:4611f6cf2413 39 ]
mbed_official 0:4611f6cf2413 40
mbed_official 0:4611f6cf2413 41 // supported socket tests
mbed_official 0:4611f6cf2413 42 def sockets = [
mbed_official 0:4611f6cf2413 43 "udp",
mbed_official 0:4611f6cf2413 44 "tcp"
mbed_official 0:4611f6cf2413 45 ]
mbed_official 0:4611f6cf2413 46
mbed_official 0:4611f6cf2413 47 def stepsForParallel = [:]
mbed_official 0:4611f6cf2413 48
mbed_official 0:4611f6cf2413 49 // Jenkins pipeline does not support map.each, we need to use oldschool for loop
mbed_official 0:4611f6cf2413 50 for (int i = 0; i < target_families.size(); i++) {
mbed_official 0:4611f6cf2413 51 for(int j = 0; j < toolchains.size(); j++) {
mbed_official 0:4611f6cf2413 52 for(int k = 0; k < targets.size(); k++) {
mbed_official 0:4611f6cf2413 53 for(int l = 0; l < sockets.size(); l++) {
mbed_official 0:4611f6cf2413 54 def target_family = target_families.keySet().asList().get(i)
mbed_official 0:4611f6cf2413 55 def allowed_target_type = target_families.get(target_family)
mbed_official 0:4611f6cf2413 56 def target = targets.get(k)
mbed_official 0:4611f6cf2413 57 def toolchain = toolchains.keySet().asList().get(j)
mbed_official 0:4611f6cf2413 58 def compilerLabel = toolchains.get(toolchain)
mbed_official 0:4611f6cf2413 59 def stepName = "${target} ${toolchain}"
mbed_official 0:4611f6cf2413 60 def socket = sockets.get(l)
mbed_official 0:4611f6cf2413 61
mbed_official 0:4611f6cf2413 62 if(allowed_target_type.contains(target)) {
mbed_official 0:4611f6cf2413 63 stepsForParallel[stepName] = buildStep(target_family, target, compilerLabel, toolchain, socket)
mbed_official 0:4611f6cf2413 64 }
mbed_official 0:4611f6cf2413 65 }
mbed_official 0:4611f6cf2413 66 }
mbed_official 0:4611f6cf2413 67 }
mbed_official 0:4611f6cf2413 68 }
mbed_official 0:4611f6cf2413 69
mbed_official 0:4611f6cf2413 70
mbed_official 0:4611f6cf2413 71 def parallelRunSmoke = [:]
mbed_official 0:4611f6cf2413 72
mbed_official 0:4611f6cf2413 73 // Need to compare boolean against string value
mbed_official 0:4611f6cf2413 74 if ( params.smoke_test == true ) {
mbed_official 0:4611f6cf2413 75 // Generate smoke tests based on suite amount
mbed_official 0:4611f6cf2413 76 for(int i = 0; i < raas.size(); i++) {
mbed_official 0:4611f6cf2413 77 for(int j = 0; j < sockets.size(); j++) {
mbed_official 0:4611f6cf2413 78 def suite_to_run = raas.keySet().asList().get(i)
mbed_official 0:4611f6cf2413 79 def raasPort = raas.get(suite_to_run)
mbed_official 0:4611f6cf2413 80 def socket = sockets.get(j)
mbed_official 0:4611f6cf2413 81
mbed_official 0:4611f6cf2413 82 // Parallel execution needs unique step names. Remove .json file ending.
mbed_official 0:4611f6cf2413 83 def smokeStep = "${raasPort} ${suite_to_run.substring(0, suite_to_run.indexOf('.'))}"
mbed_official 0:4611f6cf2413 84 parallelRunSmoke[smokeStep] = run_smoke(target_families, raasPort, suite_to_run, toolchains, targets, socket)
mbed_official 0:4611f6cf2413 85 }
mbed_official 0:4611f6cf2413 86 }
mbed_official 0:4611f6cf2413 87 }
mbed_official 0:4611f6cf2413 88
mbed_official 0:4611f6cf2413 89 timestamps {
mbed_official 0:4611f6cf2413 90 parallel stepsForParallel
mbed_official 0:4611f6cf2413 91 parallel parallelRunSmoke
mbed_official 0:4611f6cf2413 92 }
mbed_official 0:4611f6cf2413 93
mbed_official 0:4611f6cf2413 94 def buildStep(target_family, target, compilerLabel, toolchain, socket) {
mbed_official 0:4611f6cf2413 95 return {
mbed_official 0:4611f6cf2413 96 stage ("${target_family}_${target}_${compilerLabel}") {
mbed_official 0:4611f6cf2413 97 node ("${compilerLabel}") {
mbed_official 0:4611f6cf2413 98 deleteDir()
mbed_official 0:4611f6cf2413 99 dir("mbed-os-example-cellular") {
mbed_official 0:4611f6cf2413 100 checkout scm
mbed_official 0:4611f6cf2413 101 def config_file = "mbed_app.json"
mbed_official 0:4611f6cf2413 102
mbed_official 0:4611f6cf2413 103 // Activate traces
mbed_official 0:4611f6cf2413 104 //execute("sed -i 's/\"mbed-trace.enable\": false/\"mbed-trace.enable\": true/' ${config_file}")
mbed_official 0:4611f6cf2413 105
mbed_official 0:4611f6cf2413 106 //change socket typembed_app.json
mbed_official 0:4611f6cf2413 107
mbed_official 0:4611f6cf2413 108
mbed_official 0:4611f6cf2413 109 execute("sed -i 's/\"sock-type\": .*/\"sock-type\": \"${socket}\",/' ${config_file}")
mbed_official 0:4611f6cf2413 110
mbed_official 0:4611f6cf2413 111 // Set mbed-os to revision received as parameter
mbed_official 0:4611f6cf2413 112 execute ("mbed deploy --protocol ssh")
mbed_official 0:4611f6cf2413 113 //dir ("mbed-os") {
mbed_official 0:4611f6cf2413 114 // execute ("git checkout ${env.MBED_OS_REVISION}")
mbed_official 0:4611f6cf2413 115 //}
mbed_official 0:4611f6cf2413 116
mbed_official 0:4611f6cf2413 117 execute ("mbed compile --build out/${target}_${toolchain}/ -m ${target} -t ${toolchain} -c --app-config ${config_file}")
mbed_official 0:4611f6cf2413 118 }
mbed_official 0:4611f6cf2413 119 stash name: "${target}_${toolchain}_${socket}", includes: '**/mbed-os-example-cellular.bin'
mbed_official 0:4611f6cf2413 120 archive '**/mbed-os-example-cellular.bin'
mbed_official 0:4611f6cf2413 121 step([$class: 'WsCleanup'])
mbed_official 0:4611f6cf2413 122 }
mbed_official 0:4611f6cf2413 123 }
mbed_official 0:4611f6cf2413 124 }
mbed_official 0:4611f6cf2413 125 }
mbed_official 0:4611f6cf2413 126
mbed_official 0:4611f6cf2413 127 def run_smoke(target_families, raasPort, suite_to_run, toolchains, targets, socket) {
mbed_official 0:4611f6cf2413 128 return {
mbed_official 0:4611f6cf2413 129 env.RAAS_USERNAME = "user"
mbed_official 0:4611f6cf2413 130 env.RAAS_PASSWORD = "user"
mbed_official 0:4611f6cf2413 131 // Remove .json from suite name
mbed_official 0:4611f6cf2413 132 def suiteName = suite_to_run.substring(0, suite_to_run.indexOf('.'))
mbed_official 0:4611f6cf2413 133 stage ("smoke_${raasPort}_${suiteName}") {
mbed_official 0:4611f6cf2413 134 //node is actually the type of machine, i.e., mesh-test boild down to linux
mbed_official 0:4611f6cf2413 135 node ("mesh-test") {
mbed_official 0:4611f6cf2413 136 deleteDir()
mbed_official 0:4611f6cf2413 137 dir("mbed-clitest") {
mbed_official 0:4611f6cf2413 138 git "git@github.com:ARMmbed/mbed-clitest.git"
mbed_official 0:4611f6cf2413 139 execute("git checkout master")
mbed_official 0:4611f6cf2413 140 dir("mbed-clitest-suites") {
mbed_official 0:4611f6cf2413 141 git "git@github.com:ARMmbed/mbed-clitest-suites.git"
mbed_official 0:4611f6cf2413 142 execute("git submodule update --init --recursive")
mbed_official 0:4611f6cf2413 143 execute("git all checkout master")
mbed_official 0:4611f6cf2413 144 dir("cellular") {
mbed_official 0:4611f6cf2413 145 execute("git checkout master")
mbed_official 0:4611f6cf2413 146 }
mbed_official 0:4611f6cf2413 147 }
mbed_official 0:4611f6cf2413 148
mbed_official 0:4611f6cf2413 149 for (int i = 0; i < target_families.size(); i++) {
mbed_official 0:4611f6cf2413 150 for(int j = 0; j < toolchains.size(); j++) {
mbed_official 0:4611f6cf2413 151 for(int k = 0; k < targets.size(); k++) {
mbed_official 0:4611f6cf2413 152 def target_family = target_families.keySet().asList().get(i)
mbed_official 0:4611f6cf2413 153 def allowed_target_type = target_families.get(target_family)
mbed_official 0:4611f6cf2413 154 def target = targets.get(k)
mbed_official 0:4611f6cf2413 155 def toolchain = toolchains.keySet().asList().get(j)
mbed_official 0:4611f6cf2413 156
mbed_official 0:4611f6cf2413 157 if(allowed_target_type.contains(target)) {
mbed_official 0:4611f6cf2413 158 unstash "${target}_${toolchain}_${socket}"
mbed_official 0:4611f6cf2413 159 }
mbed_official 0:4611f6cf2413 160 }
mbed_official 0:4611f6cf2413 161 }
mbed_official 0:4611f6cf2413 162 }
mbed_official 0:4611f6cf2413 163 if ("${suiteName}" == "cellular_smoke_mts_dragonfly") {
mbed_official 0:4611f6cf2413 164 execute("python clitest.py --suitedir mbed-clitest-suites/suites/ --suite ${suite_to_run} --type hardware --reset hard --raas 62.44.193.186:${raasPort} --tcdir mbed-clitest-suites/cellular --failure_return_value -vvv -w --log log_${raasPort}_${suiteName}")
mbed_official 0:4611f6cf2413 165 } else {
mbed_official 0:4611f6cf2413 166 execute("python clitest.py --suitedir mbed-clitest-suites/suites/ --suite ${suite_to_run} --type hardware --reset --raas 62.44.193.186:${raasPort} --tcdir mbed-clitest-suites/cellular --failure_return_value -vvv -w --log log_${raasPort}_${suiteName}")
mbed_official 0:4611f6cf2413 167 }
mbed_official 0:4611f6cf2413 168 archive "log_${raasPort}_${suiteName}/**/*"
mbed_official 0:4611f6cf2413 169 }
mbed_official 0:4611f6cf2413 170 }
mbed_official 0:4611f6cf2413 171 }
mbed_official 0:4611f6cf2413 172 }
mbed_official 0:4611f6cf2413 173 }