Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

location: cellular: initial support with example application #717

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions examples/zephyr/location/cellular/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.20.0)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(location_cellular)

target_sources(app PRIVATE src/main.c)
target_sources_ifdef(CONFIG_GOLIOTH_CELLULAR_PLAYBACK app PRIVATE src/cellular_playback.c)
target_sources_ifdef(CONFIG_SOC_SERIES_NRF91X app PRIVATE src/cellular_nrf91.c)
32 changes: 32 additions & 0 deletions examples/zephyr/location/cellular/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Copyright (c) 2021-2024 Golioth, Inc.
# SPDX-License-Identifier: Apache-2.0

source "${ZEPHYR_GOLIOTH_FIRMWARE_SDK_MODULE_DIR}/examples/zephyr/common/Kconfig.defconfig"

config APP_LOCATION_GET_INTERVAL
int "Interval (msec)"
default 0 if GOLIOTH_CELLULAR_PLAYBACK
default 5000
help
Interval (msec) between requests of location information using cellular data.

config GOLIOTH_CELLULAR_PLAYBACK
bool
default y
depends on DT_HAS_GOLIOTH_CELLULAR_PLAYBACK_ENABLED

if GOLIOTH_CELLULAR_PLAYBACK

config GOLIOTH_CELLULAR_PLAYBACK_SPEED_FACTOR
int "Speed factor"
default 1000
help
Speed of playback.

1000 means 1x (normal) speed.
3000 means 3x speed.
500 means 0.5x speed.

endif # GOLIOTH_CELLULAR_PLAYBACK

source "Kconfig.zephyr"
199 changes: 199 additions & 0 deletions examples/zephyr/location/cellular/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
# Golioth cellular location demo

## Overview

This sample demonstrates how to connect to Golioth and get location
using cellular network cell towers information.

## Requirements

* Golioth credentials
* Network connectivity

## Building and Running

### Authentication specific configuration

#### PSK based auth - Hardcoded

Configure the following Kconfig options based on your Golioth
credentials:

* GOLIOTH_SAMPLE_PSK_ID - PSK ID of registered device
* GOLIOTH_SAMPLE_PSK - PSK of registered device

by adding these lines to configuration file (e.g. `prj.conf`):

```cfg
CONFIG_GOLIOTH_SAMPLE_PSK_ID="my-psk-id"
CONFIG_GOLIOTH_SAMPLE_PSK="my-psk"
```

#### PSK based auth - Runtime

We provide an option for setting Golioth credentials through the Zephyr
shell. This is based on the Zephyr Settings subsystem.

Enable the settings shell by including the following configuration overlay
file:

```sh
$ west build -- -DEXTRA_CONF_FILE=../../common/runtime_settings.conf
```

Alternatively, you can add the following options to ``prj.conf``:

```cfg
CONFIG_GOLIOTH_SAMPLE_HARDCODED_CREDENTIALS=n

CONFIG_FLASH=y
CONFIG_FLASH_MAP=y
CONFIG_NVS=y

CONFIG_SETTINGS=y
CONFIG_SETTINGS_RUNTIME=y
CONFIG_GOLIOTH_SAMPLE_SETTINGS=y
CONFIG_GOLIOTH_SAMPLE_WIFI_SETTINGS=y
CONFIG_GOLIOTH_SAMPLE_SETTINGS_AUTOLOAD=y
CONFIG_GOLIOTH_SAMPLE_SETTINGS_SHELL=y
```

At runtime, configure PSK-ID and PSK using the device shell based on your
Golioth credentials:

```sh
uart:~$ settings set golioth/psk-id <my-psk-id@my-project>
uart:~$ settings set golioth/psk <my-psk>
uart:-$ kernel reboot cold
```

#### Certificate based auth

Configure the following Kconfig options based on your Golioth
credentials:

* CONFIG_GOLIOTH_AUTH_METHOD_CERT - use certificate-based
authentication
* CONFIG_GOLIOTH_SAMPLE_HARDCODED_CRT_PATH - device certificate
* CONFIG_GOLIOTH_SAMPLE_HARDCODED_KEY_PATH - device private key

by adding these lines to configuration file (e.g. `prj.conf`):

```cfg
CONFIG_GOLIOTH_AUTH_METHOD_CERT=y
CONFIG_GOLIOTH_SAMPLE_HARDCODED_CRT_PATH="keys/device.crt.der"
CONFIG_GOLIOTH_SAMPLE_HARDCODED_KEY_PATH="keys/device.key.der"
```

### Platform specific configuration

#### Native Simulator

This application has been built and tested with Native Simulator
(native_sim).

On your Linux host computer, open a terminal window, locate the source
code of this sample application (i.e., `examples/zephyr/location/cellular`)
and type:

```console
$ west build -b native_sim examples/zephyr/location/cellular
$ west build -t run
```

#### ESP32-DevKitC-WROVER

Configure the following Kconfig options based on your WiFi AP
credentials:

- GOLIOTH_SAMPLE_WIFI_SSID - WiFi SSID
- GOLIOTH_SAMPLE_WIFI_PSK - WiFi PSK

by adding these lines to configuration file (e.g. `prj.conf`):

```cfg
CONFIG_GOLIOTH_SAMPLE_WIFI_SSID="my-wifi"
CONFIG_GOLIOTH_SAMPLE_WIFI_PSK="my-psk"
```

On your host computer open a terminal window, locate the source code of
this sample application (i.e., `examples/zephyr/location/cellular`) and type:

```console
$ west build -b esp32_devkitc_wrover/esp32/procpu examples/zephyr/location/cellular
$ west flash
```

#### nRF52840 DK + ESP32-WROOM-32

This subsection documents using nRF52840 DK running Zephyr with
offloaded ESP-AT WiFi driver and ESP32-WROOM-32 module based board (such
as ESP32 DevkitC rev. 4) running WiFi stack. See [AT Binary
Lists](https://docs.espressif.com/projects/esp-at/en/latest/AT_Binary_Lists/index.html)
for links to ESP-AT binaries and details on how to flash ESP-AT image on
ESP chip. Flash ESP chip with following command:

```console
esptool.py write_flash --verify 0x0 PATH_TO_ESP_AT/factory/factory_WROOM-32.bin
```

Connect nRF52840 DK and ESP32-DevKitC V4 (or other ESP32-WROOM-32 based
board) using wires:

| nRF52840 DK | ESP32-WROOM-32 | ESP32-WROVER-32 |
| ----------- | --------------- | ----------------|
| P1.01 (RX) | IO17 (TX) | IO22 (TX) |
| P1.02 (TX) | IO16 (RX) | IO19 (RX) |
| P1.03 (CTS) | IO14 (RTS) | IO14 (RTS) |
| P1.04 (RTS) | IO15 (CTS) | IO15 (CTS) |
| P1.05 | EN | EN |
| GND | GND | GND |

Configure the following Kconfig options based on your WiFi AP
credentials:

* GOLIOTH_SAMPLE_WIFI_SSID - WiFi SSID
* GOLIOTH_SAMPLE_WIFI_PSK - WiFi PSK

by adding these lines to configuration file (e.g. `prj.conf` or
`board/nrf52840dk_nrf52840.conf`):

```cfg
CONFIG_GOLIOTH_SAMPLE_WIFI_SSID="my-wifi"
CONFIG_GOLIOTH_SAMPLE_WIFI_PSK="my-psk"
```

On your host computer open a terminal window, locate the source code of
this sample application (i.e., `examples/zephyr/location/cellular`) and type:

```console
$ west build -b nrf52840dk/nrf52840 examples/zephyr/location/cellular
$ west flash
```

### Sample output

This is the output from the serial console:

```console
*** Booting Zephyr OS build v4.0.0-1-gb39d67f51986 ***
[00:00:00.000,000] <inf> net_config: Initializing network
[00:00:00.000,000] <inf> net_config: IPv4 address: 192.0.2.1
[00:00:00.000,000] <dbg> location_cellular_main: main: Start cellular location sample
[00:00:00.000,000] <inf> golioth_mbox: Mbox created, bufsize: 1848, num_items: 10, item_size: 168
[00:00:00.420,003] <inf> golioth_coap_client_zephyr: Golioth CoAP client connected
[00:00:00.420,003] <inf> location_cellular_main: Golioth client connected
[00:00:00.420,003] <inf> golioth_coap_client_zephyr: Entering CoAP I/O loop
[00:00:01.970,001] <inf> location_cellular_main: 50.657497640 17.947626110 (883)
[00:00:02.240,001] <inf> location_cellular_main: 50.668119190 17.938356400 (440)
[00:00:02.660,001] <inf> location_cellular_main: 50.668119190 17.938356400 (440)
[00:00:03.670,001] <inf> location_cellular_main: 50.668119190 17.938356400 (440)
[00:00:04.160,001] <inf> location_cellular_main: 50.671241280 17.938356400 (456)
[00:00:07.180,001] <inf> location_cellular_main: 50.672496560 17.947390080 (626)
[00:00:07.660,001] <inf> location_cellular_main: 50.672496560 17.947390080 (626)
[00:00:08.670,001] <inf> location_cellular_main: 50.672496560 17.947390080 (626)
[00:00:09.160,001] <inf> location_cellular_main: 50.672496560 17.947390080 (626)
[00:00:09.770,001] <inf> location_cellular_main: 50.672496560 17.947390080 (626)
[00:00:10.660,001] <inf> location_cellular_main: 50.667496920 17.953419690 (324)
[00:00:11.260,001] <inf> location_cellular_main: 50.672496560 17.947390080 (626)
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Copyright (c) 2024 Golioth, Inc.
# SPDX-License-Identifier: Apache-2.0

description: Cellular driver with playback of scanned cellular networks

compatible: "golioth,cellular-playback"

include: base.yaml
15 changes: 15 additions & 0 deletions examples/zephyr/location/cellular/dts/bindings/vendor-prefixes.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Device tree binding vendor prefix registry. Keep this list in
# alphabetical order.
#
# This isn't an exhaustive list, but you should add new prefixes to it
# before using them to avoid name-space collisions.
#
# The contents of this file are parsed during documentation generation.
# Anything that starts with a '#' is treated as a comment and ignored.
# Non-empty lines should be in this format:
#
# <vendor-prefix><TAB><Full name of vendor>

# zephyr-keep-sorted-start
golioth Golioth, Inc.
# zephyr-keep-sorted-stop
9 changes: 9 additions & 0 deletions examples/zephyr/location/cellular/prj.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Application
CONFIG_GOLIOTH_SAMPLE_COMMON=y
CONFIG_GOLIOTH_SAMPLE_HARDCODED_CREDENTIALS=y

# Golioth Firmware SDK with all dependencies
CONFIG_GOLIOTH_FIRMWARE_SDK=y

CONFIG_GOLIOTH_LOCATION=y
CONFIG_GOLIOTH_LOCATION_CELLULAR=y
16 changes: 16 additions & 0 deletions examples/zephyr/location/cellular/sample.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
sample:
description: Location Cellular
name: location cellular
common:
build_only: true
tags:
- golioth
- location
- socket
tests:
sample.golioth.location_cellular:
platform_allow:
- native_sim
- native_sim/native/64
- nrf9151dk/nrf9151/ns
- nrf9160dk/nrf9160/ns
19 changes: 19 additions & 0 deletions examples/zephyr/location/cellular/socs/native.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Use offloaded sockets using host BSD sockets
CONFIG_ETH_DRIVER=n
CONFIG_ETH_NATIVE_POSIX=n
CONFIG_NET_DRIVERS=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_OFFLOAD=y
CONFIG_NET_NATIVE_OFFLOADED_SOCKETS=y
CONFIG_HEAP_MEM_POOL_SIZE=1024

# Use embedded libc to use Zephyr's eventfd instead of host eventfd
CONFIG_PICOLIBC=y

# Static networking
CONFIG_NET_CONFIG_LOG_LEVEL_DBG=y
CONFIG_NET_CONFIG_SETTINGS=y
CONFIG_NET_CONFIG_NEED_IPV4=y
CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1"
CONFIG_NET_CONFIG_MY_IPV4_GW="192.0.2.2"
CONFIG_NET_CONFIG_PEER_IPV4_ADDR="192.0.2.2"
6 changes: 6 additions & 0 deletions examples/zephyr/location/cellular/socs/native.overlay
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/ {
cellular-playback {
compatible = "golioth,cellular-playback";
status = "okay";
};
};
19 changes: 19 additions & 0 deletions examples/zephyr/location/cellular/socs/native_64.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Use offloaded sockets using host BSD sockets
CONFIG_ETH_DRIVER=n
CONFIG_ETH_NATIVE_POSIX=n
CONFIG_NET_DRIVERS=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_OFFLOAD=y
CONFIG_NET_NATIVE_OFFLOADED_SOCKETS=y
CONFIG_HEAP_MEM_POOL_SIZE=1024

# Use embedded libc to use Zephyr's eventfd instead of host eventfd
CONFIG_PICOLIBC=y

# Static networking
CONFIG_NET_CONFIG_LOG_LEVEL_DBG=y
CONFIG_NET_CONFIG_SETTINGS=y
CONFIG_NET_CONFIG_NEED_IPV4=y
CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1"
CONFIG_NET_CONFIG_MY_IPV4_GW="192.0.2.2"
CONFIG_NET_CONFIG_PEER_IPV4_ADDR="192.0.2.2"
1 change: 1 addition & 0 deletions examples/zephyr/location/cellular/socs/native_64.overlay
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include "native.overlay"
41 changes: 41 additions & 0 deletions examples/zephyr/location/cellular/socs/nrf9151_ns.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# General config
CONFIG_HEAP_MEM_POOL_SIZE=4096
CONFIG_NEWLIB_LIBC=y

# Networking
CONFIG_NET_SOCKETS_OFFLOAD=y
CONFIG_NET_IPV6=y
CONFIG_NET_IPV6_NBR_CACHE=n
CONFIG_NET_IPV6_MLD=n

# Increase native TLS socket implementation, so that it is chosen instead of
# offloaded nRF91 sockets
CONFIG_NET_SOCKETS_TLS_PRIORITY=35

# Modem library
CONFIG_NRF_MODEM_LIB=y

# LTE connectivity with network connection manager
CONFIG_NRF_MODEM_LIB_NET_IF=y
CONFIG_NRF_MODEM_LIB_NET_IF_AUTO_START=y
CONFIG_NRF_MODEM_LIB_NET_IF_AUTO_CONNECT=y
CONFIG_NET_CONNECTION_MANAGER=y
CONFIG_NET_CONNECTION_MANAGER_MONITOR_STACK_SIZE=1024

# Increased sysworkq size, due to LTE connectivity
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048

# Disable options y-selected by NCS for no good reason
CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED=n
CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED=n

# MbedTLS configuration to support p-384 curve. These options
# enable using the MbedTLS built-in support for operations not
# supported by the default nRF Oberon crypto backend
CONFIG_NORDIC_SECURITY_BACKEND=n
CONFIG_MBEDTLS_LEGACY_CRYPTO_C=y

# Generate MCUboot compatible images
CONFIG_BOOTLOADER_MCUBOOT=y

CONFIG_LTE_LC_NEIGHBOR_CELL_MEAS_MODULE=y
Loading
Loading