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:
Tue Apr 30 11:02:03 2019 +0100
Revision:
39:e57f130d65bd
Parent:
30:b528cee9bf09
Child:
41:1f13c9a6ee23
Merge pull request #136 from ARMmbed/https_raas_connection

Updated RaaS connection to use https
.
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 1:ccaceb0dbbaf 2 [$class: 'StringParameterDefinition', name: 'mbed_os_revision', defaultValue: '', description: 'Revision of mbed-os to build. To access mbed-os PR use format "pull/PR number/head"'],
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 1:ccaceb0dbbaf 6 if (env.MBED_OS_REVISION == null) {
mbed_official 1:ccaceb0dbbaf 7 echo 'First run in this branch, using default parameter values'
mbed_official 1:ccaceb0dbbaf 8 env.MBED_OS_REVISION = ''
mbed_official 1:ccaceb0dbbaf 9 }
mbed_official 1:ccaceb0dbbaf 10 if (env.MBED_OS_REVISION == '') {
mbed_official 1:ccaceb0dbbaf 11 echo 'Using mbed OS revision from mbed-os.lib'
mbed_official 1:ccaceb0dbbaf 12 } else {
mbed_official 1:ccaceb0dbbaf 13 echo "Using given mbed OS revision: ${env.MBED_OS_REVISION}"
mbed_official 1:ccaceb0dbbaf 14 if (env.MBED_OS_REVISION.matches('pull/\\d+/head')) {
mbed_official 1:ccaceb0dbbaf 15 echo "Revision is a Pull Request"
mbed_official 1:ccaceb0dbbaf 16 }
mbed_official 0:4611f6cf2413 17 }
mbed_official 0:4611f6cf2413 18
mbed_official 0:4611f6cf2413 19 // Map RaaS instances to corresponding test suites
mbed_official 0:4611f6cf2413 20 def raas = [
mbed_official 30:b528cee9bf09 21 "cellular_smoke_ublox_c027.json": "ruka"
mbed_official 1:ccaceb0dbbaf 22 //"cellular_smoke_mtb_mts_dragonfly.json": "8119"
mbed_official 1:ccaceb0dbbaf 23 ]
mbed_official 0:4611f6cf2413 24
mbed_official 0:4611f6cf2413 25 // Supported Modems
mbed_official 0:4611f6cf2413 26 def targets = [
mbed_official 1:ccaceb0dbbaf 27 "UBLOX_C027",
mbed_official 7:ad3e80a40359 28 "MTB_MTS_DRAGONFLY",
mbed_official 9:35a1fad017ca 29 "UBLOX_C030_U201"
mbed_official 9:35a1fad017ca 30 //"MTB_ADV_WISE_1570",
mbed_official 9:35a1fad017ca 31 //"K64F"
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 1:ccaceb0dbbaf 38 IAR: "iar_arm",
mbed_official 1:ccaceb0dbbaf 39 ARMC6: "arm6"
mbed_official 0:4611f6cf2413 40 ]
mbed_official 0:4611f6cf2413 41
mbed_official 0:4611f6cf2413 42 def stepsForParallel = [:]
mbed_official 0:4611f6cf2413 43
mbed_official 0:4611f6cf2413 44 // Jenkins pipeline does not support map.each, we need to use oldschool for loop
mbed_official 7:ad3e80a40359 45 for (int i = 0; i < targets.size(); i++) {
mbed_official 0:4611f6cf2413 46 for(int j = 0; j < toolchains.size(); j++) {
mbed_official 8:abfee2b3d29b 47 def target = targets.get(i)
mbed_official 8:abfee2b3d29b 48 def toolchain = toolchains.keySet().asList().get(j)
mbed_official 8:abfee2b3d29b 49 def compilerLabel = toolchains.get(toolchain)
mbed_official 8:abfee2b3d29b 50 def stepName = "${target} ${toolchain}"
mbed_official 0:4611f6cf2413 51
mbed_official 8:abfee2b3d29b 52 stepsForParallel[stepName] = buildStep(target, compilerLabel, toolchain)
mbed_official 0:4611f6cf2413 53 }
mbed_official 0:4611f6cf2413 54 }
mbed_official 0:4611f6cf2413 55
mbed_official 0:4611f6cf2413 56 def parallelRunSmoke = [:]
mbed_official 0:4611f6cf2413 57
mbed_official 0:4611f6cf2413 58 // Need to compare boolean against string value
mbed_official 1:ccaceb0dbbaf 59 if (params.smoke_test == true) {
mbed_official 1:ccaceb0dbbaf 60 echo "Running smoke tests"
mbed_official 0:4611f6cf2413 61 // Generate smoke tests based on suite amount
mbed_official 0:4611f6cf2413 62 for(int i = 0; i < raas.size(); i++) {
mbed_official 8:abfee2b3d29b 63 def suite_to_run = raas.keySet().asList().get(i)
mbed_official 8:abfee2b3d29b 64 def raasName = raas.get(suite_to_run)
mbed_official 7:ad3e80a40359 65
mbed_official 8:abfee2b3d29b 66 // Parallel execution needs unique step names. Remove .json file ending.
mbed_official 8:abfee2b3d29b 67 def smokeStep = "${raasName} ${suite_to_run.substring(0, suite_to_run.indexOf('.'))}"
mbed_official 8:abfee2b3d29b 68 parallelRunSmoke[smokeStep] = run_smoke(raasName, suite_to_run, toolchains, targets)
mbed_official 0:4611f6cf2413 69 }
mbed_official 1:ccaceb0dbbaf 70 } else {
mbed_official 1:ccaceb0dbbaf 71 echo "Skipping smoke tests"
mbed_official 0:4611f6cf2413 72 }
mbed_official 0:4611f6cf2413 73
mbed_official 0:4611f6cf2413 74 timestamps {
mbed_official 0:4611f6cf2413 75 parallel stepsForParallel
mbed_official 0:4611f6cf2413 76 parallel parallelRunSmoke
mbed_official 0:4611f6cf2413 77 }
mbed_official 0:4611f6cf2413 78
mbed_official 8:abfee2b3d29b 79 def buildStep(target, compilerLabel, toolchain) {
mbed_official 0:4611f6cf2413 80 return {
mbed_official 7:ad3e80a40359 81 stage ("${target}_${compilerLabel}") {
mbed_official 0:4611f6cf2413 82 node ("${compilerLabel}") {
mbed_official 0:4611f6cf2413 83 deleteDir()
mbed_official 0:4611f6cf2413 84 dir("mbed-os-example-cellular") {
mbed_official 0:4611f6cf2413 85 checkout scm
mbed_official 0:4611f6cf2413 86 def config_file = "mbed_app.json"
mbed_official 0:4611f6cf2413 87
mbed_official 8:abfee2b3d29b 88 // Configurations for different targets
mbed_official 7:ad3e80a40359 89 if ("${target}" == "UBLOX_C030_U201") {
mbed_official 7:ad3e80a40359 90 execute("sed -i 's/internet/JTM2M/' ${config_file}")
mbed_official 7:ad3e80a40359 91 }
mbed_official 0:4611f6cf2413 92
mbed_official 8:abfee2b3d29b 93 if ("${target}" == "UBLOX_C027") {
mbed_official 8:abfee2b3d29b 94 execute("sed -i 's/TCP/UDP/' ${config_file}")
mbed_official 8:abfee2b3d29b 95 }
mbed_official 0:4611f6cf2413 96
mbed_official 8:abfee2b3d29b 97 if ("${target}" == "MTB_ADV_WISE_1570") {
mbed_official 8:abfee2b3d29b 98 execute("sed -i 's/TCP/UDP/' ${config_file}")
mbed_official 8:abfee2b3d29b 99 execute("sed -i 's/\"lwip.ppp-enabled\": true,/\"lwip.ppp-enabled\": false,/' ${config_file}")
mbed_official 8:abfee2b3d29b 100 execute("sed -i 's/\"platform.default-serial-baud-rate\": 115200,/\"platform.default-serial-baud-rate\": 9600,/' ${config_file}")
mbed_official 8:abfee2b3d29b 101 }
mbed_official 8:abfee2b3d29b 102
mbed_official 8:abfee2b3d29b 103 if ("${target}" == "K64F") {
mbed_official 8:abfee2b3d29b 104 execute("sed -i 's/TCP/UDP/' ${config_file}")
mbed_official 8:abfee2b3d29b 105 execute("sed -i 's/\"lwip.ppp-enabled\": true,/\"lwip.ppp-enabled\": false,/' ${config_file}")
mbed_official 8:abfee2b3d29b 106 execute("sed -i 's/\"target_overrides\": {/\"macros\": [\"CELLULAR_DEVICE=QUECTEL_BG96\", \"MDMRXD=PTC16\", \"MDMTXD=PTC17\"], \"target_overrides\": {/' ${config_file}")
mbed_official 8:abfee2b3d29b 107 }
mbed_official 0:4611f6cf2413 108 // Set mbed-os to revision received as parameter
mbed_official 0:4611f6cf2413 109 execute ("mbed deploy --protocol ssh")
mbed_official 1:ccaceb0dbbaf 110 if (env.MBED_OS_REVISION != '') {
mbed_official 1:ccaceb0dbbaf 111 dir("mbed-os") {
mbed_official 1:ccaceb0dbbaf 112 if (env.MBED_OS_REVISION.matches('pull/\\d+/head')) {
mbed_official 1:ccaceb0dbbaf 113 // Use mbed-os PR and switch to branch created
mbed_official 1:ccaceb0dbbaf 114 execute("git fetch origin ${env.MBED_OS_REVISION}:_PR_")
mbed_official 1:ccaceb0dbbaf 115 execute("git checkout _PR_")
mbed_official 1:ccaceb0dbbaf 116 } else {
mbed_official 1:ccaceb0dbbaf 117 execute ("git checkout ${env.MBED_OS_REVISION}")
mbed_official 1:ccaceb0dbbaf 118 }
mbed_official 1:ccaceb0dbbaf 119 }
mbed_official 1:ccaceb0dbbaf 120 }
mbed_official 0:4611f6cf2413 121
mbed_official 0:4611f6cf2413 122 execute ("mbed compile --build out/${target}_${toolchain}/ -m ${target} -t ${toolchain} -c --app-config ${config_file}")
mbed_official 0:4611f6cf2413 123 }
mbed_official 8:abfee2b3d29b 124 if ("${target}" == "MTB_ADV_WISE_1570") {
mbed_official 8:abfee2b3d29b 125 stash name: "${target}_${toolchain}", includes: '**/mbed-os-example-cellular.hex'
mbed_official 8:abfee2b3d29b 126 archive '**/mbed-os-example-cellular.hex'
mbed_official 8:abfee2b3d29b 127 }
mbed_official 8:abfee2b3d29b 128 else {
mbed_official 8:abfee2b3d29b 129 stash name: "${target}_${toolchain}", includes: '**/mbed-os-example-cellular.bin'
mbed_official 8:abfee2b3d29b 130 archive '**/mbed-os-example-cellular.bin'
mbed_official 8:abfee2b3d29b 131 }
mbed_official 0:4611f6cf2413 132 step([$class: 'WsCleanup'])
mbed_official 0:4611f6cf2413 133 }
mbed_official 0:4611f6cf2413 134 }
mbed_official 0:4611f6cf2413 135 }
mbed_official 0:4611f6cf2413 136 }
mbed_official 0:4611f6cf2413 137
mbed_official 8:abfee2b3d29b 138 def run_smoke(raasName, suite_to_run, toolchains, targets) {
mbed_official 0:4611f6cf2413 139 return {
mbed_official 0:4611f6cf2413 140 env.RAAS_USERNAME = "user"
mbed_official 0:4611f6cf2413 141 env.RAAS_PASSWORD = "user"
mbed_official 0:4611f6cf2413 142 // Remove .json from suite name
mbed_official 0:4611f6cf2413 143 def suiteName = suite_to_run.substring(0, suite_to_run.indexOf('.'))
mbed_official 8:abfee2b3d29b 144 stage ("smoke_${raasName}_${suiteName}") {
mbed_official 0:4611f6cf2413 145 //node is actually the type of machine, i.e., mesh-test boild down to linux
mbed_official 1:ccaceb0dbbaf 146 node ("linux") {
mbed_official 0:4611f6cf2413 147 deleteDir()
mbed_official 0:4611f6cf2413 148 dir("mbed-clitest") {
mbed_official 0:4611f6cf2413 149 git "git@github.com:ARMmbed/mbed-clitest.git"
mbed_official 1:ccaceb0dbbaf 150 execute("git checkout ${env.LATEST_CLITEST_STABLE_REL}")
mbed_official 0:4611f6cf2413 151 dir("mbed-clitest-suites") {
mbed_official 0:4611f6cf2413 152 git "git@github.com:ARMmbed/mbed-clitest-suites.git"
mbed_official 0:4611f6cf2413 153 execute("git submodule update --init --recursive")
mbed_official 0:4611f6cf2413 154 execute("git all checkout master")
mbed_official 0:4611f6cf2413 155 dir("cellular") {
mbed_official 0:4611f6cf2413 156 execute("git checkout master")
mbed_official 0:4611f6cf2413 157 }
mbed_official 0:4611f6cf2413 158 }
mbed_official 0:4611f6cf2413 159
mbed_official 7:ad3e80a40359 160 for (int i = 0; i < targets.size(); i++) {
mbed_official 0:4611f6cf2413 161 for(int j = 0; j < toolchains.size(); j++) {
mbed_official 7:ad3e80a40359 162 def target = targets.get(i)
mbed_official 7:ad3e80a40359 163 def toolchain = toolchains.keySet().asList().get(j)
mbed_official 8:abfee2b3d29b 164 unstash "${target}_${toolchain}"
mbed_official 0:4611f6cf2413 165 }
mbed_official 0:4611f6cf2413 166 }
mbed_official 8:abfee2b3d29b 167 execute("python clitest.py --suitedir mbed-clitest-suites/suites/ --suite ${suite_to_run} --type hardware --reset \
mbed_official 39:e57f130d65bd 168 --raas https://${raasName}.mbedcloudtesting.com:443 --tcdir mbed-clitest-suites/cellular --raas_queue --raas_queue_timeout 3600 \
mbed_official 8:abfee2b3d29b 169 --raas_share_allocs --failure_return_value -vvv -w --log log_${raasName}_${suiteName}")
mbed_official 8:abfee2b3d29b 170 archive "log_${raasName}_${suiteName}/**/*"
mbed_official 0:4611f6cf2413 171 }
mbed_official 0:4611f6cf2413 172 }
mbed_official 0:4611f6cf2413 173 }
mbed_official 0:4611f6cf2413 174 }
mbed_official 0:4611f6cf2413 175 }