Serial protocol
Devices that don't have a direct internet connection can connect to the remote management service over serial. This is done via the the serial daemon, which is an application that runs on a host machine. The serial daemon connects to a device over a serial port, and sends AT commands back and forth to the device. If your device implements all AT commands on this page, the serial daemon should work as-is on your device.
Communication between host and device is done with the following settings:
- Baud rate 115200.
- Data bits: 8.
- Return key: CR.
A comprehensive test suite for devices implementing this protocol is located here: edgeimpulse/integration-tests-firmware.
This overview should be printed when
AT+HELP
is issued.AT+HELP - Lists all commands
AT+CLEARCONFIG - Clears complete config and resets system
AT+CLEARFILES - Clears all files from the file system, this does not clear config
AT+CONFIG? - Lists complete config
AT+DEVICEINFO? - Lists device information
AT+SENSORS? - Lists sensors
AT+RESET - Reset the system
AT+WIFI? - Lists current WiFi credentials
AT+WIFI= - Sets current WiFi credentials (SSID,PASSWORD,SECURITY) (3 parameters)
AT+SCANWIFI - Scans for WiFi networks
AT+SAMPLESETTINGS? - Lists current sampling settings
AT+SAMPLESETTINGS= - Sets current sampling settings (LABEL,INTERVAL_MS,LENGTH_MS) (3 parameters)
AT+SAMPLESETTINGS= - Sets current sampling settings (LABEL,INTERVAL_MS,LENGTH_MS,HMAC_KEY) (4 parameters)
AT+UPLOADSETTINGS? - Lists current upload settings
AT+UPLOADSETTINGS= - Sets current upload settings (APIKEY,PATH) (2 parameters)
AT+UPLOADHOST= - Sets upload host (HOST) (1 parameter)
AT+MGMTSETTINGS? - Lists current management settings
AT+MGMTSETTINGS= - Sets current management settings (URL) (1 parameter)
AT+LISTFILES - Lists all files on the device
AT+READFILE= - Read a specific file (as base64) (1 parameter)
AT+READBUFFER= - Read from the temporary buffer (as base64) (START,LENGTH) (2 parameters)
AT+UNLINKFILE= - Unlink a specific file (1 parameter)
AT+UPLOADFILE= - Upload a specific file (1 parameter)
AT+SAMPLESTART= - Start sampling (1 parameter)
It's allowed to add custom commands. For example, these commands are implemented in the Edge Impulse firmware for the ST B-L475E-IOT01A, but are not used by the serial daemon.
AT+FILLMEMORY - Try and fill the full RAM, to report free heap stats
AT+RUNIMPULSE - Run the impulse
AT+RUNIMPULSEDEBUG - Run the impulse with debug messages
Clears the complete configuration, and resets the system. Has no return value. Example:
> AT+CLEARCONFIG
Clearing config and restarting system...
Hello from the Edge Impulse Device SDK.
Afterwards all settings should be reset.
Restarts the system, but leaves all configuration intact. Has no return value. Example:
> AT+RESET
Hello from the Edge Impulse Device SDK.
Lists all configuration options, grouped by category. Lines with category names start and end with
=====
. Lines with configuration options follow key: value
, with arbitrary whitespace between :
and the value. Example:===== Device info =====
ID: C4:7F:51:94:4A:38
Type: DISCO_L475VG_IOT01A
AT Version: 1.6.0
Data Transfer Baudrate: 921600
===== Sensors ======
Name: Built-in accelerometer, Max sample length: 300s, Frequencies: [62.50Hz, 100.00Hz]
Name: Built-in microphone, Max sample length: 60s, Frequencies: [16000.00Hz]
===== Snapshot ======
Has snapshot: 1
Supports stream: 1
Color depth: Grayscale
Resolutions: [ 128x96, 320x240, 640x480 ]
===== WIFI =====
Present: 1
SSID: Edge Impulse Wifi
Password: machinelearning
Security: 3
MAC: C4:7F:51:94:4A:38
Connected: 1
Present: 1
===== Sampling parameters =====
Label: noise
Interval: 10.00 ms.
Length: 1000 ms.
HMAC key: cde1e82eec38e086db7b9c6d2f60c97e
===== Upload settings =====
Api Key: ei_9231b10d97b18c6065868c0729400a0945df0d2715429495396678863d778f5c
Host: http://ingestion.edgeimpulse.com
Path: /api/training/data
===== Remote management =====
URL: ws://remote-mgmt.edgeimpulse.com
Connected: 1
Last error:
See the separate sections per configuration option below for more information.
Returns information about the device and the firmware. The
ID
here should be a globally unique ID (like a MAC address). If the device does not have a globally unique ID set this to 00:00:00:00:00:00
and implement the AT+DEVICEID
command. The serial daemon will then use the MAC address of the USB controller instead.The
Data Transfer Baudrate
is the baud rate that the device can switch to when offloading data for functions like AT+BUFFER
. If the device does not support switching to a higher baud rate set this to 115200
. See "Switching to higher baud rates" later on this page for the protocol.Example:
> AT+DEVICEINFO?
ID: C4:7F:51:94:4A:38
Type: DISCO_L475VG_IOT01A
AT Version: 1.6.0
Data Transfer Baudrate: 921600
For an overview of the different AT command versions, see the end of this page.
Sets the device ID. This is only required for devices that do not have a globally unique ID (see
AT+DEVICEINFO?
).Example:
> AT+DEVICEID=00:00:00:DD:EE:FF
OK
Lists sensors on the device that can be used to collect data. One sensor per line, with Name, Max sample length, and Frequencies listed. The name that you list here will be passed back to
AT+SAMPLESTART=
to indicate which sensor should be used. Example:> AT+SENSORS?
Name: Built-in accelerometer, Max sample length: 300s, Frequencies: [62.50Hz, 100.00Hz]
Name: Built-in microphone, Max sample length: 60s, Frequencies: [16000.00Hz]
Lists whether the device has a camera, whether the device supports snapshot streaming, and the resolutions of the camera. If the device does not have a camera set
Has snapshot
to 0
and omit the other options. The color depth should be either Grayscale
or RGB
. Example:> AT+SNAPSHOT?
Has snapshot: 1
Supports stream: 1
Color depth: Grayscale
Resolutions: [ 128x96, 320x240, 640x480 ]
No file system? The serial daemon can also use a scratch buffer instead, e.g. on external or internal flash. For this you need to implement the
AT+READBUFFER
function and follow the instructions under AT+SAMPLESTART
.Lists all files on the file system, one file per line. Example:
> AT+LISTFILES
/fs/noise12
/fs/noise13
Read a single file from file system, returns the full file in base64 format. This function takes two parameters: 1) the name of the file, 2) whether to switch to the 'Data transfer baud rate' (
y/n
). Example:> AT+READFILE=/fs/noise12,n
SGVsbG8gZnJvbSBFZGdlIEltcHVsc2U=
If the file does not exist, a string should be returned such as:
> AT+READFILE=/fs/non-existent
File '/fs/non-existent' does not exist
Removes a single file from file system. Returns nothing if the file was unlinked successfully. Example:
> AT+UNLINKFILE=/fs/noise12
If the file does not exist, or if unlink fails, a string should be returned:
> AT+UNLINKFILE=/fs/non-existent
File '/fs/non-existent' could not be unlinked
Uploads a file to Edge Impulse. This uses the upload settings (see
AT+UPLOADSETTINGS?
) to specify where the file will be sent. Once uploading is completed, the device should respond with File uploaded
. Example:> AT+UPLOADFILE=/fs/noise0
Uploading '/fs/noise0' to http://ingestion.edgeimpulse.com/api/training/data...
File uploaded
If the file does not exist, an error should be thrown that starts with "Failed to upload file". Example:
> AT+UPLOADFILE=/fs/non-existent
Uploading '/fs/non-existent' to http://ingestion.edgeimpulse.com/api/training/data...
Failed to upload file, cannot open '/fs/non-existent'
If there's no WiFi connection, an error should be thrown that starts with "Not connected to WiFi". Example:
> AT+UPLOADFILE=/fs/noise0
Not connected to WiFi, cannot upload
Clears all files on the underlying file system, except the config file. Example:
> AT+CLEARFILES
Clearing file system...
Unlinked '/fs/noise12'
Unlinked '/fs/noise15'
Unlinked '/fs/noise16'
Read part of the scratch buffer, and returns this data in base64 format. This function takes three parameters: 1) the start offset, 2) the end offset, 3) whether to switch to the 'Data transfer baud rate' (
y/n
). Example:> AT+READBUFFER=0,20,n
o2lwcm90ZWN0ZWSiY3ZlcmJ2MWM=
An integer is used to specify the security mode for a WiFi network, according to this list:
- 0 - Open access point
- 1 - WEP
- 2 - WPA
- 3 - WPA2
- 4 - WPA/WPA2
- 5 - PPP authentication context
- 6 - PPP authentication context
- 7 - EAP-TLS
- 8 - PEAP
- 255 - Unknown
Scans for nearby WiFi networks. Returns one network per line. Example:
> AT+SCANWIFI
SSID: Edge Impulse WiFi, Security: WPA2 (3), RSSI: -56 dBm
SSID: _HOME, Security: WPA2 (3), RSSI: -83 dBm
SSID: VFNL-EDA318, Security: WPA2 (3), RSSI: -91 dBm
SSID: HZN242073819, Security: WPA2 (3), RSSI: -73 dBm
SSID: Ziggo, Security: Unknown (255), RSSI: -89 dBm
SSID: Ziggo911B311, Security: WPA2 (3), RSSI: -85 dBm
SSID: Recover.Me-2B6F30, Security: WPA2 (3), RSSI: -88 dBm
Lists current WiFi credentials, MAC address, and whether the device is connected. Example:
Present: 1
SSID: Edge Impulse WiFi
Password: machinelearning
Security: 3
MAC: C4:7F:51:94:4A:38
Connected: 1
Present: 1
No WiFi? Return
0
for 'Present' and leave the other fields empty. The serial daemon will then no longer prompt to connect the development board to WiFi.Sets WiFi credentials. Takes three parameters: SSID, password, and security mode (integer). After calling this function the device connects to the WiFi network, gets NTP info, and connects to the remote management service (if the remote management settings are set). Returns OK when done. Example:
> AT+WIFI=Edge Impulse WiFi,machinelearning,3
Connecting to 'Edge Impulse WiFi'
Connected to WiFi, will now automatically upload samples
Getting NTP info...
Current time is Tue Jan 21 17:30:20 2020
ws connect
Connecting to WS Client returned 0
OK
Note: failure to connect to the remote management service should not throw an error, and should still return OK.
Lists the current sample settings, such as the label to use, the interval, the length and the HMAC key. Example:
> AT+SAMPLESETTINGS?
Label: noise
Interval: 10.00 ms.
Length: 1000 ms.
HMAC key: cde1e82eec38e086db7b9c6d2f60c97e
Sets the current sample settings. This either takes three parameters (label, interval, length) or four parameters (label, interval, length, HMAC key). Returns OK. Example:
> AT+SAMPLESETTINGS=idle,12,1000,cde2831ae
OK
Note that the interval may be ignore if the sensor does not support this. E.g. if a microphone only supports sampling at 16KHz it will ignore this setting.
Lists the current upload settings, such as the API Key (used to authenticate to the ingestion service, but also used for connecting to the remote management service). Example:
> AT+UPLOADSETTINGS?
Api Key: ei_9231b10d97b18c6065868c0729400a0945df0d2715429495396678863d778f5c
Host: http://ingestion.edgeimpulse.com
Path: /api/training/data
Sets the upload and remote management API key and sets the path (two parameters). Returns OK. Example:
> AT+UPLOADSETTINGS=ei_myapikey,/api/training/data
OK
Sets the upload host. Returns OK. Example:
> AT+UPLOADHOST=http://ingestion.edgeimpulse.com
OK
Lists the current settings and state for the remote management service. Note that the API key used to authenticate to the service is set by
AT+UPLOADSETTINGS=
. If the device is not connected, the Last error
field can be used to indicate why the connection failed. Example:> AT+MGMTSETTINGS?
URL: ws://remote-mgmt.edgeimpulse.com
Connected: 1
Last error:
Or when something went wrong:
> AT+MGMTSETTINGS?
URL: ws://remote-mgmt.edgeimpulse.com
Connected: 0
Last error: Error: Invalid API key
Sets the management URL. After this value is changed the device should not disconnect from the current remote management service - this only happens after re-connecting to WiFi or when restarting the device. Returns OK. Example:
> AT+MGMTSETTINGS=ws://remote-mgmt.edgeimpulse.com
OK
Starts sampling according to the parameters in
AT+SAMPLESETTINGS?
, and then uploads the file (if connected to WiFi) according to the parameters in AT+UPLOADSETTINGS?
. Takes one parameter, the name of the sensor (one of the sensors listed in AT+SENSORS?
).If the upload succeeds, you can unlink the file to save space. If the device is not connected to WiFi it should print the string
Not uploading file
. The serial daemon will then use AT+READFILE
with the file name specified earlier to read the file back.If you have stored the file in a scratch buffer - e.g. on external flash - without a file system, you need to print:
Not uploading file. Used buffer, from=0, to=310.
(where 0 and 310 are parameters that will be passed in to AT+READBUFFER
).The sample interval from
AT+SAMPLESETTINGS?
may be ignored, e.g. if this is set to a value that the sensor does not support.While sampling you can print the following lines to give feedback about the sampling status. These messages are intercepted by the daemon and used to set UI updates in the studio.
Sampling...
- sampling has started, currently recording data from the sensor.Done sampling
- sampling has finished.Processing...
- if the sample requires post-processing (e.g. signing the file, or copying the file over), send this event.Done processing
- post-processing was done.Uploading...
- uploading has started.OK
- full process is done.
If the device is not connected, end with the line
Not uploading file
, and don't emit OK
.Prior to starting, please print out a line that starts with
File name:
and lists where the file will be stored.Example:
> AT+SAMPLESTART=Built-in microphone
Sampling settings:
Interval: 0.06250 ms.
Length: 1000 ms.
Name: noise
HMAC Key: efe9cb503c6f29ead60228cc63a68e5f
File name: /fs/noise0
Starting in 2000 ms... (or until all flash was erased)
Sampling...
Done sampling, total bytes collected: 32000
Processing...
[1/3] Copying from tempfile to /fs/noise0 (this might take a while)...
[1/3] Copying from tempfile to /fs/noise0 OK (took 1378 ms.)
[2/3] Calculating hash...
[2/3] Calculating hash OK
Done processing
[3/3] Uploading file to Edge Impulse...
Uploading... '/fs/noise0' to http://ingestion.edgeimpulse.com/api/training/data...
[3/3] Uploading file to Edge Impulse OK (took 2403 ms.)
OK
Makes a photo and prints the frame buffer as a base64 encoded string. This function takes three parameters: 1) the width of the snapshot, 2) the height of the snapshot, 3) whether to switch to the 'Data transfer baud rate' (
y/n
). The content of the base64 buffer should be a uint8_t
array, with one value per pixel when in grayscale mode, or three values per pixel in RGB mode. E.g. an 2x1 image with a black and a white pixel would be:- Grayscale:
[ 0x00, 0xff ]
(pixel 1, pixel 2). - RGB:
[ 0x00, 0x00, 0x00, 0xff, 0xff, 0xff ]
(pixel 1 red, pixel 1 green, pixel 1 blue, pixel 2 red, pixel 2 green, pixel 2 blue).
Example:
> AT+SNAPSHOT=128,96,n
Q0lMTFpobWpZgnViU1JVVlZXW32Vkm9ERkxQSkc9NzhGUTNrSj09PC0yNTpAQ1FWWV1UT09O...
OK
To decode the framebuffer you can use the
edge-impulse-framebuffer2jpg
tool which is part of the Edge Impulse CLI. Write the base64 string to a file called features.txt
and then invoke:$ edge-impulse-framebuffer2jpg -f features.txt -o framebuffer.jpg -w 128 -h 96
This will create a file called
framebuffer.jpg
with the decoded content.Constantly snaps photos and prints the frame buffer as a base64 encoded string, until
b
is received on stdin. This function takes three parameters: 1) the width of the snapshot, 2) the height of the snapshot, 3) whether to switch to the 'Data transfer baud rate' (y/n
). The format is the same as AT+SNAPSHOT
, but every snapshot should be on a new line.Example:
> AT+SNAPSHOTSTREAM=128,96,n
Starting snapshot stream...
ODw9Pj8tIiEjMEI/NiopO0dMRC8vMDAyNDQ0OFtlPi47Yks2Ly8wMC0uLiwtKywrKyopKCgoKC...
ODw+Pj8tIiIjMEJANiopO0dMRC8vMDAyNTQ1OVxlPS08Yks1MC8wLy0uLSwsLCwrKyopKCgnKC...
OD0+Pj8vIiIjL0JAOCopOkZLRS8vMDAyNDQ0OFllPi46YUw2Ly8wMC0uLSwsLCsrKyopKCgoKC...
Snapshot streaming stopped by user
OK
For commands that allow switching to a higher baud rate (
AT+READFILE
, AT+READBUFFER
, AT+SNAPSHOT
, AT+SNAPSHOTSTREAM
) you'll need to follow this procedure:- 1.When
n
is passed in for the 'use max rate' property:- Do nothing, just print as usual.
- 2.When
y
is passed in for the 'use max rate' property:- Print
\r\nOK
on baud rate 115,200. - Wait 100ms and switch to the max. baud rate. This gives the serial daemon time to switch the rate.
- Print the result of the command.
- Print
\r\nOK
(on the max. baud rate). - Wait 100ms. and switch back to baud rate 115,200.
- Print a new REPL start line (
\r\n>
).
- 1.2.0 - switch the return type of
AT+READFILE
from hex to base64. - 1.3.0 - implement
AT+READBUFFER
and thePresent
field for WiFi. - 1.4.0 - add snapshot mode and the data transfer baud rate property.
- 1.5.0 - add snapshot streaming mode.
- 1.6.0 - allow explicit switching to higher baud rates.