# NetBurner > Networking in One Day! > Admin Email: wbradley@netburner.com ## Products ### Outdoor PoE NTP Network Time Server NTP1061 (ARM Cortex M7) NTP1061 Datasheet 130.34 KB 224 downloads Download Key Features Precision Time Synchronization Stratum 1 accuracy supporting all major GNSS constellations NTP accuracy better than 1 microsecond Server time precision better than 1ms (plus network jitter) Handles up to 10,000 NTP requests per second Web-based clock display Simplified Deployment Single PoE connection for both power and data (44-57VDC, <2W) Integrated antenna and time server in one compact indoor/outdoor assembly Self-contained design for stand or pole mounting No special power supply or antenna cables required Network Capabilities 10/100Mbps Ethernet with IPv4/IPv6 dual stack Supports NTPv2 (RFC1119) and NTPv3 (RFC1306) SNTP compatible (Simple Network Time Protocol, RFC1769/2030/4330) DHCP/DHCPv6 for automatic network configuration Security HTTPS web interface with TLS 1.3 support Flexible TLS certificate management: ACME, auto-generated, or customer-provided Configuration and monitoring via intuitive web interface Real-time satellite tracking and status visualization Industrial-Grade Reliability IP65-rated outdoor enclosure for all-weather operation Extended temperature range: -40°C to +85°C operating Compact form factor: 13cm x 6cm (5" x 2.4") Lightweight at 105g (3.9oz) LED indicators for network link, activity, and speed Applications The NTP1061 is ideal for organizations requiring precise, reliable time synchronization across their network infrastructure. Perfect for industrial automation, telecommunications, financial services, power utilities, and any application where accurate timekeeping is critical. Its single-cable outdoor PoE design make it easy to deploy while providing superior reception. Compliance & Certifications CE, RoHS, FCC Part A Directives: LVD 2014/35/EU, EMC 2014/30/EU, Safety 2006/95/EU, RTT&E 2014/53/EU Safety: IEC 60950-1:2005 (2nd ed)/AM 1:2009/AM 2:2013, EN 60950-1: 2ed. 2006/A11:2009/A1:2010/A12: 2011/A2:2013 Why Choose the NTP1061? Unlike traditional NTP servers that require separate GPS antennas, power supplies, and complex cabling, the NTP1061 streamlines deployment with its integrated design and PoE capability. Get Stratum 1 accuracy with the simplicity of a single Ethernet connection, backed by NetBurner's reputation for reliable, high-performance network solutions. Read the NTP1061 Product Announcement or Press Release! And much more: See the data sheet above for complete information on this powerful, affordable new server! Product Posts Introducing the NTP1061 Outdoor Time Server Introducing an affordable, weatherproof, self-contained NTP server! A single Power Over Ethernet cable is now all it takes to deliver sub-millisecond time accuracy to an entire network, no manual clock-setting or antenna wiring required. Read More » March 12, 2026 FET1061-S ### End of Life Wi-Fi   ### SBE70 LC Development Board (with ribbon cable) Included in the Package 1 DEV-SBE70LC-100CR Development Board 1 Ribbon Cable Compatibility List SBE70LC-100IR SB70LC-100IR SB72-301IR ### i.MX RT1171 Embedded IoT Development Kit MODRT1171 [Content is password protected] ### NXP i.MX RT1170 Embedded System-on-Module MODRT1171 [Content is password protected] ### i.MX RT1061 Embedded IoT Development Kit SOMRT1061 Robust, Scalable and Easy to Use Embedded IoT Development Kits This NetBurner embedded development kit features the i.MX RT1061 ARM® Cortex® M7 System-on-Module (SOM) and is an IoT device containing everything needed to add industrial-quality network control, monitoring, and processing to nearly any device. The easy to use development suite contains everything needed to rapidly learn, code, test and deploy an industrial-quality embedded solution. Want to see just how easy it is to get started? Take a look at the SOMRT1061 Quick Start Guide. SOMRT1061 200IR Datasheet and Pinout 660.21 KB 14008 downloads Download Videos Wondering how the unique 88-pin surface mount solderable SOMRT1061 makes prototyping easy while reducing your product's BOM cost and complexity? See these videos for details: IoT Development Kit Contents 1 NetBurner i.MX RT1061 SOMRT1061 Embedded Platform Hardware (soldered on carrier board) 1 IoT Development Kit Adapter board 1 Quick Start Guide 1 NNDK License Card with Platform Serial Number 1 USB Cable 1 DB9 Serial Cable 1 Blue CAT5 Patch Cable 1 Year of US-Based Technical Support, Software and Development Tool Updates Ready to build products? Take a look at the standalone SOMRT1061 NetBurner platform hardware and volume pricing. Design and Configure Pinouts with our Convenient New Tool: The SOMRT1061 is so flexible, most pins can be used for many functions. In order to save you the trouble of digging through tons of documentation (and to give you easy drop-in schematic symbols!) we've made an easy Pin Configurator tool. You can look up the various functions for each pin, customize each pin's function, and download C++ initialization code or a KiCad symbol for your device: Bare SOMRT1061 Pin Configurator (Pin 1-88) CAR-SOMRT1061 Pin Configurator (On Carrier, P1-P4) More on the i.MX RT1061 CPU used in this NetBurner Embedded Development Kit can be found here: NXP i.MX RT Family Datasheet ARM Cortex M-7 Developer Page Product Specific Posts Introducing the NTP1061 Outdoor Time Server Introducing an affordable, weatherproof, self-contained NTP server! A single Power Over Ethernet cable is now all it takes to deliver sub-millisecond time accuracy to an entire network, no manual clock-setting or antenna wiring required. Read More » March 12, 2026 Embedded MQTT: Getting Started the Easy Way I’m an intermediate level embedded developer and I’ve heard the term “MQTT” for a lot over the past year but never really delved into the details. I decided to spend a Saturday to understand what it is and implement it on an embedded device so I can use it for other projects, like sensors and various controllers that need to be monitored and controlled but are behind a router and firewall. Read More » June 24, 2025 Bridging the Web-Embedded Divide, Part 2: Laundromat Continuing from Part 1 of our Web-Embedded Divide series, today we’re diving into the opposite direction: instead of submitting data from an embedded device to Read More » May 8, 2025 Including External Libraries: LVGL LED Display Part 1 Have you ever struggled to get compilers to properly include and link third-party libraries in your projects? Ever wondered if a NetBurner was powerful and Read More » November 20, 2024 Use Qwiic I2C and SOMRT1061 for Rapid Prototyping Say goodbye to breadboards and jumper wires, say hello to effortless prototyping with Qwiic I2C and the SOMRT1061! Read More » July 22, 2024 Unveiling NetBurner’s NXP i.MX RT1061 ARM M7 System-on-Module with Dual Ethernet We’re proud to announce a worthy successor to our single-chip SBL2e! 528 MHz, 7 UARTs, 32 MB RAM, USB and dual Ethernet all in 1 inch square for all your Industrial IoT needs. Read More » April 5, 2024   ### NXP i.MX RT1060 Embedded System-on-Module SOMRT1061 SOMRT1061 200IR Datasheet and Pinout 660.21 KB 14008 downloads Download NXP i.MX RT106x Embedded System-on-Module SOMRT1061 Need a high-performing and reliable ARM module for secure embedded automation and industrial IoT applications? For a very low price point, this ARM® Cortex® M7 embedded system-on-module (SOM) solves the problem of securely network-enabling devices with dual 10/100 Ethernet, including those requiring SSL/TLS, machine-to-machine (M2M) protocols, digital, analog and serial control, and much more. The product can also be used as an edge node microcontroller, edge processor or IoT gateway. This unique self-contained surface-mount solderable package contains an NXP i.MX ARM® 1060-series processor combined with NetBurner’s acclaimed reliability and ease-of-use to get you a solution you can depend on. Flexible RT106x ARM Microcontroller The i.MX RT series of crossover MCUs are ideally suited to the workloads NetBurner customers prioritize: the right balance of I/O, connectivity, power, and industrial capability in an affordable package ready for manufacturing. NXP's RT1060 family has also seen new popularity recently with the Teensy 4.1 module: hobbyists and professionals alike are eager to dig into a new efficient ARM M7 SOM. Similar to the RT1062, support for Dual Ethernet and plenty of I/O make for SOMs that serve a variety of roles. Key Features NXP i.MX MIMXRT1061, 528MHz, ARM M7, Industrial Temperature Flash: 1MB boot, 8MB application SRAM: 1MB on processor RAM: 32MB Floating Point Unit (FPU) Dual 10/100 Ethernet (one PHY onboard) Two USB Controllers (two PHY sharing a VBUS) 7 UARTs Up to 67 GPIO 1" (25.4mm) square form factor Try out our SOMRT1061 development kit! The best way to get started. Read the ARM® Embedded System-on-Module SOMRT1061 Product Announcement or Press Release! Timers and PWMs Two General Programmable Timers (GPT) -  Four-channel generic 32-bit resolution timer for each, supports standard capture and compare operation. 6 total capture inputs (5 usable at a time). 6 total compare outputs. 1 external clock input. Four Periodical Interrupt Timers (PIT) - Generic 32-bit resolution timer with periodical interrupt generation. Three Quad Timers (QTimer) with a total of 11 I/O signals - Four-channel generic 16-bit chainable timers for each. Quadrature decoder integrated. Four FlexPWMs - Up to 8 individual PWM channels per each channel. 16-bit resolution PWM suitable for Motor Control applications. Four Quadrature Encoder/Decoders And more! See Specifications and the datasheet PDF under Documents and Downloads for details. Three FlexIO modules The SOMRT1061's FlexIO modules can each be configured as I2C, SPI, UART, I2S, Camera I/F, 68K 8080 parallel bus, or PWM/ Waveform Generation. They are generic serial to parallel or parallel to serial interfaces that can even operate as a limited state machine. And much more: See the data sheet above for complete information on this powerful, affordable new module! Design and Configure Pinouts with our Convenient New Tool: The SOMRT1061 is so flexible, most pins can be used for many functions. In order to save you the trouble of digging through tons of documentation (and to give you easy drop-in schematic symbols!) we've made an easy Pin Configurator tool. You can look up the various functions for each pin, customize each pin's function, and download C++ initialization code or a KiCad symbol for your device: SOMRT1061 Pin Configurator CAR-SOMRT1061 Pin Configurator More on the ARM® RT1061 CPU used in this module can be found here: NXP i.MX RT Family Datasheet ARM Cortex M-7 Developer Page Product Posts Introducing the NTP1061 Outdoor Time Server Introducing an affordable, weatherproof, self-contained NTP server! A single Power Over Ethernet cable is now all it takes to deliver sub-millisecond time accuracy to an entire network, no manual clock-setting or antenna wiring required. Read More » March 12, 2026 Embedded MQTT: Getting Started the Easy Way I’m an intermediate level embedded developer and I’ve heard the term “MQTT” for a lot over the past year but never really delved into the details. I decided to spend a Saturday to understand what it is and implement it on an embedded device so I can use it for other projects, like sensors and various controllers that need to be monitored and controlled but are behind a router and firewall. Read More » June 24, 2025 Bridging the Web-Embedded Divide, Part 2: Laundromat Continuing from Part 1 of our Web-Embedded Divide series, today we’re diving into the opposite direction: instead of submitting data from an embedded device to Read More » May 8, 2025 Including External Libraries: LVGL LED Display Part 1 Have you ever struggled to get compilers to properly include and link third-party libraries in your projects? Ever wondered if a NetBurner was powerful and Read More » November 20, 2024 Use Qwiic I2C and SOMRT1061 for Rapid Prototyping Say goodbye to breadboards and jumper wires, say hello to effortless prototyping with Qwiic I2C and the SOMRT1061! Read More » July 22, 2024 Unveiling NetBurner’s NXP i.MX RT1061 ARM M7 System-on-Module with Dual Ethernet We’re proud to announce a worthy successor to our single-chip SBL2e! 528 MHz, 7 UARTs, 32 MB RAM, USB and dual Ethernet all in 1 inch square for all your Industrial IoT needs. Read More » April 5, 2024 FET1061-S ### Lot Charge ### ARM Development Kits Choosing the right IoT Embedded Development Kit is no joke for serious projects. Find out why developers love working with NetBurner's ARM based Embedded Dev Kits. Your success is our success, which is why NetBurner does everything possible to support the design and commercialization of cutting edge and reliable automation and IoT products and solutions. Our robust and easy to use development kits accelerate embedded development into scalable product and solutions. With NetBurner, developers can focus on the core of their application and leave it to us to do the embedded heavy-lifting. 1. Included IoT Development Software Eclipse-Based IDE NBEclipse is a plug-in to the Eclipse IDE and provides a great environment to manage projects, edit code, debug, and download your application to NetBurner devices. Example Source Code Get hands-on familiarity with the NetBurner embedded platform by studying, building, and modifying the included source code examples. Each example consists of buildable and executable source code that illustrates how to accomplish one or more tasks. Software Libraries ANSI C/C++ compiler and linker (GNU Based), TCP/IP stack, Web server, E-mail protocols, RTOS, Flash file system, and more. Security and Optional Software Modules Embedded SSL/TLS & SSH Security Suite, SNMP V1 (optional Module License Version) 2. Hardware Development Boards Each SOM dev kit comes with the industrially-rated embedded system on module platform hardware. We also include a development carrier board which makes prototyping fast and easy. Interact with a NetBurner dev kits by loading examples that read and control integrated dip switches or LEDs in response to incoming data. NetBurner even provides schematics for development boards so that you can easily use them in your own designs and get deployed faster. Power and data Now you can communicate with processor UARTs from your Mac or Windows PC via USB. The on-board USB port also enables you to power the development board. Or use a wall powered barrel jack with +7 to +24 VDC supply of your choosing (or add one while shopping). Flash card storage The FAT12/16/32 flash file system gives developers the flexibility to store and exchange data through flash cards. NetBurner provides a standard API, complete C-based source code, drivers, and ample examples to get started. 3. Firmware Simple firmware updates Perform updates remotely. Update your hardware over 10/100 Ethernet or its serial port. RTOS Robust Real-Time Operating System (RTOS) optimized for high-speed encrypted networking, task management and IO. With NetBurner you get an RTOS that we stand behind and fully support. 4. Technical Support E-Mail and Online Support Portal All dev kits come with a limited time support package. Our prompt email support provides excellent results and works as follows: your email question is received by support personnel with a wide range of abilities. The individual best suited to answer the question will assume responsibility to answer your question. This method avoids tiered approach of forcing you to go through many people before finding the right person to help. Documentation and Learn Tutorials Getting started guides, manuals, and application notes can help you load your first application code image in minutes. Our Learn Blog features detailed hands-on tutorials with NetBurner embedded development kits, popular sensors, cloud services, and protocols. Support Forum The NetBurner forum is great to discuss any hardware or software issues with developers like you. It has been a great place for developers in the NetBurner community to share new ideas and to communicate unique implementations of the product. 5. Quality and Reliability All of our products are checked for quality according to our high standards, rated for industrial operating temperatures, and are RoHS compliant. We stand by the quality and reliability of our products, include our Embedded IoT Development Kits, with our 1 year warranty and expert support.   Note: A development kit or software upgrade is required for each NetBurner platform type. The purpose of development kit boards is to demonstrate the features and functions of our module products. Development kit boards should not be designed into your final product as they continuously change as new features are added to the module product line. We are willing to provide the design information to you if you wish to manufacture a particular development board revision on your own. ### SBE70 LC Development Kit SBE70 LC Datasheet 501.02 KB 13679 downloads Download Included in the Package 1 Platform Hardware 1 Development Board (new DEV-SBE70LC-100CR as of 2025!) 1 Ribbon Cable 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 USB-C Cable 1 Serial Cable 1 Blue CAT5 Patch Cable 1 Year of Software and Tool Updates 6 Months of Technical Support   Ready to build products? Take a look at volume pricing for the SBE70 LC. Click here for additional product information. NOTE: These kits are USB powered (with the included USB cable), but can also be powered by a power adapter which can be purchased here: International Power Adapter or a US Power Adapter ### SBE70 LC SBE70 LC Datasheet 501.02 KB 13679 downloads Download Product Posts New Feature: Easy SSL Certificates with ACME and Let’s Encrypt Easily add trusted SSL/TLS certificates to your NetBurner project! Read More » February 2, 2024 Introduction to the SSH Protocol Introduction One of the most common tasks in local and Internet networks is controlling a device remotely to carry out configuration, maintenance, or even file Read More » March 30, 2022 Don’t Be the Weakest Link: Auto-Generated Self-Signed Certificates For Embedded and IoT Devices A New Way to Protect Your IoT and Embedded Devices The saying goes, “A chain is only as strong as its weakest link.” Nowhere is Read More » May 28, 2020 Peer Verification: Getting to the Root of the Matter “There are a thousand hacking at the branches of evil to one who is striking at the root.” – Henry David Thoreau Staying Safe on Read More » April 28, 2020 SSL/TLS Serial Tunneling Enabling NetBurner’s Built-in Secure Serial Capability Let’s be honest, if you had a “kick me” sign taped to your back, you’d want someone to tell Read More » January 30, 2018 Creating a Self-Signed SSL/TLS Certificate for Secure IoT Applications These days, special consideration into the security of your internet accessible devices is a must. The proliferation of the Internet of Things (IoT) has provided Read More » December 20, 2017 Not the right device? Compare all Ethernet to Serial Servers by feature. ### SPIF-MOD54417 ### End of Life Serial to Ethernet One of the toughest challenges faced in today's evolving market is network connectivity for legacy serial devices. To satisfy this need, NetBurner has developed a complete series of Serial to Ethernet Servers. The NetBurner serial to Ethernet server is ready to run right out of the box with no programming. Start by connecting your serial device and Ethernet network. The initial setup, configuration, and diagnostic programs are easily accessed via the web page interface or included network utilities. ### End of Life System-On-Modules ### ARM® Embedded IoT Development Kit MODM7AE70 Robust, Scalable and Easy to Use Embedded IoT Development Kits This NetBurner embedded development kit features the ARM® Cortex® M7 System-on-Module (SOM) and is an IoT device containing everything needed to add industrial-quality network control, monitoring, and processing to nearly any device. The easy to use development suite contains everything needed to rapidly learn, code, test and deploy an industrial-quality embedded solution. Want to see just how easy it is to get started? Take a look at the MODM7AE70 Quick Start Guide. MODM7AE70 Datasheet 788.15 KB 28975 downloads The ARM® Cortex®-powered NetBurner Ethernet System-on-Module is a device containing everything needed to add industrial-quality network control and monitoring to nearly any hardware or device. For a very low price point, this module solves the problem of network-enabling devices with 10/100 Ethernet, including those requiring digital, analog and serial control, and much more. Microchip®/Atmel® ARM® processors are combined with NetBurner’s acclaimed reliability and easy-of-use to get you a solution you can depend on. View product page. Download IoT Development Kit Contents 1 ARM®-Powered NetBurner MODM7AE70 Embedded Platform Hardware 1 IoT Development Kit Adapter board 1 Ribbon Cable 1 Quick Start Guide 1 NNDK License Card with Platform Serial Number 1 USB Cable 1 DB9 Serial Cable 1 Blue CAT5 Patch Cable 1 Year of Software and Development Tool Updates 6 Months of In-house Technical Support Embedded IoT Development Kit Specs Microchip®/Atmel® SAM E70 32-bit ARM Cortex-M7 300-MHz processor Optimized and Embedded Real Time Operating System (RTOS) Low-power / High Energy Efficiency Flexible memory, Memory Protection Unit (MPU) and system peripherals Optional Wi-Fi available Ready to build products? Take a look at the standalone MODM7AE70 NetBurner ARM® platform hardware and volume pricing. Design and Configure Pinouts with our Convenient New Tool: Many MODM7AE70 pins can be used for many functions, so in order to save you the trouble of digging through documentation and provide an easy drop-in schematic symbol, we've made an easy Pin Configurator tool. You can look up the various functions for each pin, customize each pin's function, and download C++ initialization code or a KiCad symbol for your device: MODM7AE70 Pin Configurator More on the ARM® SAM E70 CPU SOM used in this NetBurner Embedded Development Kit can be found here: SAM E70/S70/V70/V71 Family Datasheet ARM Cortex M-7 Developer Page Product Specific Posts Tracking Traps on the MODM7AE70 – Part 2 NetBurner’s Smart Trap feature greatly helps with debugging issues by automatically outputting stack and register information during a crash. In part 1 of this blog Read More » December 26, 2025 Embedded MQTT: Getting Started the Easy Way I’m an intermediate level embedded developer and I’ve heard the term “MQTT” for a lot over the past year but never really delved into the details. I decided to spend a Saturday to understand what it is and implement it on an embedded device so I can use it for other projects, like sensors and various controllers that need to be monitored and controlled but are behind a router and firewall. Read More » June 24, 2025 Tracking Traps on the MODM7AE70 – Part 1 Have you ever found yourself writing an application that, at runtime, reboots seemingly at random? Maybe your application prints trap output—diagnostic messages that indicate system Read More » April 30, 2020 IoT Fight Night: AWS IoT Core vs Google Cloud IoT Core An IoT Cloud Service Comparison If you’re looking for an easy way to get your Internet of Things (IoT) projects set up, consider partnering with Read More » October 23, 2019 MODM7AE70 Dev Kit Quick Start Guide – Video 2 In this second quick start video, we get rolling with the MODM7AE70 development kit. We start with examining the carrier board, the MOD-DEV-70CR, and continue Read More » October 22, 2019 MODM7AE70 Dev Kit Quick Start Guide – Video 1 Get up and running with NetBurner’s MODM7AE70 development kit. In this first video, we take a look at what’s included in the development kit, as Read More » October 11, 2019   ### ARM® Embedded System-on-Module MODM7AE70 MODM7AE70 Datasheet 788.15 KB 28975 downloads The ARM® Cortex®-powered NetBurner Ethernet System-on-Module is a device containing everything needed to add industrial-quality network control and monitoring to nearly any hardware or device. For a very low price point, this module solves the problem of network-enabling devices with 10/100 Ethernet, including those requiring digital, analog and serial control, and much more. Microchip®/Atmel® ARM® processors are combined with NetBurner’s acclaimed reliability and easy-of-use to get you a solution you can depend on. View product page. Download ARM® Embedded System-on-Module MODM7AE70 Need a high-performing and reliable ARM® embedded IoT device for secure automation and industrial IoT applications? For a very low price point, this ARM® Cortex-M7 embedded system-on-module (SOM) solves the problem of securely network-enabling devices with 10/100 Ethernet, including those requiring SSL/TLS, machine-to-machine (M2M) protocols, digital, analog and serial control, and much more. The product can also be used as an edge node microcontroller, edge processor or IoT gateway. Microchip®/Atmel® ARM® processors are combined with NetBurner’s acclaimed reliability and ease-of-use to get you a solution you can depend on. Try out our IoT development kit! The best way to get started. Read the ARM® Embedded System-on-Module MODM7AE70 Product Release / Press Release at Newswire.com Design and Configure Pinouts with our Convenient New Tool: Many MODM7AE70 pins can be used for many functions, so in order to save you the trouble of digging through documentation and provide an easy drop-in schematic symbol, we've made an easy Pin Configurator tool. You can look up the various functions for each pin, customize each pin's function, and download C++ initialization code or a KiCad symbol for your device: MODM7AE70 Pin Configurator Product Posts Tracking Traps on the MODM7AE70 – Part 2 NetBurner’s Smart Trap feature greatly helps with debugging issues by automatically outputting stack and register information during a crash. In part 1 of this blog Read More » December 26, 2025 Embedded MQTT: Getting Started the Easy Way I’m an intermediate level embedded developer and I’ve heard the term “MQTT” for a lot over the past year but never really delved into the details. I decided to spend a Saturday to understand what it is and implement it on an embedded device so I can use it for other projects, like sensors and various controllers that need to be monitored and controlled but are behind a router and firewall. Read More » June 24, 2025 Tracking Traps on the MODM7AE70 – Part 1 Have you ever found yourself writing an application that, at runtime, reboots seemingly at random? Maybe your application prints trap output—diagnostic messages that indicate system Read More » April 30, 2020 IoT Fight Night: AWS IoT Core vs Google Cloud IoT Core An IoT Cloud Service Comparison If you’re looking for an easy way to get your Internet of Things (IoT) projects set up, consider partnering with Read More » October 23, 2019 MODM7AE70 Dev Kit Quick Start Guide – Video 2 In this second quick start video, we get rolling with the MODM7AE70 development kit. We start with examining the carrier board, the MOD-DEV-70CR, and continue Read More » October 22, 2019 MODM7AE70 Dev Kit Quick Start Guide – Video 1 Get up and running with NetBurner’s MODM7AE70 development kit. In this first video, we take a look at what’s included in the development kit, as Read More » October 11, 2019 ### SB800 EX 2 Port Serial to Ethernet Server - SSL/TLS SB800 EX Datasheet 1.22 MB 39319 downloads Download Product Posts New Feature: Easy SSL Certificates with ACME and Let’s Encrypt Easily add trusted SSL/TLS certificates to your NetBurner project! Read More » February 2, 2024 Introduction to the SSH Protocol Introduction One of the most common tasks in local and Internet networks is controlling a device remotely to carry out configuration, maintenance, or even file Read More » March 30, 2022 Don’t Be the Weakest Link: Auto-Generated Self-Signed Certificates For Embedded and IoT Devices A New Way to Protect Your IoT and Embedded Devices The saying goes, “A chain is only as strong as its weakest link.” Nowhere is Read More » May 28, 2020 Peer Verification: Getting to the Root of the Matter “There are a thousand hacking at the branches of evil to one who is striking at the root.” – Henry David Thoreau Staying Safe on Read More » April 28, 2020 SSL/TLS Serial Tunneling Enabling NetBurner’s Built-in Secure Serial Capability Let’s be honest, if you had a “kick me” sign taped to your back, you’d want someone to tell Read More » January 30, 2018 Creating a Self-Signed SSL/TLS Certificate for Secure IoT Applications These days, special consideration into the security of your internet accessible devices is a must. The proliferation of the Internet of Things (IoT) has provided Read More » December 20, 2017 Not the right device? Compare all Ethernet to Serial Servers by feature. ### SBL2e XA Development Kit SBL2e XA Datasheet 1.68 MB 11964 downloads Download Included in the Package 1 Platform Hardware 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Blue CAT5 Patch Cable 1 Red CAT5 Cross-over Cable 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products? Take a look at volume pricing for the SBL2e XA. Click here for additional product information ### SBL2e X Development Kit SBL2EX Datasheet 1.18 MB 14736 downloads Download Included in the Package 1 Platform Hardware 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Serial Cable 1 Blue CAT5 Patch Cable 1 Red CAT5 Cross-over Cable 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products? Take a look at volume pricing for the SBL2e X. Click here for additional product information ### SBL2e BOB Development Kit SBL2e CHIP & BOB Datasheet 943.76 KB 27682 downloads Download Included in the Package 1 Platform Hardware 1 Adapter Board 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 USB Cable 1 RJ-45 Ethernet Jack 1 Serial Cable 1 Blue CAT5 Patch Cable 1 Red CAT5 Cross-over Cable 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products? Take a look at volume pricing for the SBL2e BOB. Click here for additional product information NOTE: These kits are USB powered (with the included USB cable), but can also be powered by a power adapter which can be purchased here: International Power Adapter or a US Power Adapter ### SBL2e Development Kit SBL2e Datasheet 921.24 KB 54853 downloads Download Included in the Package 1 Platform Hardware 1 Adapter Board 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 USB Cable 1 RJ-45 Ethernet Jack 1 Serial Cable 1 Blue CAT5 Patch Cable 1 Red CAT5 Cross-over Cable 1 Year of Software and Tool Updates 6 Months of Technical Support   Ready to build products? Take a look at volume pricing for the SBL2e. Click here for additional product information NOTE: These kits are USB powered (with the included USB cable), but can also be powered by a power adapter which can be purchased here: International Power Adapter or a US Power Adapter ### SB800 EXW WiFi Development Kit SB800 EX Datasheet 1.22 MB 39319 downloads Download Like the SB800EX, the SB800EXW provides a secure, turnkey Serial to Ethernet server with 2 DB9 serial ports but also adds the power and capability of 2.4 Ghz WiFi. NetBurner's Secure Serial to Ethernet Servers network-enable serial devices out of the box – no programming or development is required. The included virtual COM port Windows utility enables you to easily access serial devices located on a remote NetBurner device as if they were plugged into your own computer. The hardware is pre-programmed to convert your serial data to Ethernet, enabling secure communication with the serial device over a network or the Internet or create custom applications using the NetBurner Network Development Kit. Included in the Package 1 Platform Hardware 1 Power Adapter (International or US Version) 1 WiFi 2.4 Ghz Adjustable Angle Antenna SMA Male 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Serial Cable (NULL MODEM) 1 Blue CAT5 Patch Cable 1 NetBurner Platform Hardware Label 1 Year of Software and Tool Updates 6 Months of Technical Support   Ready to build products? Take a look at volume pricing for the SB800 EXW. Click here for additional product information ### SB800 EX Development Kit SB800 EX Datasheet 1.22 MB 39319 downloads Download Included in the Package 1 Platform Hardware 1 Power Adapter (International or US Version) 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Serial Cable (NULL MODEM) 1 Blue CAT5 Patch Cable 1 NetBurner Platform Hardware Label 1 Year of Software and Tool Updates 6 Months of Technical Support. Ready to build products? Take a look at volume pricing for the SB800 EX. Click here for additional product information ### SB70 LC Development Kit SB70 and SB70LC End of Life Notice 78.43 KB 11222 downloads Download SB70LC Datasheet 869.31 KB 37180 downloads Download Included in the Package 1 Platform Hardware 1 Adapter board 1 Ribbon Cable 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 USB Cable 1 Serial Cable 1 Blue CAT5 Patch Cable 1 Year of Software and Tool Updates 6 Months of Technical Support   Ready to build products? Take a look at volume pricing for the SB70 LC. Click here for additional product information NOTE: These kits are USB powered (with the included USB cable), but can also be powered by a power adapter which can be purchased here: International Power Adapter or a US Power Adapter ### SB700 EX Development Kit SB700EX Datasheet 1.40 MB 17399 downloads Download Included in the Package 1 Platform Hardware 1 Power Adapter (International or US Version) 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Serial Cable (NULL MODEM) 1 Blue CAT5 Patch Cable 1 NetBurner Platform Hardware Label 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products? Take a look at volume pricing for the SB700 EX. Click here for additional product information ### SB70 Development Kit SB70 and SB70LC End of Life Notice 78.43 KB 11222 downloads Download Legacy SB70 Datasheet 208.86 KB 19100 downloads Download Included in the Package 1 Platform Hardware 1 Power Adapter (International or US Version) 1 Adapter board 1 Ribbon Cable 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Serial Cable 1 Blue CAT5 Patch Cable 1 Red CAT5 Cross-over Cable 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products? Take a look at volume pricing for the SB70. Click here for additional product information ### PK70 EX NTP Time Server Development Kit PK70 EX NTP Datasheet 651.87 KB 20858 downloads Download Included in the Package 1 Platform Hardware 1 Power Adapter (International or US Version) 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Blue CAT5 Patch Cable 1 NetBurner Platform Hardware Label 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products or just looking for an NTP server? The PK70 EX NTP also comes as a stand-alone product ready for use, with volume pricing discounts. ### PK70 EX MMS Development Kit PK70 EX MMS Datasheet 733.35 KB 8875 downloads Download Included in the Package 1 Platform Hardware 1 Power Adapter (International or US Version) 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 DB37 to 4x DB9 Adapter Cable 1 Blue CAT5 Patch Cable 1 NetBurner Platform Hardware Label 1 Year of Software and Tool Updates 6 Months of Technical Support ### PK70 EX 485 Development Kit PK70 EX 485 Datasheet 730.13 KB 9152 downloads Download Included in the Package 1 Platform Hardware 1 Power Adapter (International or US Version) 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 DB37 to 4x DB9 Adapter Cable 1 Blue CAT5 Patch Cable 1 NetBurner Platform Hardware Label 1 Year of Software and Tool Updates 6 Months of Technical Support ### PK70 EX 232 Development Kit PK70 EX 232 Datasheet 730.71 KB 10433 downloads Download Included in the Package 1 Platform Hardware 1 Power Adapter (International or US Version) 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 DB37 to 4x DB9 Adapter Cable 1 Blue CAT5 Patch Cable 1 NetBurner Platform Hardware Label 1 Year of Software and Tool Updates 6 Months of Technical Support Click here for additional product information ### PINK LC Development Kit (3.3V Version) SB70LC Datasheet 869.31 KB 37180 downloads Download Included in the Package 1 Platform Hardware (PINK70 LC and Development Board) 1 NNDK Card and Platform Serial Number 1 Blue CAT5 Patch Cable 1 Red CAT5 Cross-over Cable 1 Grey Serial Cable 1 Power Adapter (US or International Version) 1 Adapter Board Connector Ribbon 1 Adapter Board 6 Hookup Wires Ready to build products? Take a look at volume pricing for the PINK70 LC. Click here for additional product information Note: If you need the 5V version of this device, please see the PINK70 Development Kit product page. ### PINK Development Kit (5V Version) Legacy SB70 Datasheet 208.86 KB 19100 downloads Download Included in the Package 1 Platform Hardware (PINK70 Module and Development Board) 1 NNDK Card and Platform Serial Number 1 Blue CAT5 Patch Cable 1 Red CAT5 Cross-over Cable 1 Grey Serial Cable 1 Power Adapter (US or International Version) 1 Adapter Board Connector Ribbon 1 Adapter Board 6 Hookup Wires Ready to build products? Take a look at volume pricing for the PINK70. Click here for additional product information Note: If you need the 3.3V version of this device, please see the PINK70 LC Development Kit product page. ### 802.11b/g Wireless Module Development Kit Legacy NBWIFIUG Datasheet 0.00 KB 6606 downloads Download Note: The NBWIFIUG-100CR is no longer being produced. A replacement for the wireless solution is currently in development. For additional details, please read the following: Legacy NBWIFIUG Product Discontinuation Notice 0.00 KB 4502 downloads Download Included in the Package 1 Platform Hardware 1 Year of Software and Tool Updates 6 Months of Technical Support Click here for additional product information. The NBWIFIUG-100CR WiFi hardware module is only compatible with the following core modules: MOD5234, MOD5270, MOD5272, MOD5282. The NBWIFIUG-100CR WiFi hardware module with adapter board is compatible with the MOD-DEV-100CR and MOD-DEV-70CR development boards. IMPORTANT: Requires development tools release 2.4 RC1 or later. *** NON-CANCELLABLE / NON-RETURNABLE *** ### WiFi 802.11b/g/n Development Kit NBWIFIIN Datasheet 1.15 MB 29935 downloads Download Note: The NNDK-NBWIFIIN-UFL-KIT and NNDK-NBWIFIIN-PCB-KIT (based on NBWIFIIN-SOM-UFLIR) is no longer being produced. A replacement for the wireless solution is currently in development. For additional details, please read the following: NBWIFIIN-SOM-UFL End of Life Notice (EOL) 117.94 KB 1738 downloads Download Ready to build products? Take a look at volume pricing for the NBWIFIIN 802.11b/g/n. Click here for additional product information ### PK70 EX Development Kit PK70 EX Datasheet 795.92 KB 19897 downloads Download PK70 Flash Memory PCN 0.00 KB 16989 downloads This Product Change Notice details the flash memory component change of our PK70 based devices. Download Included in the Package 1 Platform Hardware 1 Power Adapter (International or US Version) 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Serial Cable 1 Blue CAT5 Patch Cable 1 NetBurner Platform Hardware Label 1 Year of Software and Tool Updates 6 Months of Technical Support Click here for additional product information NOTE: The PK70 EX can be customized to add additional functionality with one of the standard NetBurner Personality Blade boards. This kit does NOT include a NetBurner Personality Blade. You can add a NetBurner Personality Blade to your order by selecting the blade of your choice by clicking on this link. ### NANO54415 Development Kit NANO54415 Datasheet 578.27 KB 15549 downloads Download Included in the Package 1 Platform Hardware 1 Development Board 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Serial Cable 1 Blue CAT5 Patch Cable 1 USB Cable 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products? Take a look at volume pricing for the NANO54415. Click here for additional product information NOTE: These kits are USB powered (with the included USB cable), but can also be powered by a power adapter which can be purchased here: International Power Adapter or a US Power Adapter ### MOD54417 LC Development Kit - Dual Ethernet MOD5441X Embedded Ethernet System on Module Datasheet 990.26 KB 33501 downloads Datasheet for our popular MOD5441X embedded system on module. The datasheets provides data and specifications for our single and dual jack models, MOD54415 and MOD54417, respectively. Electrical, mechanical and interface details. Download Included in the Package 1 Platform Hardware 1 Development Board 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Serial Cable 1 Blue CAT5 Patch Cable 1 USB Cable 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products? Take a look at volume pricing for the MOD54417. Click here for additional product information NOTE: These kits are USB powered (with the included USB cable), but can also be powered by a power adapter which can be purchased below: International Power Adapter or a US Power Adapter ### MOD54415 LC Development Kit MOD5441X Embedded Ethernet System on Module Datasheet 990.26 KB 33501 downloads Datasheet for our popular MOD5441X embedded system on module. The datasheets provides data and specifications for our single and dual jack models, MOD54415 and MOD54417, respectively. Electrical, mechanical and interface details. Download Included in the Package 1 Platform Hardware 1 Development Board 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Serial Cable 1 Blue CAT5 Patch Cable 1 USB Cable 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products? Take a look at volume pricing for the MOD54415. Click here for additional product information NOTE: These kits are USB powered (with the included USB cable), but can also be powered by a power adapter which can be purchased below: International Adapter or US Adapter ### MOD5270 LC Development Kit MOD5270 Datasheet 824.44 KB 34239 downloads Download Included in the Package 1 Platform Hardware 1 Development Board 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Serial Cable 1 Blue CAT5 Patch Cable 1 USB Cable 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products? Take a look at volume pricing for the MOD5270. Click here for additional product information NOTE: These kits are USB powered (with the included USB cable), but can also be powered by a power adapter which can be purchased here: International Power Adapter or a US Power Adapter ### MOD5234 LC Development Kit MOD5234 Datasheet 1.04 MB 30364 downloads Download Included in the Package 1 Platform Hardware 1 Development Board 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Serial Cable 1 Blue CAT5 Patch Cable 1 USB Cable 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products? Take a look at volume pricing for the MOD5234. Click here for additional product information NOTE: These kits are USB powered (with the included USB cable), but can also be powered by a power adapter which can be purchased here: International Power Adapter or a US Power Adapter ### MOD5213 Development Kit - Non-Networked MOD5213 Datasheet 461.60 KB 12470 downloads Download Included in the Package 1 Platform Hardware 1 Development Board 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 USB Cable 1 Serial Cable 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products? Take a look at volume pricing for the MOD5213. Click here for additional product information NOTE: These kits are USB powered (with the included USB cable), but can also be powered by a power adapter which can be purchased here: International Power Adapter or a US Power Adapter ### CB34 EX Development Kit CB34 EX Datasheet 1.50 MB 35378 downloads CB34 EX Datasheet. Find data and specifications on this NetBurner module. Mechanical, electrical and interface details. CAN to Ethernet Server. Access 2 serial ports over SSL & SSH Ethernet! Web Based Configuration. Ind temp range -40°C to 85°C Customize with dev kit. Download Included in the Package 1 Platform Hardware 1 Power Adapter (International or US Version) 1 Quick Start Guide 1 NNDK Card with Platform Serial Number 1 Serial Cable (NULL MODEM) 1 Blue CAT5 Patch Cable 1 NetBurner Platform Hardware Label 1 Year of Software and Tool Updates 6 Months of Technical Support Ready to build products? Take a look at volume pricing for the CB34 EX. Click here for additional product information ### Compact Flash Adapter Board (Leaded Assembly) Included in the Package 1 Adapter Board ### NBWIFIUG 802.11b/g Wireless Module Legacy NBWIFIUG Datasheet 0.00 KB 6606 downloads Download Note: The NBWIFIUG-100CR is no longer being produced. For additional details, please read the following product discontinuation notice. Legacy NBWIFIUG Product Discontinuation Notice 0.00 KB 4502 downloads Download Click here for additional information on the new NBWIFIIN product NBWIFIUG-100CR WiFi hardware module is only compatible with the following core modules: MOD5234, MOD5270, MOD5272, MOD5282. IMPORTANT: Requires development tools release 2.4 RC1 or later. ### Power Adapter (US Version, 9VDC) Included in the Package 1 Power Adapter ### Power Adapter (International Version, 9VDC) Included in the Package 1 Power Adapter 4 International Plugs ### FPGA Blade Board NBPKX500-100CR Modular and easy to implement add-on board provides powerful additional functionality to the NetBurner Product Kit PK70EX. 1 NBPKX500-100CR Platform Hardware. Programmable Xilinx Spartan3A FPGA (Field Programmable Gate Array) ### Quad UART Blade Board (232/422/485 Multi-Mode Serial Version) NBPKBU-MMSCR Modular and easy to implement Quad UART RS-422/485 add-on board provides powerful additional functionality to the NetBurner Product Kit PK70EX. Network enable up to 4 RS-232/422/485 serial devices 1-to-4 UART Cable Adapter (DB37 to 4 x DB9) ### Quad UART Blade Board (422/485 Version) NBPKBU-485CR Modular and easy to implement Quad UART RS-422/485 add-on board provides powerful additional functionality to the NetBurner Product Kit PK70EX. Network enable up to 4 RS-422/485 serial devices 1-to-4 UART Cable Adapter (DB37 to 4 x DB9)   ### Quad UART Blade Board (232 Version) NBPKBU-232CR Modular and easy to implement Quad UART RS-232 add-on board provides powerful additional functionality to the NetBurner Product Kit PK70EX. Network enable up to 4 RS-232 serial devices 1-to-4 UART Cable Adapter (DB37 to 4 x DB9) ### Prototype Blade Board NBPKBP-100CR Create your own Blade board for the NetBurner Product Kit PK70EX.   ### Multi-I/O Blade Board NBPKBM-100CR Modular and easy to implement add-on board provides powerful additional functionality to the NetBurner Product Kit PK70EX. Eight 12-bit analog-to-digital inputs Two 16-bit digital-to-analog outputs 16 digital I/O   ### NTP Network Time Server with GPS Blade Board NBPKBG-100CR Modular and easy to implement add-on board provide powerful additional functionality to the NetBurner Product Kit PK70EX. 1 Platform Hardware. Network Time Protocol (NTP) server Precision GPS time reference for Stratum 1 Accuracy   ### Programmable Xilinx Digital I/O Blade Board NBPKBD-100CR 1 NBPKBD-100CR Platform Hardware. Programmable Xilinx CPLD 32 digital I/O ### PK70EX Top Cover (No DB37 Cutout) Included in the Package 1 Top Cover ### RJ-45 Jack (Industrial Temperature) Included in the Package 1 Jack ### NetBurner 1-to-4 UART Cable Adapter (DB37 to 4 x DB9) Included in the Package 1 Cable ### FPC Antenna Included in the Package 1 FPC antenna with U.FL connection Click here for additional product information ### GPS Antenna GPS/GNSS antenna designed for both GPS and GLONASS reception. Includes magnetic mount and 3 meter cable with standard SMA connector. ### RP-SMA Antenna with Cable Included in the Package 1 RP-SMA Antenna 1 U.FL to RP-SMA cable Click here for additional product information ### NANO54415 Ethernet System-on-Module and Serial to Ethernet Device NANO54415 Datasheet 578.27 KB 15549 downloads Download Product Posts Alternate Ways of Securing Your NANO54415 Securing the NANO54415: It’s Easier Than You Think It has come to our attention that some industrial users have reservations regarding the spring retention clips Read More » October 28, 2019 Autonomous Navigation Using a NetBurner SOM This is the second half of our article “Circles of Concern: A Robotics Spin“. If you haven’t had a chance to read up on how Read More » March 28, 2019 Circles of Concern: A Robotics Spin Developing a 1/7-scale Autonomous Race Car In this article, I will discuss the engineering process behind developing a 1/7-scale autonomous race car from a NetBurner Read More » March 28, 2019 Epic Race at the Sparkfun Autonomous Vehicle Challenge 2017 – Part I It’s amazing what can be done with a NetBurner Embedded Core Module, creativity, and some ingenuity. The digital and analog world can ALL be yours… Read More » October 25, 2017 Epic Race at the Sparkfun Autonomous Vehicle Challenge 2017 – Part II As with any side-project, especially with a hard and fast deadline, loose-ends were just an inevitability. When I left for Denver on Thursday afternoon I Read More » October 24, 2017 Epic Race at the Sparkfun Autonomous Vehicle Challenge 2017 – Part III After a harrowing but somewhat successful first day of racing at the SparkFun AVC 2017 I needed to regroup and literally do some hacking. I Read More » October 23, 2017 Not sure it's the right module? Compare against other modules by feature. NANO54415 -- System-on-Module Comparison Table NANO54415 -- Serial to Ethernet Comparison Table ### NANO Development Board Development board for the NetBurner NANO54415 embedded system on module. Convenient interface to SOM peripherals, LEDs, DB9, RJ-45 Ethernet jack, screw terminals, barrel jack, USB, SD Flash, and more. Included in the Package 1 Board Compatibility List NANO54415 (purchased separately) ### NANO Break Out Board Included in the Package 1 Platform Hardware Click here for additional product information Notes This product only includes the NANO-BOB-200IR hardware. If you need documentation, software, or support, please see the NNDK-NANO54415-KIT This product does not have an RJ-45 jack installed. This product does not include a NANO54415-200IR Core Module. ### Development Board (70 Version) MOD-DEV-70CR Included in the Package 1 Board Compatibility List MOD5234 MOD5270 MOD5282 (Legacy) MOD54415 / MOD54417 MODM7AE70 ### Development Board (40 Version) Included in the Package 1 Board Compatibility List MOD5213 ### SBL2e Evaluation Kit SBL2e Datasheet 921.24 KB 54853 downloads Download Included in the Package 1 Platform Hardware 1 Adapter Board 1 Quick Start Guide 1 USB Cable 1 RJ-45 Ethernet Jack 1 Serial Cable 1 Blue CAT5 Patch Cable 1 Red CAT5 Cross-over Cable Click here for additional product information NOTE: These kits are USB powered (with the included USB cable), but can also be powered by a power adapter which can be purchased here. ### DIN Rail Mounting Kit (200 Version, single sided) Included in the Package 2 DIN Rail Mounting Brackets (left and right) 4 Screws 2 Mounting Clips Compatibility List CB34 EX SB72 EX SB700 EX SB800 EX PK70 EX PK70 EX 232 PK70 EX 485 PK70 EX MMS PK70 EX NTP Note: This product can be used as a replacement for the DIN-400. The DIN-400 is no longer being produced. ### DIN Rail Mounting Brackets (110 Version, metal only) Included in the Package 2 DIN Rail Mounting Brackets (left and right) Compatibility List CB34 EX SB72 EX SB700 EX SB800 EX PK70 EX PK70 EX 232 PK70 EX 485 PK70 EX MMS PK70 EX NTP Note: This product can be used as a replacement for the DIN-300. The DIN-300 is no longer being produced. ### DIN Rail Mounting Kit (100 Version, double sided) Included in the Package 2 DIN Rail Mounting Brackets (left and right) 4 Screws 2 Mounting Clips Compatibility List CB34 EX SB72 EX SB700 EX SB800 EX PK70 EX PK70 EX 232 PK70 EX 485 PK70 EX MMS PK70 EX NTP Note: This product can be used as a replacement for the DIN-300. The DIN-300 is no longer being produced. ### Mature-Lifecycle Serial to Ethernet ### Mature-Lifecycle System-On-Modules ### Mature-Lifecycle Development Kits ### PK70 EX Network Product Kit PK70 EX Datasheet 795.92 KB 19897 downloads Download PK70 Flash Memory PCN 0.00 KB 16989 downloads This Product Change Notice details the flash memory component change of our PK70 based devices. Download Add-on Board Options Have NetBurner Prototype and Produce a Board Use a Pre-Built Add-on Board CPLD board ADC/DAC/GPIO board FPGA board NTP/GPS board Quad UART with support for RS-232/422/485 board Design your own Add-on Board Product Posts Customer Spotlight: NetBurner Enables MDI To Be In Two Places At Once Wouldn’t it be nice to have a teleportation system? To step through a convenient portal and be at your destination instantly? If you’ve ever had Read More » October 28, 2020 The RS-485 and RS-422 Standard Protocols Last week we reviewed the RS-232 standard protocol. We laughed, we cried. Overall, it was a pretty good time. Even though it is well established, used Read More » November 18, 2019 All About the RS-232 Serial Communication Protocol What Is RS-232 Serial Communication Protocol and What Does It Do? It may come as a shock to some of you youngsters, but the RS-232 Read More » October 17, 2019 NetBurner in the Field: Sirus Solar DS-201 Solar Monitor  NetBurner’s goal is to enable innovation and engineering solutions with our easy to use and powerful system on modules, embedded IoT development kits, and turnkey Read More » September 28, 2017 Get on the I2C Bus! I2C: The Kindergarten Classroom of Protocols Have you ever found yourself daydreaming idly, “If only there was something out there that allowed me the luxury Read More » September 27, 2017 How to Create a Virtual Serial Port (COM Port) What is a virtual COM port? A virtual COM port or a virtual serial port is an ideal solution when a legacy software application expects Read More » September 26, 2017 ### Serial-Enabled Web Server Development Kit Specs 2 Serial Ports Web Based Configuration Customize with development kit ### CB34 EX CB34 EX Datasheet 1.50 MB 35378 downloads CB34 EX Datasheet. Find data and specifications on this NetBurner module. Mechanical, electrical and interface details. CAN to Ethernet Server. Access 2 serial ports over SSL & SSH Ethernet! Web Based Configuration. Ind temp range -40°C to 85°C Customize with dev kit. Download Note: Device programming is required for CAN devices (development kit required). This device is ONLY pre-programmed to work with RS-232 and RS-485 devices. Product Posts Customer Spotlight: NetBurner Enables MDI To Be In Two Places At Once Wouldn’t it be nice to have a teleportation system? To step through a convenient portal and be at your destination instantly? If you’ve ever had Read More » October 28, 2020 All About the RS-232 Serial Communication Protocol What Is RS-232 Serial Communication Protocol and What Does It Do? It may come as a shock to some of you youngsters, but the RS-232 Read More » October 17, 2019 Get on the I2C Bus! I2C: The Kindergarten Classroom of Protocols Have you ever found yourself daydreaming idly, “If only there was something out there that allowed me the luxury Read More » September 27, 2017 How to Create a Virtual Serial Port (COM Port) What is a virtual COM port? A virtual COM port or a virtual serial port is an ideal solution when a legacy software application expects Read More » September 26, 2017 Demystifying Serial Tunneling In this article, we’ll explain Serial Tunneling and how this powerful capability uses Ethernet to connect two or more separated serial end-points. We’ll also introduce Read More » August 23, 2017 Writing Your Own Serial Port Processing Function Using Callbacks Photo Credit: Lobo Studio Hamburg Handling serial data streams is our bread and butter. In a majority of cases, NetBurner’s serial device platforms are ready Read More » July 19, 2017 Not the right device? Compare all Ethernet to Serial Servers by feature. ### SB70 LC SB70 and SB70LC End of Life Notice 78.43 KB 11222 downloads Download SB70LC Datasheet 869.31 KB 37180 downloads Download Product Posts New Feature: Easy SSL Certificates with ACME and Let’s Encrypt Easily add trusted SSL/TLS certificates to your NetBurner project! Read More » February 2, 2024 Introduction to the SSH Protocol Introduction One of the most common tasks in local and Internet networks is controlling a device remotely to carry out configuration, maintenance, or even file Read More » March 30, 2022 Don’t Be the Weakest Link: Auto-Generated Self-Signed Certificates For Embedded and IoT Devices A New Way to Protect Your IoT and Embedded Devices The saying goes, “A chain is only as strong as its weakest link.” Nowhere is Read More » May 28, 2020 Peer Verification: Getting to the Root of the Matter “There are a thousand hacking at the branches of evil to one who is striking at the root.” – Henry David Thoreau Staying Safe on Read More » April 28, 2020 SSL/TLS Serial Tunneling Enabling NetBurner’s Built-in Secure Serial Capability Let’s be honest, if you had a “kick me” sign taped to your back, you’d want someone to tell Read More » January 30, 2018 Creating a Self-Signed SSL/TLS Certificate for Secure IoT Applications These days, special consideration into the security of your internet accessible devices is a must. The proliferation of the Internet of Things (IoT) has provided Read More » December 20, 2017 Not the right device? Compare all Ethernet to Serial Servers by feature. ### SBL2e SBL2e Datasheet 921.24 KB 54853 downloads Download SBL2e CHIP & BOB Datasheet 943.76 KB 27682 downloads Download Product Posts Customer Spotlight: NetBurner Enables MDI To Be In Two Places At Once Wouldn’t it be nice to have a teleportation system? To step through a convenient portal and be at your destination instantly? If you’ve ever had Read More » October 28, 2020 All About the RS-232 Serial Communication Protocol What Is RS-232 Serial Communication Protocol and What Does It Do? It may come as a shock to some of you youngsters, but the RS-232 Read More » October 17, 2019 Get on the I2C Bus! I2C: The Kindergarten Classroom of Protocols Have you ever found yourself daydreaming idly, “If only there was something out there that allowed me the luxury Read More » September 27, 2017 How to Create a Virtual Serial Port (COM Port) What is a virtual COM port? A virtual COM port or a virtual serial port is an ideal solution when a legacy software application expects Read More » September 26, 2017 Demystifying Serial Tunneling In this article, we’ll explain Serial Tunneling and how this powerful capability uses Ethernet to connect two or more separated serial end-points. We’ll also introduce Read More » August 23, 2017 Writing Your Own Serial Port Processing Function Using Callbacks Photo Credit: Lobo Studio Hamburg Handling serial data streams is our bread and butter. In a majority of cases, NetBurner’s serial device platforms are ready Read More » July 19, 2017 Not the right device? Compare all Ethernet to Serial Servers by feature.   ### PK70 EX 4-Port Serial to Ethernet Servers PK70 EX 232 Datasheet 730.71 KB 10433 downloads Download PK70 EX 485 Datasheet 730.13 KB 9152 downloads Download PK70 EX MMS Datasheet 733.35 KB 8875 downloads Download Product Posts Customer Spotlight: NetBurner Enables MDI To Be In Two Places At Once Wouldn’t it be nice to have a teleportation system? To step through a convenient portal and be at your destination instantly? If you’ve ever had Read More » October 28, 2020 The RS-485 and RS-422 Standard Protocols Last week we reviewed the RS-232 standard protocol. We laughed, we cried. Overall, it was a pretty good time. Even though it is well established, used Read More » November 18, 2019 All About the RS-232 Serial Communication Protocol What Is RS-232 Serial Communication Protocol and What Does It Do? It may come as a shock to some of you youngsters, but the RS-232 Read More » October 17, 2019 NetBurner in the Field: Sirus Solar DS-201 Solar Monitor  NetBurner’s goal is to enable innovation and engineering solutions with our easy to use and powerful system on modules, embedded IoT development kits, and turnkey Read More » September 28, 2017 Get on the I2C Bus! I2C: The Kindergarten Classroom of Protocols Have you ever found yourself daydreaming idly, “If only there was something out there that allowed me the luxury Read More » September 27, 2017 How to Create a Virtual Serial Port (COM Port) What is a virtual COM port? A virtual COM port or a virtual serial port is an ideal solution when a legacy software application expects Read More » September 26, 2017 Not the right device? Compare all Ethernet to Serial Servers by feature. ### MOD5213 System-on-Module MOD5213 Datasheet 461.60 KB 12470 downloads Download Product Posts Use Qwiic I2C and SOMRT1061 for Rapid Prototyping Say goodbye to breadboards and jumper wires, say hello to effortless prototyping with Qwiic I2C and the SOMRT1061! Read More » July 22, 2024 Working Outside the Box: A to Z NetBurner Startup Guide This post provides a start to finish description of how to go from opening your first NetBurner Network Development Kit (NNDK) box to getting your Read More » August 30, 2018 Get on the I2C Bus! I2C: The Kindergarten Classroom of Protocols Have you ever found yourself daydreaming idly, “If only there was something out there that allowed me the luxury Read More » September 27, 2017 Not the right module? Compare all modules by feature. ### MOD5234 System-on-Module MOD5234 Datasheet 1.04 MB 30364 downloads Download MOD5234 1588 Datasheet 896.30 KB 44148 downloads Download Product Posts Introducing the NTP1061 Outdoor Time Server Introducing an affordable, weatherproof, self-contained NTP server! A single Power Over Ethernet cable is now all it takes to deliver sub-millisecond time accuracy to an entire network, no manual clock-setting or antenna wiring required. Read More » March 12, 2026 Supercharge NetBurner Development with AI You know AI can write emails and answer trivia questions for you, and you might even use it to help you write code, but did Read More » July 31, 2025 Embedded MQTT: Getting Started the Easy Way I’m an intermediate level embedded developer and I’ve heard the term “MQTT” for a lot over the past year but never really delved into the details. I decided to spend a Saturday to understand what it is and implement it on an embedded device so I can use it for other projects, like sensors and various controllers that need to be monitored and controlled but are behind a router and firewall. Read More » June 24, 2025 Bridging the Web-Embedded Divide, Part 1: Switch Counter There’s a world of difference between a web application that runs on a $3000 server in a datacenter and an embedded application that runs on Read More » September 26, 2023 How to Connect Your Embedded System to Azure IoT Hub with MQTT This is the first article in a two part series that will cover how to use our embedded systems to connect to Microsoft’s Azure IoT Read More » January 27, 2021 IoT Fight Night: AWS IoT Core vs Google Cloud IoT Core An IoT Cloud Service Comparison If you’re looking for an easy way to get your Internet of Things (IoT) projects set up, consider partnering with Read More » October 23, 2019 Not the right module? Compare all modules by feature. ### MOD5270 System-on-Module The NetBurner MOD5270 multi-function Ethernet System-on-Module is a device containing everything needed for IoT and embedded design engineers to add network control and to monitor a company’s communications assets. For a very low price point, this module solves the problem of network-enabling devices with 10/100 Ethernet, including those requiring digital, analog and serial control. MOD5270 Datasheet 824.44 KB 34239 downloads Download Product Posts Introducing the NTP1061 Outdoor Time Server Introducing an affordable, weatherproof, self-contained NTP server! A single Power Over Ethernet cable is now all it takes to deliver sub-millisecond time accuracy to an entire network, no manual clock-setting or antenna wiring required. Read More » March 12, 2026 Supercharge NetBurner Development with AI You know AI can write emails and answer trivia questions for you, and you might even use it to help you write code, but did Read More » July 31, 2025 Embedded MQTT: Getting Started the Easy Way I’m an intermediate level embedded developer and I’ve heard the term “MQTT” for a lot over the past year but never really delved into the details. I decided to spend a Saturday to understand what it is and implement it on an embedded device so I can use it for other projects, like sensors and various controllers that need to be monitored and controlled but are behind a router and firewall. Read More » June 24, 2025 Bridging the Web-Embedded Divide, Part 1: Switch Counter There’s a world of difference between a web application that runs on a $3000 server in a datacenter and an embedded application that runs on Read More » September 26, 2023 How to Connect Your Embedded System to Azure IoT Hub with MQTT This is the first article in a two part series that will cover how to use our embedded systems to connect to Microsoft’s Azure IoT Read More » January 27, 2021 IoT Fight Night: AWS IoT Core vs Google Cloud IoT Core An IoT Cloud Service Comparison If you’re looking for an easy way to get your Internet of Things (IoT) projects set up, consider partnering with Read More » October 23, 2019 Not the right module? Compare all modules by feature. ### Product Kit Add-On Boards Add-on Boards for the NetBurner Network Product Kit PK70EX Add-on Board Options: Have NetBurner Prototype and Produce a Board Use a Pre-Built Add-on Board CPLD board ADC/DAC/GPIO board FPGA board NTP/GPS board Quad UART with support for RS-232/422/485 board Design your own Add-on Board ### PINK70 & PINK70 LC Serial-Enabled Web Server Legacy SB70 Datasheet 208.86 KB 19100 downloads Download SB70LC Datasheet 869.31 KB 37180 downloads Download ### PK70 EX NTP Network Time Server PK70 EX NTP Datasheet 651.87 KB 20858 downloads Download PK70 EX NTP User's Manual 0.00 KB 13423 downloads Download Want to customize? The PK70EX-NTP can be customized with your own branding, or modified to suit any software or hardware customization. Please contact sales@neturner.com for details, or click here for development kit information. Product Posts Introducing the NTP1061 Outdoor Time Server Introducing an affordable, weatherproof, self-contained NTP server! A single Power Over Ethernet cable is now all it takes to deliver sub-millisecond time accuracy to an entire network, no manual clock-setting or antenna wiring required. Read More » March 12, 2026 Customer Spotlight: NetBurner Enables MDI To Be In Two Places At Once Wouldn’t it be nice to have a teleportation system? To step through a convenient portal and be at your destination instantly? If you’ve ever had Read More » October 28, 2020 How to set up an NTP Time Server on your Network How do you synchronize the machines on your network to the same time? This articles describes how to set up an NTP Server and configure Read More » July 26, 2018 NetBurner in the Field: Sirus Solar DS-201 Solar Monitor  NetBurner’s goal is to enable innovation and engineering solutions with our easy to use and powerful system on modules, embedded IoT development kits, and turnkey Read More » September 28, 2017 Get on the I2C Bus! I2C: The Kindergarten Classroom of Protocols Have you ever found yourself daydreaming idly, “If only there was something out there that allowed me the luxury Read More » September 27, 2017 How to Create a Virtual Serial Port (COM Port) What is a virtual COM port? A virtual COM port or a virtual serial port is an ideal solution when a legacy software application expects Read More » September 26, 2017 ### Serial to Ethernet Development Kits Why do developers love working with NetBurner Development Kits? Software Example Source Code Get hands-on familiarity with the NetBurner platform by studying, building, and modifying the included source code examples. Each example consists of buildable and executable source code that illustrates how to accomplish one or more tasks. Eclipse Based IDE NBEclipse is a plug-in to the Eclipse IDE and provides a great environment to manage projects, edit code, debug, and download your application to NetBurner devices. Software Libraries ANSI C/C++ compiler and linker (GNU Based), TCP/IP stack, Web server, E-mail protocols, RTOS, Flash file system, and more. Optional software modules SNMP V1 (Module License Version) Hardware Development Boards Interact with a NetBurner device by loading examples that react to changes in dip switch position or light up an LED in response to incoming data. We provide schematics for development boards so that you can use them in your own designs. Simple firmware updates Update your hardware over 10/100 Ethernet or its serial port USB for power and data Now you can communicate with processor UARTs from your Mac or Windows PC. The on-board USB port also enables you to power the development board. Flash card storage The FAT12/16/32 flash file system gives developers the flexibility to store and exchange data through flash cards. NetBurner provides a standard API, complete C-based source code, drivers, and ample examples to get started. Technical Support E-Mail Support Our prompt email support provides excellent results and works as follows: your email question is received by support personnel with a wide range of abilities. The individual best suited to answer the question will assume responsibility to answer your question. This method avoids tiered approach of forcing you to go through many people before finding the right person to help. Documentation Getting started guides, manuals, and application notes can help you load your first application code image in minutes. Message Boards The NetBurner message boards have been used to discuss any hardware or software issues with NetBurner developers like you. It has been a great place for developers in the NetBurner community to share new ideas and to communicate unique implementations of their product. ### System on Module IoT Development Kits Choosing the right IoT Development Kit is no joke for serious projects. Find out why developers love working with NetBurner Embedded Dev Kits. Your success is our success which is why NetBurner does everything possible to support the design and commercialization of cutting edge and reliable automation and IoT products and solutions. Our robust and easy to use development kits accelerate embedded development into scalable product and soluitions. With NetBurner, developers can focus on the core of their application and leave it to us to do the embedded heavy-lifting. 1. Included IoT Development Software Eclipse-Based IDE NBEclipse is a plug-in to the Eclipse IDE and provides a great environment to manage projects, edit code, debug, and download your application to NetBurner devices. Example Source Code Get hands-on familiarity with the NetBurner embedded platform by studying, building, and modifying the included source code examples. Each example consists of buildable and executable source code that illustrates how to accomplish one or more tasks. Software Libraries ANSI C/C++ compiler and linker (GNU Based), TCP/IP stack, Web server, E-mail protocols, RTOS, Flash file system, and more. Security and Optional Software Modules Embedded SSL/TLS & SSH Security Suite, SNMP V1 (optional Module License Version) 2. Hardware Development Boards Each SOM dev kit comes with the industrially-rated embedded system on module platform hardware. We also include a development carrier board which makes prototyping fast and easy. Interact with a NetBurner dev kits by loading examples that read and control integrated dip switches or LEDs in response to incoming data. NetBurner even provides schematics for development boards so that you can easily use them in your own designs and get deployed faster. Power and data Now you can communicate with processor UARTs from your Mac or Windows PC via USB. The on-board USB port also enables you to power the development board. Or use a wall powered barrel jack with +7 to +24 VDC supply of your choosing (or add one while shopping). Flash card storage The FAT12/16/32 flash file system gives developers the flexibility to store and exchange data through flash cards. NetBurner provides a standard API, complete C-based source code, drivers, and ample examples to get started. 3. Firmware Simple firmware updates Perform updates remotely. Update your hardware over 10/100 Ethernet or its serial port. RTOS Robust Real-Time Operating System (RTOS) optimized for high-speed encrypted networking, task management and IO. With NetBurner you get an RTOS that we stand behind and fully support. 4. Technical Support E-Mail and Online Support Portal All dev kits come with a limited time support package. Our prompt email support provides excellent results and works as follows: your email question is received by support personnel with a wide range of abilities. The individual best suited to answer the question will assume responsibility to answer your question. This method avoids tiered approach of forcing you to go through many people before finding the right person to help. Documentation and Learn Tutorials Getting started guides, manuals, and application notes can help you load your first application code image in minutes. Our Learn Blog features detailed hands-on tutorials with NetBurner embedded development kits, popular sensors, cloud services, and protocols. Support Forum The NetBurner forum is great to discuss any hardware or software issues with developers like you. It has been a great place for developers in the NetBurner community to share new ideas and to communicate unique implementations of the product. 5. Quality and Reliability All of our products are made and checked for quality in the USA, rated for industrial operating temperatures, and are RoHS compliant. We stand by the quality and reliability of our products, include our Embedded IoT Development Kits, with our 1 year warranty and expert support.   Note: A development kit or software upgrade is required for each NetBurner platform type. The purpose of development kit boards is to demonstrate the features and functions of our module products. Development kit boards should not be designed into your final product as they continuously change as new features are added to the module product line. We are willing to provide the design information to you if you wish to manufacture a particular development board revision on your own. ### MOD5441X System-on-Module Key Points Use as a high-performance single board computer or add Ethernet connectivity to a new or existing design Industrial temperature range (-40°C to 85°C) MOD54417 can function as a switch or as two independent ports, each with its own MAC address Customize with development kit Features ColdFire 5441x microprocessor at 250MHz 32MB Flash Memory 64MB DDR2 RAM Up to two 10/100Mbps Ethernet 8 UARTs, 4 I2C, 2 CAN, 3 SPI, and 1-Wire® support SD/MMC and MicroSD flash card ready 42 digital I/Os and 2 additional digital inputs 16-bit address and data bus with 3 chip selects Eight 12-bit analog-to-digital converters (ADC) Two 12-bit digital-to-analog converters (DAC) Five pulse width modulators (PWM) Companion development kit The following is available with the development kit: Customize any aspect of operation including web pages, data filtering, or custom network applications Development software: NB Eclipse IDE, Graphical debugger, deployment tools, and examples Communication software: TCP/IP stack, HTTP web server, FTP, E-mail, and flash file system System software: uC/OS RTOS, ANSI C/C++ compiler and linker Product Datasheet MOD5441X Embedded Ethernet System on Module Datasheet 990.26 KB 33501 downloads Datasheet for our popular MOD5441X embedded system on module. The datasheets provides data and specifications for our single and dual jack models, MOD54415 and MOD54417, respectively. Electrical, mechanical and interface details. Download Product Posts NetBurner In The Field: UAV-Hyperspectral Imager for Ecological Monitoring At NetBurner, we love to see what people are building with our products. What’s even better is when we get permission to showcase those inspiring Read More » July 30, 2019 How to Connect Your Embedded System to AWS IoT Core with MQTT In this tutorial, we are going to show you exactly how to get started with the AWS IoT Core service by using it to connect to an Read More » June 26, 2019 NetBurner in Flight Ground and airborne tracking platforms maintain a communications link “For many networked consumer products, a Raspberry Pi is a popular option; however, for timing-critical or Read More » April 25, 2018 Intelligent Robotic Arm with Networking: Part 2 This is the second part of the two part blog post; It will cover the more technical details of the robotic arm. If you have Read More » July 27, 2015 Intelligent Robotic Arm with Networking: Part 1 This is the first of two posts about the Duck Shepard robotic arm. This post will be an overview of the project and the second Read More » July 24, 2015 Playing audio on an embedded device Sometimes you have an embedded project that needs to play audio. Maybe you just need to make a beep, in which case a simple piezo Read More » October 25, 2013 Not the right module? Compare all modules by feature. ### WIFI 802.11b/g/n Module NBWIFIIN Datasheet 1.15 MB 29935 downloads Download Note: The NBWIFIIN-SOM-UFLIR and NBEXP-WIFI-INIR are no longer being produced. A replacement for the wireless solution is currently in development. For additional details, please read the following: NBWIFIIN-SOM-UFL End of Life Notice (EOL) 117.94 KB 1738 downloads Download Module Compatibility MOD5234 MOD5270 MOD5272 MOD5282 MOD54415 MOD54417 NANO54415 SB70LC SBE70LC MODM7AE70 SOMRT1061 Breakout Board Compatibility SB800EX (replacement) DEV-SOMRT1061-100CR (SOMRT1061 Development Kit board) Product Posts Cellular LTE/4G Connectivity with NetBurner Devices For those who are too young to recall the marvel and sheer monstrosity, not to mention the high cost, of early cell phones and “car Read More » October 25, 2018 Intelligent Robotic Arm with Networking: Part 2 This is the second part of the two part blog post; It will cover the more technical details of the robotic arm. If you have Read More » July 27, 2015 Intelligent Robotic Arm with Networking: Part 1 This is the first of two posts about the Duck Shepard robotic arm. This post will be an overview of the project and the second Read More » July 24, 2015 The easy way to add 802.11 Wifi to your product Adding wifi is very easy to do (given the right tools). It’s also full of potential pitfalls you need to be aware of. This article Read More » June 13, 2014 ### SBL2e X / XA - Serial to Ethernet Server SBL2EX Datasheet 1.18 MB 14736 downloads Download SBL2e XA Datasheet 1.68 MB 11964 downloads Download Product Posts Customer Spotlight: NetBurner Enables MDI To Be In Two Places At Once Wouldn’t it be nice to have a teleportation system? To step through a convenient portal and be at your destination instantly? If you’ve ever had Read More » October 28, 2020 All About the RS-232 Serial Communication Protocol What Is RS-232 Serial Communication Protocol and What Does It Do? It may come as a shock to some of you youngsters, but the RS-232 Read More » October 17, 2019 Get on the I2C Bus! I2C: The Kindergarten Classroom of Protocols Have you ever found yourself daydreaming idly, “If only there was something out there that allowed me the luxury Read More » September 27, 2017 How to Create a Virtual Serial Port (COM Port) What is a virtual COM port? A virtual COM port or a virtual serial port is an ideal solution when a legacy software application expects Read More » September 26, 2017 Demystifying Serial Tunneling In this article, we’ll explain Serial Tunneling and how this powerful capability uses Ethernet to connect two or more separated serial end-points. We’ll also introduce Read More » August 23, 2017 Writing Your Own Serial Port Processing Function Using Callbacks Photo Credit: Lobo Studio Hamburg Handling serial data streams is our bread and butter. In a majority of cases, NetBurner’s serial device platforms are ready Read More » July 19, 2017 Not the right device? Compare all Ethernet to Serial Servers by feature. ### SB700 EX Serial to Ethernet Server SB700EX Datasheet 1.40 MB 17399 downloads Download Product Posts New Feature: Easy SSL Certificates with ACME and Let’s Encrypt Easily add trusted SSL/TLS certificates to your NetBurner project! Read More » February 2, 2024 Introduction to the SSH Protocol Introduction One of the most common tasks in local and Internet networks is controlling a device remotely to carry out configuration, maintenance, or even file Read More » March 30, 2022 Don’t Be the Weakest Link: Auto-Generated Self-Signed Certificates For Embedded and IoT Devices A New Way to Protect Your IoT and Embedded Devices The saying goes, “A chain is only as strong as its weakest link.” Nowhere is Read More » May 28, 2020 Peer Verification: Getting to the Root of the Matter “There are a thousand hacking at the branches of evil to one who is striking at the root.” – Henry David Thoreau Staying Safe on Read More » April 28, 2020 SSL/TLS Serial Tunneling Enabling NetBurner’s Built-in Secure Serial Capability Let’s be honest, if you had a “kick me” sign taped to your back, you’d want someone to tell Read More » January 30, 2018 Creating a Self-Signed SSL/TLS Certificate for Secure IoT Applications These days, special consideration into the security of your internet accessible devices is a must. The proliferation of the Internet of Things (IoT) has provided Read More » December 20, 2017 Not the right device? Compare all Ethernet to Serial Servers by feature. ### Support Renewal Includes: 1 Renewal Serial Number Click here to add serial number to your support account. NOTE: The serial number will enable you to: Create new support requests (one year). Download software and tool updates (one year). This annual support and maintenance agreement is for one development kit and should only be ordered by customers with an existing NetBurner Support Account. A serial number is included with each development kit. NOTE: This product is for customers with questions about hardware purchased from NetBurner. If you are a Product Site License customer, you will need a Support & Maintenance Agreement (License Version, 1-Year Renewal) which can be purchased here. ### Support & Maintenance Agreement (Site License Version, 1-Year Renewal) 1 Renewal Serial Number Click here to add serial number to your support account. NOTE: The serial number will enable you to: Download software and tool updates (one year). Create new support requests (one year). This annual support and maintenance agreement should only be ordered by customers with an existing NetBurner Product Site License. If you do not have a NetBurner Support Account, please contact NetBurner Sales to assist in creating an account or to activate inactive accounts. ## Pages ### Microsemi Microchip SyncServer S80 vs NetBurner NTP1061 Comparison The SyncServer S80 Is Gone. Here's What Comes Next. Microchip discontinued the SyncServer S80 in September 2025, leaving a lot of engineers and integrators looking for a reliable outdoor NTP source. If that's you, take a look at the NetBurner NTP1061: a new self-contained outdoor time server that handles 20× the throughput at a fraction of the cost, all from that same standard PoE cable. Here's how they stack up: FeatureMicrochip SyncServer S80NetBurner NTP1061 StatusDiscontinued (Sept 2025)New — shipping May 2026 StratumStratum 1Stratum 1 Satellite SupportGPS & GLONASSAll major GNSS constellations Timestamp Accuracy< 100 ns< 1 µs PowerPoEPoE EthernetGigabit EthernetEthernet IP RatingRuggedized outdoorIP65 Operating TempOutdoor-rated−40 °C to +85 °C Size / WeightLarger, wall-mountable13 × 6 cm, ~100 g Dynamic / Mobile UseYes (automotive, sea modes)Stationary SecurityNTP Reflector hardware firewallHTTPS web interface ManagementCLI over SSH v2Web-based GUI Network ProtocolsIPv4, IPv6, NTP, SNMP, DHCPIPv4, IPv6, NTP, SNTP, DHCP Approx. Price$2,695$299 Ready to Replace Your S80? For your everyday deployments like security cameras, enterprise networks, industrial automation, and telecom, the NTP1061 delivers the accuracy you need with a simpler installation and a price that can't be beat. Plug in one PoE cable, give it a view of the sky, and your entire network has sub-millisecond precise time. Order the NTP1061 → ### Full Lifecycle Management Full Lifecycle Management Streamline the embedded product lifecycle with NetBurner Taking an embedded product from prototype to production, and then supporting it in the field, involves many moving parts: testing, configuration, code management, and security. At NetBurner, we've built our platform to reduce complexity at every stage. Everything is managed through web interfaces and JSON. Use our defaults, build custom pages, or integrate with your tools via RESTful APIs. The Embedded Lifecycle Challenge Common problems that slow down product development and deployment Production Setup Complexity JTAG programmers, special cables, complex toolchains—just to load your first board? Time wasted on setup is time not spent on your product. Configuration Management Calibration data lost after updates? Customer settings wiped? Per-device customization requiring custom tools? These shouldn't be problems in 2025. Field Update Risks How do you safely update thousands of devices in the field? Manual processes don't scale, and bricked devices destroy customer confidence. Revenue Protection Protecting your IP and preventing unauthorized hardware from running your code is critical to maintaining your business model. NetBurner's Web-Based Lifecycle Solution Enabling lifecycle management through web interfaces and RESTful APIs 1   Development & Testing Start coding in minutes, not hours—everything accessible through your browser.Zero-Setup ProgrammingLoad code via web interface, RESTful API calls, our NBEclipse IDE, makeor cmakeJSON-based configuration for complete controlNo JTAG, no special cables, no bootloader setupWorks with wget, curl, or any HTTP clientRapid Iteration15-second switch between test and production buildsConfiguration persists across application changesBuilt-in web interface for easy debuggingRESTful API that enables easy automated testing workflows 2   Production & Manufacturing Scale from one to thousands with web-based tools your production team already understands.Factory-Ready ToolsDevices arrive ready to use with a MAC address already encodedPer-device customization via RESTful config APIWeb interface for production line techniciansScriptable with any language that speaks HTTPConfiguration That SticksConfiguration is stored separately from codeSurvives firmware updates automaticallyAccess via default web UI or custom pagesRESTful API for remote managementEasily connect configurations to MQTT 3   Deployment & Updates Keep your fleet current and secure with multiple paths for both production and in-field app updates.Multiple Update MethodsLoadCodeFromServer example: update your application from an HTTP/HTTPS serverFileUpdate example: update your application via SD card for offline devicesSignedApp example: Cryptographic verification of updatesDirect HTTP upload: no JTAG required, update your application over the networkDeployment ControlEasily implement encrypted downloads over the webRESTful updates of code and configurationBuilt-In ReliabilityDiagnostic monitoring through an extensible web-based reportsAutomatic recovery from failed updates 4   Long-Term Support Maintain and protect your investment throughout the product lifetime.Revenue ProtectionBoardLock: Tie applications to specific hardware serial numbersPrevent unauthorized hardware from running your codeProtect your business model and revenue streamSustainable SecurityAutomatic SSL/TLS certificates via ACMEGranular control over user access permissions and encryptionField MaintenanceRemote diagnostics via web dashboardJSON-based telemetry and custom metricsEasy access to configuration, calibration, and feature enablement via API or web interfaceMultiple methods and tools for local device access and discoveryCustomer-specific configuration updates Built-In Enterprise Features Everything you need, nothing you don't: all accessible through web interfaces Web-Based EverythingAll configuration and code loading through web interfaces and JSON. Use our defaults, customize onboard pages, or build remote tools with RESTful APIs. No proprietary protocols or special software required.Automatic TLS CertificatesACME protocol support for Let's Encrypt and other CAs. Your devices can manage their own SSL certificates. Configure once through the web interface and forget it.Network DiscoveryFind all NetBurner devices on your network instantly through our web-based discovery tool. Self-hostable for remote management and monitoring of distributed deployments.Zero-Effort IPv6Full IPv6 support enabled by default. No extra configuration, no additional code. Your products are future-proof automatically, manageable through the same web interfaces as IPv4.Extensible DiagnosticsBuilt-in system health monitoring accessible via web dashboard plus easy hooks for your custom metrics. Export data as JSON for integration with your monitoring systems.Working ExamplesNot just documentation—complete, working code examples for every lifecycle stage. LoadCodeFromServer, FileUpdate, SignedApp, BoardLock, and more. Copy, modify, deploy. Ready to Simplify Your Product Lifecycle? Join thousands of engineers who've eliminated deployment headaches with NetBurner. Explore Documentation Talk to an Expert NetBurner has been simplifying embedded networking since 1998. Our complete hardware and software solutions are designed in San Diego, USA and manufactured with genuine components. All products are RoHS compliant and rated for industrial temperature ranges. ### Quality Assurance: ISO 9001 Certified Certificate Number 1119650 We are proud to have implemented an ISO 9001:2015 Certified Quality Management System (QMS), the international standard for quality assurance. Our QMS has been certified by Systems Certification Body (SCB) an ANSI National Accrediation Board (ANAB) Accredited certification body and auditor, and our ISO9001 certificate is available upon request.NetBurner, Inc. is committed to providing innovative, high-quality products and support to enable our customers to be successful. This will be accomplished through continually improving our product offerings, customer support, internal processes and integration of customer feedback to fulfill our Quality Objectives as defined in our Quality System. ### Home Embedded Simplicity for a Novice,Industrial Power for a Pro Robust, easy-to-use networking and edge computing modules with built-in OTA updates, web configuration and diagnostics. Learn More Newsletter Networking In One Day We've built our reputation on partnering with you for your success: we don't just sell microcontrollers, we work to help you deliver results overnight. Say Hello to the most Affordable, Flexible Time Server on the Market. Based on NetBurner's newest ARM i.MX M7 platform, we've removed every possible barrier to deploying sub-millisecond-accuracy time to your network. No Internet connection required, just a Power over Ethernet cable and clear view of the sky. See Why the NTP1061 is Changing Everything Networked ARM® System-On-Modules Streamline Industrial IoT product development, reduce project risk, scale-up and sell faster with our powerful, flexible embedded SOMs! Explore NetBurner SDK Development Kits Everything needed for a professional or hobbyist to get started with our easy to use and flexible dev kit, including hundreds of examples. Explore Serial to EthernetWeb Servers Reliable networking products ready out of the box! Use for Industrial Automation and upgrades with WiFi, RS232, RS485, CANBUS, Modbus, and more. Explore Scale your prototypes to industry-ready products overnight. Try our latest NXP i.MX ARM-Cortex M7 development kit. More flexible, powerful, and production-ready than ever! See our Newest Dev Kit Software We provide as complete and well supported of an embedded IoT solution as possible. Our software and development tools, IDE, libraries, extensive code examples, up-to-date SSL/TLS library, documentation and affordable US-based support support our mission to help you deploy technology faster with an edge towards reliability, security, scalability, and sustainability. Intimidated by IDEs? We even offer competitive consulting and design. Hardware Our complete embedded IoT devices accelerate innovation and the development of new products, letting you field your systems and get to market faster. Our products are designed in San Diego, USA and manufactured with genuine components, are RoHS compliant and are rated for operation over industrial temperature ranges. Try our latest NXP i.MX ARM M7-powered embedded IoT development kit today! Turnkey Products If you are looking for an industrial Serial to Ethernet converting device, a Network Time Server (using NTP and GPS), or a Serial-Enabled Web Server, then NetBurner's battle hardened and industrial temperature-rated products are ready to step in and pick up the slack. Get your devices connected faster and easier than ever with these out-of-the-box embedded servers! Create Anything We have the hardware products & software solutions to help transform your work. SOLUTIONS System on Module (SOM) Virtual COM Port Embedded SDK SSL/TLS for IoT Serial to Ethernet NTP Servers Transform Your Process We do everything for our users because their success is quite literally our success. Complete Solutions​​ The workings of an embedded networking stack is definitely not trivial. Get all of the pieces you need right out of the box to rapidly develop and field your applications, with easy licensing. Easy to Use Use our NBEclipse IDE or bring your own! Our debugging tools, web-based configuration and diagnostics, robust documentation and simple C/C++ environment will get you up and running in no time. Secure & Supported​​ Get top of the line data security with our leading products. Find the help you need anywhere in the product life-cycle with our helpful West Coast USA customer support and sales team. Countries 0 Fielded Devices + 0 Years Continuous Use 0 Our Promise Reliability, quality, and great customer service are in our blood. Reliability & Quality You can trust over 25 years of innovation and quality from NetBurner. Our One Year Warranty is there to back you up. Industrial temperature range and RoHS compliance mean NetBurner devices are powering the world in every extreme environment there is. We are proud to have an ISO 9001:2015 certified quality management system. Support & Integrity Our top rate email support is staffed by our dedicated team of US-based engineers and experts. No call centers here! Track requests with our online support portal and get extra insight with our Community Forum.   "I had my NetBurner board up on the network in about 15-20 minutes, about the time it took to unpackage it, read the documentation, hookup a small hub and the power supply, and run the configuration program to set the network address." Kim C. "As a web developer I needed an SSL/TLS-ready IoT device that was easy to get running over the web and provide serious real-time performance, capability and scalability. Netburner really helped make my project successful." Adam C. "I really appreciate all the help - you've put us way ahead of the game, and kept us ahead of schedule in general. Thanks again for making this project a success as far as we're concerned!" Bob J. "NetBurner’s boards and development tools have been very easy to use since day one. Solid quality, good documentation and examples, and fun to program." Evan B. "I really appreciate all the help - you've put us way ahead of the game, and kept us ahead of schedule in general. Thanks again for making this project a success as far as we're concerned!" Alan W. Posts & Social Connect with us! Sign Up for Our Newsletter ### SOMRT1061 and Teensy 4.1 Comparison Introduction PJRC’s Teensy 4.1 and the Net Burner SOMRT1061 are both great products. The Teensy tends to be used by hobbyists, and the SOMRT1061 for large scale production. The goal of this article is to compare the two products and show that the SOMRT1061 is an excellent choice for any project or product, whether it be hobbyist or a company product that must meet rigorous industrial requirements. NetBurner development kits aren’t just developer and product-friendly - they’re product-minded and include things like life-cycle support, industrial temperate range, and end-user tools, for deployment, configuration and application updates. Teensy 4.1, developed by PJRC and widely used by makers and educators. It comes in a 40-pin DIP package to enable a low-barrier for experimentation. The NetBurner SOMRT1061 is available in two form factors: an 88-pin 1-inch (25.4mm) square soldered-down SOM, and an 88-pin SOM-on-carrier with standard 0.1 inch (2.54mm) male headers for easy troubleshooting, development, and prototyping. Deployable by Design: Surface-mount form factor, –40°C to +85°C industrial temperature ranges, ready to be pick-n-place’d or added to an existing product. Alternate Package with Easy toAccess 0.1” Header Pins: For anyone that prefers standard header pins instead of a solder down SOM. Built-In Memory Muscle: 32MB External is RAM included and part of the application and data space (as opposed to external memory). No soldering or reconfiguration necessary. Industrial-Grade Networking: Dual Ethernet ports, onboard PHY, and IEEE 1588 support out of the box. Continuity That Scales: ISO 9001, RoHS, revision control, lifecycle transparency, and sourcing reliability that go beyond the bench: we’re here to support your product’s success for years to come, not throw you curveballs. Protocols That Just Work: Native stacks for MQTT, Modbus, and TCP/IP ensure clean implementation and secure communication. Whether you're validating a concept or preparing for full-scale rollout, NetBurner supports your engineering goals with reliability, sourcing, and developer-first support so you can prototype without second-guessing your path to production.In the sections ahead we’ll break down how NetBurner and Teensy stack up, from hardware specs and connectivity to deployment readiness and developer experience. From Dev Kit to Deployment: Designing for the Finish Line Not all microcontroller platforms are created equal. NetBurner’s SOMRT1061 isn’t just a microcontroller on a dev board—it’s a production-grade ARM M7 system-on-module engineered to smooth the gaps between prototyping, development, deployment, and assembly-line production.You can start with NetBurner and stay with NetBurner. When you get a SOMRT1061 development kit, you start with a SOM surface-mount soldered to a carrier board, which is plugged into the development board using common 0.1” header pins. You can flash your app to it over the network within seconds and breadboard your proof of concept immediately, and then quickly start flashing low-quantity prototypes and beta units by getting additional SOMRT1061s on carrier boards and swapping them out. When you’re ready to condense your design, simply delete the headers from the outside of the footprint and shrink the PCB layout to use surface-mount SOMRT1061s instead, once again flashable over the network after assembly. Finally, factories can use pick-n-place machines and your own flashing/testing procedures to solder, program, and validate your high-volume product. Or, if you never reach high volume, the SOMRT1061 is still quite hand solderable!Whether you're prototyping a one-off scientific instrument or scaling up for a regulated deployment, NetBurner’s whole product line minimizes hardware rework, finicky bring-up procedures, and future headaches. Use Case Comparison: NetBurner SOMRT1061 vs PJRC Teensy 4.1 There’s definitely overlap between these microcontrollers in embedded systems and edge computing, but the key difference usually hinges on scale, reliability, and/or deployment environment. Let’s break this down: Use CaseWhere They Both FitWho Wins & Why Prototyping Embedded DevicesBoth allow rapid iteration with accessible toolchainsDraw: Teensy is attractive for beginners, but NetBurner comes out of the box with production-grade features Basic IoT NodesEach supports sensor input and network communicationsTeensy (small scale): for low-cost MVPs and hobby projects NetBurner (scalable): for mission-critical monitoring, logging, and control Educational PlatformsBoth have rich documentation and dev-friendly ecosystemsTeensy: more prevalent in K-12 and maker spaces. Through-hole soldering can be easier for some to work with. If you prefer working with Arduino IDE Teensy may be a better fit. NetBurner: ready to drop into more advanced vocational/industrial education fields. RoboticsGPIO, PWM, and UARTs enable motion and sensor I/ONetBurner: more I/O flexibility, expanded timers, a tighter production path, and an industrial-grade Real-Time Operating System with multiple easily-manageable task priorities. CAN transceivers ready on the dev board. Audio ProcessingI2S/TDM supported across bothTeensy: brings out all channels for the primary I2S module, allowing more bandwidth, which is much easier for multi-channel audio. The DMA engine can handle things more directly. NetBurner: brings out two signals for all three I2S modules, with TDM capability. More resource flexibility for varied use cases. Industrial AutomationTeensy can prototype control logicNetBurner: industrial temperature, dual Ethernet, CAN, and regulatory compliance all come standard Automotive PrototypingCAN support exists on bothNetBurner: higher temp tolerance and better integration flexibility Custom InstrumentationGPIOs + analog inputs are presentNetBurner: more channels, better timer granularity, and lifecycle stability for production builds Protocol GatewaysBoth can manage SPI/UART/CAN trafficNetBurner: native protocol support, helpful included tech support, and multi-port architecture reduce development burden Embedded Vision SystemsTeensy can manage basic camera interface workflowsNetBurner: External RAM and FlexIO enable sensor fusion, buffering, and processing Scientific Lab DevicesBoth support data acquisition setupsNetBurner: robust IO, flexible form factor, and stable hardware lifecycle offer the most dependability with least fuss Edge AI / ML InferenceTeensy can host small models with careNetBurner: 32 times more memory enables smooth inferencing at the edge Industrial IoT HubsNetwork features are present in bothNetBurner: deployment-grade support for multi-node communications, secure protocols, and sourcing reliability Network and Consumer DevicesWide range of Internet protocols and librariesNetBurner: no worrying about third party library licensing or supply chains Making the Leap: From Versatility to Viability There's real overlap between NetBurner and PJRC’s Teensy especially when it comes to prototyping workflows and flexible embedded applications. But when projects move from concepts or production, context starts to matter more than convenience.If your build is destined for home automation, maker demos, or short-run MVPs, Teensy's affordability and Arduino-style ecosystem offer strong appeal. But when your system faces industrial conditions, requires sustained sourcing, or demands professional-grade networking, Teensy's strengths may begin to bend under pressure.That’s when teams pivot to NetBurner.Whether it's needing built-in RAM for audio or video frames, onboard Ethernet for automation, temperature tolerance beyond 70°C, or long-term lifecycle transparency, NetBurner meets the moment. Its surface-mount design, deployment-grade SDKs, and industrial documentation make it ideal for integration not just experimentation.And for developers coming from Teensy, transitioning isn’t daunting. Most embedded libraries are cross-compatible, and NetBurner's dedicated tools, IDEs, and support resources are tailored to keep momentum moving without rework.The move from hobby-grade to deployment-ready microcontrollers isn’t just about capability—it's about choosing a platform that reduces risk, respects your roadmap, and builds with intention. Beyond the Bench: Why Some Hobbyists Start and Finish with NetBurner Not every embedded journey begins with industrial ambitions. For hobbyists and DIY engineers, platforms like PJRC’s Teensy deliver tremendous flexibility and low barrier to entry, especially for consumer-grade automation and lightweight sensor projects.But NetBurner isn’t reserved for enterprise deployment. In fact, many users discover it after hitting walls in their existing products or hobby builds, often when networking becomes critical. That’s where NetBurner shines: its SOMs are designed to drop into larger systems, with native Ethernet, dual PHY support, and module-based integration that saves time and headaches.Teensy’s pricing and Arduino-based ecosystem make it a great starting point for casual hobbyists. But for projects that demand industrial features like PoE, remote management, or stable long-term sourcing NetBurner often becomes the better fit. Its SOMs plug easily into custom systems, offer native networking capabilities, and are backed by solid documentation and direct technical support. If you’re comfortable designing your own boards or building something that might outgrow weekend status, NetBurner gives you the tools to scale without compromise.It’s not just about scale. It’s about intention. When your “hobby” starts looking like a future product, NetBurner offers a path with fewer compromises. When Your Hobby Project Turns Into a Product For those weighing the move, it helps to understand the key limitations that tend to surface when Teensy moves beyond the bench. Here's where small-scale strengths start to stretch and where NetBurner’s engineering-grade platform proves its staying power.Teensy boards are brilliant for early prototyping and DIY innovation, but when it’s time to build a product that ships in the thousands or operates within a critical industrial process, limitations begin to surface:Memory Expansion Is Optional, Not Native: While Teensy 4.1 includes 1MB of internal RAM and 8MB of Flash, that’s it. Developers can manually solder up to two PSRAM chips to expand RAM up to 16MB, but this isn’t standard and requires extra setup. In contrast, NetBurner offers 32MB of External RAM onboard—ready from the start and ideal for applications that demand high memory throughput.Limited long-term sourcing: Hobbyist boards like Teensy may change form factors or components without guaranteeing long-term availability, which can disrupt supply chains for production.Packaging not optimized for mass deployment: DIP-style packaging suits breadboarding but complicates surface-mount manufacturing. Aligning single-row headers adds time, effort, and cost.Less industrial compliance and ruggedization: NetBurner’s temperature range and signal interface protection suit regulated, industrial environments where Teensy can fall short. Spec Showdown: SOMRT1061 vs Teensy 4.1 CategorySOMRT1061Teensy 4.1 Form Factor88 castellated SMT pads or 0.1" headers via carrier48 through hole, must add headers ProcessorNXP ARM Cortex i.MX RT1061 Extended working time, low residual moisture, rapid-setting, and excellent resistance to freeze/thaw cyclingNXP ARM Cortex i.MX RT1062 2-line x 16 character LCD, soft-touch keypad, connections for a door contact, egress button, and a relay output for a door strike CPU Speed528 MHz (Industrial Spec)600 MHz Industrial Temperature Range-40C to +85CNo, 0C to 70C Floating Point FPUYesYes Flash Memory8M plus 1MB boot8MB TCM Memory1M SRAM (Up to 512K tightly coupled)1M SRAM (Up to 512K tightly coupled) External RAM32MB PSRAM, x8, DDR0 (optional QSPI memory support) Ethernet2: 1 MAC+PHY, 1 MAC (RMII)1 Flash File SystemYesYes GPIO6755 UARTs7, 6 with RTS/CTS8 SPI33 I2C33 CAN3, one with CAN FD3, one with CAN FD USB22 I2S/TDM and S/PDIF22 SDHC/SDIOYesYes PWM4435 ADC Inputs918 FlexIOYesYes CryptoYesYes SoftwareEasy royalty-free NetBurner RTOS with supportArduino (Teensyduino, modified MIT), FreeRTOS (MIT), Zephyr (Apache) Why Developers Keep Choosing NetBurner Building with NetBurner is just the beginning. When systems move into the field, developers stay with the platform because it continues to deliver: stable tools, responsive support, and the kind of infrastructure that makes maintenance predictable instead of painful.Direct Technical Support:  Responsive help from engineers familiar with deployment challenges—no guesswork, no forum scavenging, with 1 year of support free with your development kit purchase.Stable SDKs and Toolchains: An actively-maintained stack by a dedicated team means fewer broken dependencies and smoother updates over time: we don’t want to break your build!Lifecycle & Firmware Management: Clear revision tracking, upgrade paths, and hardware consistency that make planning and maintenance predictable.Detailed Documentation: Datasheets and integration guides that support real needs, not just cute demos.Developer Community: Peer insights, shared solutions, and practical help from others building serious applications.This level of support is ideal for mission-critical applications and products and accelerates everything from initial proof-of-concept to full-scale rollout. Final Thoughts & Product Recommendation Teensy is excellent for fast experimentation, hobbyist builds, and lean MVPs. But when projects are planned for growth, integrated into real-world systems, or deployed in regulated environments, NetBurner proves its worth.Here’s what sets it apart:Hardware reliability built for scale and stressFeature sets optimized for connectivity, control, and computeIndustrial temperature tolerance and interface stabilityEngineering support that accelerates development and de-risks productionLifecycle documentation and sourcing commitments you can plan aroundWhether you're deploying 10 units or 10,000, NetBurner helps embedded systems ship with confidence.Recommendation: If you’re building embedded hardware that needs to go beyond the bench—into factory cabinets, institutional deployments, commercial products, or long-term automation—NetBurner is the platform to trust. Powered by an ARM Cortex-M7 processor and built to industrial standards, our SOM delivers the performance, reliability, and integration that professional developers and ambitious projects demand.Whether you’re a solo engineer designing for scale, a consultant refining control systems, or a startup preparing for manufacturing, NetBurner is ready to be your full-lifecycle partner.Referenced:(n.d.). Teensy® 4.1 Development Board. PJRC. Retrieved August 5, 2025, from https://www.pjrc.com/store/teensy41.html ### Press Kit PRESS KIT  NewsroomPast Press ReleasesImagesLogos and Brand GuidelinesProduct PhotosHeadquartersCorporateAbout Us ### Get Started Get Started With NetBurner Thank you for being a NetBurner customer! There are two main ways to use NetBurner products, either with the preinstalled applications or by creating your own: Ready-to-Use Products Your NetBurner Serial to Ethernet or NTP device can be used and configured without any programming required. To get started, you can find built-in factory application manuals and other guides here: Product Manuals and Guides After reviewing these documents, you may find additional helpful resources under the Documents and Downloads tab of the product page for your device. Our Support team and community forum are happy to help with any further questions you may have. If you have needs above and beyond what a product ships with, you may wish to engage a developer to write custom software for your device. The possibilities are endless! Custom Development All NetBurner products can be customized with our development kits, including our EX series Serial to Ethernet and NTP devices as well as bare modules. We have an NBEclipse IDE, C++ libraries, and documentation to help get you started: Developer Quick Start Guides Developer Documentation (3.x) Legacy Documentation (2.x) For Legacy documentation, start with the appropriate Quick Start Guide, NBEclipse Getting Started Guide, and Runtime Libraries documents.Additional resources are available under the Documents and Downloads tab of the product page for your device. Please review the Support menu, as well as our forum, blog, and Support team contact options. ### Privacy Statement (BR) This privacy statement was last updated on May 15, 2025 and applies to citizens and legal permanent residents of Brazil.In this privacy statement, we explain what we do with the data we obtain about you via https://www.netburner.com. We recommend you carefully read this statement. In our processing we comply with the requirements of privacy legislation. That means, among other things, that: we clearly state the purposes for which we process personal data. We do this by means of this privacy statement; we aim to limit our collection of personal data to only the personal data required for legitimate purposes; we first request your explicit consent to process your personal data in cases requiring your consent; we take appropriate security measures to protect your personal data and also require this from parties that process personal data on our behalf; we respect your right to access your personal data or have it corrected or deleted, at your request. If you have any questions, or want to know exactly what data we keep of you, please contact us.1. Purpose, data and retention periodWe may collect or receive personal information for a number of purposes connected with our business operations which may include the following: (click to expand)1.1 Contact - Through phone, mail, email and/or webformsFor this purpose we use the following data:A first and last nameAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.2 PaymentsFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:It is necessary for the execution of a contract or preliminary procedures related to a contract to which the data subject is a party. Retention periodWe retain this data until the service is terminated.1.3 Registering an accountFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.4 NewslettersFor this purpose we use the following data:A first and last nameAccount name or aliasAn email addressIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.5 To support services or products that a customer wants to buy or has purchasedFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.6 Compiling and analyzing statistics for website improvement.For this purpose we use the following data:IP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.7 To be able to offer personalized products and servicesFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.8 DeliveriesFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.2. What if you don't provide us with your personal information?If you don't provide us with your personal information, we may not be able to provide you with the information, products or assistance that you are seeking.3. Sharing with other partiesWe only share or disclose this data to operators for the following purposes:OperatorsName: Google Workspaces Country: USA Purpose: Cloud applications, storage and emailName: Start Anywhere Media LLC Country: USA Purpose: Website Development and ITName: Mailchimp Country: USA Purpose: Newsletter distributionsName: Cloudways by Digital Ocean Country: USA Purpose: Website HostingName:  Country:  Purpose: 4. CookiesOur website uses cookies. For more information about cookies, please refer to our Cookie Policy. 5. Disclosure practicesWe disclose personal information if we are required by law or by a court order, in response to a law enforcement agency, to the extent permitted under other provisions of law, to provide information, or for an investigation on a matter related to public safety.If our website or organisation is taken over, sold, or involved in a merger or acquisition, your details may be disclosed to our advisers and any prospective purchasers and will be passed on to the new owners.We have concluded a data processing agreement with Google.Google may not use the data for any other Google services.The inclusion of full IP addresses is blocked by us.6. SecurityWe are committed to the security of personal data. We take appropriate security measures to limit abuse of and unauthorised access to personal data. This ensures that only the necessary persons have access to your data, that access to the data is protected, and that our security measures are regularly reviewed.7. Third-party websitesThis privacy statement does not apply to third-party websites connected by links on our website. We cannot guarantee that these third parties handle your personal data in a reliable or secure manner. We recommend you read the privacy statements of these websites prior to making use of these websites.8. Amendments to this privacy statementWe reserve the right to make amendments to this privacy statement. It is recommended that you consult this privacy statement regularly in order to be aware of any changes. In addition, we will actively inform you wherever possible.9. Accessing and modifying your dataIf you have any questions or want to know which personal data we have about you, please contact us. You can contact us by using the information below. Your rights with respect to personal data: confirmation of the existence of processing; access to data; correction of incomplete, inaccurate, or outdated data; anonymization, blocking, or deletion of unnecessary, excessive, or processed data in disagreement with the provisions of the General Law for the Protection of Personal Data (LGPD); portability of data to another service or product provider, upon express request, in accordance with the regulations of the national authority, observing commercial and industrial secrets; deletion of personal data processed with the consent of the holder, except in the cases provided for in art. 16 of the General Law for the Protection of Personal Data (LGPD); information on public and private entities with which the controller shared data; information on the possibility of not providing consent and on the consequences of denial. To exercise these rights, please contact us. Please refer to the contact details at the bottom of this Privacy Statement. Please make sure to always clearly state who you are, so that we can be certain that we do not modify or delete any data of the wrong person.10. Submitting a complaintIf you are not satisfied with the way in which we handle (a complaint about) the processing of your personal data, you have the right to submit a complaint to the National Data Protection Authority (ANPD):Autoridade Nacional de Proteção de Dados Esplanada dos Ministérios, Bloco C, 2º andar, CEP 70297-400 - Brasília – DF. Website11. ChildrenOur website is not designed to attract children and it is not our intent to collect personal data from children under the age of consent in their country of residence. We therefore request that children under the age of consent do not submit any personal data to us.12. Contact detailsNetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-029313. Data RequestsFor the most frequently submitted requests, we also offer you the possibility to use our data request form × Name Name Email Submit a request for access to the data we process about you. Submit a request for deletion of the data if it is no longer relevant. Submit a request to receive an export file of the data we process about you. AnnexFor each visitor to NetBurner’s website, our web server does not automatically recognize information regarding the domain or e-mail address. We collect, store, and analyze information from our website traffic for statistical purposes. For example, we count the number of visitors to the different pages of our website in order to help make them more useful to visitors. This information does not, and will never, identify you personally. Additionally, we utilize 3rd party tools to help aggregate and make sense of this data. Specifically, these are Google Analytics, Facebook Analytics, and Hotjar. Any personal information that we collect is volunteered by the consumer. This includes site registrations for NetBurner support, emails to our sales department, signing up for our monthly newsletter, or registering for our forums at forum.embeddedethernet.com. This information is used to customize the content and/or layout of our page for each individual visitor, used to notify consumers about updates to our website and/or products, used by us to contact consumers (when requested by customer) for marketing purposes, and to assist our customers during support and sales requests. This information is never sold to third parties. Our customers always have the following rights: Right to be forgotten: Subscribers may contact NetBurner directly to request deletion of their data from individual user’s accounts, or across multiple NetBurner users’ accounts (if applicable), unless it is prohibited by law. Right to object: Subscribers or contact have a right to contact us to object or stop the use of their data for direct marketing. Right to rectification: You may access and update your subscriber profile to correct or complete subscriber/contact information upon their request at any time. In addition, subscribers and customers may contact NetBurner directly to access, correct, and/or delete information that may be held about the data subject. Right of access: Our Privacy Policy describes what data we collect and how we use it. As mentioned above, subscribers or contacts may contact us directly to request to access information that we hold about them. Right of portability: You may request that we transfer or export your data in a machine-readable format such as CSV. With respect to Ad Servers: We do not partner with or have special relationships with any ad server companies. ### Privacy Statement (ZA) This privacy statement was last updated on May 15, 2025 and applies to citizens and legal permanent residents of South Africa.In this privacy statement, we explain what we do with the data we obtain about you via https://www.netburner.com. We recommend you carefully read this statement. In our processing we comply with the requirements of privacy legislation. That means, among other things, that: we clearly state the purposes for which we process personal data. We do this by means of this privacy statement; we aim to limit our collection of personal data to only the personal data required for legitimate purposes; we first request your explicit consent to process your personal data in cases requiring your consent; we take appropriate security measures to protect your personal data and also require this from parties that process personal data on our behalf; we respect your right to access your personal data or have it corrected or deleted, at your request. If you have any questions, or want to know exactly what data we keep of you, please contact us.1. Purpose, data and retention periodWe may collect or receive personal information for a number of purposes connected with our business operations which may include the following: (click to expand)1.1 Contact - Through phone, mail, email and/or webformsFor this purpose we use the following data:A first and last nameAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.2 PaymentsFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.3 Registering an accountFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.4 NewslettersFor this purpose we use the following data:A first and last nameAccount name or aliasAn email addressIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.5 To support services or products that a customer wants to buy or has purchasedFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.6 Compiling and analyzing statistics for website improvement.For this purpose we use the following data:IP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.7 To be able to offer personalized products and servicesFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.8 DeliveriesFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.2. What if you don't provide us with your personal information?If you don't provide us with your personal information, we may not be able to provide you with the information, products or assistance that you are seeking.3. Sharing with other partiesWe only share or disclose this data to operators for the following purposes:Operators Name: Google Workspaces Country: USA Purpose: Cloud applications, storage and email Name: Start Anywhere Media LLC Country: USA Purpose: Website Development and IT Name: Mailchimp Country: USA Purpose: Newsletter distributions Name: Cloudways by Digital Ocean Country: USA Purpose: Website Hosting Name:  Country:  Purpose:  4. CookiesOur website uses cookies. For more information about cookies, please refer to our Cookie Policy. 5. Disclosure practicesWe disclose personal information if we are required by law or by a court order, in response to a law enforcement agency, to the extent permitted under other provisions of law, to provide information, or for an investigation on a matter related to public safety.If our website or organisation is taken over, sold, or involved in a merger or acquisition, your details may be disclosed to our advisers and any prospective purchasers and will be passed on to the new owners.We have concluded a data processing agreement with Google.Google may not use the data for any other Google services.The inclusion of full IP addresses is blocked by us.6. SecurityWe are committed to the security of personal data. We take appropriate security measures to limit abuse of and unauthorised access to personal data. This ensures that only the necessary persons have access to your data, that access to the data is protected, and that our security measures are regularly reviewed.7. Third-party websitesThis privacy statement does not apply to third-party websites connected by links on our website. We cannot guarantee that these third parties handle your personal data in a reliable or secure manner. We recommend you read the privacy statements of these websites prior to making use of these websites.8. Amendments to this privacy statementWe reserve the right to make amendments to this privacy statement. It is recommended that you consult this privacy statement regularly in order to be aware of any changes. In addition, we will actively inform you wherever possible.9. Accessing and modifying your dataIf you have any questions or want to know which personal data we have about you, please contact us. You can contact us by using the information below. You have the following rights: You have the right to know why your personal data is needed, what will happen to it, and how long it will be retained for. Right of access: You have the right to access your personal data that is known to us. Right to rectification: you have the right to supplement, correct, have deleted or blocked your personal data whenever you wish. If you give us your consent to process your data, you have the right to revoke that consent and to have your personal data deleted. Right to object: you may object to the processing of your data. We comply with this, unless there are justified grounds for processing. Please make sure to always clearly state who you are, so that we can be certain that we do not modify or delete any data of the wrong person.10. Submitting a complaintIf you are not satisfied with the way in which we handle (a complaint about) the processing of your personal data, you have the right to submit a complaint to the Information Regulator South Africa:P.O Box 31533, Braamfontein, Johannesburg, 2017 Complaints email:complaints.IR@justice.gov.za11. ChildrenOur website is not designed to attract children and it is not our intent to collect personal data from children under the age of consent in their country of residence. We therefore request that children under the age of consent do not submit any personal data to us.12. Contact detailsNetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-029313. Data RequestsFor the most frequently submitted requests, we also offer you the possibility to use our data request form × Name Name Email Submit a request for access to the data we process about you. Submit a request for deletion of the data if it is no longer relevant. Submit a request to receive an export file of the data we process about you. We have appointed a contact person for the organization’s policies and practices and to whom complaints or inquiries can be forwarded:Thomas Kenney16855 W Bernardo Drive, Ste 260 San Diego, CA 92127AnnexFor each visitor to NetBurner’s website, our web server does not automatically recognize information regarding the domain or e-mail address. We collect, store, and analyze information from our website traffic for statistical purposes. For example, we count the number of visitors to the different pages of our website in order to help make them more useful to visitors. This information does not, and will never, identify you personally. Additionally, we utilize 3rd party tools to help aggregate and make sense of this data. Specifically, these are Google Analytics, Facebook Analytics, and Hotjar. Any personal information that we collect is volunteered by the consumer. This includes site registrations for NetBurner support, emails to our sales department, signing up for our monthly newsletter, or registering for our forums at forum.embeddedethernet.com. This information is used to customize the content and/or layout of our page for each individual visitor, used to notify consumers about updates to our website and/or products, used by us to contact consumers (when requested by customer) for marketing purposes, and to assist our customers during support and sales requests. This information is never sold to third parties. Our customers always have the following rights: Right to be forgotten: Subscribers may contact NetBurner directly to request deletion of their data from individual user’s accounts, or across multiple NetBurner users’ accounts (if applicable), unless it is prohibited by law. Right to object: Subscribers or contact have a right to contact us to object or stop the use of their data for direct marketing. Right to rectification: You may access and update your subscriber profile to correct or complete subscriber/contact information upon their request at any time. In addition, subscribers and customers may contact NetBurner directly to access, correct, and/or delete information that may be held about the data subject. Right of access: Our Privacy Policy describes what data we collect and how we use it. As mentioned above, subscribers or contacts may contact us directly to request to access information that we hold about them. Right of portability: You may request that we transfer or export your data in a machine-readable format such as CSV. With respect to Ad Servers: We do not partner with or have special relationships with any ad server companies. ### Privacy Statement (AU) This privacy statement was last changed on May 15, 2025, last checked on May 15, 2025, and applies to citizens of Australia.In this privacy statement, we explain what we do with the data we obtain about you via https://www.netburner.com. We recommend you carefully read this statement. In our processing we comply with the requirements of privacy legislation. That means, among other things, that: we clearly state the purposes for which we process personal data. We do this by means of this privacy statement; we aim to limit our collection of personal data to only the personal data required for legitimate purposes; we first request your explicit consent to process your personal data in cases requiring your consent; we take appropriate security measures to protect your personal data and also require this from parties that process personal data on our behalf; we respect your right to access your personal data or have it corrected or deleted, at your request. If you have any questions, or want to know exactly what data we keep of you, please contact us.1. Purpose and categories of dataWe may collect or receive personal information for a number of purposes connected with our business operations which may include the following: (click to expand)1.1 Contact - Through phone, mail, email and/or webformsThe following categories of data are collectedA first and last nameAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.2 PaymentsThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.3 Registering an accountThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.4 NewslettersThe following categories of data are collectedA first and last nameAccount name or aliasAn email addressIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.5 To support services or products that a customer wants to buy or has purchasedThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.6 Compiling and analyzing statistics for website improvement.The following categories of data are collectedIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.7 To be able to offer personalized products and servicesThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.8 DeliveriesThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.2. Sharing with other partiesWe only share or disclose this data to other recipients for the following purposes:Purpose of the data transfer: Cloud applications, storage and email Country or state in which this processor is located: USAPurpose of the data transfer: Website Development and IT Country or state in which this processor is located: USAPurpose of the data transfer: Newsletter distributions Country or state in which this processor is located: USAPurpose of the data transfer: Website Hosting Country or state in which this processor is located: USAPurpose of the data transfer:  Country or state in which this processor is located: 3. Disclosure practicesWe disclose personal information if we are required by law or by a court order, in response to a law enforcement agency, to the extent permitted under other provisions of law, to provide information, or for an investigation on a matter related to public safety.If our website or organisation is taken over, sold, or involved in a merger or acquisition, your details may be disclosed to our advisers and any prospective purchasers and will be passed on to the new owners.4. What if you don't provide us with your personal information?If you don't provide us with your personal information, we may not be able to provide you with the information, products or assistance that you are seeking.5. How we respond to Do Not Track signals & Global Privacy Control Our website responds to and supports the Do Not Track (DNT) header request field. If you turn DNT on in your browser, those preferences are communicated to us in the HTTP request header, and we will not track your browsing behavior.6. CookiesOur website uses cookies. For more information about cookies, please refer to our Cookie Policy on our Cookie Policy (AU) webpage. We have concluded a data processing agreement with Google.Google may not use the data for any other Google services.The inclusion of full IP addresses is blocked by us.7. SecurityWe are committed to the security of personal data. We take appropriate security measures to limit abuse of and unauthorized access to personal data. This ensures that only the necessary persons have access to your data, that access to the data is protected, and that our security measures are regularly reviewed.8. Third party websitesThis privacy statement does not apply to third party websites connected by links on our website. We cannot guarantee that these third parties handle your personal data in a reliable or secure manner. We recommend you read the privacy statements of these websites prior to making use of these websites.9. Amendments to this privacy statementWe reserve the right to make amendments to this privacy statement. It is recommended that you consult this privacy statement regularly in order to be aware of any changes. In addition, we will actively inform you wherever possible.10. Accessing and modifying your dataIf you have any questions or want to know which personal data we have about you, please contact us. Please make sure to always clearly state who you are, so that we can be certain that we do not modify or delete any data of the wrong person. We shall provide the requested information only upon receipt of a verifiable consumer request. You can contact us by using the information below. You have the following rights:10.1 You have the following rights with respect to your personal data You may submit a request for access to the data we process about you. You may request an overview, in a commonly used format, of the data we process about you. You may request correction or deletion of the data if it is incorrect or not or no longer relevant for any purpose under the Privacy Act. 11. ChildrenOur website is not designed to attract children and it is not our intent to collect personal data from children under the age of consent in their country of residence. We therefore request that children under the age of consent do not submit any personal data to us.12. Contact detailsNetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-029313. Data RequestsFor the most frequently submitted requests, we also offer you the possibility to use our data request form × Name Name Email Submit a request for access to the data we process about you. Submit a request for deletion of the data if it is no longer relevant. Submit a request to receive an export file of the data we process about you. We have appointed a contact person for the organization’s policies and practices and to whom complaints or inquiries can be forwarded:Thomas Kenney16855 W Bernardo Drive, Ste 260 San Diego, CA 92127AnnexFor each visitor to NetBurner’s website, our web server does not automatically recognize information regarding the domain or e-mail address. We collect, store, and analyze information from our website traffic for statistical purposes. For example, we count the number of visitors to the different pages of our website in order to help make them more useful to visitors. This information does not, and will never, identify you personally. Additionally, we utilize 3rd party tools to help aggregate and make sense of this data. Specifically, these are Google Analytics, Facebook Analytics, and Hotjar. Any personal information that we collect is volunteered by the consumer. This includes site registrations for NetBurner support, emails to our sales department, signing up for our monthly newsletter, or registering for our forums at forum.embeddedethernet.com. This information is used to customize the content and/or layout of our page for each individual visitor, used to notify consumers about updates to our website and/or products, used by us to contact consumers (when requested by customer) for marketing purposes, and to assist our customers during support and sales requests. This information is never sold to third parties. Our customers always have the following rights: Right to be forgotten: Subscribers may contact NetBurner directly to request deletion of their data from individual user’s accounts, or across multiple NetBurner users’ accounts (if applicable), unless it is prohibited by law. Right to object: Subscribers or contact have a right to contact us to object or stop the use of their data for direct marketing. Right to rectification: You may access and update your subscriber profile to correct or complete subscriber/contact information upon their request at any time. In addition, subscribers and customers may contact NetBurner directly to access, correct, and/or delete information that may be held about the data subject. Right of access: Our Privacy Policy describes what data we collect and how we use it. As mentioned above, subscribers or contacts may contact us directly to request to access information that we hold about them. Right of portability: You may request that we transfer or export your data in a machine-readable format such as CSV. With respect to Ad Servers: We do not partner with or have special relationships with any ad server companies. ### Privacy Statement (CA) This privacy statement was last changed on May 15, 2025, last checked on May 15, 2025, and applies to citizens and legal permanent residents of Canada.In this privacy statement, we explain what we do with the data we obtain about you via https://www.netburner.com. We recommend you carefully read this statement. In our processing we comply with the requirements of privacy legislation. That means, among other things, that: we clearly state the purposes for which we process personal data. We do this by means of this privacy statement; we aim to limit our collection of personal data to only the personal data required for legitimate purposes; we first request your explicit consent to process your personal data in cases requiring your consent; we take appropriate security measures to protect your personal data and also require this from parties that process personal data on our behalf; we respect your right to access your personal data or have it corrected or deleted, at your request. If you have any questions, or want to know exactly what data we keep of you, please contact us.1. Purpose and categories of dataWe may collect or receive personal information for a number of purposes connected with our business operations which may include the following: (click to expand)1.1 Contact - Through phone, mail, email and/or webformsThe following categories of data are collectedA first and last nameAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.2 PaymentsThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.3 Registering an accountThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.4 NewslettersThe following categories of data are collectedA first and last nameAccount name or aliasAn email addressIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.5 To support services or products that a customer wants to buy or has purchasedThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.6 Compiling and analyzing statistics for website improvement.The following categories of data are collectedIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.7 To be able to offer personalized products and servicesThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.8 DeliveriesThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.2. Sharing with other partiesWe only share or disclose this data to other recipients for the following purposes:Purpose of the data transfer: Cloud applications, storage and email Country or state in which this service provider is located: USAPurpose of the data transfer: Website Development and IT Country or state in which this service provider is located: USAPurpose of the data transfer: Newsletter distributions Country or state in which this service provider is located: USAPurpose of the data transfer: Website Hosting Country or state in which this service provider is located: USAPurpose of the data transfer:  Country or state in which this service provider is located: 3. Disclosure practicesWe disclose personal information if we are required by law or by a court order, in response to a law enforcement agency, to the extent permitted under other provisions of law, to provide information, or for an investigation on a matter related to public safety.If our website or organisation is taken over, sold, or involved in a merger or acquisition, your details may be disclosed to our advisers and any prospective purchasers and will be passed on to the new owners.4. How we respond to Do Not Track signals & Global Privacy Control Our website responds to and supports the Do Not Track (DNT) header request field. If you turn DNT on in your browser, those preferences are communicated to us in the HTTP request header, and we will not track your browsing behavior.5. CookiesOur website uses cookies. For more information about cookies, please refer to our Cookie Policy on our Cookie Policy (CA) webpage. We have concluded a data Processing Agreement with Google.Google may not use the data for any other Google services.The inclusion of full IP addresses is blocked by us.6. SecurityWe are committed to the security of personal data. We take appropriate security measures to limit abuse of and unauthorized access to personal data. This ensures that only the necessary persons have access to your data, that access to the data is protected, and that our security measures are regularly reviewed.7. Third party websitesThis privacy statement does not apply to third party websites connected by links on our website. We cannot guarantee that these third parties handle your personal data in a reliable or secure manner. We recommend you read the privacy statements of these websites prior to making use of these websites.8. Amendments to this privacy statementWe reserve the right to make amendments to this privacy statement. It is recommended that you consult this privacy statement regularly in order to be aware of any changes. In addition, we will actively inform you wherever possible.9. Accessing and modifying your dataIf you have any questions or want to know which personal data we have about you, please contact us. Please make sure to always clearly state who you are, so that we can be certain that we do not modify or delete any data of the wrong person. We shall provide the requested information only upon receipt of a verifiable consumer request. You can contact us by using the information below.9.1 You have the following rights with respect to your personal data You may submit a request for access to the data we process about you. You may request an overview, in a commonly used format, of the data we process about you. You may request correction or deletion of the data if it is incorrect or not or no longer relevant. Where appropriate, the amended information shall be transmitted to third parties having access to the information in question. You have the right to withdraw consent at any time, subject to legal or contractual restrictions and reasonable notice. You will be informed of the implications of such withdrawal. You have the right to address a challenge concerning non-compliance with PIPEDA to our organization and, if the issue is not resolved, to the Office of the Privacy Commissioner of Canada. We shall give access to personal information in an alternative format to an individual with a sensory disability who has a right of access to personal information under PIPEDA and who requests that it be transmitted in the alternative format if (a) a version of the information already exists in that format; or (b) its conversion into that format is reasonable and necessary in order for the individual to be able to exercise rights. 10. ChildrenOur website is not designed to attract children and it is not our intent to collect personal data from children under the age of consent in their country of residence. We therefore request that children under the age of consent do not submit any personal data to us.11. Contact detailsNetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-029312. Data RequestsFor the most frequently submitted requests, we also offer you the possibility to use our data request form × Name Name Email Submit a request for access to the data we process about you. Submit a request for deletion of the data if it is no longer relevant. Submit a request to receive an export file of the data we process about you. We have appointed a contact person for the organization’s policies and practices and to whom complaints or inquiries can be forwarded:Thomas Kenney16855 W Bernardo Drive, Ste 260 San Diego, CA 92127AnnexFor each visitor to NetBurner’s website, our web server does not automatically recognize information regarding the domain or e-mail address. We collect, store, and analyze information from our website traffic for statistical purposes. For example, we count the number of visitors to the different pages of our website in order to help make them more useful to visitors. This information does not, and will never, identify you personally. Additionally, we utilize 3rd party tools to help aggregate and make sense of this data. Specifically, these are Google Analytics, Facebook Analytics, and Hotjar. Any personal information that we collect is volunteered by the consumer. This includes site registrations for NetBurner support, emails to our sales department, signing up for our monthly newsletter, or registering for our forums at forum.embeddedethernet.com. This information is used to customize the content and/or layout of our page for each individual visitor, used to notify consumers about updates to our website and/or products, used by us to contact consumers (when requested by customer) for marketing purposes, and to assist our customers during support and sales requests. This information is never sold to third parties. Our customers always have the following rights: Right to be forgotten: Subscribers may contact NetBurner directly to request deletion of their data from individual user’s accounts, or across multiple NetBurner users’ accounts (if applicable), unless it is prohibited by law. Right to object: Subscribers or contact have a right to contact us to object or stop the use of their data for direct marketing. Right to rectification: You may access and update your subscriber profile to correct or complete subscriber/contact information upon their request at any time. In addition, subscribers and customers may contact NetBurner directly to access, correct, and/or delete information that may be held about the data subject. Right of access: Our Privacy Policy describes what data we collect and how we use it. As mentioned above, subscribers or contacts may contact us directly to request to access information that we hold about them. Right of portability: You may request that we transfer or export your data in a machine-readable format such as CSV. With respect to Ad Servers: We do not partner with or have special relationships with any ad server companies. ### Privacy Statement (US) This privacy statement was last changed on May 15, 2025, last checked on May 15, 2025, and applies to citizens and legal permanent residents of the United States.In this privacy statement, we explain what we do with the data we obtain about you via https://www.netburner.com. We recommend you carefully read this statement. In our processing we comply with the requirements of privacy legislation. That means, among other things, that: we clearly state the purposes for which we process personal data. We do this by means of this privacy statement; we aim to limit our collection of personal data to only the personal data required for legitimate purposes; we first request your explicit consent to process your personal data in cases requiring your consent; we take appropriate security measures to protect your personal data and also require this from parties that process personal data on our behalf; we respect your right to access your personal data or have it corrected or deleted, at your request. If you have any questions, or want to know exactly what data we keep of you, please contact us.1. Purpose and categories of dataWe may collect or receive personal information for a number of purposes connected with our business operations which may include the following: (click to expand)1.1 Contact - Through phone, mail, email and/or webformsThe following categories of data are collectedA first and last nameAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.2 PaymentsThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.3 Registering an accountThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.4 NewslettersThe following categories of data are collectedA first and last nameAccount name or aliasAn email addressIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.5 To support services or products that a customer wants to buy or has purchasedThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.6 Compiling and analyzing statistics for website improvement.The following categories of data are collectedIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.7 To be able to offer personalized products and servicesThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.1.8 DeliveriesThe following categories of data are collectedA first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataRetention periodWe retain this data until the service is terminated.2. Sharing with other partiesWe only share or disclose this data to other recipients for the following purposes:Purpose of the data transfer: Cloud applications, storage and email Country or state in which this service provider is located: USAPurpose of the data transfer: Website Development and IT Country or state in which this service provider is located: USAPurpose of the data transfer: Newsletter distributions Country or state in which this service provider is located: USAPurpose of the data transfer: Website Hosting Country or state in which this service provider is located: USAPurpose of the data transfer:  Country or state in which this service provider is located: 3. Disclosure practicesWe disclose personal information if we are required by law or by a court order, in response to a law enforcement agency, to the extent permitted under other provisions of law, to provide information, or for an investigation on a matter related to public safety.If our website or organisation is taken over, sold, or involved in a merger or acquisition, your details may be disclosed to our advisers and any prospective purchasers and will be passed on to the new owners.4. How we respond to Do Not Track signals & Global Privacy Control Our website responds to and supports the Do Not Track (DNT) header request field. If you turn DNT on in your browser, those preferences are communicated to us in the HTTP request header, and we will not track your browsing behavior.5. CookiesOur website uses cookies. For more information about cookies, please refer to our Cookie Policy on our Opt-out preferences webpage. We have concluded a data processing agreement with Google.Google may not use the data for any other Google services.The inclusion of full IP addresses is blocked by us.6. SecurityWe are committed to the security of personal data. We take appropriate security measures to limit abuse of and unauthorized access to personal data. This ensures that only the necessary persons have access to your data, that access to the data is protected, and that our security measures are regularly reviewed.7. Third-party websitesThis privacy statement does not apply to third-party websites connected by links on our website. We cannot guarantee that these third parties handle your personal data in a reliable or secure manner. We recommend you read the privacy statements of these websites prior to making use of these websites.8. Amendments to this privacy statementWe reserve the right to make amendments to this privacy statement. It is recommended that you consult this privacy statement regularly in order to be aware of any changes. In addition, we will actively inform you wherever possible.9. Accessing and modifying your dataIf you have any questions or want to know which personal data we have about you, please contact us. Please make sure to always clearly state who you are, so that we can be certain that we do not modify or delete any data of the wrong person. We shall provide the requested information only upon receipt of a verifiable consumer request. You can contact us by using the information below. You have the following rights:9.1 You have the following rights with respect to your personal data You may submit a request for access to the data we process about you. You may object to the processing. You may request an overview, in a commonly used format, of the data we process about you. You may request correction or deletion of the data if it is incorrect or not or no longer relevant, or to ask to restrict the processing of the data. You may appeal our decision whenever we refuse to take action on a request and submit a complaint with the competent authority if your appeal is denied. 9.2 SupplementsThis section, which supplements the rest of this Privacy Statement, applies to citizens and legal permanent residents of California (CPRA), Colorado (CPA), Connecticut (CTDPA), Nevada (NRS 603A), Utah (UCPA) and Virginia (CDPA)California Right to know what personal information is being collected about you A consumer shall have the right to request that a business that collects personal information about the consumer disclose to the consumer the following: The categories of personal information it has collected about that consumer. The categories of sources from which the personal information is collected. The business or commercial purpose for collecting or selling personal information. The categories of third parties with whom the business shares personal information. The specific pieces of personal information it has collected about that consumer. The right to know whether personal information is sold or disclosed and to whom A consumer shall have the right to request that a business that sells the consumer’s personal information, or that discloses it for a business purpose, disclose to that consumer: The categories of personal information that the business collected about the consumer. The categories of personal information that the business sold about the consumer and the categories of third parties to whom the personal information was sold, by category or categories of personal information for each third party to whom the personal information was sold. The categories of personal information that the business disclosed about the consumer for a business purpose. The Right to equal service and price, even if you exercise your privacy rights A consumer shall have the right to request that a business delete any personal information about the consumer which the business has collected from the consumer. A business that receives a verifiable request from a consumer to delete the consumer’s personal information pursuant to subdivision (a) of this section shall delete the consumer’s personal information from its records and direct any service providers to delete the consumer’s personal information from their records. A business or a service provider shall not be required to comply with a consumer’s request to delete the consumer’s personal information if it is necessary for the business or service provider to maintain the consumer’s personal information in order to: Complete the transaction for which the personal information was collected, provide a good or service requested by the consumer, or reasonably anticipated within the context of a business’s ongoing business relationship with the consumer, or otherwise perform a contract between the business and the consumer. Detect security incidents, protect against malicious, deceptive, fraudulent, or illegal activity; or prosecute those responsible for that activity. Debug to identify and repair errors that impair existing intended functionality. Exercise free speech, ensure the right of another consumer to exercise his or her right of free speech, or exercise another right provided for by law. Comply with the California Electronic Communications Privacy Act pursuant to Chapter 3.6 (commencing with Section 1546) of Title 12 of Part 2 of the Penal Code. Engage in public or peer-reviewed scientific, historical, or statistical research in the public interest that adheres to all other applicable ethics and privacy laws, when the businesses’ deletion of the information is likely to render impossible or seriously impair the achievement of such research, if the consumer has provided informed consent. Exercise free speech, ensure the right of another consumer to exercise his or her right of free speech, or exercise another right provided for by law. To enable solely internal uses that are reasonably aligned with the expectations of the consumer based on the consumer’s relationship with the business. Comply with a legal obligation. Otherwise use the consumer’s personal information, internally, in a lawful manner that is compatible with the context in which the consumer provided the information. Right to opt-out You may submit a request directing us not to make certain disclosures of personal information we maintain about you. For more information about the possibility of submitting an opt-out request, please refer to our Opt-out preferences page. Financial incentivesSelling of personal data to third parties We have not sold consumers’ personal data in the preceding 12 monthsWe have not disclosed consumers’ personal information for a business purpose in the preceding 12 months.A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressGeolocation dataColoradoRight to Data Portability When exercising the right to Access personal data , you have the right to obtain the personal data in a portable and, to the extent technically feasible, readily usable format that allows you to transmit the data to another entity without hindrance. You may exercise this right no more than two times per calendar year. Right to opt-out You may submit a request directing us not to make certain disclosures of personal information we maintain about you. Under Colorado law this concerns the following purposes: targeted advertising; the sale of personal data; or profiling in furtherance of decisions that produce legal or similarly significant effects concerning a consumer. For more information about the possibility of submitting an opt-out request, please refer to our Opt-out preferences page. ConnecticutRight to Data Portability When exercising the right to Access personal data , you have the right to obtain the personal data in a portable and, to the extent technically feasible, readily usable format that allows you to transmit the data to another entity without hindrance. We are not required to reveal any trade secret. Right to opt-out You may submit a request directing us not to make certain disclosures of personal information we maintain about you. Under the CTDPA this concerns the following purposes: targeted advertising; or the sale of personal data; or profiling in furtherance of decisions that produce legal or similarly significant effects concerning a consumer. For more information about the possibility of submitting an opt-out request, please refer to our Opt-out preferences page. NevadaRight to opt-out You may submit a request directing us not to make certain disclosures of personal information we maintain about you. Under the Nevada Privacy Law, this concerns the sale of personal data. For more information about the possibility of submitting an opt-out request, please refer to our Opt-out preferences page.UtahRight to Data Portability When exercising the right to Access personal data, you have the right to obtain the personal data that you previously provided to us as a controller in a portable and, to the extent technically feasible, readily usable format that allows you to transmit the data to another entity without hindrance. Right to opt-out You may submit a request directing us not to make certain disclosures of personal information we maintain about you. Under the UCPA this concerns the following purposes: targeted advertising; or the sale of personal data. For more information about the possibility of submitting an opt-out request, please refer to our Opt-out preferences page. VirginiaRight to Data Portability When exercising the right to Access personal data , you have the right to obtain the personal data in a portable and, to the extent technically feasible, readily usable format that allows you to transmit the data to another entity without hindrance. You may exercise this right no more than two times per calendar year. Right to opt-out You may submit a request directing us not to make certain disclosures of personal information we maintain about you. Under the CDPA this concerns the following purposes: targeted advertising; the sale of personal data; or profiling in furtherance of decisions that produce legal or similarly significant effects concerning a consumer. For more information about the possibility of submitting an opt-out request, please refer to our Opt-out preferences page. 10. ChildrenOur website is not designed to attract children and it is not our intent to collect personal data from children under the age of consent in their country of residence. We therefore request that children under the age of consent do not submit any personal data to us.11. Contact detailsNetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-029312. Data RequestsFor the most frequently submitted requests, we also offer you the possibility to use our data request form × Name Name Email Submit a request for access to the data we process about you. Submit a request for deletion of the data if it is no longer relevant. Submit a request to receive an export file of the data we process about you. AnnexFor each visitor to NetBurner’s website, our web server does not automatically recognize information regarding the domain or e-mail address. We collect, store, and analyze information from our website traffic for statistical purposes. For example, we count the number of visitors to the different pages of our website in order to help make them more useful to visitors. This information does not, and will never, identify you personally. Additionally, we utilize 3rd party tools to help aggregate and make sense of this data. Specifically, these are Google Analytics, Facebook Analytics, and Hotjar. Any personal information that we collect is volunteered by the consumer. This includes site registrations for NetBurner support, emails to our sales department, signing up for our monthly newsletter, or registering for our forums at forum.embeddedethernet.com. This information is used to customize the content and/or layout of our page for each individual visitor, used to notify consumers about updates to our website and/or products, used by us to contact consumers (when requested by customer) for marketing purposes, and to assist our customers during support and sales requests. This information is never sold to third parties. Our customers always have the following rights: Right to be forgotten: Subscribers may contact NetBurner directly to request deletion of their data from individual user’s accounts, or across multiple NetBurner users’ accounts (if applicable), unless it is prohibited by law. Right to object: Subscribers or contact have a right to contact us to object or stop the use of their data for direct marketing. Right to rectification: You may access and update your subscriber profile to correct or complete subscriber/contact information upon their request at any time. In addition, subscribers and customers may contact NetBurner directly to access, correct, and/or delete information that may be held about the data subject. Right of access: Our Privacy Policy describes what data we collect and how we use it. As mentioned above, subscribers or contacts may contact us directly to request to access information that we hold about them. Right of portability: You may request that we transfer or export your data in a machine-readable format such as CSV. With respect to Ad Servers: We do not partner with or have special relationships with any ad server companies. ### Privacy Statement (UK) This privacy statement was last updated on May 15, 2025 and applies to citizens and legal permanent residents of the United Kingdom.In this privacy statement, we explain what we do with the data we obtain about you via https://www.netburner.com. We recommend you carefully read this statement. In our processing we comply with the requirements of privacy legislation. That means, among other things, that: we clearly state the purposes for which we process personal data. We do this by means of this privacy statement; we aim to limit our collection of personal data to only the personal data required for legitimate purposes; we first request your explicit consent to process your personal data in cases requiring your consent; we take appropriate security measures to protect your personal data and also require this from parties that process personal data on our behalf; we respect your right to access your personal data or have it corrected or deleted, at your request. If you have any questions, or want to know exactly what data we keep of you, please contact us.1. Purpose, data and retention periodWe may collect or receive personal information for a number of purposes connected with our business operations which may include the following: (click to expand)1.1 Contact - Through phone, mail, email and/or webformsFor this purpose we use the following data:A first and last nameAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.2 PaymentsFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:It is necessary for the execution of a contract or preliminary procedures related to a contract to which the data subject is a party. Retention periodWe retain this data until the service is terminated.1.3 Registering an accountFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.4 NewslettersFor this purpose we use the following data:A first and last nameAccount name or aliasAn email addressIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.5 To support services or products that a customer wants to buy or has purchasedFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.6 Compiling and analyzing statistics for website improvement.For this purpose we use the following data:IP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.7 To be able to offer personalized products and servicesFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.8 DeliveriesFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.2. Sharing with other partiesWe only share or disclose this data to processors for the following purposes:ProcessorsName: Google Workspaces Country: USA Purpose: Cloud applications, storage and emailName: Start Anywhere Media LLC Country: USA Purpose: Website Development and ITName: Mailchimp Country: USA Purpose: Newsletter distributionsName: Cloudways by Digital Ocean Country: USA Purpose: Website HostingName:  Country:  Purpose: 3. CookiesOur website uses cookies. For more information about cookies, please refer to our Cookie Policy. 4. Disclosure practicesWe disclose personal information if we are required by law or by a court order, in response to a law enforcement agency, to the extent permitted under other provisions of law, to provide information, or for an investigation on a matter related to public safety.If our website or organisation is taken over, sold, or involved in a merger or acquisition, your details may be disclosed to our advisers and any prospective purchasers and will be passed on to the new owners.We have concluded a data processing agreement with Google.Google may not use the data for any other Google services.The inclusion of full IP addresses is blocked by us.5. SecurityWe are committed to the security of personal data. We take appropriate security measures to limit abuse of and unauthorised access to personal data. This ensures that only the necessary persons have access to your data, that access to the data is protected, and that our security measures are regularly reviewed.6. Third-party websitesThis privacy statement does not apply to third-party websites connected by links on our website. We cannot guarantee that these third parties handle your personal data in a reliable or secure manner. We recommend you read the privacy statements of these websites prior to making use of these websites.7. Amendments to this privacy statementWe reserve the right to make amendments to this privacy statement. It is recommended that you consult this privacy statement regularly in order to be aware of any changes. In addition, we will actively inform you wherever possible.8. Accessing and modifying your dataIf you have any questions or want to know which personal data we have about you, please contact us. You can contact us by using the information below. You have the following rights: You have the right to know why your personal data is needed, what will happen to it, and how long it will be retained for. Right of access: You have the right to access your personal data that is known to us. Right to rectification: you have the right to supplement, correct, have deleted or blocked your personal data whenever you wish. If you give us your consent to process your data, you have the right to revoke that consent and to have your personal data deleted. Right to transfer your data: you have the right to request all your personal data from the controller and transfer it in its entirety to another controller. Right to object: you may object to the processing of your data. We comply with this, unless there are justified grounds for processing. Please make sure to always clearly state who you are, so that we can be certain that we do not modify or delete any data of the wrong person.9. Submitting a complaintIf you are not satisfied with the way in which we handle (a complaint about) the processing of your personal data, you have the right to submit a complaint to the Information Commissioner's Office:Wycliffe House Water Lane Wilmslow Cheshire SK9 5AF10. ChildrenOur website is not designed to attract children and it is not our intent to collect personal data from children under the age of consent in their country of residence. We therefore request that children under the age of consent do not submit any personal data to us.11. Contact detailsNetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-029312. Data RequestsFor the most frequently submitted requests, we also offer you the possibility to use our data request form × Name Name Email Submit a request for access to the data we process about you. Submit a request for deletion of the data if it is no longer relevant. Submit a request to receive an export file of the data we process about you. AnnexFor each visitor to NetBurner’s website, our web server does not automatically recognize information regarding the domain or e-mail address. We collect, store, and analyze information from our website traffic for statistical purposes. For example, we count the number of visitors to the different pages of our website in order to help make them more useful to visitors. This information does not, and will never, identify you personally. Additionally, we utilize 3rd party tools to help aggregate and make sense of this data. Specifically, these are Google Analytics, Facebook Analytics, and Hotjar. Any personal information that we collect is volunteered by the consumer. This includes site registrations for NetBurner support, emails to our sales department, signing up for our monthly newsletter, or registering for our forums at forum.embeddedethernet.com. This information is used to customize the content and/or layout of our page for each individual visitor, used to notify consumers about updates to our website and/or products, used by us to contact consumers (when requested by customer) for marketing purposes, and to assist our customers during support and sales requests. This information is never sold to third parties. Our customers always have the following rights: Right to be forgotten: Subscribers may contact NetBurner directly to request deletion of their data from individual user’s accounts, or across multiple NetBurner users’ accounts (if applicable), unless it is prohibited by law. Right to object: Subscribers or contact have a right to contact us to object or stop the use of their data for direct marketing. Right to rectification: You may access and update your subscriber profile to correct or complete subscriber/contact information upon their request at any time. In addition, subscribers and customers may contact NetBurner directly to access, correct, and/or delete information that may be held about the data subject. Right of access: Our Privacy Policy describes what data we collect and how we use it. As mentioned above, subscribers or contacts may contact us directly to request to access information that we hold about them. Right of portability: You may request that we transfer or export your data in a machine-readable format such as CSV. With respect to Ad Servers: We do not partner with or have special relationships with any ad server companies. ### Privacy Statement (EU) This privacy statement was last updated on May 15, 2025 and applies to citizens and legal permanent residents of the European Economic Area and Switzerland.In this privacy statement, we explain what we do with the data we obtain about you via https://www.netburner.com. We recommend you carefully read this statement. In our processing we comply with the requirements of privacy legislation. That means, among other things, that: we clearly state the purposes for which we process personal data. We do this by means of this privacy statement; we aim to limit our collection of personal data to only the personal data required for legitimate purposes; we first request your explicit consent to process your personal data in cases requiring your consent; we take appropriate security measures to protect your personal data and also require this from parties that process personal data on our behalf; we respect your right to access your personal data or have it corrected or deleted, at your request. If you have any questions, or want to know exactly what data we keep of you, please contact us.1. Purpose, data and retention periodWe may collect or receive personal information for a number of purposes connected with our business operations which may include the following: (click to expand)1.1 Contact - Through phone, mail, email and/or webformsFor this purpose we use the following data:A first and last nameAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.2 PaymentsFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:It is necessary for the execution of a contract or preliminary procedures related to a contract to which the data subject is a party. Retention periodWe retain this data until the service is terminated.1.3 Registering an accountFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.4 NewslettersFor this purpose we use the following data:A first and last nameAccount name or aliasAn email addressIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.5 To support services or products that a customer wants to buy or has purchasedFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.6 Compiling and analyzing statistics for website improvement.For this purpose we use the following data:IP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.7 To be able to offer personalized products and servicesFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.1.8 DeliveriesFor this purpose we use the following data:A first and last nameAccount name or aliasA home or other physical address, including street name and name of a city or townAn email addressA telephone numberIP AddressInternet activity information, including, but not limited to, browsing history, search history, and information regarding a consumer's interaction with an Internet Web site, application, or advertisementGeolocation dataThe basis on which we may process these data is:Upon the provision of consent.Retention periodWe retain this data until the service is terminated.2. Sharing with other partiesWe only share or disclose this data to processors for the following purposes:ProcessorsName: Google Workspaces Country: USA Purpose: Cloud applications, storage and email Name: Start Anywhere Media LLC Country: USA Purpose: Website Development and IT Name: Mailchimp Country: USA Purpose: Newsletter distributions Name: Cloudways by Digital Ocean Country: USA Purpose: Website Hosting Name:  Country:  Purpose:  3. CookiesOur website uses cookies. For more information about cookies, please refer to our Cookie Policy. 4. Disclosure practicesWe disclose personal information if we are required by law or by a court order, in response to a law enforcement agency, to the extent permitted under other provisions of law, to provide information, or for an investigation on a matter related to public safety.If our website or organisation is taken over, sold, or involved in a merger or acquisition, your details may be disclosed to our advisers and any prospective purchasers and will be passed on to the new owners.We have concluded a data Processing Agreement with Google.Google may not use the data for any other Google services.The inclusion of full IP addresses is blocked by us.5. SecurityWe are committed to the security of personal data. We take appropriate security measures to limit abuse of and unauthorized access to personal data. This ensures that only the necessary persons have access to your data, that access to the data is protected, and that our security measures are regularly reviewed.6. Third-party websitesThis privacy statement does not apply to third-party websites connected by links on our website. We cannot guarantee that these third parties handle your personal data in a reliable or secure manner. We recommend you read the privacy statements of these websites prior to making use of these websites.7. Amendments to this privacy statementWe reserve the right to make amendments to this privacy statement. It is recommended that you consult this privacy statement regularly in order to be aware of any changes. In addition, we will actively inform you wherever possible.8. Accessing and modifying your dataIf you have any questions or want to know which personal data we have about you, please contact us. You can contact us by using the information below. You have the following rights: You have the right to know why your personal data is needed, what will happen to it, and how long it will be retained for. Right of access: You have the right to access your personal data that is known to us. Right to rectification: you have the right to supplement, correct, have deleted or blocked your personal data whenever you wish. If you give us your consent to process your data, you have the right to revoke that consent and to have your personal data deleted. Right to transfer your data: you have the right to request all your personal data from the controller and transfer it in its entirety to another controller. Right to object: you may object to the processing of your data. We comply with this, unless there are justified grounds for processing. Please make sure to always clearly state who you are, so that we can be certain that we do not modify or delete any data of the wrong person.9. Submitting a complaintIf you are not satisfied with the way in which we handle (a complaint about) the processing of your personal data, you have the right to submit a complaint to the Data Protection Authority.10. Contact detailsNetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-029311. Data RequestsFor the most frequently submitted requests, we also offer you the possibility to use our data request form × Name Name Email Submit a request for access to the data we process about you. Submit a request for deletion of the data if it is no longer relevant. Submit a request to receive an export file of the data we process about you. AnnexFor each visitor to NetBurner’s website, our web server does not automatically recognize information regarding the domain or e-mail address. We collect, store, and analyze information from our website traffic for statistical purposes. For example, we count the number of visitors to the different pages of our website in order to help make them more useful to visitors. This information does not, and will never, identify you personally. Additionally, we utilize 3rd party tools to help aggregate and make sense of this data. Specifically, these are Google Analytics, Facebook Analytics, and Hotjar. Any personal information that we collect is volunteered by the consumer. This includes site registrations for NetBurner support, emails to our sales department, signing up for our monthly newsletter, or registering for our forums at forum.embeddedethernet.com. This information is used to customize the content and/or layout of our page for each individual visitor, used to notify consumers about updates to our website and/or products, used by us to contact consumers (when requested by customer) for marketing purposes, and to assist our customers during support and sales requests. This information is never sold to third parties. Our customers always have the following rights: Right to be forgotten: Subscribers may contact NetBurner directly to request deletion of their data from individual user’s accounts, or across multiple NetBurner users’ accounts (if applicable), unless it is prohibited by law. Right to object: Subscribers or contact have a right to contact us to object or stop the use of their data for direct marketing. Right to rectification: You may access and update your subscriber profile to correct or complete subscriber/contact information upon their request at any time. In addition, subscribers and customers may contact NetBurner directly to access, correct, and/or delete information that may be held about the data subject. Right of access: Our Privacy Policy describes what data we collect and how we use it. As mentioned above, subscribers or contacts may contact us directly to request to access information that we hold about them. Right of portability: You may request that we transfer or export your data in a machine-readable format such as CSV. With respect to Ad Servers: We do not partner with or have special relationships with any ad server companies. ### Cookie Policy (BR) This Cookie Policy was last updated on May 15, 2025 and applies to citizens and legal permanent residents of Brazil.1. IntroductionOur website, https://www.netburner.com (hereinafter: "the website") uses cookies and other related technologies (for convenience all technologies are referred to as "cookies"). Cookies are also placed by third parties we have engaged. In the document below we inform you about the use of cookies on our website.2. What are cookies?A cookie is a small simple file that is sent along with pages of this website and stored by your browser on the hard drive of your computer or another device. The information stored therein may be returned to our servers or to the servers of the relevant third parties during a subsequent visit.3. What are scripts?A script is a piece of program code that is used to make our website function properly and interactively. This code is executed on our server or on your device.4. What is a web beacon?A web beacon (or a pixel tag) is a small, invisible piece of text or image on a website that is used to monitor traffic on a website. In order to do this, various data about you is stored using web beacons.5. Cookies5.1 Technical or functional cookiesSome cookies ensure that certain parts of the website work properly and that your user preferences remain known. By placing functional cookies, we make it easier for you to visit our website. This way, you do not need to repeatedly enter the same information when visiting our website and, for example, the items remain in your shopping cart until you have paid. We may place these cookies without your consent.5.2 Statistics cookiesWe use statistics cookies to optimize the website experience for our users. With these statistics cookies we get insights in the usage of our website. We ask your permission to place statistics cookies.5.3 Marketing/Tracking cookiesMarketing/Tracking cookies are cookies or any other form of local storage, used to create user profiles to display advertising or to track the user on this website or across several websites for similar marketing purposes.5.4 Social mediaOn our website, we have included content from Facebook, X (Formerly Twitter) and LinkedIn to promote web pages (e.g. “like”, “pin”) or share (e.g. “tweet”) on social networks like Facebook, X (Formerly Twitter) and LinkedIn. This content is embedded with code derived from Facebook, X (Formerly Twitter) and LinkedIn and places cookies. This content might store and process certain information for personalized advertising.Please read the privacy statement of these social networks (which can change regularly) to read what they do with your (personal) data which they process using these cookies. The data that is retrieved is anonymized as much as possible. Facebook, X (Formerly Twitter) and LinkedIn are located in the United States.6. Placed cookies Elementor Statistics (anonymous) Consent to service elementor Usage We use Elementor for content creation. Read more about Elementor Sharing data This data is not shared with third parties. Statistics (anonymous) Name elementor Expiration persistent Function Store performed actions on the website WooCommerce Functional Consent to service woocommerce Usage We use WooCommerce for webshop management. Read more about WooCommerce Sharing data This data is not shared with third parties. Functional Name wc_cart_hash_* Expiration session Function Store items in shopping cart Name wc_fragments_* Expiration persistent Function Name wc_cart_created Expiration session Function Store performed actions on the website Name woocommerce_items_in_cart Expiration session Function Store items in shopping cart Name woocommerce_cart_hash Expiration 1 day Function Store items in shopping cart Name wp_woocommerce_session_* Expiration session Function Store performed actions on the website Name store_notice* Expiration session Function Store if a message has been dismissed Google Analytics Statistics Consent to service google-analytics Usage We use Google Analytics for website statistics. Read more about Google Analytics Sharing data For more information, please read the Google Analytics Privacy Statement. Statistics Name _gid Expiration 1 day Function Store and count pageviews Name _ga Expiration 2 years Function Store and count pageviews Name _ga_* Expiration 1 year Function Store and count pageviews Jetpack Statistics Consent to service jetpack Usage We use Jetpack for advertising. Read more about Jetpack Sharing data For more information, please read the Jetpack Privacy Statement. Statistics Name tk_*r Expiration 1 year Function Store referrer ID's Name tk_r3d Expiration 3 days Function WordPress Functional Consent to service wordpress Usage We use WordPress for website development. Read more about WordPress Sharing data This data is not shared with third parties. Functional Name wordpress_test_cookie Expiration session Function Read if cookies can be placed Name wp-settings-* Expiration persistent Function Store user preferences Name wp-settings-time-* Expiration 1 year Function Store user preferences Name wordpress_logged_in_* Expiration persistent Function Store logged in users Name WP_PREFERENCES_USER_* Expiration persistent Function Store user preferences Name wp_lang Expiration session Function Store language settings Popup Maker Purpose pending investigation Consent to service popup-maker Usage We use Popup Maker for popup creation. Read more about Popup Maker Sharing data This data is not shared with third parties. Purpose pending investigation Name pum-* Expiration Function Automattic Statistics Consent to service automattic Usage We use Automattic for website development. Read more about Automattic Sharing data For more information, please read the Automattic Privacy Statement. Statistics Name tk_qs Expiration 30 minutes Function Provide functions across pages Wordpress Download Manager Functional Consent to service wordpress-download-manager Usage We use Wordpress Download Manager for content management. Read more about Wordpress Download Manager Sharing data For more information, please read the Wordpress Download Manager Privacy Statement. Functional Name __wpdm_client Expiration various Function Provide functions across pages Complianz Functional Consent to service complianz Usage We use Complianz for cookie consent management. Read more about Complianz Sharing data This data is not shared with third parties. For more information, please read the Complianz Privacy Statement. Functional Name cmplz_user_data Expiration 365 days Function Read to determine which cookie banner to show Name cmplz_consented_services Expiration 365 days Function Store cookie consent preferences Name cmplz_policy_id Expiration 365 days Function Store accepted cookie policy ID Name cmplz_marketing Expiration 365 days Function Store cookie consent preferences Name cmplz_statistics Expiration 365 days Function Store cookie consent preferences Name cmplz_preferences Expiration 365 days Function Store cookie consent preferences Name cmplz_functional Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_categories Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_services Expiration 365 days Function Store cookie consent preferences Name cmplz_id Expiration 365 days Function Store cookie consent preferences Name cmplz_banner-status Expiration 365 days Function Store if the cookie banner has been dismissed PHP Functional Consent to service php Usage We use PHP for website development. Read more about PHP Sharing data This data is not shared with third parties. Functional Name exp* Expiration Function Provide functions across pages Google reCAPTCHA Functional, Marketing Consent to service google-recaptcha Usage We use Google reCAPTCHA for spam prevention. Read more about Google reCAPTCHA Sharing data For more information, please read the Google reCAPTCHA Privacy Statement. Functional Name _grecaptcha Expiration 6 months Function Provide spam protection Marketing Name rc::c Expiration session Function Read and filter requests from bots Name rc::b Expiration session Function Read and filter requests from bots Name rc::a Expiration persistent Function Read and filter requests from bots PayPal Functional Consent to service paypal Usage We use PayPal for payment processing. Read more about PayPal Sharing data For more information, please read the PayPal Privacy Statement. Purpose pending investigation Name __paypal_storage__ Expiration Function Functional Name nsid Expiration session Function Provide fraud prevention Name enforce_policy Expiration 1 year Function Store privacy preferences Name tsrce Expiration 3 days Function Name ts_c Expiration 3 years Function Provide fraud prevention Google Maps Marketing Consent to service google-maps Usage We use Google Maps for maps display. Read more about Google Maps Sharing data For more information, please read the Google Maps Privacy Statement. Marketing Name Google Maps API Expiration expires immediately Function Read user IP address YouTube Marketing Consent to service youtube Usage We use YouTube for video display. Read more about YouTube Sharing data For more information, please read the YouTube Privacy Statement. Marketing Name GPS Expiration session Function Store location data Name VISITOR_INFO1_LIVE Expiration 6 months Function Provide ad delivery or retargeting Name YSC Expiration session Function Store and track interaction Name PREF Expiration 8 months Function Store user preferences Facebook Marketing, Functional Consent to service facebook Usage We use Facebook for display of recent social posts and/or social share buttons. Read more about Facebook Sharing data For more information, please read the Facebook Privacy Statement. Marketing Name _fbc Expiration 2 years Function Store last visit Name fbm* Expiration 1 year Function Store account details Name xs Expiration 3 months Function Store a unique session ID Name fr Expiration 3 months Function Provide ad delivery or retargeting Name act Expiration 90 days Function Store logged in users Name _fbp Expiration 3 months Function Store and track visits across websites Name datr Expiration 2 years Function Provide fraud prevention Name c_user Expiration 30 days Function Store a unique user ID Name sb Expiration 2 years Function Store browser details Name *_fbm_ Expiration 1 year Function Store account details Functional Name wd Expiration 1 week Function Read screen resolution Name csm Expiration 90 days Function Provide fraud prevention Name actppresence Expiration session Function Store and track if the browser tab is active Twitter Functional, Marketing Consent to service twitter Usage We use Twitter for display of recent social posts and/or social share buttons. Read more about Twitter Sharing data For more information, please read the Twitter Privacy Statement. Functional Name local_storage_support_test Expiration persistent Function Provide load balancing functionality Marketing Name metrics_token Expiration persistent Function Store if the user has seen embedded content LinkedIn Functional, Marketing, Statistics, Preferences Consent to service linkedin Usage We use LinkedIn for display of recent social posts and/or social share buttons. Read more about LinkedIn Sharing data For more information, please read the LinkedIn Privacy Statement. Functional Name sdsc Expiration session Function Provide load balancing functionality Name li_gc Expiration 6 months Function Store cookie consent preferences Name BizographicsOptOut Expiration 10 years Function Store privacy preferences Marketing Name lms_ads Expiration 30 days Function Store and track visits across websites Name _guid Expiration 90 days Function Store and track a visitor's identity Name li-oatml Expiration 1 month Function Provide ad delivery or retargeting Name li_sugr Expiration 90 days Function Store and track a visitor's identity Name UserMatchHistory Expiration 30 days Function Provide ad delivery or retargeting Statistics Name lms_analytics Expiration 30 days Function Store and track a visitor's identity Name AnalyticsSyncHistory Expiration 30 days Function Store and track visits across websites Preferences Name li_alerts Expiration 1 year Function Store if a message has been shown Name bcookie Expiration 1 year Function Store browser details Name lidc Expiration 1 day Function Provide load balancing functionality Name bscookie Expiration 1 year Function Store logged in users HubSpot Functional Consent to service hubspot Usage We use HubSpot for marketing automation (automated email marketing). Read more about HubSpot Sharing data For more information, please read the HubSpot Privacy Statement. Functional Name *_key Expiration 2 weeks Function Store logged in users Purpose pending investigation Name __hs_cookie_cat_pref Expiration Function Name messagesUtk Expiration Function Name __hssc Expiration Function Name __hstc Expiration Function Name __hsmem Expiration Function Name hs-messages-is-open Expiration Function Name hs_ab_test Expiration Function Name __hs_do_not_track Expiration Function Google Fonts Purpose pending investigation Consent to service google-fonts Usage We use Google Fonts for display of webfonts. Read more about Google Fonts Sharing data For more information, please read the Google Fonts Privacy Statement. Purpose pending investigation Name Google Fonts API Expiration Function Miscellaneous Purpose pending investigation Consent to service miscellaneous Usage Sharing data Sharing of data is pending investigation Purpose pending investigation Name NRBA_SESSION_ID Expiration Function Name icwp-wpsf-notbot Expiration Function Name shield-notbot-nonce Expiration Function Name breeze_folder_name Expiration Function Name leanbe.client Expiration Function Name __angelleye_paypal_sdk_storage__ Expiration Function Name extendify-global-state Expiration Function Name wf301_404_chart Expiration Function Name extendify-wanted-template Expiration Function Name ninjatable_tables_per_page Expiration Function Name nav* Expiration Function Name NRBA_SESSION Expiration Function Name __belter_experiment_* Expiration Function Name customer-effort-score-exit-page Expiration Function Name wf301_404_stats Expiration Function Name wf301_redirect_stats Expiration Function Name extendify-taxonomies Expiration Function Name e_kit-elements-defaults Expiration Function Name wf301_tabs Expiration Function Name WP_DATA_USER_5 Expiration Function Name wf301_redirect_chart Expiration Function Name gt-current-screen Expiration Function Name *ActiveTab Expiration Function Name __paypal_sdk_storage__ Expiration Function Name doxygen_width Expiration Function Name 62e5437476b962001357b06d Expiration Function Name wppmsta Expiration Function Name LEANBE_ACCEPT Expiration Function Name WP_DATA_USER_2008398 Expiration Function Name qm-container-height Expiration Function Name extendify-library-globals-sync Expiration Function Name deactivation-hash Expiration Function Name ios_specific_templates_id Expiration Function Name qm-container-width Expiration Function Name rank-math-option-search-index Expiration Function Name qm-admin-container-pinned Expiration Function Name wpEmojiSettingsSupports Expiration Function Name rank-math-option-titles-index Expiration Function Name rank-math-option-sitemap-index Expiration Function Name rank-math-option-general-index Expiration Function Name extendify-library-cache Expiration Function Name sbjs_migrations Expiration Function Name sbjs_current_add Expiration Function Name sbjs_first_add Expiration Function Name sbjs_current Expiration Function Name sbjs_first Expiration Function Name __ssid Expiration Function Name sbjs_udata Expiration Function Name sbjs_session Expiration Function Name doxygen_search_grp Expiration Function Name loglevel Expiration Function Name bis_data Expiration Function Name __cf_bm Expiration Function Name cf_clearance Expiration Function Name wp-autosave-1 Expiration Function Name qm-front-container-pinned Expiration Function Name calendly-store Expiration Function Name cmplz_consent_mode Expiration 365 days Function Name marketplace_redesign_2023_last_shown_date Expiration Function Name notif_2136245149 Expiration Function Name marketplace_redesign_2023_dismissals Expiration Function Name prefers-light-mode-in-dark-mode Expiration Function Name mirage_cache_manifest Expiration Function Name mirage_network_connection Expiration Function Name gtm4wp_orderid_tracked Expiration Function Name savefrom-helper-extension Expiration Function Name extendify-unsplash-images Expiration Function Name redux_current_tab Expiration Function Name redux_current_tab_get Expiration Function Name redux_current_tab_woocommerce_group_attributes_options Expiration Function Name notices_dismissed__traffic_page_highlights_module_settings Expiration Function Name notices_dismissed__traffic_page_settings Expiration Function Name jp-stats-last-tab Expiration Function Name maxmegamenu.themeeditor Expiration Function Name woocommerce_geo_hash Expiration Function Name adobeCleanFontAdded Expiration Function Name extendify-unsplash-images-d3b1abc4-22a2-4fbd-8d2f-bf1a32fce11a Expiration Function Name wc_remote_logging_last_error_sent_time Expiration Function Name i18nextLng Expiration Function Name WP_DATA_USER_2 Expiration Function Name storeApiCartData Expiration Function Name welaunch_current_tab Expiration Function Name welaunch_current_tab_get Expiration Function Name welaunch_current_tab_woocommerce_group_attributes_options Expiration Function Name _gcl_ls Expiration Function Name _gcl_au Expiration Function Name wcpdf_general_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_0 Expiration Function Name jetpack-ai-jwt Expiration Function Name wc_featuredBannerDismissed Expiration Function Name elementor_safe_mode_token Expiration Function Name wcpdf_documents_settings_accordion_state_0 Expiration Function Name wcpdf_documents_settings_accordion_state_3 Expiration Function Name wcpdf_documents_settings_accordion_state_2 Expiration Function Name wcpdf_documents_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_2 Expiration Function Name wc_iam_settings Expiration Function Name __paypal_global_5_0_502_storage__ Expiration Function Name __paypal_global_5_0_508_storage__ Expiration Function Name mp_150605b3b9f979922f2ac5a52e2dcfe9_mixpanel Expiration Function Name mp_gen_new_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name mp_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wcpdf_documents_settings_accordion_state_advanced Expiration Function Name wcpdf_documents_settings_accordion_state_document_details Expiration Function Name wcpdf_general_settings_accordion_state_address_customization Expiration Function Name wcpdf_general_settings_accordion_state_advanced_formatting Expiration Function Name wcpdf_general_settings_accordion_state_static_files Expiration Function Name wcpdf_general_settings_accordion_state_multilingual Expiration Function Name wcpdf_debug_settings_accordion_state_display_interaction Expiration Function Name wcpdf_general_settings_accordion_state_shop_information Expiration Function Name wp-autosave-block-editor-post-21 Expiration Function Name wpdm_active_tab Expiration Function Name e_library Expiration Function Name 7fc4d26-evergreen_due_date Expiration Function Name 7fc4d26-evergreen_interval Expiration Function Name mc4wp_activity_period Expiration Function Name mc4wp_activity_view Expiration Function Name mc4wp_activity_list Expiration Function Name elementor_sidebar_menu_expanded_v2_elementor-templates Expiration Function Name __mp_opt_in_out_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wp-postpass_2f7f8d091b989df948164cd3404309a6 Expiration Function 7. ConsentWhen you visit our website for the first time, we will show you a pop-up with an explanation about cookies. As soon as you click on "Save preferences", you consent to us using the categories of cookies and plug-ins you selected in the pop-up, as described in this Cookie Policy. You can disable the use of cookies via your browser, but please note that our website may no longer work properly.7.1 Manage your consent settingsYou have loaded the Cookie Policy without javascript support. On AMP, you can use the manage consent button on the bottom of the page.8. Enabling/disabling and deleting cookiesYou can use your internet browser to automatically or manually delete cookies. You can also specify that certain cookies may not be placed. Another option is to change the settings of your internet browser so that you receive a message each time a cookie is placed. For more information about these options, please refer to the instructions in the Help section of your browser.Please note that our website may not work properly if all cookies are disabled. If you do delete the cookies in your browser, they will be placed again after your consent when you visit our website again.9. Your rights with respect to personal dataYou have the following rights with respect to your personal data: confirmation of the existence of processing; access to data; correction of incomplete, inaccurate, or outdated data; anonymization, blocking, or deletion of unnecessary, excessive, or processed data in disagreement with the provisions of the General Law for the Protection of Personal Data (LGPD); portability of data to another service or product provider, upon express request, in accordance with the regulations of the national authority, observing commercial and industrial secrets; deletion of personal data processed with the consent of the holder, except in the cases provided for in art. 16 of the General Law for the Protection of Personal Data (LGPD); information on public and private entities with which the controller shared data; information on the possibility of not providing consent and on the consequences of denial. To exercise these rights, please contact us. Please refer to the contact details at the bottom of this Cookie Policy. If you have a complaint about how we handle your data, we would like to hear from you, but you also have the right to submit a complaint to the National Data Protection Authority (ANPD):Autoridade Nacional de Proteção de Dados Esplanada dos Ministérios, Bloco C, 2º andar, CEP 70297-400 - Brasília – DF. Website10. Contact detailsFor questions and/or comments about our Cookie Policy and this statement, please contact us by using the following contact details:NetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-0293This Cookie Policy was synchronized with cookiedatabase.org on April 22, 2026. ### Cookie Policy (ZA) This Cookie Policy was last updated on May 15, 2025 and applies to citizens and legal permanent residents of South Africa.1. IntroductionOur website, https://www.netburner.com (hereinafter: "the website") uses cookies and other related technologies (for convenience all technologies are referred to as "cookies"). Cookies are also placed by third parties we have engaged. In the document below we inform you about the use of cookies on our website.2. What are cookies?A cookie is a small simple file that is sent along with pages of this website and stored by your browser on the hard drive of your computer or another device. The information stored therein may be returned to our servers or to the servers of the relevant third parties during a subsequent visit.3. What are scripts?A script is a piece of program code that is used to make our website function properly and interactively. This code is executed on our server or on your device.4. What is a web beacon?A web beacon (or a pixel tag) is a small, invisible piece of text or image on a website that is used to monitor traffic on a website. In order to do this, various data about you is stored using web beacons.5. Cookies5.1 Technical or functional cookiesSome cookies ensure that certain parts of the website work properly and that your user preferences remain known. By placing functional cookies, we make it easier for you to visit our website. This way, you do not need to repeatedly enter the same information when visiting our website and, for example, the items remain in your shopping cart until you have paid. We may place these cookies without your consent.5.2 Statistics cookiesWe use statistics cookies to optimize the website experience for our users. With these statistics cookies we get insights in the usage of our website. We ask your permission to place statistics cookies.5.3 Marketing/Tracking cookiesMarketing/Tracking cookies are cookies or any other form of local storage, used to create user profiles to display advertising or to track the user on this website or across several websites for similar marketing purposes.5.4 Social mediaOn our website, we have included content from Facebook, X (Formerly Twitter) and LinkedIn to promote web pages (e.g. “like”, “pin”) or share (e.g. “tweet”) on social networks like Facebook, X (Formerly Twitter) and LinkedIn. This content is embedded with code derived from Facebook, X (Formerly Twitter) and LinkedIn and places cookies. This content might store and process certain information for personalized advertising.Please read the privacy statement of these social networks (which can change regularly) to read what they do with your (personal) data which they process using these cookies. The data that is retrieved is anonymized as much as possible. Facebook, X (Formerly Twitter) and LinkedIn are located in the United States.6. Placed cookies Elementor Statistics (anonymous) Consent to service elementor Usage We use Elementor for content creation. Read more about Elementor Sharing data This data is not shared with third parties. Statistics (anonymous) Name elementor Expiration persistent Function Store performed actions on the website WooCommerce Functional Consent to service woocommerce Usage We use WooCommerce for webshop management. Read more about WooCommerce Sharing data This data is not shared with third parties. Functional Name wc_cart_hash_* Expiration session Function Store items in shopping cart Name wc_fragments_* Expiration persistent Function Name wc_cart_created Expiration session Function Store performed actions on the website Name woocommerce_items_in_cart Expiration session Function Store items in shopping cart Name woocommerce_cart_hash Expiration 1 day Function Store items in shopping cart Name wp_woocommerce_session_* Expiration session Function Store performed actions on the website Name store_notice* Expiration session Function Store if a message has been dismissed Google Analytics Statistics Consent to service google-analytics Usage We use Google Analytics for website statistics. Read more about Google Analytics Sharing data For more information, please read the Google Analytics Privacy Statement. Statistics Name _gid Expiration 1 day Function Store and count pageviews Name _ga Expiration 2 years Function Store and count pageviews Name _ga_* Expiration 1 year Function Store and count pageviews Jetpack Statistics Consent to service jetpack Usage We use Jetpack for advertising. Read more about Jetpack Sharing data For more information, please read the Jetpack Privacy Statement. Statistics Name tk_*r Expiration 1 year Function Store referrer ID's Name tk_r3d Expiration 3 days Function WordPress Functional Consent to service wordpress Usage We use WordPress for website development. Read more about WordPress Sharing data This data is not shared with third parties. Functional Name wordpress_test_cookie Expiration session Function Read if cookies can be placed Name wp-settings-* Expiration persistent Function Store user preferences Name wp-settings-time-* Expiration 1 year Function Store user preferences Name wordpress_logged_in_* Expiration persistent Function Store logged in users Name WP_PREFERENCES_USER_* Expiration persistent Function Store user preferences Name wp_lang Expiration session Function Store language settings Popup Maker Purpose pending investigation Consent to service popup-maker Usage We use Popup Maker for popup creation. Read more about Popup Maker Sharing data This data is not shared with third parties. Purpose pending investigation Name pum-* Expiration Function Automattic Statistics Consent to service automattic Usage We use Automattic for website development. Read more about Automattic Sharing data For more information, please read the Automattic Privacy Statement. Statistics Name tk_qs Expiration 30 minutes Function Provide functions across pages Wordpress Download Manager Functional Consent to service wordpress-download-manager Usage We use Wordpress Download Manager for content management. Read more about Wordpress Download Manager Sharing data For more information, please read the Wordpress Download Manager Privacy Statement. Functional Name __wpdm_client Expiration various Function Provide functions across pages Complianz Functional Consent to service complianz Usage We use Complianz for cookie consent management. Read more about Complianz Sharing data This data is not shared with third parties. For more information, please read the Complianz Privacy Statement. Functional Name cmplz_user_data Expiration 365 days Function Read to determine which cookie banner to show Name cmplz_consented_services Expiration 365 days Function Store cookie consent preferences Name cmplz_policy_id Expiration 365 days Function Store accepted cookie policy ID Name cmplz_marketing Expiration 365 days Function Store cookie consent preferences Name cmplz_statistics Expiration 365 days Function Store cookie consent preferences Name cmplz_preferences Expiration 365 days Function Store cookie consent preferences Name cmplz_functional Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_categories Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_services Expiration 365 days Function Store cookie consent preferences Name cmplz_id Expiration 365 days Function Store cookie consent preferences Name cmplz_banner-status Expiration 365 days Function Store if the cookie banner has been dismissed PHP Functional Consent to service php Usage We use PHP for website development. Read more about PHP Sharing data This data is not shared with third parties. Functional Name exp* Expiration Function Provide functions across pages Google reCAPTCHA Functional, Marketing Consent to service google-recaptcha Usage We use Google reCAPTCHA for spam prevention. Read more about Google reCAPTCHA Sharing data For more information, please read the Google reCAPTCHA Privacy Statement. Functional Name _grecaptcha Expiration 6 months Function Provide spam protection Marketing Name rc::c Expiration session Function Read and filter requests from bots Name rc::b Expiration session Function Read and filter requests from bots Name rc::a Expiration persistent Function Read and filter requests from bots PayPal Functional Consent to service paypal Usage We use PayPal for payment processing. Read more about PayPal Sharing data For more information, please read the PayPal Privacy Statement. Purpose pending investigation Name __paypal_storage__ Expiration Function Functional Name nsid Expiration session Function Provide fraud prevention Name enforce_policy Expiration 1 year Function Store privacy preferences Name tsrce Expiration 3 days Function Name ts_c Expiration 3 years Function Provide fraud prevention Google Maps Marketing Consent to service google-maps Usage We use Google Maps for maps display. Read more about Google Maps Sharing data For more information, please read the Google Maps Privacy Statement. Marketing Name Google Maps API Expiration expires immediately Function Read user IP address YouTube Marketing Consent to service youtube Usage We use YouTube for video display. Read more about YouTube Sharing data For more information, please read the YouTube Privacy Statement. Marketing Name GPS Expiration session Function Store location data Name VISITOR_INFO1_LIVE Expiration 6 months Function Provide ad delivery or retargeting Name YSC Expiration session Function Store and track interaction Name PREF Expiration 8 months Function Store user preferences Facebook Marketing, Functional Consent to service facebook Usage We use Facebook for display of recent social posts and/or social share buttons. Read more about Facebook Sharing data For more information, please read the Facebook Privacy Statement. Marketing Name _fbc Expiration 2 years Function Store last visit Name fbm* Expiration 1 year Function Store account details Name xs Expiration 3 months Function Store a unique session ID Name fr Expiration 3 months Function Provide ad delivery or retargeting Name act Expiration 90 days Function Store logged in users Name _fbp Expiration 3 months Function Store and track visits across websites Name datr Expiration 2 years Function Provide fraud prevention Name c_user Expiration 30 days Function Store a unique user ID Name sb Expiration 2 years Function Store browser details Name *_fbm_ Expiration 1 year Function Store account details Functional Name wd Expiration 1 week Function Read screen resolution Name csm Expiration 90 days Function Provide fraud prevention Name actppresence Expiration session Function Store and track if the browser tab is active Twitter Functional, Marketing Consent to service twitter Usage We use Twitter for display of recent social posts and/or social share buttons. Read more about Twitter Sharing data For more information, please read the Twitter Privacy Statement. Functional Name local_storage_support_test Expiration persistent Function Provide load balancing functionality Marketing Name metrics_token Expiration persistent Function Store if the user has seen embedded content LinkedIn Functional, Marketing, Statistics, Preferences Consent to service linkedin Usage We use LinkedIn for display of recent social posts and/or social share buttons. Read more about LinkedIn Sharing data For more information, please read the LinkedIn Privacy Statement. Functional Name sdsc Expiration session Function Provide load balancing functionality Name li_gc Expiration 6 months Function Store cookie consent preferences Name BizographicsOptOut Expiration 10 years Function Store privacy preferences Marketing Name lms_ads Expiration 30 days Function Store and track visits across websites Name _guid Expiration 90 days Function Store and track a visitor's identity Name li-oatml Expiration 1 month Function Provide ad delivery or retargeting Name li_sugr Expiration 90 days Function Store and track a visitor's identity Name UserMatchHistory Expiration 30 days Function Provide ad delivery or retargeting Statistics Name lms_analytics Expiration 30 days Function Store and track a visitor's identity Name AnalyticsSyncHistory Expiration 30 days Function Store and track visits across websites Preferences Name li_alerts Expiration 1 year Function Store if a message has been shown Name bcookie Expiration 1 year Function Store browser details Name lidc Expiration 1 day Function Provide load balancing functionality Name bscookie Expiration 1 year Function Store logged in users HubSpot Functional Consent to service hubspot Usage We use HubSpot for marketing automation (automated email marketing). Read more about HubSpot Sharing data For more information, please read the HubSpot Privacy Statement. Functional Name *_key Expiration 2 weeks Function Store logged in users Purpose pending investigation Name __hs_cookie_cat_pref Expiration Function Name messagesUtk Expiration Function Name __hssc Expiration Function Name __hstc Expiration Function Name __hsmem Expiration Function Name hs-messages-is-open Expiration Function Name hs_ab_test Expiration Function Name __hs_do_not_track Expiration Function Google Fonts Purpose pending investigation Consent to service google-fonts Usage We use Google Fonts for display of webfonts. Read more about Google Fonts Sharing data For more information, please read the Google Fonts Privacy Statement. Purpose pending investigation Name Google Fonts API Expiration Function Miscellaneous Purpose pending investigation Consent to service miscellaneous Usage Sharing data Sharing of data is pending investigation Purpose pending investigation Name NRBA_SESSION_ID Expiration Function Name icwp-wpsf-notbot Expiration Function Name shield-notbot-nonce Expiration Function Name breeze_folder_name Expiration Function Name leanbe.client Expiration Function Name __angelleye_paypal_sdk_storage__ Expiration Function Name extendify-global-state Expiration Function Name wf301_404_chart Expiration Function Name extendify-wanted-template Expiration Function Name ninjatable_tables_per_page Expiration Function Name nav* Expiration Function Name NRBA_SESSION Expiration Function Name __belter_experiment_* Expiration Function Name customer-effort-score-exit-page Expiration Function Name wf301_404_stats Expiration Function Name wf301_redirect_stats Expiration Function Name extendify-taxonomies Expiration Function Name e_kit-elements-defaults Expiration Function Name wf301_tabs Expiration Function Name WP_DATA_USER_5 Expiration Function Name wf301_redirect_chart Expiration Function Name gt-current-screen Expiration Function Name *ActiveTab Expiration Function Name __paypal_sdk_storage__ Expiration Function Name doxygen_width Expiration Function Name 62e5437476b962001357b06d Expiration Function Name wppmsta Expiration Function Name LEANBE_ACCEPT Expiration Function Name WP_DATA_USER_2008398 Expiration Function Name qm-container-height Expiration Function Name extendify-library-globals-sync Expiration Function Name deactivation-hash Expiration Function Name ios_specific_templates_id Expiration Function Name qm-container-width Expiration Function Name rank-math-option-search-index Expiration Function Name qm-admin-container-pinned Expiration Function Name wpEmojiSettingsSupports Expiration Function Name rank-math-option-titles-index Expiration Function Name rank-math-option-sitemap-index Expiration Function Name rank-math-option-general-index Expiration Function Name extendify-library-cache Expiration Function Name sbjs_migrations Expiration Function Name sbjs_current_add Expiration Function Name sbjs_first_add Expiration Function Name sbjs_current Expiration Function Name sbjs_first Expiration Function Name __ssid Expiration Function Name sbjs_udata Expiration Function Name sbjs_session Expiration Function Name doxygen_search_grp Expiration Function Name loglevel Expiration Function Name bis_data Expiration Function Name __cf_bm Expiration Function Name cf_clearance Expiration Function Name wp-autosave-1 Expiration Function Name qm-front-container-pinned Expiration Function Name calendly-store Expiration Function Name cmplz_consent_mode Expiration 365 days Function Name marketplace_redesign_2023_last_shown_date Expiration Function Name notif_2136245149 Expiration Function Name marketplace_redesign_2023_dismissals Expiration Function Name prefers-light-mode-in-dark-mode Expiration Function Name mirage_cache_manifest Expiration Function Name mirage_network_connection Expiration Function Name gtm4wp_orderid_tracked Expiration Function Name savefrom-helper-extension Expiration Function Name extendify-unsplash-images Expiration Function Name redux_current_tab Expiration Function Name redux_current_tab_get Expiration Function Name redux_current_tab_woocommerce_group_attributes_options Expiration Function Name notices_dismissed__traffic_page_highlights_module_settings Expiration Function Name notices_dismissed__traffic_page_settings Expiration Function Name jp-stats-last-tab Expiration Function Name maxmegamenu.themeeditor Expiration Function Name woocommerce_geo_hash Expiration Function Name adobeCleanFontAdded Expiration Function Name extendify-unsplash-images-d3b1abc4-22a2-4fbd-8d2f-bf1a32fce11a Expiration Function Name wc_remote_logging_last_error_sent_time Expiration Function Name i18nextLng Expiration Function Name WP_DATA_USER_2 Expiration Function Name storeApiCartData Expiration Function Name welaunch_current_tab Expiration Function Name welaunch_current_tab_get Expiration Function Name welaunch_current_tab_woocommerce_group_attributes_options Expiration Function Name _gcl_ls Expiration Function Name _gcl_au Expiration Function Name wcpdf_general_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_0 Expiration Function Name jetpack-ai-jwt Expiration Function Name wc_featuredBannerDismissed Expiration Function Name elementor_safe_mode_token Expiration Function Name wcpdf_documents_settings_accordion_state_0 Expiration Function Name wcpdf_documents_settings_accordion_state_3 Expiration Function Name wcpdf_documents_settings_accordion_state_2 Expiration Function Name wcpdf_documents_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_2 Expiration Function Name wc_iam_settings Expiration Function Name __paypal_global_5_0_502_storage__ Expiration Function Name __paypal_global_5_0_508_storage__ Expiration Function Name mp_150605b3b9f979922f2ac5a52e2dcfe9_mixpanel Expiration Function Name mp_gen_new_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name mp_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wcpdf_documents_settings_accordion_state_advanced Expiration Function Name wcpdf_documents_settings_accordion_state_document_details Expiration Function Name wcpdf_general_settings_accordion_state_address_customization Expiration Function Name wcpdf_general_settings_accordion_state_advanced_formatting Expiration Function Name wcpdf_general_settings_accordion_state_static_files Expiration Function Name wcpdf_general_settings_accordion_state_multilingual Expiration Function Name wcpdf_debug_settings_accordion_state_display_interaction Expiration Function Name wcpdf_general_settings_accordion_state_shop_information Expiration Function Name wp-autosave-block-editor-post-21 Expiration Function Name wpdm_active_tab Expiration Function Name e_library Expiration Function Name 7fc4d26-evergreen_due_date Expiration Function Name 7fc4d26-evergreen_interval Expiration Function Name mc4wp_activity_period Expiration Function Name mc4wp_activity_view Expiration Function Name mc4wp_activity_list Expiration Function Name elementor_sidebar_menu_expanded_v2_elementor-templates Expiration Function Name __mp_opt_in_out_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wp-postpass_2f7f8d091b989df948164cd3404309a6 Expiration Function 7. ConsentWhen you visit our website for the first time, we will show you a pop-up with an explanation about cookies. As soon as you click on "Save preferences", you consent to us using the categories of cookies and plug-ins you selected in the pop-up, as described in this Cookie Policy. You can disable the use of cookies via your browser, but please note that our website may no longer work properly.7.1 Manage your consent settingsYou have loaded the Cookie Policy without javascript support. On AMP, you can use the manage consent button on the bottom of the page.8. Enabling/disabling and deleting cookiesYou can use your internet browser to automatically or manually delete cookies. You can also specify that certain cookies may not be placed. Another option is to change the settings of your internet browser so that you receive a message each time a cookie is placed. For more information about these options, please refer to the instructions in the Help section of your browser.Please note that our website may not work properly if all cookies are disabled. If you do delete the cookies in your browser, they will be placed again after your consent when you visit our website again.9. Your rights with respect to personal dataYou have the following rights with respect to your personal data: You have the right to know why your personal data is needed, what will happen to it, and how long it will be retained for. Right of access: You have the right to access your personal data that is known to us. Right to rectification: you have the right to supplement, correct, have deleted or blocked your personal data whenever you wish. If you give us your consent to process your data, you have the right to revoke that consent and to have your personal data deleted. Right to object: you may object to the processing of your data. We comply with this, unless there are justified grounds for processing. To exercise these rights, please contact us. Please refer to the contact details at the bottom of this Cookie Policy. If you have a complaint about how we handle your data, we would like to hear from you, but you also have the right to submit a complaint to the Information Regulator South Africa: P.O Box 31533, Braamfontein, Johannesburg, 2017 Complaints email: complaints.IR@justice.gov.za10. Contact detailsFor questions and/or comments about our Cookie Policy and this statement, please contact us by using the following contact details:NetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-0293This Cookie Policy was synchronized with cookiedatabase.org on April 22, 2026. ### Cookie Policy (AU) This page was last changed on May 15, 2025, last checked on May 15, 2025 and applies to citizens of Australia. 1. IntroductionOur website, https://www.netburner.com (hereinafter: "the website") uses cookies and other related technologies (for convenience all technologies are referred to as "cookies"). Cookies are also placed by third parties we have engaged. In the document below we inform you about the use of cookies on our website.2. What are cookies?A cookie is a small simple file that is sent along with pages of this website and stored by your browser on the hard drive of your computer or another device. The information stored therein may be returned to our servers or to the servers of the relevant third parties during a subsequent visit.3. What are scripts?A script is a piece of program code that is used to make our website function properly and interactively. This code is executed on our server or on your device.4. What is a web beacon?A web beacon (or a pixel tag) is a small, invisible piece of text or image on a website that is used to monitor traffic on a website. In order to do this, various data about you is stored using web beacons.5. ConsentWhen you visit our website for the first time, we will show you a pop-up with an explanation about cookies. You do have the right to opt-out and to object against the further use of non-functional cookies.5.1 Manage your consent settingsYou have loaded the Cookie Policy without javascript support. On AMP, you can use the manage consent button on the bottom of the page.You can also disable the use of cookies via your browser, but please note that our website may no longer work properly.6. Cookies6.1 Technical or functional cookiesSome cookies ensure that certain parts of the website work properly and that your user preferences remain known. By placing functional cookies, we make it easier for you to visit our website. This way, you do not need to repeatedly enter the same information when visiting our website and, for example, the items remain in your shopping cart until you have paid. We may place these cookies without your consent.6.2 Analytical cookiesWe use analytical cookies to optimize the website experience for our users. With these analytical cookies we get insights in the usage of our website.6.3 Marketing/Tracking cookiesMarketing/Tracking cookies are cookies or any other form of local storage, used to create user profiles to display advertising or to track the user on this website or across several websites for similar marketing purposes.6.4 Social mediaOn our website, we have included content from Facebook, X (Formerly Twitter) and LinkedIn to promote web pages (e.g. “like”, “pin”) or share (e.g. “tweet”) on social networks like Facebook, X (Formerly Twitter) and LinkedIn. This content is embedded with code derived from Facebook, X (Formerly Twitter) and LinkedIn and places cookies. This content might store and process certain information for personalized advertising.Please read the privacy statement of these social networks (which can change regularly) to read what they do with your (personal) data which they process using these cookies. The data that is retrieved is anonymized as much as possible. Facebook, X (Formerly Twitter) and LinkedIn are located in the United States.7. Placed cookies Elementor Statistics (anonymous) Consent to service elementor Usage We use Elementor for content creation. Read more about Elementor Sharing data This data is not shared with third parties. Statistics (anonymous) Name elementor Expiration persistent Function Store performed actions on the website WooCommerce Functional Consent to service woocommerce Usage We use WooCommerce for webshop management. Read more about WooCommerce Sharing data This data is not shared with third parties. Functional Name wc_cart_hash_* Expiration session Function Store items in shopping cart Name wc_fragments_* Expiration persistent Function Name wc_cart_created Expiration session Function Store performed actions on the website Name woocommerce_items_in_cart Expiration session Function Store items in shopping cart Name woocommerce_cart_hash Expiration 1 day Function Store items in shopping cart Name wp_woocommerce_session_* Expiration session Function Store performed actions on the website Name store_notice* Expiration session Function Store if a message has been dismissed Google Analytics Statistics Consent to service google-analytics Usage We use Google Analytics for website statistics. Read more about Google Analytics Sharing data For more information, please read the Google Analytics Privacy Statement. Statistics Name _gid Expiration 1 day Function Store and count pageviews Name _ga Expiration 2 years Function Store and count pageviews Name _ga_* Expiration 1 year Function Store and count pageviews Jetpack Statistics Consent to service jetpack Usage We use Jetpack for advertising. Read more about Jetpack Sharing data For more information, please read the Jetpack Privacy Statement. Statistics Name tk_*r Expiration 1 year Function Store referrer ID's Name tk_r3d Expiration 3 days Function WordPress Functional Consent to service wordpress Usage We use WordPress for website development. Read more about WordPress Sharing data This data is not shared with third parties. Functional Name wordpress_test_cookie Expiration session Function Read if cookies can be placed Name wp-settings-* Expiration persistent Function Store user preferences Name wp-settings-time-* Expiration 1 year Function Store user preferences Name wordpress_logged_in_* Expiration persistent Function Store logged in users Name WP_PREFERENCES_USER_* Expiration persistent Function Store user preferences Name wp_lang Expiration session Function Store language settings Popup Maker Purpose pending investigation Consent to service popup-maker Usage We use Popup Maker for popup creation. Read more about Popup Maker Sharing data This data is not shared with third parties. Purpose pending investigation Name pum-* Expiration Function Automattic Statistics Consent to service automattic Usage We use Automattic for website development. Read more about Automattic Sharing data For more information, please read the Automattic Privacy Statement. Statistics Name tk_qs Expiration 30 minutes Function Provide functions across pages Wordpress Download Manager Functional Consent to service wordpress-download-manager Usage We use Wordpress Download Manager for content management. Read more about Wordpress Download Manager Sharing data For more information, please read the Wordpress Download Manager Privacy Statement. Functional Name __wpdm_client Expiration various Function Provide functions across pages Complianz Functional Consent to service complianz Usage We use Complianz for cookie consent management. Read more about Complianz Sharing data This data is not shared with third parties. For more information, please read the Complianz Privacy Statement. Functional Name cmplz_user_data Expiration 365 days Function Read to determine which cookie banner to show Name cmplz_consented_services Expiration 365 days Function Store cookie consent preferences Name cmplz_policy_id Expiration 365 days Function Store accepted cookie policy ID Name cmplz_marketing Expiration 365 days Function Store cookie consent preferences Name cmplz_statistics Expiration 365 days Function Store cookie consent preferences Name cmplz_preferences Expiration 365 days Function Store cookie consent preferences Name cmplz_functional Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_categories Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_services Expiration 365 days Function Store cookie consent preferences Name cmplz_id Expiration 365 days Function Store cookie consent preferences Name cmplz_banner-status Expiration 365 days Function Store if the cookie banner has been dismissed PHP Functional Consent to service php Usage We use PHP for website development. Read more about PHP Sharing data This data is not shared with third parties. Functional Name exp* Expiration Function Provide functions across pages Google reCAPTCHA Functional, Marketing Consent to service google-recaptcha Usage We use Google reCAPTCHA for spam prevention. Read more about Google reCAPTCHA Sharing data For more information, please read the Google reCAPTCHA Privacy Statement. Functional Name _grecaptcha Expiration 6 months Function Provide spam protection Marketing Name rc::c Expiration session Function Read and filter requests from bots Name rc::b Expiration session Function Read and filter requests from bots Name rc::a Expiration persistent Function Read and filter requests from bots PayPal Functional Consent to service paypal Usage We use PayPal for payment processing. Read more about PayPal Sharing data For more information, please read the PayPal Privacy Statement. Purpose pending investigation Name __paypal_storage__ Expiration Function Functional Name nsid Expiration session Function Provide fraud prevention Name enforce_policy Expiration 1 year Function Store privacy preferences Name tsrce Expiration 3 days Function Name ts_c Expiration 3 years Function Provide fraud prevention Google Maps Marketing Consent to service google-maps Usage We use Google Maps for maps display. Read more about Google Maps Sharing data For more information, please read the Google Maps Privacy Statement. Marketing Name Google Maps API Expiration expires immediately Function Read user IP address YouTube Marketing Consent to service youtube Usage We use YouTube for video display. Read more about YouTube Sharing data For more information, please read the YouTube Privacy Statement. Marketing Name GPS Expiration session Function Store location data Name VISITOR_INFO1_LIVE Expiration 6 months Function Provide ad delivery or retargeting Name YSC Expiration session Function Store and track interaction Name PREF Expiration 8 months Function Store user preferences Facebook Marketing, Functional Consent to service facebook Usage We use Facebook for display of recent social posts and/or social share buttons. Read more about Facebook Sharing data For more information, please read the Facebook Privacy Statement. Marketing Name _fbc Expiration 2 years Function Store last visit Name fbm* Expiration 1 year Function Store account details Name xs Expiration 3 months Function Store a unique session ID Name fr Expiration 3 months Function Provide ad delivery or retargeting Name act Expiration 90 days Function Store logged in users Name _fbp Expiration 3 months Function Store and track visits across websites Name datr Expiration 2 years Function Provide fraud prevention Name c_user Expiration 30 days Function Store a unique user ID Name sb Expiration 2 years Function Store browser details Name *_fbm_ Expiration 1 year Function Store account details Functional Name wd Expiration 1 week Function Read screen resolution Name csm Expiration 90 days Function Provide fraud prevention Name actppresence Expiration session Function Store and track if the browser tab is active Twitter Functional, Marketing Consent to service twitter Usage We use Twitter for display of recent social posts and/or social share buttons. Read more about Twitter Sharing data For more information, please read the Twitter Privacy Statement. Functional Name local_storage_support_test Expiration persistent Function Provide load balancing functionality Marketing Name metrics_token Expiration persistent Function Store if the user has seen embedded content LinkedIn Functional, Marketing, Statistics, Preferences Consent to service linkedin Usage We use LinkedIn for display of recent social posts and/or social share buttons. Read more about LinkedIn Sharing data For more information, please read the LinkedIn Privacy Statement. Functional Name sdsc Expiration session Function Provide load balancing functionality Name li_gc Expiration 6 months Function Store cookie consent preferences Name BizographicsOptOut Expiration 10 years Function Store privacy preferences Marketing Name lms_ads Expiration 30 days Function Store and track visits across websites Name _guid Expiration 90 days Function Store and track a visitor's identity Name li-oatml Expiration 1 month Function Provide ad delivery or retargeting Name li_sugr Expiration 90 days Function Store and track a visitor's identity Name UserMatchHistory Expiration 30 days Function Provide ad delivery or retargeting Statistics Name lms_analytics Expiration 30 days Function Store and track a visitor's identity Name AnalyticsSyncHistory Expiration 30 days Function Store and track visits across websites Preferences Name li_alerts Expiration 1 year Function Store if a message has been shown Name bcookie Expiration 1 year Function Store browser details Name lidc Expiration 1 day Function Provide load balancing functionality Name bscookie Expiration 1 year Function Store logged in users HubSpot Functional Consent to service hubspot Usage We use HubSpot for marketing automation (automated email marketing). Read more about HubSpot Sharing data For more information, please read the HubSpot Privacy Statement. Functional Name *_key Expiration 2 weeks Function Store logged in users Purpose pending investigation Name __hs_cookie_cat_pref Expiration Function Name messagesUtk Expiration Function Name __hssc Expiration Function Name __hstc Expiration Function Name __hsmem Expiration Function Name hs-messages-is-open Expiration Function Name hs_ab_test Expiration Function Name __hs_do_not_track Expiration Function Google Fonts Purpose pending investigation Consent to service google-fonts Usage We use Google Fonts for display of webfonts. Read more about Google Fonts Sharing data For more information, please read the Google Fonts Privacy Statement. Purpose pending investigation Name Google Fonts API Expiration Function Miscellaneous Purpose pending investigation Consent to service miscellaneous Usage Sharing data Sharing of data is pending investigation Purpose pending investigation Name NRBA_SESSION_ID Expiration Function Name icwp-wpsf-notbot Expiration Function Name shield-notbot-nonce Expiration Function Name breeze_folder_name Expiration Function Name leanbe.client Expiration Function Name __angelleye_paypal_sdk_storage__ Expiration Function Name extendify-global-state Expiration Function Name wf301_404_chart Expiration Function Name extendify-wanted-template Expiration Function Name ninjatable_tables_per_page Expiration Function Name nav* Expiration Function Name NRBA_SESSION Expiration Function Name __belter_experiment_* Expiration Function Name customer-effort-score-exit-page Expiration Function Name wf301_404_stats Expiration Function Name wf301_redirect_stats Expiration Function Name extendify-taxonomies Expiration Function Name e_kit-elements-defaults Expiration Function Name wf301_tabs Expiration Function Name WP_DATA_USER_5 Expiration Function Name wf301_redirect_chart Expiration Function Name gt-current-screen Expiration Function Name *ActiveTab Expiration Function Name __paypal_sdk_storage__ Expiration Function Name doxygen_width Expiration Function Name 62e5437476b962001357b06d Expiration Function Name wppmsta Expiration Function Name LEANBE_ACCEPT Expiration Function Name WP_DATA_USER_2008398 Expiration Function Name qm-container-height Expiration Function Name extendify-library-globals-sync Expiration Function Name deactivation-hash Expiration Function Name ios_specific_templates_id Expiration Function Name qm-container-width Expiration Function Name rank-math-option-search-index Expiration Function Name qm-admin-container-pinned Expiration Function Name wpEmojiSettingsSupports Expiration Function Name rank-math-option-titles-index Expiration Function Name rank-math-option-sitemap-index Expiration Function Name rank-math-option-general-index Expiration Function Name extendify-library-cache Expiration Function Name sbjs_migrations Expiration Function Name sbjs_current_add Expiration Function Name sbjs_first_add Expiration Function Name sbjs_current Expiration Function Name sbjs_first Expiration Function Name __ssid Expiration Function Name sbjs_udata Expiration Function Name sbjs_session Expiration Function Name doxygen_search_grp Expiration Function Name loglevel Expiration Function Name bis_data Expiration Function Name __cf_bm Expiration Function Name cf_clearance Expiration Function Name wp-autosave-1 Expiration Function Name qm-front-container-pinned Expiration Function Name calendly-store Expiration Function Name cmplz_consent_mode Expiration 365 days Function Name marketplace_redesign_2023_last_shown_date Expiration Function Name notif_2136245149 Expiration Function Name marketplace_redesign_2023_dismissals Expiration Function Name prefers-light-mode-in-dark-mode Expiration Function Name mirage_cache_manifest Expiration Function Name mirage_network_connection Expiration Function Name gtm4wp_orderid_tracked Expiration Function Name savefrom-helper-extension Expiration Function Name extendify-unsplash-images Expiration Function Name redux_current_tab Expiration Function Name redux_current_tab_get Expiration Function Name redux_current_tab_woocommerce_group_attributes_options Expiration Function Name notices_dismissed__traffic_page_highlights_module_settings Expiration Function Name notices_dismissed__traffic_page_settings Expiration Function Name jp-stats-last-tab Expiration Function Name maxmegamenu.themeeditor Expiration Function Name woocommerce_geo_hash Expiration Function Name adobeCleanFontAdded Expiration Function Name extendify-unsplash-images-d3b1abc4-22a2-4fbd-8d2f-bf1a32fce11a Expiration Function Name wc_remote_logging_last_error_sent_time Expiration Function Name i18nextLng Expiration Function Name WP_DATA_USER_2 Expiration Function Name storeApiCartData Expiration Function Name welaunch_current_tab Expiration Function Name welaunch_current_tab_get Expiration Function Name welaunch_current_tab_woocommerce_group_attributes_options Expiration Function Name _gcl_ls Expiration Function Name _gcl_au Expiration Function Name wcpdf_general_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_0 Expiration Function Name jetpack-ai-jwt Expiration Function Name wc_featuredBannerDismissed Expiration Function Name elementor_safe_mode_token Expiration Function Name wcpdf_documents_settings_accordion_state_0 Expiration Function Name wcpdf_documents_settings_accordion_state_3 Expiration Function Name wcpdf_documents_settings_accordion_state_2 Expiration Function Name wcpdf_documents_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_2 Expiration Function Name wc_iam_settings Expiration Function Name __paypal_global_5_0_502_storage__ Expiration Function Name __paypal_global_5_0_508_storage__ Expiration Function Name mp_150605b3b9f979922f2ac5a52e2dcfe9_mixpanel Expiration Function Name mp_gen_new_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name mp_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wcpdf_documents_settings_accordion_state_advanced Expiration Function Name wcpdf_documents_settings_accordion_state_document_details Expiration Function Name wcpdf_general_settings_accordion_state_address_customization Expiration Function Name wcpdf_general_settings_accordion_state_advanced_formatting Expiration Function Name wcpdf_general_settings_accordion_state_static_files Expiration Function Name wcpdf_general_settings_accordion_state_multilingual Expiration Function Name wcpdf_debug_settings_accordion_state_display_interaction Expiration Function Name wcpdf_general_settings_accordion_state_shop_information Expiration Function Name wp-autosave-block-editor-post-21 Expiration Function Name wpdm_active_tab Expiration Function Name e_library Expiration Function Name 7fc4d26-evergreen_due_date Expiration Function Name 7fc4d26-evergreen_interval Expiration Function Name mc4wp_activity_period Expiration Function Name mc4wp_activity_view Expiration Function Name mc4wp_activity_list Expiration Function Name elementor_sidebar_menu_expanded_v2_elementor-templates Expiration Function Name __mp_opt_in_out_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wp-postpass_2f7f8d091b989df948164cd3404309a6 Expiration Function 8. Enabling/disabling and deleting cookiesYou can use your internet browser to automatically or manually delete cookies. You can also specify that certain cookies may not be placed. Another option is to change the settings of your internet browser so that you receive a message each time a cookie is placed. For more information about these options, please refer to the instructions in the Help section of your browser.Please note that our website may not work properly if all cookies are disabled. If you do delete the cookies in your browser, they will be placed again after your consent when you visit our website again.9. Your rights with respect to personal dataYou have the following rights with respect to your personal data: you may submit a request for access to the data we process about you; you may request an overview, in a commonly used format, of the data we process about you; you may request correction or deletion of the data if it is incorrect or not or no longer relevant for any purpose under the Privacy Act. To exercise these rights, please contact us. Please refer to the contact details at the bottom of this cookie statement. If you have a complaint about how we handle your data, we would like to hear from you.10. Contact detailsFor questions and/or comments about our Cookie Policy and this statement, please contact us by using the following contact details:NetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-0293This Cookie Policy was synchronised with cookiedatabase.org on April 22, 2026. ### Cookie Policy (CA) This page was last changed on May 15, 2025, last checked on May 15, 2025 and applies to citizens and legal permanent residents of Canada.1. IntroductionOur website, https://www.netburner.com (hereinafter: "the website") uses cookies and other related technologies (for convenience all technologies are referred to as "cookies"). Cookies are also placed by third parties we have engaged. In the document below we inform you about the use of cookies on our website.2. What are cookies?A cookie is a small simple file that is sent along with pages of this website and stored by your browser on the hard drive of your computer or another device. The information stored therein may be returned to our servers or to the servers of the relevant third parties during a subsequent visit.3. What are scripts?A script is a piece of program code that is used to make our website function properly and interactively. This code is executed on our server or on your device.4. What is a web beacon?A web beacon (or a pixel tag) is a small, invisible piece of text or image on a website that is used to monitor traffic on a website. In order to do this, various data about you is stored using web beacons.5. Third partiesWe have made agreements about the use of cookies with other companies that place cookies. However, we cannot guarantee that these third parties handle your personal data in a reliable or secure manner. Parties such as Google are to be considered as independent data controllers. We recommend that you read the privacy statements of these companies.6. Cookies6.1 Technical or functional cookiesSome cookies ensure that certain parts of the website work properly and that your user preferences remain known. By placing functional cookies, we make it easier for you to visit our website. This way, you do not need to repeatedly enter the same information when visiting our website and, for example, the items remain in your shopping cart until you have paid.6.2 Statistics cookiesWe use statistics cookies to optimize the website experience for our users. With these statistics cookies we get insights in the usage of our website.6.3 Marketing/Tracking cookiesMarketing/Tracking cookies are cookies or any other form of local storage, used to create user profiles to display advertising or to track the user on this website or across several websites for similar marketing purposes.6.4 Social mediaOn our website, we have included content from Facebook, X (Formerly Twitter) and LinkedIn to promote web pages (e.g. “like”, “pin”) or share (e.g. “tweet”) on social networks like Facebook, X (Formerly Twitter) and LinkedIn. This content is embedded with code derived from Facebook, X (Formerly Twitter) and LinkedIn and places cookies. This content might store and process certain information for personalized advertising.Please read the privacy statement of these social networks (which can change regularly) to read what they do with your (personal) data which they process using these cookies. The data that is retrieved is anonymized as much as possible. Facebook, X (Formerly Twitter) and LinkedIn are located in the United States.7. Placed cookies Elementor Statistics (anonymous) Consent to service elementor Usage We use Elementor for content creation. Read more about Elementor Sharing data This data is not shared with third parties. Statistics (anonymous) Name elementor Expiration persistent Function Store performed actions on the website WooCommerce Functional Consent to service woocommerce Usage We use WooCommerce for webshop management. Read more about WooCommerce Sharing data This data is not shared with third parties. Functional Name wc_cart_hash_* Expiration session Function Store items in shopping cart Name wc_fragments_* Expiration persistent Function Name wc_cart_created Expiration session Function Store performed actions on the website Name woocommerce_items_in_cart Expiration session Function Store items in shopping cart Name woocommerce_cart_hash Expiration 1 day Function Store items in shopping cart Name wp_woocommerce_session_* Expiration session Function Store performed actions on the website Name store_notice* Expiration session Function Store if a message has been dismissed Google Analytics Statistics Consent to service google-analytics Usage We use Google Analytics for website statistics. Read more about Google Analytics Sharing data For more information, please read the Google Analytics Privacy Statement. Statistics Name _gid Expiration 1 day Function Store and count pageviews Name _ga Expiration 2 years Function Store and count pageviews Name _ga_* Expiration 1 year Function Store and count pageviews Jetpack Statistics Consent to service jetpack Usage We use Jetpack for advertising. Read more about Jetpack Sharing data For more information, please read the Jetpack Privacy Statement. Statistics Name tk_*r Expiration 1 year Function Store referrer ID's Name tk_r3d Expiration 3 days Function WordPress Functional Consent to service wordpress Usage We use WordPress for website development. Read more about WordPress Sharing data This data is not shared with third parties. Functional Name wordpress_test_cookie Expiration session Function Read if cookies can be placed Name wp-settings-* Expiration persistent Function Store user preferences Name wp-settings-time-* Expiration 1 year Function Store user preferences Name wordpress_logged_in_* Expiration persistent Function Store logged in users Name WP_PREFERENCES_USER_* Expiration persistent Function Store user preferences Name wp_lang Expiration session Function Store language settings Popup Maker Purpose pending investigation Consent to service popup-maker Usage We use Popup Maker for popup creation. Read more about Popup Maker Sharing data This data is not shared with third parties. Purpose pending investigation Name pum-* Expiration Function Automattic Statistics Consent to service automattic Usage We use Automattic for website development. Read more about Automattic Sharing data For more information, please read the Automattic Privacy Statement. Statistics Name tk_qs Expiration 30 minutes Function Provide functions across pages Wordpress Download Manager Functional Consent to service wordpress-download-manager Usage We use Wordpress Download Manager for content management. Read more about Wordpress Download Manager Sharing data For more information, please read the Wordpress Download Manager Privacy Statement. Functional Name __wpdm_client Expiration various Function Provide functions across pages Complianz Functional Consent to service complianz Usage We use Complianz for cookie consent management. Read more about Complianz Sharing data This data is not shared with third parties. For more information, please read the Complianz Privacy Statement. Functional Name cmplz_user_data Expiration 365 days Function Read to determine which cookie banner to show Name cmplz_consented_services Expiration 365 days Function Store cookie consent preferences Name cmplz_policy_id Expiration 365 days Function Store accepted cookie policy ID Name cmplz_marketing Expiration 365 days Function Store cookie consent preferences Name cmplz_statistics Expiration 365 days Function Store cookie consent preferences Name cmplz_preferences Expiration 365 days Function Store cookie consent preferences Name cmplz_functional Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_categories Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_services Expiration 365 days Function Store cookie consent preferences Name cmplz_id Expiration 365 days Function Store cookie consent preferences Name cmplz_banner-status Expiration 365 days Function Store if the cookie banner has been dismissed PHP Functional Consent to service php Usage We use PHP for website development. Read more about PHP Sharing data This data is not shared with third parties. Functional Name exp* Expiration Function Provide functions across pages Google reCAPTCHA Functional, Marketing Consent to service google-recaptcha Usage We use Google reCAPTCHA for spam prevention. Read more about Google reCAPTCHA Sharing data For more information, please read the Google reCAPTCHA Privacy Statement. Functional Name _grecaptcha Expiration 6 months Function Provide spam protection Marketing Name rc::c Expiration session Function Read and filter requests from bots Name rc::b Expiration session Function Read and filter requests from bots Name rc::a Expiration persistent Function Read and filter requests from bots PayPal Functional Consent to service paypal Usage We use PayPal for payment processing. Read more about PayPal Sharing data For more information, please read the PayPal Privacy Statement. Purpose pending investigation Name __paypal_storage__ Expiration Function Functional Name nsid Expiration session Function Provide fraud prevention Name enforce_policy Expiration 1 year Function Store privacy preferences Name tsrce Expiration 3 days Function Name ts_c Expiration 3 years Function Provide fraud prevention Google Maps Marketing Consent to service google-maps Usage We use Google Maps for maps display. Read more about Google Maps Sharing data For more information, please read the Google Maps Privacy Statement. Marketing Name Google Maps API Expiration expires immediately Function Read user IP address YouTube Marketing Consent to service youtube Usage We use YouTube for video display. Read more about YouTube Sharing data For more information, please read the YouTube Privacy Statement. Marketing Name GPS Expiration session Function Store location data Name VISITOR_INFO1_LIVE Expiration 6 months Function Provide ad delivery or retargeting Name YSC Expiration session Function Store and track interaction Name PREF Expiration 8 months Function Store user preferences Facebook Marketing, Functional Consent to service facebook Usage We use Facebook for display of recent social posts and/or social share buttons. Read more about Facebook Sharing data For more information, please read the Facebook Privacy Statement. Marketing Name _fbc Expiration 2 years Function Store last visit Name fbm* Expiration 1 year Function Store account details Name xs Expiration 3 months Function Store a unique session ID Name fr Expiration 3 months Function Provide ad delivery or retargeting Name act Expiration 90 days Function Store logged in users Name _fbp Expiration 3 months Function Store and track visits across websites Name datr Expiration 2 years Function Provide fraud prevention Name c_user Expiration 30 days Function Store a unique user ID Name sb Expiration 2 years Function Store browser details Name *_fbm_ Expiration 1 year Function Store account details Functional Name wd Expiration 1 week Function Read screen resolution Name csm Expiration 90 days Function Provide fraud prevention Name actppresence Expiration session Function Store and track if the browser tab is active Twitter Functional, Marketing Consent to service twitter Usage We use Twitter for display of recent social posts and/or social share buttons. Read more about Twitter Sharing data For more information, please read the Twitter Privacy Statement. Functional Name local_storage_support_test Expiration persistent Function Provide load balancing functionality Marketing Name metrics_token Expiration persistent Function Store if the user has seen embedded content LinkedIn Functional, Marketing, Statistics, Preferences Consent to service linkedin Usage We use LinkedIn for display of recent social posts and/or social share buttons. Read more about LinkedIn Sharing data For more information, please read the LinkedIn Privacy Statement. Functional Name sdsc Expiration session Function Provide load balancing functionality Name li_gc Expiration 6 months Function Store cookie consent preferences Name BizographicsOptOut Expiration 10 years Function Store privacy preferences Marketing Name lms_ads Expiration 30 days Function Store and track visits across websites Name _guid Expiration 90 days Function Store and track a visitor's identity Name li-oatml Expiration 1 month Function Provide ad delivery or retargeting Name li_sugr Expiration 90 days Function Store and track a visitor's identity Name UserMatchHistory Expiration 30 days Function Provide ad delivery or retargeting Statistics Name lms_analytics Expiration 30 days Function Store and track a visitor's identity Name AnalyticsSyncHistory Expiration 30 days Function Store and track visits across websites Preferences Name li_alerts Expiration 1 year Function Store if a message has been shown Name bcookie Expiration 1 year Function Store browser details Name lidc Expiration 1 day Function Provide load balancing functionality Name bscookie Expiration 1 year Function Store logged in users HubSpot Functional Consent to service hubspot Usage We use HubSpot for marketing automation (automated email marketing). Read more about HubSpot Sharing data For more information, please read the HubSpot Privacy Statement. Functional Name *_key Expiration 2 weeks Function Store logged in users Purpose pending investigation Name __hs_cookie_cat_pref Expiration Function Name messagesUtk Expiration Function Name __hssc Expiration Function Name __hstc Expiration Function Name __hsmem Expiration Function Name hs-messages-is-open Expiration Function Name hs_ab_test Expiration Function Name __hs_do_not_track Expiration Function Google Fonts Purpose pending investigation Consent to service google-fonts Usage We use Google Fonts for display of webfonts. Read more about Google Fonts Sharing data For more information, please read the Google Fonts Privacy Statement. Purpose pending investigation Name Google Fonts API Expiration Function Miscellaneous Purpose pending investigation Consent to service miscellaneous Usage Sharing data Sharing of data is pending investigation Purpose pending investigation Name NRBA_SESSION_ID Expiration Function Name icwp-wpsf-notbot Expiration Function Name shield-notbot-nonce Expiration Function Name breeze_folder_name Expiration Function Name leanbe.client Expiration Function Name __angelleye_paypal_sdk_storage__ Expiration Function Name extendify-global-state Expiration Function Name wf301_404_chart Expiration Function Name extendify-wanted-template Expiration Function Name ninjatable_tables_per_page Expiration Function Name nav* Expiration Function Name NRBA_SESSION Expiration Function Name __belter_experiment_* Expiration Function Name customer-effort-score-exit-page Expiration Function Name wf301_404_stats Expiration Function Name wf301_redirect_stats Expiration Function Name extendify-taxonomies Expiration Function Name e_kit-elements-defaults Expiration Function Name wf301_tabs Expiration Function Name WP_DATA_USER_5 Expiration Function Name wf301_redirect_chart Expiration Function Name gt-current-screen Expiration Function Name *ActiveTab Expiration Function Name __paypal_sdk_storage__ Expiration Function Name doxygen_width Expiration Function Name 62e5437476b962001357b06d Expiration Function Name wppmsta Expiration Function Name LEANBE_ACCEPT Expiration Function Name WP_DATA_USER_2008398 Expiration Function Name qm-container-height Expiration Function Name extendify-library-globals-sync Expiration Function Name deactivation-hash Expiration Function Name ios_specific_templates_id Expiration Function Name qm-container-width Expiration Function Name rank-math-option-search-index Expiration Function Name qm-admin-container-pinned Expiration Function Name wpEmojiSettingsSupports Expiration Function Name rank-math-option-titles-index Expiration Function Name rank-math-option-sitemap-index Expiration Function Name rank-math-option-general-index Expiration Function Name extendify-library-cache Expiration Function Name sbjs_migrations Expiration Function Name sbjs_current_add Expiration Function Name sbjs_first_add Expiration Function Name sbjs_current Expiration Function Name sbjs_first Expiration Function Name __ssid Expiration Function Name sbjs_udata Expiration Function Name sbjs_session Expiration Function Name doxygen_search_grp Expiration Function Name loglevel Expiration Function Name bis_data Expiration Function Name __cf_bm Expiration Function Name cf_clearance Expiration Function Name wp-autosave-1 Expiration Function Name qm-front-container-pinned Expiration Function Name calendly-store Expiration Function Name cmplz_consent_mode Expiration 365 days Function Name marketplace_redesign_2023_last_shown_date Expiration Function Name notif_2136245149 Expiration Function Name marketplace_redesign_2023_dismissals Expiration Function Name prefers-light-mode-in-dark-mode Expiration Function Name mirage_cache_manifest Expiration Function Name mirage_network_connection Expiration Function Name gtm4wp_orderid_tracked Expiration Function Name savefrom-helper-extension Expiration Function Name extendify-unsplash-images Expiration Function Name redux_current_tab Expiration Function Name redux_current_tab_get Expiration Function Name redux_current_tab_woocommerce_group_attributes_options Expiration Function Name notices_dismissed__traffic_page_highlights_module_settings Expiration Function Name notices_dismissed__traffic_page_settings Expiration Function Name jp-stats-last-tab Expiration Function Name maxmegamenu.themeeditor Expiration Function Name woocommerce_geo_hash Expiration Function Name adobeCleanFontAdded Expiration Function Name extendify-unsplash-images-d3b1abc4-22a2-4fbd-8d2f-bf1a32fce11a Expiration Function Name wc_remote_logging_last_error_sent_time Expiration Function Name i18nextLng Expiration Function Name WP_DATA_USER_2 Expiration Function Name storeApiCartData Expiration Function Name welaunch_current_tab Expiration Function Name welaunch_current_tab_get Expiration Function Name welaunch_current_tab_woocommerce_group_attributes_options Expiration Function Name _gcl_ls Expiration Function Name _gcl_au Expiration Function Name wcpdf_general_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_0 Expiration Function Name jetpack-ai-jwt Expiration Function Name wc_featuredBannerDismissed Expiration Function Name elementor_safe_mode_token Expiration Function Name wcpdf_documents_settings_accordion_state_0 Expiration Function Name wcpdf_documents_settings_accordion_state_3 Expiration Function Name wcpdf_documents_settings_accordion_state_2 Expiration Function Name wcpdf_documents_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_2 Expiration Function Name wc_iam_settings Expiration Function Name __paypal_global_5_0_502_storage__ Expiration Function Name __paypal_global_5_0_508_storage__ Expiration Function Name mp_150605b3b9f979922f2ac5a52e2dcfe9_mixpanel Expiration Function Name mp_gen_new_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name mp_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wcpdf_documents_settings_accordion_state_advanced Expiration Function Name wcpdf_documents_settings_accordion_state_document_details Expiration Function Name wcpdf_general_settings_accordion_state_address_customization Expiration Function Name wcpdf_general_settings_accordion_state_advanced_formatting Expiration Function Name wcpdf_general_settings_accordion_state_static_files Expiration Function Name wcpdf_general_settings_accordion_state_multilingual Expiration Function Name wcpdf_debug_settings_accordion_state_display_interaction Expiration Function Name wcpdf_general_settings_accordion_state_shop_information Expiration Function Name wp-autosave-block-editor-post-21 Expiration Function Name wpdm_active_tab Expiration Function Name e_library Expiration Function Name 7fc4d26-evergreen_due_date Expiration Function Name 7fc4d26-evergreen_interval Expiration Function Name mc4wp_activity_period Expiration Function Name mc4wp_activity_view Expiration Function Name mc4wp_activity_list Expiration Function Name elementor_sidebar_menu_expanded_v2_elementor-templates Expiration Function Name __mp_opt_in_out_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wp-postpass_2f7f8d091b989df948164cd3404309a6 Expiration Function 8. ConsentWhen you visit our website for the first time, we will show you a pop-up with an explanation about cookies. You do have the right to opt-out and to object against the further use of non-functional cookies.8.1 Manage your consent settingsYou have loaded the Cookie Policy without javascript support. On AMP, you can use the manage consent button on the bottom of the page.You can also disable the use of cookies via your browser, but please note that our website may no longer work properly.9. Enabling/disabling and deleting cookiesYou can use your internet browser to automatically or manually delete cookies. You can also specify that certain cookies may not be placed. Another option is to change the settings of your internet browser so that you receive a message each time a cookie is placed. For more information about these options, please refer to the instructions in the Help section of your browser. Or you can indicate your preferences on the following page: youradchoices.caPlease note that our website may not work properly if all cookies are disabled. If you do delete the cookies in your browser, they will be placed again after your consent when you visit our website again.10. Your rights with respect to personal dataYou have the following rights with respect to your personal data: you may submit a request for access to the data we process about you; you may object to the processing; you may request an overview, in a commonly used format, of the data we process about you; you may request correction or deletion of the data if it is incorrect or not or no longer relevant. Where appropriate, the amended information shall be transmitted to third parties having access to the information in question. You have the right to withdraw consent at any time, subject to legal or contractual restrictions and reasonable notice. You will be informed of the implications of such withdrawal. You have the right to address a challenge concerning non-compliance with PIPEDA to our organization and, if the issue is not resolved, to the Office of the Privacy Commissioner of Canada. To exercise these rights, please contact us. Please refer to the contact details at the bottom of this Cookie Policy. If you have a complaint about how we handle your data, we would like to hear from you.11. Contact detailsFor questions and/or comments about our Cookie Policy and this statement, please contact us by using the following contact details:NetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-0293This Cookie Policy was synchronized with cookiedatabase.org on April 22, 2026. ### Opt-out preferences This page was last changed on May 15, 2025, last checked on May 15, 2025 and applies to citizens and legal permanent residents of the United States. 1. IntroductionOur website, https://www.netburner.com (hereinafter: "the website") uses cookies and other related technologies (for convenience all technologies are referred to as "cookies"). Cookies are also placed by third parties we have engaged. In the document below we inform you about the use of cookies on our website.We do not sell or share personal information to third parties for monetary consideration; however, we may disclose certain personal information to third parties under circumstances that might be deemed a “sale” or ”Sharing” for residents of California (CPRA), Colorado (CPA), Connecticut (CTDPA), Nevada (NRS 603A), Utah (UCPA) and Virginia (CDPA). We respect and understand that you may want to be sure that your personal information is not being sold or shared. You may request that we exclude your personal information from such arrangements, or direct us to limit the use and disclosure of possible sensitive personal information, by entering your name and email address below. You may need to provide additional identifying information before we can process your request. × Name Name Email Global opt-out from selling and sharing my personal information and limiting the use or disclosure of sensitive personal information. Do not sell my personal information for cross-context behavioral advertising Limit the use of my sensitive personal information Request for access Right to be Forgotten Right to Data Portability 2. CookiesWhen you visit our website it can be necessary to store and/or read certain data from your device by using technologies such as cookies.2.1 Technical or functional cookiesSome cookies ensure that certain parts of the website work properly and that your user preferences remain known. By placing functional cookies, we make it easier for you to visit our website. This way, you do not need to repeatedly enter the same information when visiting our website and, for example, the items remain in your shopping cart until you have paid. We may place these cookies without your consent.2.2 Statistics cookiesWe use statistics cookies to optimize the website experience for our users. With these statistics cookies we get insights in the usage of our website.2.3 Marketing/Tracking cookiesMarketing/Tracking cookies are cookies or any other form of local storage, used to create user profiles to display advertising or to track the user on this website or across several websites for similar marketing purposes.2.4 Social mediaOn our website, we have included content from Facebook, X (Formerly Twitter) and LinkedIn to promote web pages (e.g. “like”, “pin”) or share (e.g. “tweet”) on social networks like Facebook, X (Formerly Twitter) and LinkedIn. This content is embedded with code derived from Facebook, X (Formerly Twitter) and LinkedIn and places cookies. This content might store and process certain information for personalized advertising.Please read the privacy statement of these social networks (which can change regularly) to read what they do with your (personal) data which they process using these cookies. The data that is retrieved is anonymized as much as possible. Facebook, X (Formerly Twitter) and LinkedIn are located in the United States.3. Placed cookiesMost of these technologies have a function, a purpose, and an expiration period. A function is a particular task a technology has. So a function can be to "store certain data." Purpose is "the Why" behind the function. Maybe the data is stored because it is needed for statistics. The expiration period shows the length of the period the used technology can “store or read certain data." Elementor Statistics (anonymous) Consent to service elementor Usage We use Elementor for content creation. Read more about Elementor Sharing data This data is not shared with third parties. Statistics (anonymous) Name elementor Expiration persistent Function Store performed actions on the website WooCommerce Functional Consent to service woocommerce Usage We use WooCommerce for webshop management. Read more about WooCommerce Sharing data This data is not shared with third parties. Functional Name wc_cart_hash_* Expiration session Function Store items in shopping cart Name wc_fragments_* Expiration persistent Function Name wc_cart_created Expiration session Function Store performed actions on the website Name woocommerce_items_in_cart Expiration session Function Store items in shopping cart Name woocommerce_cart_hash Expiration 1 day Function Store items in shopping cart Name wp_woocommerce_session_* Expiration session Function Store performed actions on the website Name store_notice* Expiration session Function Store if a message has been dismissed Google Analytics Statistics Consent to service google-analytics Usage We use Google Analytics for website statistics. Read more about Google Analytics Sharing data For more information, please read the Google Analytics Privacy Statement. Statistics Name _gid Expiration 1 day Function Store and count pageviews Name _ga Expiration 2 years Function Store and count pageviews Name _ga_* Expiration 1 year Function Store and count pageviews Jetpack Statistics Consent to service jetpack Usage We use Jetpack for advertising. Read more about Jetpack Sharing data For more information, please read the Jetpack Privacy Statement. Statistics Name tk_*r Expiration 1 year Function Store referrer ID's Name tk_r3d Expiration 3 days Function WordPress Functional Consent to service wordpress Usage We use WordPress for website development. Read more about WordPress Sharing data This data is not shared with third parties. Functional Name wordpress_test_cookie Expiration session Function Read if cookies can be placed Name wp-settings-* Expiration persistent Function Store user preferences Name wp-settings-time-* Expiration 1 year Function Store user preferences Name wordpress_logged_in_* Expiration persistent Function Store logged in users Name WP_PREFERENCES_USER_* Expiration persistent Function Store user preferences Name wp_lang Expiration session Function Store language settings Popup Maker Purpose pending investigation Consent to service popup-maker Usage We use Popup Maker for popup creation. Read more about Popup Maker Sharing data This data is not shared with third parties. Purpose pending investigation Name pum-* Expiration Function Automattic Statistics Consent to service automattic Usage We use Automattic for website development. Read more about Automattic Sharing data For more information, please read the Automattic Privacy Statement. Statistics Name tk_qs Expiration 30 minutes Function Provide functions across pages Wordpress Download Manager Functional Consent to service wordpress-download-manager Usage We use Wordpress Download Manager for content management. Read more about Wordpress Download Manager Sharing data For more information, please read the Wordpress Download Manager Privacy Statement. Functional Name __wpdm_client Expiration various Function Provide functions across pages Complianz Functional Consent to service complianz Usage We use Complianz for cookie consent management. Read more about Complianz Sharing data This data is not shared with third parties. For more information, please read the Complianz Privacy Statement. Functional Name cmplz_user_data Expiration 365 days Function Read to determine which cookie banner to show Name cmplz_consented_services Expiration 365 days Function Store cookie consent preferences Name cmplz_policy_id Expiration 365 days Function Store accepted cookie policy ID Name cmplz_marketing Expiration 365 days Function Store cookie consent preferences Name cmplz_statistics Expiration 365 days Function Store cookie consent preferences Name cmplz_preferences Expiration 365 days Function Store cookie consent preferences Name cmplz_functional Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_categories Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_services Expiration 365 days Function Store cookie consent preferences Name cmplz_id Expiration 365 days Function Store cookie consent preferences Name cmplz_banner-status Expiration 365 days Function Store if the cookie banner has been dismissed PHP Functional Consent to service php Usage We use PHP for website development. Read more about PHP Sharing data This data is not shared with third parties. Functional Name exp* Expiration Function Provide functions across pages Google reCAPTCHA Functional, Marketing Consent to service google-recaptcha Usage We use Google reCAPTCHA for spam prevention. Read more about Google reCAPTCHA Sharing data For more information, please read the Google reCAPTCHA Privacy Statement. Functional Name _grecaptcha Expiration 6 months Function Provide spam protection Marketing Name rc::c Expiration session Function Read and filter requests from bots Name rc::b Expiration session Function Read and filter requests from bots Name rc::a Expiration persistent Function Read and filter requests from bots PayPal Functional Consent to service paypal Usage We use PayPal for payment processing. Read more about PayPal Sharing data For more information, please read the PayPal Privacy Statement. Purpose pending investigation Name __paypal_storage__ Expiration Function Functional Name nsid Expiration session Function Provide fraud prevention Name enforce_policy Expiration 1 year Function Store privacy preferences Name tsrce Expiration 3 days Function Name ts_c Expiration 3 years Function Provide fraud prevention Google Maps Marketing Consent to service google-maps Usage We use Google Maps for maps display. Read more about Google Maps Sharing data For more information, please read the Google Maps Privacy Statement. Marketing Name Google Maps API Expiration expires immediately Function Read user IP address YouTube Marketing Consent to service youtube Usage We use YouTube for video display. Read more about YouTube Sharing data For more information, please read the YouTube Privacy Statement. Marketing Name GPS Expiration session Function Store location data Name VISITOR_INFO1_LIVE Expiration 6 months Function Provide ad delivery or retargeting Name YSC Expiration session Function Store and track interaction Name PREF Expiration 8 months Function Store user preferences Facebook Marketing, Functional Consent to service facebook Usage We use Facebook for display of recent social posts and/or social share buttons. Read more about Facebook Sharing data For more information, please read the Facebook Privacy Statement. Marketing Name _fbc Expiration 2 years Function Store last visit Name fbm* Expiration 1 year Function Store account details Name xs Expiration 3 months Function Store a unique session ID Name fr Expiration 3 months Function Provide ad delivery or retargeting Name act Expiration 90 days Function Store logged in users Name _fbp Expiration 3 months Function Store and track visits across websites Name datr Expiration 2 years Function Provide fraud prevention Name c_user Expiration 30 days Function Store a unique user ID Name sb Expiration 2 years Function Store browser details Name *_fbm_ Expiration 1 year Function Store account details Functional Name wd Expiration 1 week Function Read screen resolution Name csm Expiration 90 days Function Provide fraud prevention Name actppresence Expiration session Function Store and track if the browser tab is active Twitter Functional, Marketing Consent to service twitter Usage We use Twitter for display of recent social posts and/or social share buttons. Read more about Twitter Sharing data For more information, please read the Twitter Privacy Statement. Functional Name local_storage_support_test Expiration persistent Function Provide load balancing functionality Marketing Name metrics_token Expiration persistent Function Store if the user has seen embedded content LinkedIn Functional, Marketing, Statistics, Preferences Consent to service linkedin Usage We use LinkedIn for display of recent social posts and/or social share buttons. Read more about LinkedIn Sharing data For more information, please read the LinkedIn Privacy Statement. Functional Name sdsc Expiration session Function Provide load balancing functionality Name li_gc Expiration 6 months Function Store cookie consent preferences Name BizographicsOptOut Expiration 10 years Function Store privacy preferences Marketing Name lms_ads Expiration 30 days Function Store and track visits across websites Name _guid Expiration 90 days Function Store and track a visitor's identity Name li-oatml Expiration 1 month Function Provide ad delivery or retargeting Name li_sugr Expiration 90 days Function Store and track a visitor's identity Name UserMatchHistory Expiration 30 days Function Provide ad delivery or retargeting Statistics Name lms_analytics Expiration 30 days Function Store and track a visitor's identity Name AnalyticsSyncHistory Expiration 30 days Function Store and track visits across websites Preferences Name li_alerts Expiration 1 year Function Store if a message has been shown Name bcookie Expiration 1 year Function Store browser details Name lidc Expiration 1 day Function Provide load balancing functionality Name bscookie Expiration 1 year Function Store logged in users HubSpot Functional Consent to service hubspot Usage We use HubSpot for marketing automation (automated email marketing). Read more about HubSpot Sharing data For more information, please read the HubSpot Privacy Statement. Functional Name *_key Expiration 2 weeks Function Store logged in users Purpose pending investigation Name __hs_cookie_cat_pref Expiration Function Name messagesUtk Expiration Function Name __hssc Expiration Function Name __hstc Expiration Function Name __hsmem Expiration Function Name hs-messages-is-open Expiration Function Name hs_ab_test Expiration Function Name __hs_do_not_track Expiration Function Google Fonts Purpose pending investigation Consent to service google-fonts Usage We use Google Fonts for display of webfonts. Read more about Google Fonts Sharing data For more information, please read the Google Fonts Privacy Statement. Purpose pending investigation Name Google Fonts API Expiration Function Miscellaneous Purpose pending investigation Consent to service miscellaneous Usage Sharing data Sharing of data is pending investigation Purpose pending investigation Name NRBA_SESSION_ID Expiration Function Name icwp-wpsf-notbot Expiration Function Name shield-notbot-nonce Expiration Function Name breeze_folder_name Expiration Function Name leanbe.client Expiration Function Name __angelleye_paypal_sdk_storage__ Expiration Function Name extendify-global-state Expiration Function Name wf301_404_chart Expiration Function Name extendify-wanted-template Expiration Function Name ninjatable_tables_per_page Expiration Function Name nav* Expiration Function Name NRBA_SESSION Expiration Function Name __belter_experiment_* Expiration Function Name customer-effort-score-exit-page Expiration Function Name wf301_404_stats Expiration Function Name wf301_redirect_stats Expiration Function Name extendify-taxonomies Expiration Function Name e_kit-elements-defaults Expiration Function Name wf301_tabs Expiration Function Name WP_DATA_USER_5 Expiration Function Name wf301_redirect_chart Expiration Function Name gt-current-screen Expiration Function Name *ActiveTab Expiration Function Name __paypal_sdk_storage__ Expiration Function Name doxygen_width Expiration Function Name 62e5437476b962001357b06d Expiration Function Name wppmsta Expiration Function Name LEANBE_ACCEPT Expiration Function Name WP_DATA_USER_2008398 Expiration Function Name qm-container-height Expiration Function Name extendify-library-globals-sync Expiration Function Name deactivation-hash Expiration Function Name ios_specific_templates_id Expiration Function Name qm-container-width Expiration Function Name rank-math-option-search-index Expiration Function Name qm-admin-container-pinned Expiration Function Name wpEmojiSettingsSupports Expiration Function Name rank-math-option-titles-index Expiration Function Name rank-math-option-sitemap-index Expiration Function Name rank-math-option-general-index Expiration Function Name extendify-library-cache Expiration Function Name sbjs_migrations Expiration Function Name sbjs_current_add Expiration Function Name sbjs_first_add Expiration Function Name sbjs_current Expiration Function Name sbjs_first Expiration Function Name __ssid Expiration Function Name sbjs_udata Expiration Function Name sbjs_session Expiration Function Name doxygen_search_grp Expiration Function Name loglevel Expiration Function Name bis_data Expiration Function Name __cf_bm Expiration Function Name cf_clearance Expiration Function Name wp-autosave-1 Expiration Function Name qm-front-container-pinned Expiration Function Name calendly-store Expiration Function Name cmplz_consent_mode Expiration 365 days Function Name marketplace_redesign_2023_last_shown_date Expiration Function Name notif_2136245149 Expiration Function Name marketplace_redesign_2023_dismissals Expiration Function Name prefers-light-mode-in-dark-mode Expiration Function Name mirage_cache_manifest Expiration Function Name mirage_network_connection Expiration Function Name gtm4wp_orderid_tracked Expiration Function Name savefrom-helper-extension Expiration Function Name extendify-unsplash-images Expiration Function Name redux_current_tab Expiration Function Name redux_current_tab_get Expiration Function Name redux_current_tab_woocommerce_group_attributes_options Expiration Function Name notices_dismissed__traffic_page_highlights_module_settings Expiration Function Name notices_dismissed__traffic_page_settings Expiration Function Name jp-stats-last-tab Expiration Function Name maxmegamenu.themeeditor Expiration Function Name woocommerce_geo_hash Expiration Function Name adobeCleanFontAdded Expiration Function Name extendify-unsplash-images-d3b1abc4-22a2-4fbd-8d2f-bf1a32fce11a Expiration Function Name wc_remote_logging_last_error_sent_time Expiration Function Name i18nextLng Expiration Function Name WP_DATA_USER_2 Expiration Function Name storeApiCartData Expiration Function Name welaunch_current_tab Expiration Function Name welaunch_current_tab_get Expiration Function Name welaunch_current_tab_woocommerce_group_attributes_options Expiration Function Name _gcl_ls Expiration Function Name _gcl_au Expiration Function Name wcpdf_general_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_0 Expiration Function Name jetpack-ai-jwt Expiration Function Name wc_featuredBannerDismissed Expiration Function Name elementor_safe_mode_token Expiration Function Name wcpdf_documents_settings_accordion_state_0 Expiration Function Name wcpdf_documents_settings_accordion_state_3 Expiration Function Name wcpdf_documents_settings_accordion_state_2 Expiration Function Name wcpdf_documents_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_2 Expiration Function Name wc_iam_settings Expiration Function Name __paypal_global_5_0_502_storage__ Expiration Function Name __paypal_global_5_0_508_storage__ Expiration Function Name mp_150605b3b9f979922f2ac5a52e2dcfe9_mixpanel Expiration Function Name mp_gen_new_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name mp_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wcpdf_documents_settings_accordion_state_advanced Expiration Function Name wcpdf_documents_settings_accordion_state_document_details Expiration Function Name wcpdf_general_settings_accordion_state_address_customization Expiration Function Name wcpdf_general_settings_accordion_state_advanced_formatting Expiration Function Name wcpdf_general_settings_accordion_state_static_files Expiration Function Name wcpdf_general_settings_accordion_state_multilingual Expiration Function Name wcpdf_debug_settings_accordion_state_display_interaction Expiration Function Name wcpdf_general_settings_accordion_state_shop_information Expiration Function Name wp-autosave-block-editor-post-21 Expiration Function Name wpdm_active_tab Expiration Function Name e_library Expiration Function Name 7fc4d26-evergreen_due_date Expiration Function Name 7fc4d26-evergreen_interval Expiration Function Name mc4wp_activity_period Expiration Function Name mc4wp_activity_view Expiration Function Name mc4wp_activity_list Expiration Function Name elementor_sidebar_menu_expanded_v2_elementor-templates Expiration Function Name __mp_opt_in_out_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wp-postpass_2f7f8d091b989df948164cd3404309a6 Expiration Function 4. Browser and Device based ConsentWhen you visit our website for the first time, we will show you a pop-up with an explanation about cookies. You do have the right to opt-out and to object against the further use of non-functional cookies.4.1 Manage your opt-out preferencesYou have loaded the Cookie Policy without javascript support. On AMP, you can use the manage consent button on the bottom of the page.5. Enabling/disabling and deleting cookiesYou can use your internet browser to automatically or manually delete cookies. You can also specify that certain cookies may not be placed. Another option is to change the settings of your internet browser so that you receive a message each time a cookie is placed. For more information about these options, please refer to the instructions in the Help section of your browser.Please note that our website may not work properly if all cookies are disabled. If you do delete the cookies in your browser, they will be placed again after your consent when you visit our website again.6. Your rights with respect to personal dataYou have the following rights with respect to your personal data: you may submit a request for access to the data we process about you; you may object to the processing; you may request an overview, in a commonly used format, of the data we process about you; you may request correction or deletion of the data if it is incorrect or not or no longer relevant, or to ask to restrict the processing of the data. To exercise these rights, please contact us. Please refer to the contact details at the bottom of this Cookie Policy. If you have a complaint about how we handle your data, we would like to hear from you.For more information about your rights with respect to personal data, please refer to our Privacy Statement7. Contact detailsFor questions and/or comments about our Cookie Policy and this statement, please contact us by using the following contact details:NetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-0293This Cookie Policy was synchronized with cookiedatabase.org on April 22, 2026. ### Cookie Policy (UK) This Cookie Policy was last updated on May 15, 2025 and applies to citizens and legal permanent residents of the United Kingdom.1. IntroductionOur website, https://www.netburner.com (hereinafter: "the website") uses cookies and other related technologies (for convenience all technologies are referred to as "cookies"). Cookies are also placed by third parties we have engaged. In the document below we inform you about the use of cookies on our website.2. What are cookies?A cookie is a small simple file that is sent along with pages of this website and stored by your browser on the hard drive of your computer or another device. The information stored therein may be returned to our servers or to the servers of the relevant third parties during a subsequent visit.3. What are scripts?A script is a piece of program code that is used to make our website function properly and interactively. This code is executed on our server or on your device.4. What is a web beacon?A web beacon (or a pixel tag) is a small, invisible piece of text or image on a website that is used to monitor traffic on a website. In order to do this, various data about you is stored using web beacons.5. Cookies5.1 Technical or functional cookiesSome cookies ensure that certain parts of the website work properly and that your user preferences remain known. By placing functional cookies, we make it easier for you to visit our website. This way, you do not need to repeatedly enter the same information when visiting our website and, for example, the items remain in your shopping cart until you have paid. We may place these cookies without your consent.5.2 Statistics cookiesWe use statistics cookies to optimize the website experience for our users. With these statistics cookies we get insights in the usage of our website. We ask your permission to place statistics cookies.5.3 Marketing/Tracking cookiesMarketing/Tracking cookies are cookies or any other form of local storage, used to create user profiles to display advertising or to track the user on this website or across several websites for similar marketing purposes.5.4 Social mediaOn our website, we have included content from Facebook, X (Formerly Twitter) and LinkedIn to promote web pages (e.g. “like”, “pin”) or share (e.g. “tweet”) on social networks like Facebook, X (Formerly Twitter) and LinkedIn. This content is embedded with code derived from Facebook, X (Formerly Twitter) and LinkedIn and places cookies. This content might store and process certain information for personalized advertising.Facebook, X (Formerly Twitter) and LinkedIn are located in the United States.6. Placed cookies Elementor Statistics (anonymous) Consent to service elementor Usage We use Elementor for content creation. Read more about Elementor Sharing data This data is not shared with third parties. Statistics (anonymous) Name elementor Expiration persistent Function Store performed actions on the website WooCommerce Functional Consent to service woocommerce Usage We use WooCommerce for webshop management. Read more about WooCommerce Sharing data This data is not shared with third parties. Functional Name wc_cart_hash_* Expiration session Function Store items in shopping cart Name wc_fragments_* Expiration persistent Function Name wc_cart_created Expiration session Function Store performed actions on the website Name woocommerce_items_in_cart Expiration session Function Store items in shopping cart Name woocommerce_cart_hash Expiration 1 day Function Store items in shopping cart Name wp_woocommerce_session_* Expiration session Function Store performed actions on the website Name store_notice* Expiration session Function Store if a message has been dismissed Google Analytics Statistics Consent to service google-analytics Usage We use Google Analytics for website statistics. Read more about Google Analytics Sharing data For more information, please read the Google Analytics Privacy Statement. Statistics Name _gid Expiration 1 day Function Store and count pageviews Name _ga Expiration 2 years Function Store and count pageviews Name _ga_* Expiration 1 year Function Store and count pageviews Jetpack Statistics Consent to service jetpack Usage We use Jetpack for advertising. Read more about Jetpack Sharing data For more information, please read the Jetpack Privacy Statement. Statistics Name tk_*r Expiration 1 year Function Store referrer ID's Name tk_r3d Expiration 3 days Function WordPress Functional Consent to service wordpress Usage We use WordPress for website development. Read more about WordPress Sharing data This data is not shared with third parties. Functional Name wordpress_test_cookie Expiration session Function Read if cookies can be placed Name wp-settings-* Expiration persistent Function Store user preferences Name wp-settings-time-* Expiration 1 year Function Store user preferences Name wordpress_logged_in_* Expiration persistent Function Store logged in users Name WP_PREFERENCES_USER_* Expiration persistent Function Store user preferences Name wp_lang Expiration session Function Store language settings Popup Maker Purpose pending investigation Consent to service popup-maker Usage We use Popup Maker for popup creation. Read more about Popup Maker Sharing data This data is not shared with third parties. Purpose pending investigation Name pum-* Expiration Function Automattic Statistics Consent to service automattic Usage We use Automattic for website development. Read more about Automattic Sharing data For more information, please read the Automattic Privacy Statement. Statistics Name tk_qs Expiration 30 minutes Function Provide functions across pages Wordpress Download Manager Functional Consent to service wordpress-download-manager Usage We use Wordpress Download Manager for content management. Read more about Wordpress Download Manager Sharing data For more information, please read the Wordpress Download Manager Privacy Statement. Functional Name __wpdm_client Expiration various Function Provide functions across pages Complianz Functional Consent to service complianz Usage We use Complianz for cookie consent management. Read more about Complianz Sharing data This data is not shared with third parties. For more information, please read the Complianz Privacy Statement. Functional Name cmplz_user_data Expiration 365 days Function Read to determine which cookie banner to show Name cmplz_consented_services Expiration 365 days Function Store cookie consent preferences Name cmplz_policy_id Expiration 365 days Function Store accepted cookie policy ID Name cmplz_marketing Expiration 365 days Function Store cookie consent preferences Name cmplz_statistics Expiration 365 days Function Store cookie consent preferences Name cmplz_preferences Expiration 365 days Function Store cookie consent preferences Name cmplz_functional Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_categories Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_services Expiration 365 days Function Store cookie consent preferences Name cmplz_id Expiration 365 days Function Store cookie consent preferences Name cmplz_banner-status Expiration 365 days Function Store if the cookie banner has been dismissed PHP Functional Consent to service php Usage We use PHP for website development. Read more about PHP Sharing data This data is not shared with third parties. Functional Name exp* Expiration Function Provide functions across pages Google reCAPTCHA Functional, Marketing Consent to service google-recaptcha Usage We use Google reCAPTCHA for spam prevention. Read more about Google reCAPTCHA Sharing data For more information, please read the Google reCAPTCHA Privacy Statement. Functional Name _grecaptcha Expiration 6 months Function Provide spam protection Marketing Name rc::c Expiration session Function Read and filter requests from bots Name rc::b Expiration session Function Read and filter requests from bots Name rc::a Expiration persistent Function Read and filter requests from bots PayPal Functional Consent to service paypal Usage We use PayPal for payment processing. Read more about PayPal Sharing data For more information, please read the PayPal Privacy Statement. Purpose pending investigation Name __paypal_storage__ Expiration Function Functional Name nsid Expiration session Function Provide fraud prevention Name enforce_policy Expiration 1 year Function Store privacy preferences Name tsrce Expiration 3 days Function Name ts_c Expiration 3 years Function Provide fraud prevention Google Maps Marketing Consent to service google-maps Usage We use Google Maps for maps display. Read more about Google Maps Sharing data For more information, please read the Google Maps Privacy Statement. Marketing Name Google Maps API Expiration expires immediately Function Read user IP address YouTube Marketing Consent to service youtube Usage We use YouTube for video display. Read more about YouTube Sharing data For more information, please read the YouTube Privacy Statement. Marketing Name GPS Expiration session Function Store location data Name VISITOR_INFO1_LIVE Expiration 6 months Function Provide ad delivery or retargeting Name YSC Expiration session Function Store and track interaction Name PREF Expiration 8 months Function Store user preferences Facebook Marketing, Functional Consent to service facebook Usage We use Facebook for display of recent social posts and/or social share buttons. Read more about Facebook Sharing data For more information, please read the Facebook Privacy Statement. Marketing Name _fbc Expiration 2 years Function Store last visit Name fbm* Expiration 1 year Function Store account details Name xs Expiration 3 months Function Store a unique session ID Name fr Expiration 3 months Function Provide ad delivery or retargeting Name act Expiration 90 days Function Store logged in users Name _fbp Expiration 3 months Function Store and track visits across websites Name datr Expiration 2 years Function Provide fraud prevention Name c_user Expiration 30 days Function Store a unique user ID Name sb Expiration 2 years Function Store browser details Name *_fbm_ Expiration 1 year Function Store account details Functional Name wd Expiration 1 week Function Read screen resolution Name csm Expiration 90 days Function Provide fraud prevention Name actppresence Expiration session Function Store and track if the browser tab is active Twitter Functional, Marketing Consent to service twitter Usage We use Twitter for display of recent social posts and/or social share buttons. Read more about Twitter Sharing data For more information, please read the Twitter Privacy Statement. Functional Name local_storage_support_test Expiration persistent Function Provide load balancing functionality Marketing Name metrics_token Expiration persistent Function Store if the user has seen embedded content LinkedIn Functional, Marketing, Statistics, Preferences Consent to service linkedin Usage We use LinkedIn for display of recent social posts and/or social share buttons. Read more about LinkedIn Sharing data For more information, please read the LinkedIn Privacy Statement. Functional Name sdsc Expiration session Function Provide load balancing functionality Name li_gc Expiration 6 months Function Store cookie consent preferences Name BizographicsOptOut Expiration 10 years Function Store privacy preferences Marketing Name lms_ads Expiration 30 days Function Store and track visits across websites Name _guid Expiration 90 days Function Store and track a visitor's identity Name li-oatml Expiration 1 month Function Provide ad delivery or retargeting Name li_sugr Expiration 90 days Function Store and track a visitor's identity Name UserMatchHistory Expiration 30 days Function Provide ad delivery or retargeting Statistics Name lms_analytics Expiration 30 days Function Store and track a visitor's identity Name AnalyticsSyncHistory Expiration 30 days Function Store and track visits across websites Preferences Name li_alerts Expiration 1 year Function Store if a message has been shown Name bcookie Expiration 1 year Function Store browser details Name lidc Expiration 1 day Function Provide load balancing functionality Name bscookie Expiration 1 year Function Store logged in users HubSpot Functional Consent to service hubspot Usage We use HubSpot for marketing automation (automated email marketing). Read more about HubSpot Sharing data For more information, please read the HubSpot Privacy Statement. Functional Name *_key Expiration 2 weeks Function Store logged in users Purpose pending investigation Name __hs_cookie_cat_pref Expiration Function Name messagesUtk Expiration Function Name __hssc Expiration Function Name __hstc Expiration Function Name __hsmem Expiration Function Name hs-messages-is-open Expiration Function Name hs_ab_test Expiration Function Name __hs_do_not_track Expiration Function Google Fonts Purpose pending investigation Consent to service google-fonts Usage We use Google Fonts for display of webfonts. Read more about Google Fonts Sharing data For more information, please read the Google Fonts Privacy Statement. Purpose pending investigation Name Google Fonts API Expiration Function Miscellaneous Purpose pending investigation Consent to service miscellaneous Usage Sharing data Sharing of data is pending investigation Purpose pending investigation Name NRBA_SESSION_ID Expiration Function Name icwp-wpsf-notbot Expiration Function Name shield-notbot-nonce Expiration Function Name breeze_folder_name Expiration Function Name leanbe.client Expiration Function Name __angelleye_paypal_sdk_storage__ Expiration Function Name extendify-global-state Expiration Function Name wf301_404_chart Expiration Function Name extendify-wanted-template Expiration Function Name ninjatable_tables_per_page Expiration Function Name nav* Expiration Function Name NRBA_SESSION Expiration Function Name __belter_experiment_* Expiration Function Name customer-effort-score-exit-page Expiration Function Name wf301_404_stats Expiration Function Name wf301_redirect_stats Expiration Function Name extendify-taxonomies Expiration Function Name e_kit-elements-defaults Expiration Function Name wf301_tabs Expiration Function Name WP_DATA_USER_5 Expiration Function Name wf301_redirect_chart Expiration Function Name gt-current-screen Expiration Function Name *ActiveTab Expiration Function Name __paypal_sdk_storage__ Expiration Function Name doxygen_width Expiration Function Name 62e5437476b962001357b06d Expiration Function Name wppmsta Expiration Function Name LEANBE_ACCEPT Expiration Function Name WP_DATA_USER_2008398 Expiration Function Name qm-container-height Expiration Function Name extendify-library-globals-sync Expiration Function Name deactivation-hash Expiration Function Name ios_specific_templates_id Expiration Function Name qm-container-width Expiration Function Name rank-math-option-search-index Expiration Function Name qm-admin-container-pinned Expiration Function Name wpEmojiSettingsSupports Expiration Function Name rank-math-option-titles-index Expiration Function Name rank-math-option-sitemap-index Expiration Function Name rank-math-option-general-index Expiration Function Name extendify-library-cache Expiration Function Name sbjs_migrations Expiration Function Name sbjs_current_add Expiration Function Name sbjs_first_add Expiration Function Name sbjs_current Expiration Function Name sbjs_first Expiration Function Name __ssid Expiration Function Name sbjs_udata Expiration Function Name sbjs_session Expiration Function Name doxygen_search_grp Expiration Function Name loglevel Expiration Function Name bis_data Expiration Function Name __cf_bm Expiration Function Name cf_clearance Expiration Function Name wp-autosave-1 Expiration Function Name qm-front-container-pinned Expiration Function Name calendly-store Expiration Function Name cmplz_consent_mode Expiration 365 days Function Name marketplace_redesign_2023_last_shown_date Expiration Function Name notif_2136245149 Expiration Function Name marketplace_redesign_2023_dismissals Expiration Function Name prefers-light-mode-in-dark-mode Expiration Function Name mirage_cache_manifest Expiration Function Name mirage_network_connection Expiration Function Name gtm4wp_orderid_tracked Expiration Function Name savefrom-helper-extension Expiration Function Name extendify-unsplash-images Expiration Function Name redux_current_tab Expiration Function Name redux_current_tab_get Expiration Function Name redux_current_tab_woocommerce_group_attributes_options Expiration Function Name notices_dismissed__traffic_page_highlights_module_settings Expiration Function Name notices_dismissed__traffic_page_settings Expiration Function Name jp-stats-last-tab Expiration Function Name maxmegamenu.themeeditor Expiration Function Name woocommerce_geo_hash Expiration Function Name adobeCleanFontAdded Expiration Function Name extendify-unsplash-images-d3b1abc4-22a2-4fbd-8d2f-bf1a32fce11a Expiration Function Name wc_remote_logging_last_error_sent_time Expiration Function Name i18nextLng Expiration Function Name WP_DATA_USER_2 Expiration Function Name storeApiCartData Expiration Function Name welaunch_current_tab Expiration Function Name welaunch_current_tab_get Expiration Function Name welaunch_current_tab_woocommerce_group_attributes_options Expiration Function Name _gcl_ls Expiration Function Name _gcl_au Expiration Function Name wcpdf_general_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_0 Expiration Function Name jetpack-ai-jwt Expiration Function Name wc_featuredBannerDismissed Expiration Function Name elementor_safe_mode_token Expiration Function Name wcpdf_documents_settings_accordion_state_0 Expiration Function Name wcpdf_documents_settings_accordion_state_3 Expiration Function Name wcpdf_documents_settings_accordion_state_2 Expiration Function Name wcpdf_documents_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_2 Expiration Function Name wc_iam_settings Expiration Function Name __paypal_global_5_0_502_storage__ Expiration Function Name __paypal_global_5_0_508_storage__ Expiration Function Name mp_150605b3b9f979922f2ac5a52e2dcfe9_mixpanel Expiration Function Name mp_gen_new_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name mp_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wcpdf_documents_settings_accordion_state_advanced Expiration Function Name wcpdf_documents_settings_accordion_state_document_details Expiration Function Name wcpdf_general_settings_accordion_state_address_customization Expiration Function Name wcpdf_general_settings_accordion_state_advanced_formatting Expiration Function Name wcpdf_general_settings_accordion_state_static_files Expiration Function Name wcpdf_general_settings_accordion_state_multilingual Expiration Function Name wcpdf_debug_settings_accordion_state_display_interaction Expiration Function Name wcpdf_general_settings_accordion_state_shop_information Expiration Function Name wp-autosave-block-editor-post-21 Expiration Function Name wpdm_active_tab Expiration Function Name e_library Expiration Function Name 7fc4d26-evergreen_due_date Expiration Function Name 7fc4d26-evergreen_interval Expiration Function Name mc4wp_activity_period Expiration Function Name mc4wp_activity_view Expiration Function Name mc4wp_activity_list Expiration Function Name elementor_sidebar_menu_expanded_v2_elementor-templates Expiration Function Name __mp_opt_in_out_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wp-postpass_2f7f8d091b989df948164cd3404309a6 Expiration Function 7. ConsentWhen you visit our website for the first time, we will show you a pop-up with an explanation about cookies. As soon as you click on "Save preferences", you consent to us using the categories of cookies and plug-ins you selected in the pop-up, as described in this Cookie Policy. You can disable the use of cookies via your browser, but please note that our website may no longer work properly.7.1 Manage your consent settingsYou have loaded the Cookie Policy without javascript support. On AMP, you can use the manage consent button on the bottom of the page.8. Enabling/disabling and deleting cookiesYou can use your internet browser to automatically or manually delete cookies. You can also specify that certain cookies may not be placed. Another option is to change the settings of your internet browser so that you receive a message each time a cookie is placed. For more information about these options, please refer to the instructions in the Help section of your browser.Please note that our website may not work properly if all cookies are disabled. If you do delete the cookies in your browser, they will be placed again after your consent when you visit our website again.9. Your rights with respect to personal dataYou have the following rights with respect to your personal data: You have the right to know why your personal data is needed, what will happen to it, and how long it will be retained for. Right of access: You have the right to access your personal data that is known to us. Right to rectification: you have the right to supplement, correct, have deleted or blocked your personal data whenever you wish. If you give us your consent to process your data, you have the right to revoke that consent and to have your personal data deleted. Right to transfer your data: you have the right to request all your personal data from the controller and transfer it in its entirety to another controller. Right to object: you may object to the processing of your data. We comply with this, unless there are justified grounds for processing. To exercise these rights, please contact us. Please refer to the contact details at the bottom of this Cookie Policy. If you have a complaint about how we handle your data, we would like to hear from you, but you also have the right to submit a complaint to the supervisory authority (the Information Commissioner's Office (ICO)).10. Contact detailsFor questions and/or comments about our Cookie Policy and this statement, please contact us by using the following contact details:NetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-0293This Cookie Policy was synchronised with cookiedatabase.org on April 22, 2026. ### Cookie Policy (EU) This Cookie Policy was last updated on May 15, 2025 and applies to citizens and legal permanent residents of the European Economic Area and Switzerland.1. IntroductionOur website, https://www.netburner.com (hereinafter: "the website") uses cookies and other related technologies (for convenience all technologies are referred to as "cookies"). Cookies are also placed by third parties we have engaged. In the document below we inform you about the use of cookies on our website.2. What are cookies?A cookie is a small simple file that is sent along with pages of this website and stored by your browser on the hard drive of your computer or another device. The information stored therein may be returned to our servers or to the servers of the relevant third parties during a subsequent visit.3. What are scripts?A script is a piece of program code that is used to make our website function properly and interactively. This code is executed on our server or on your device.4. What is a web beacon?A web beacon (or a pixel tag) is a small, invisible piece of text or image on a website that is used to monitor traffic on a website. In order to do this, various data about you is stored using web beacons.5. Cookies5.1 Technical or functional cookiesSome cookies ensure that certain parts of the website work properly and that your user preferences remain known. By placing functional cookies, we make it easier for you to visit our website. This way, you do not need to repeatedly enter the same information when visiting our website and, for example, the items remain in your shopping cart until you have paid. We may place these cookies without your consent.5.2 Statistics cookiesWe use statistics cookies to optimize the website experience for our users. With these statistics cookies we get insights in the usage of our website. We ask your permission to place statistics cookies.5.3 Marketing/Tracking cookiesMarketing/Tracking cookies are cookies or any other form of local storage, used to create user profiles to display advertising or to track the user on this website or across several websites for similar marketing purposes.5.4 Social mediaOn our website, we have included content from Facebook, X (Formerly Twitter) and LinkedIn to promote web pages (e.g. “like”, “pin”) or share (e.g. “tweet”) on social networks like Facebook, X (Formerly Twitter) and LinkedIn. This content is embedded with code derived from Facebook, X (Formerly Twitter) and LinkedIn and places cookies. This content might store and process certain information for personalized advertising.Please read the privacy statement of these social networks (which can change regularly) to read what they do with your (personal) data which they process using these cookies. The data that is retrieved is anonymized as much as possible. Facebook, X (Formerly Twitter) and LinkedIn are located in the United States.6. Placed cookies Elementor Statistics (anonymous) Consent to service elementor Usage We use Elementor for content creation. Read more about Elementor Sharing data This data is not shared with third parties. Statistics (anonymous) Name elementor Expiration persistent Function Store performed actions on the website WooCommerce Functional Consent to service woocommerce Usage We use WooCommerce for webshop management. Read more about WooCommerce Sharing data This data is not shared with third parties. Functional Name wc_cart_hash_* Expiration session Function Store items in shopping cart Name wc_fragments_* Expiration persistent Function Name wc_cart_created Expiration session Function Store performed actions on the website Name woocommerce_items_in_cart Expiration session Function Store items in shopping cart Name woocommerce_cart_hash Expiration 1 day Function Store items in shopping cart Name wp_woocommerce_session_* Expiration session Function Store performed actions on the website Name store_notice* Expiration session Function Store if a message has been dismissed Google Analytics Statistics Consent to service google-analytics Usage We use Google Analytics for website statistics. Read more about Google Analytics Sharing data For more information, please read the Google Analytics Privacy Statement. Statistics Name _gid Expiration 1 day Function Store and count pageviews Name _ga Expiration 2 years Function Store and count pageviews Name _ga_* Expiration 1 year Function Store and count pageviews Jetpack Statistics Consent to service jetpack Usage We use Jetpack for advertising. Read more about Jetpack Sharing data For more information, please read the Jetpack Privacy Statement. Statistics Name tk_*r Expiration 1 year Function Store referrer ID's Name tk_r3d Expiration 3 days Function WordPress Functional Consent to service wordpress Usage We use WordPress for website development. Read more about WordPress Sharing data This data is not shared with third parties. Functional Name wordpress_test_cookie Expiration session Function Read if cookies can be placed Name wp-settings-* Expiration persistent Function Store user preferences Name wp-settings-time-* Expiration 1 year Function Store user preferences Name wordpress_logged_in_* Expiration persistent Function Store logged in users Name WP_PREFERENCES_USER_* Expiration persistent Function Store user preferences Name wp_lang Expiration session Function Store language settings Popup Maker Purpose pending investigation Consent to service popup-maker Usage We use Popup Maker for popup creation. Read more about Popup Maker Sharing data This data is not shared with third parties. Purpose pending investigation Name pum-* Expiration Function Automattic Statistics Consent to service automattic Usage We use Automattic for website development. Read more about Automattic Sharing data For more information, please read the Automattic Privacy Statement. Statistics Name tk_qs Expiration 30 minutes Function Provide functions across pages Wordpress Download Manager Functional Consent to service wordpress-download-manager Usage We use Wordpress Download Manager for content management. Read more about Wordpress Download Manager Sharing data For more information, please read the Wordpress Download Manager Privacy Statement. Functional Name __wpdm_client Expiration various Function Provide functions across pages Complianz Functional Consent to service complianz Usage We use Complianz for cookie consent management. Read more about Complianz Sharing data This data is not shared with third parties. For more information, please read the Complianz Privacy Statement. Functional Name cmplz_user_data Expiration 365 days Function Read to determine which cookie banner to show Name cmplz_consented_services Expiration 365 days Function Store cookie consent preferences Name cmplz_policy_id Expiration 365 days Function Store accepted cookie policy ID Name cmplz_marketing Expiration 365 days Function Store cookie consent preferences Name cmplz_statistics Expiration 365 days Function Store cookie consent preferences Name cmplz_preferences Expiration 365 days Function Store cookie consent preferences Name cmplz_functional Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_categories Expiration 365 days Function Store cookie consent preferences Name cmplz_saved_services Expiration 365 days Function Store cookie consent preferences Name cmplz_id Expiration 365 days Function Store cookie consent preferences Name cmplz_banner-status Expiration 365 days Function Store if the cookie banner has been dismissed PHP Functional Consent to service php Usage We use PHP for website development. Read more about PHP Sharing data This data is not shared with third parties. Functional Name exp* Expiration Function Provide functions across pages Google reCAPTCHA Functional, Marketing Consent to service google-recaptcha Usage We use Google reCAPTCHA for spam prevention. Read more about Google reCAPTCHA Sharing data For more information, please read the Google reCAPTCHA Privacy Statement. Functional Name _grecaptcha Expiration 6 months Function Provide spam protection Marketing Name rc::c Expiration session Function Read and filter requests from bots Name rc::b Expiration session Function Read and filter requests from bots Name rc::a Expiration persistent Function Read and filter requests from bots PayPal Functional Consent to service paypal Usage We use PayPal for payment processing. Read more about PayPal Sharing data For more information, please read the PayPal Privacy Statement. Purpose pending investigation Name __paypal_storage__ Expiration Function Functional Name nsid Expiration session Function Provide fraud prevention Name enforce_policy Expiration 1 year Function Store privacy preferences Name tsrce Expiration 3 days Function Name ts_c Expiration 3 years Function Provide fraud prevention Google Maps Marketing Consent to service google-maps Usage We use Google Maps for maps display. Read more about Google Maps Sharing data For more information, please read the Google Maps Privacy Statement. Marketing Name Google Maps API Expiration expires immediately Function Read user IP address YouTube Marketing Consent to service youtube Usage We use YouTube for video display. Read more about YouTube Sharing data For more information, please read the YouTube Privacy Statement. Marketing Name GPS Expiration session Function Store location data Name VISITOR_INFO1_LIVE Expiration 6 months Function Provide ad delivery or retargeting Name YSC Expiration session Function Store and track interaction Name PREF Expiration 8 months Function Store user preferences Facebook Marketing, Functional Consent to service facebook Usage We use Facebook for display of recent social posts and/or social share buttons. Read more about Facebook Sharing data For more information, please read the Facebook Privacy Statement. Marketing Name _fbc Expiration 2 years Function Store last visit Name fbm* Expiration 1 year Function Store account details Name xs Expiration 3 months Function Store a unique session ID Name fr Expiration 3 months Function Provide ad delivery or retargeting Name act Expiration 90 days Function Store logged in users Name _fbp Expiration 3 months Function Store and track visits across websites Name datr Expiration 2 years Function Provide fraud prevention Name c_user Expiration 30 days Function Store a unique user ID Name sb Expiration 2 years Function Store browser details Name *_fbm_ Expiration 1 year Function Store account details Functional Name wd Expiration 1 week Function Read screen resolution Name csm Expiration 90 days Function Provide fraud prevention Name actppresence Expiration session Function Store and track if the browser tab is active Twitter Functional, Marketing Consent to service twitter Usage We use Twitter for display of recent social posts and/or social share buttons. Read more about Twitter Sharing data For more information, please read the Twitter Privacy Statement. Functional Name local_storage_support_test Expiration persistent Function Provide load balancing functionality Marketing Name metrics_token Expiration persistent Function Store if the user has seen embedded content LinkedIn Functional, Marketing, Statistics, Preferences Consent to service linkedin Usage We use LinkedIn for display of recent social posts and/or social share buttons. Read more about LinkedIn Sharing data For more information, please read the LinkedIn Privacy Statement. Functional Name sdsc Expiration session Function Provide load balancing functionality Name li_gc Expiration 6 months Function Store cookie consent preferences Name BizographicsOptOut Expiration 10 years Function Store privacy preferences Marketing Name lms_ads Expiration 30 days Function Store and track visits across websites Name _guid Expiration 90 days Function Store and track a visitor's identity Name li-oatml Expiration 1 month Function Provide ad delivery or retargeting Name li_sugr Expiration 90 days Function Store and track a visitor's identity Name UserMatchHistory Expiration 30 days Function Provide ad delivery or retargeting Statistics Name lms_analytics Expiration 30 days Function Store and track a visitor's identity Name AnalyticsSyncHistory Expiration 30 days Function Store and track visits across websites Preferences Name li_alerts Expiration 1 year Function Store if a message has been shown Name bcookie Expiration 1 year Function Store browser details Name lidc Expiration 1 day Function Provide load balancing functionality Name bscookie Expiration 1 year Function Store logged in users HubSpot Functional Consent to service hubspot Usage We use HubSpot for marketing automation (automated email marketing). Read more about HubSpot Sharing data For more information, please read the HubSpot Privacy Statement. Functional Name *_key Expiration 2 weeks Function Store logged in users Purpose pending investigation Name __hs_cookie_cat_pref Expiration Function Name messagesUtk Expiration Function Name __hssc Expiration Function Name __hstc Expiration Function Name __hsmem Expiration Function Name hs-messages-is-open Expiration Function Name hs_ab_test Expiration Function Name __hs_do_not_track Expiration Function Google Fonts Purpose pending investigation Consent to service google-fonts Usage We use Google Fonts for display of webfonts. Read more about Google Fonts Sharing data For more information, please read the Google Fonts Privacy Statement. Purpose pending investigation Name Google Fonts API Expiration Function Miscellaneous Purpose pending investigation Consent to service miscellaneous Usage Sharing data Sharing of data is pending investigation Purpose pending investigation Name NRBA_SESSION_ID Expiration Function Name icwp-wpsf-notbot Expiration Function Name shield-notbot-nonce Expiration Function Name breeze_folder_name Expiration Function Name leanbe.client Expiration Function Name __angelleye_paypal_sdk_storage__ Expiration Function Name extendify-global-state Expiration Function Name wf301_404_chart Expiration Function Name extendify-wanted-template Expiration Function Name ninjatable_tables_per_page Expiration Function Name nav* Expiration Function Name NRBA_SESSION Expiration Function Name __belter_experiment_* Expiration Function Name customer-effort-score-exit-page Expiration Function Name wf301_404_stats Expiration Function Name wf301_redirect_stats Expiration Function Name extendify-taxonomies Expiration Function Name e_kit-elements-defaults Expiration Function Name wf301_tabs Expiration Function Name WP_DATA_USER_5 Expiration Function Name wf301_redirect_chart Expiration Function Name gt-current-screen Expiration Function Name *ActiveTab Expiration Function Name __paypal_sdk_storage__ Expiration Function Name doxygen_width Expiration Function Name 62e5437476b962001357b06d Expiration Function Name wppmsta Expiration Function Name LEANBE_ACCEPT Expiration Function Name WP_DATA_USER_2008398 Expiration Function Name qm-container-height Expiration Function Name extendify-library-globals-sync Expiration Function Name deactivation-hash Expiration Function Name ios_specific_templates_id Expiration Function Name qm-container-width Expiration Function Name rank-math-option-search-index Expiration Function Name qm-admin-container-pinned Expiration Function Name wpEmojiSettingsSupports Expiration Function Name rank-math-option-titles-index Expiration Function Name rank-math-option-sitemap-index Expiration Function Name rank-math-option-general-index Expiration Function Name extendify-library-cache Expiration Function Name sbjs_migrations Expiration Function Name sbjs_current_add Expiration Function Name sbjs_first_add Expiration Function Name sbjs_current Expiration Function Name sbjs_first Expiration Function Name __ssid Expiration Function Name sbjs_udata Expiration Function Name sbjs_session Expiration Function Name doxygen_search_grp Expiration Function Name loglevel Expiration Function Name bis_data Expiration Function Name __cf_bm Expiration Function Name cf_clearance Expiration Function Name wp-autosave-1 Expiration Function Name qm-front-container-pinned Expiration Function Name calendly-store Expiration Function Name cmplz_consent_mode Expiration 365 days Function Name marketplace_redesign_2023_last_shown_date Expiration Function Name notif_2136245149 Expiration Function Name marketplace_redesign_2023_dismissals Expiration Function Name prefers-light-mode-in-dark-mode Expiration Function Name mirage_cache_manifest Expiration Function Name mirage_network_connection Expiration Function Name gtm4wp_orderid_tracked Expiration Function Name savefrom-helper-extension Expiration Function Name extendify-unsplash-images Expiration Function Name redux_current_tab Expiration Function Name redux_current_tab_get Expiration Function Name redux_current_tab_woocommerce_group_attributes_options Expiration Function Name notices_dismissed__traffic_page_highlights_module_settings Expiration Function Name notices_dismissed__traffic_page_settings Expiration Function Name jp-stats-last-tab Expiration Function Name maxmegamenu.themeeditor Expiration Function Name woocommerce_geo_hash Expiration Function Name adobeCleanFontAdded Expiration Function Name extendify-unsplash-images-d3b1abc4-22a2-4fbd-8d2f-bf1a32fce11a Expiration Function Name wc_remote_logging_last_error_sent_time Expiration Function Name i18nextLng Expiration Function Name WP_DATA_USER_2 Expiration Function Name storeApiCartData Expiration Function Name welaunch_current_tab Expiration Function Name welaunch_current_tab_get Expiration Function Name welaunch_current_tab_woocommerce_group_attributes_options Expiration Function Name _gcl_ls Expiration Function Name _gcl_au Expiration Function Name wcpdf_general_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_0 Expiration Function Name jetpack-ai-jwt Expiration Function Name wc_featuredBannerDismissed Expiration Function Name elementor_safe_mode_token Expiration Function Name wcpdf_documents_settings_accordion_state_0 Expiration Function Name wcpdf_documents_settings_accordion_state_3 Expiration Function Name wcpdf_documents_settings_accordion_state_2 Expiration Function Name wcpdf_documents_settings_accordion_state_1 Expiration Function Name wcpdf_general_settings_accordion_state_2 Expiration Function Name wc_iam_settings Expiration Function Name __paypal_global_5_0_502_storage__ Expiration Function Name __paypal_global_5_0_508_storage__ Expiration Function Name mp_150605b3b9f979922f2ac5a52e2dcfe9_mixpanel Expiration Function Name mp_gen_new_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name mp_tab_id_mixpanel_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wcpdf_documents_settings_accordion_state_advanced Expiration Function Name wcpdf_documents_settings_accordion_state_document_details Expiration Function Name wcpdf_general_settings_accordion_state_address_customization Expiration Function Name wcpdf_general_settings_accordion_state_advanced_formatting Expiration Function Name wcpdf_general_settings_accordion_state_static_files Expiration Function Name wcpdf_general_settings_accordion_state_multilingual Expiration Function Name wcpdf_debug_settings_accordion_state_display_interaction Expiration Function Name wcpdf_general_settings_accordion_state_shop_information Expiration Function Name wp-autosave-block-editor-post-21 Expiration Function Name wpdm_active_tab Expiration Function Name e_library Expiration Function Name 7fc4d26-evergreen_due_date Expiration Function Name 7fc4d26-evergreen_interval Expiration Function Name mc4wp_activity_period Expiration Function Name mc4wp_activity_view Expiration Function Name mc4wp_activity_list Expiration Function Name elementor_sidebar_menu_expanded_v2_elementor-templates Expiration Function Name __mp_opt_in_out_150605b3b9f979922f2ac5a52e2dcfe9 Expiration Function Name wp-postpass_2f7f8d091b989df948164cd3404309a6 Expiration Function 7. ConsentWhen you visit our website for the first time, we will show you a pop-up with an explanation about cookies. As soon as you click on "Save preferences", you consent to us using the categories of cookies and plug-ins you selected in the pop-up, as described in this Cookie Policy. You can disable the use of cookies via your browser, but please note that our website may no longer work properly.7.1 Manage your consent settingsYou have loaded the Cookie Policy without javascript support. On AMP, you can use the manage consent button on the bottom of the page.8. Enabling/disabling and deleting cookiesYou can use your internet browser to automatically or manually delete cookies. You can also specify that certain cookies may not be placed. Another option is to change the settings of your internet browser so that you receive a message each time a cookie is placed. For more information about these options, please refer to the instructions in the Help section of your browser.Please note that our website may not work properly if all cookies are disabled. If you do delete the cookies in your browser, they will be placed again after your consent when you visit our website again.9. Your rights with respect to personal dataYou have the following rights with respect to your personal data: You have the right to know why your personal data is needed, what will happen to it, and how long it will be retained for. Right of access: You have the right to access your personal data that is known to us. Right to rectification: you have the right to supplement, correct, have deleted or blocked your personal data whenever you wish. If you give us your consent to process your data, you have the right to revoke that consent and to have your personal data deleted. Right to transfer your data: you have the right to request all your personal data from the controller and transfer it in its entirety to another controller. Right to object: you may object to the processing of your data. We comply with this, unless there are justified grounds for processing. To exercise these rights, please contact us. Please refer to the contact details at the bottom of this Cookie Policy. If you have a complaint about how we handle your data, we would like to hear from you, but you also have the right to submit a complaint to the supervisory authority (the Data Protection Authority).10. Contact detailsFor questions and/or comments about our Cookie Policy and this statement, please contact us by using the following contact details:NetBurner Inc. 16855 W Bernardo Drive, Ste 260 San Diego, CA 92127 United States Website: https://www.netburner.com Email: sales@ex.comnetburner.com Phone number: (858) 558-0293This Cookie Policy was synchronized with cookiedatabase.org on April 22, 2026. ### Purchases [wpdmpp_purchases] ### Cart [wpdmpp_cart] ### Serial to Ethernet and NTP Device Quick Start Guide Introduction NetBurner's Serial to Ethernet devices are designed to connect a serial device to a network or over the Internet, and our NTP devices are designed to provide NTP time services to your network directly from a builtin GPS satellite receiver. Our devices support several operating modes, including serial over TCP and/or UDP. Configuring them is fairly straight forward, though it's important to get the settings correct.This guide will introduce you to some of the different ways in which our devices are set up, some of the tools that are used in conjunction with them, and a step by step guide to get started. We will also provide resources with more information on the specific settings associated with the builtin application shipped your device from the factory. Resources The following resources are useful in getting your device up and running, and will be referenced throughout the rest of this guide. User Manual Select your Serial to Ethernet or NTP device model number to download the User Manual and Datasheet: SB800EX SB700EX NANO54415 SB70 LC SBE70 LC CB34 EX SBL2e SBL2e CHIP SBL2e BOB SBL2e X SBL2e XA PK70 EX 232 PK70 EX 485 PK70 EX MMS PK70 EX NTP SB70 SB72 (EOL) SB72 EX (EOL) PK70 EX MMS User's ManualPK70 EX MMS DatasheetPK70 Quick Start GuidePK70 EX NTP User's ManualPK70 EX NTP DatasheetPK70 Quick Start GuideSecure Serial to Ethernet User ManualSB800EX DatasheetSB800 Quick Start GuideSecure Serial to Ethernet User ManualSB700EX DatasheetSB700 Quick Start GuideSecure Serial to Ethernet User ManualNANO54415 DatasheetNANO54415 Quick Start GuideSecure Serial to Ethernet User ManualSB70 LC DatasheetSB70 LC Quick Start GuideSecure Serial to Ethernet User ManualSBE70 LC DatasheetSBE70 LC Quick Start GuideSecure Serial to Ethernet User ManualCB34 EX DatasheetCB34EX Quick Start GuideDual Serial to Ethernet User ManualSBL2e DatasheetSBL2e Quick Start GuideDual Serial to Ethernet User ManualSBL2e CHIP DatasheetDual Serial to Ethernet User ManualSBL2e BOB DatasheetSBL2e X User's ManualSBL2e X DatasheetSBL2e X Quick Start GuideSBL2e XA User's ManualSBL2e XA DatasheetSBL2e XA Quick Start GuidePK70 EX 232 User's ManualPK70 EX 232 DatasheetPK70 Quick Start Guide PK70 EX 485 User's ManualPK70 EX 485 DatasheetPK70 Quick Start GuideSB70 Quick Start GuideSB70 DatasheetSB72 User's ManualSB72 DatasheetSB72 Quick Start GuideSB72 EX Quick Start GuideSB72 EX Datasheet Utilities MTTTY: Serial terminal that can be used to change the device setting serially, view connection information, or to view the serial data being received over the networkIPSetup: Used to discover the IP address of your device on the networkNetBurner Virtual COMM Port Driver: Used to create a virtual serial port through a Windows PC over a network connection Device Setup The following steps are taken during the initial device setup in order to connect your device the network or Internet: Connect one of the serial ports to your serial device Connect the NetBurner device to your network via the Ethernet jack Find the NetBurner device's IP address using IPSetup Configure the software settings of the NetBurner device using your computer's web browser by going to the URL http:// Software Configuration Before being able to use your NetBurner Serial to Ethernet device, you will need to configure the appropriate options for both the serial data settings as well as the network settings. NTP Devices NTP devices require no special configuration once they have the appropriate IP address and GPS reception, however their IP may be configured with DHCP or manually, their network name may be customized, a password should be set to prevent unauthorized access, and a status page can show GPS and time information. Serial Settings On Serial to Ethernet devices, each port on your NetBurner device will be able to support its own set of serial settings. These will include the operating mode (RS-232, RS-485, or RS-422 half-duplex or full-duplex), as well as the baud rate, data bits, stop bits, and parity. Network Settings Serial to Ethernet devices have several network settings that can be configured to allow it to operate in many different network configurations. It can send data using either the TCP or UDP protocol, and when using TCP, can act as the client or the server. TCP Connection, Server Mode In this configuration, the Serial to Ethernet device acts as a network device server, listening for incoming network connections. When an incoming network connection is established, all received network data is sent out the serial port, and all received serial data is sent out the network port. TCP Connection, Client Mode In this configuration, the Serial to Ethernet device acts as a network device client and initiates the connection to another network device, such as a network server. You can choose to have a permanent network connection that is established as soon as the device is powered on, or you can choose to only have a connection established when serial data is available to send to the network destination. Serial Tunneling Serial Tunneling uses two Serial to Ethernet devices to simulate a direct serial cable connection between two serial devices. The two Serial to Ethernet devices communicate over a network connection with one being configured as the Server and the other as a Client. Your serial devices are unaware that a network connection is involved and communicate just as they would with a direct serial data connection. Note that this mode does not support non-standard use of the hardware flow control signals, such as using them as general purpose input/output signals.For more information on how to set this up, please see our article, Demystifying Serial Tunneling. Virtual Comm Port Driver for Windows The NetBurner Virtual Comm Port Driver enables you to create virtual serial ports on your Windows PC. These virtual comm ports appear as serial ports to Windows applications, but are converted to network traffic by the driver. When you specify the IP address of your SB800EX as the network destination for the virtual comm port, all serial traffic will be sent to that address.For more information on how to set up a virtual comm port using our driver, please see our article, How to Create a Virtual Serial Port (COM Port). Getting Started To get started with your device, perform the following steps:Download the manual and datasheet for your device using the links above.Download IPSetup, the MTTTY serial terminal, and if required, the NetBurner Virtual Comm Port Driver.Connect the serial cables from your Serial to Ethernet device to your serial device.Connect a network cable from the Serial to Ethernet device to your network.Plug the power supply jack into the Serial to Ethernet device's power port.Run IPSetup to determine the IP address of the Serial to Ethernet device. If a DHCP server is present on your network, it will get an IP address automatically. Otherwise a static IP address must be configured using IPSetup. Please refer to the device's User Manual for more detailed information on IP address selection.Open a web browser and type the IP address of the Serial to Ethernet device in the URL address field.Select the network and serial configuration options required for your setup. Testing Your Device A good way to test and experiment with the various function of your Serial to Ethernet device is to run a Telnet session and the MTTTY serial terminal on a single PC. When you go through the steps listed previously and connect to the Serial to Ethernet device through a Telnet session, anything that is typed in the Telnet window should appear in the MTTTY window, and vice versa. Getting Help If you run into any issues using your Serial to Ethernet device, please don't hesitate to contact us as sales@netburner.com. ### Embedded IP Product Licensing Embedded PRODUCT LICENSING Cost-effective solution for custom designs HOW DOES IT WORK? Evaluate One of Our Powerful Development Kits Purchase one of our easy to use Embedded IoT Development Kits that include all the hardware, software, development tools and support needed to create your product design. Kits start at $99 with a 30-Day Money-Back Guarantee! Create your Hardware Design We provide a proven reference design to get you started quickly and you sign a no-cost license agreement and purchase 1 year of license support (additional years are optional). The license agreement stipulates that you will use a small boot chip in your design, purchased from NetBurner. Sell and Scale-Up with Our Single-Boot Embedded Chips Have Unlimited Access to our Intellectual Property (IP) when you continue to buy our ready-to-use, fully licensed, single-boot embedded chips to power your custom products and devices. A Simple Approach to Licensing for Highly Customized Designs At NetBurner, one way we accelerate innovation is through our low-cost, user-friendly, success-oriented, Intellectual Property (IP) licensing model. We understand that customers can be size, weight, or cost constrained and can't always use our standard off-the-shelf SOM PCBs. Our licenses easily enable the use of our fully-embedded chip-only products so you can optimize and get all the design freedom you need.For product teams that need a turn-key experience leave it up to our in-house embedded engineers to provide a design solution that meets your requirements. Read more about our Custom Embedded Design Services here.  A Low-Cost Integrated License Lets You Focus on Selling and Succeeding! ONLY $3675! CONTACT US Licensing fee includes 1 year of NetBurner's in-house engineering technical support. WHY WORK WITH OUR SINGE-BOOT CHIP LICENSE? Chips boot immediately in production, reducing production costsChips provide a recovery mechanism -  can recover from any type of software or configuration errorsCut the out packaging from our standard PCB platform while keeping our acclaimed fully embedded stack and RTOSEasily design whatever hardware and peripherals you want around our embedded system platformFit your exact requirements and nothing moreAccelerate product development and reduce costs and riskNo "Big Brother" license agreement, oversight, or auditsPartner with a trusted leader in embedded networking and IoT for over 20 years https://www.netburner.com/wp-content/uploads/2020/10/microchip_vid1.mp4 Our Line of Integrated License Embedded Single-Boot Chip Products: MOD54415: NXP Coldfire© System-on-ModuleMODM7AE70: ARM Cortex-M7 System-on-ModuleNANO54415: NXP Coldfire System-on-ModuleMore Chip-Only NetBurner Platforms to Come! NetBurner Gets You Working with the Technology You Trust A common use case for the NetBurner license agreement is when a team needs to heavily integrate our products and solutions into a highly-optimized embedded design. Many times this is a great long-term solution for product teams and helps them get off the ground, scaled-up, and through the development and product life-cycle more efficiently and with much lower risk. Our license agreement includes rights to the hardware design, TCP/IP Stack, Web Server, RTOS, Debug Monitor, IDE, and end user utilities such as AutoUpdate and IPSetup that allow you to update flash memory remotely and configure your network device through the network. You even get access to our schematic and layout design files to give you a super-charged head start and the confidence of using a proven design.With a NetBurner Multiple Product Site License You Have Rights To:Build your own hardware using NetBurner hardware, software, & toolsBuild unlimited productsNo recurring development seat costsIncludes source code, schematics, & layout design filesA convenient & reliable single vendor solutionComplete support from people who know your hardware & software Have questions about licensing? Let us know at sales@netburner.com, or submit your request with this form. ### MOD52XX to MODM7AE70 Pinout Comparison Introduction This document provides a hardware comparison for the purpose of converting a MOD52xx design to a MODM7AE70. Each sheet lists the MOD52xx function as described in the data sheet for that particular module, header pin number, and the MODM7AE70 function for the same header pin. It is important to note that the MOD52xx devices use a ColdFire processor, and the MODM7AE70 uses an ARM processor, so the naming conventions and descriptions may differ slightly even if the function is identical.Each MODM7AE70 signal pin can have up to 5 functions. For the purposes of this comparison, only the similar function of the ColdFire MOD52xx module is listed. However, the MODM7AE70 has significantly more functions per pin that may be of interest. Please refer to the MODM7AE70 datasheet or contact NetBurner sales if you do not see a function you are looking for. This is particularly important for timers. The MODM7AE70 has 10 timers, but the architecture is described differently than ColdFire.For more information specific to the MODM7AE70, please see the product page or datasheet. Upgrade Notes for ARM Signal Names Serial Ports​ The MODM7AE70 has a total of 7 serial peripherals2 USARTS5 UARTSThe two USART peripherals can be configured as UARTs or SPI. Since there are other dedicated SPI ports available and the most common usage for the USART will be a UART configuration, the data sheet refers to the serial peripherals as Serial Ports 0 – 6. Serial ports 0 and 1 are USARTs and serial ports 2 – 6 are UARTs. However, you can configure the USARTs in any mode you wish.Serial ports 0 and 1 (USARTs) are in MOD52xx pin locations for UART0 and UART1: USART0USART1RXP2.3P2.21TXP2.4P2.22 SPI SPI0: Pins are identical to MOD52xx signalsPinSignalDescriptionP2.25SPIO CLKClockP2.26SPIO/CS3Chip select 3P2.27SPIO MISOMaster input, slave outputP2.28SPIO MOSIMaster output, slave inputSPI0: Additional signalsPinSignalDescriptionP2.29SPIO/CS0Chip select 0P2.30SPIO/CS2Chip select 2P2.40SPIO/CS1Chip select 1P2.41SPIO/CS1Chip select 1QSPI: Quad SPI, configured as single bit mode SPIPinSignalDescriptionP2.43MOSIMaster output, slave inputP2.45QSCKSerial clockP2.47MISOMaster input, slave outputP2.49/CSChip selectUSART: USART peripheral configured for SPIThese two peripherals are normally configured as serial UARTs 0 and 1, serial port 0 is the default debug/console port. But you can also configure them for SPI operation.USART0 Configured as SPIPinSignalDescriptionP2.11SCKClockP2.3MISOMaster input, slave outputP2.4MOSIMaster output, slave inputP2.38/CSChip selectUSART1 Configured as SPIPinSignalDescriptionP2.31SCKClockP2.21MISOMaster input, slave outputP2.22MOSIMaster output, slave inputP2.32/CSChip select I2C To Be Written Pin Compatibility Tables Table Key All functions match, indicated with an At least one function matches Functions do not match. External bus signals. Contact NetBurner Support for compatibility review. View Pin Compatibility Between the MODM7AE70 and a MOD5234 MODM7AE70 and a MOD5270 MODM7AE70 and a MOD5272 MODM7AE70 and a MOD5282 MOD5234 J1 Header Header PinMOD5234 Signal NameMODM7AE70 CompatibilityNotes 1Ground 2Ground 3Vcc 3.3V 4R/W/WR0, /WE, GPIO 5/CS1, GPIO/CS2, GPIO 6/CS2, GPIO/CS0, GPIOAlso CAN1 TX 7/CS3, GPIO/CS3, GPIO 8/OE/RD, GPIO 9/BS2/WR1, /BS1 10/BS3/BA0 11/TIP 12D16D0 13/TA, GPIO/WAIT, GPIO 14D18D2 15D17D1 16D20D4 17D19D3 18D22D6 19D21D5 20D24D8 21D23D7 22D26D10 23D25D9 24D28D12 25D27D11 26D30D14 27D29D13 28Reset In 29D31D15 30Reset Out 31Clock Out 32A0A0 33A1A1 34A2A2 35A3A3 36A4A4 37A5A5 38A6A6 39A7A7 40A8A8 41A9A9 42A10A10 43A11A11 44A12A12 45A13A13 46A14A14 47A15A15 48Vcc 3.3V 49Ground 50Ground Edit Table MOD5234 J2 Header Header PinMOD5234 Signal NameMODM7AE70 CompatibilityNotes 1Ground 2Vcc 3.3V 3UART 0 RX, GPIO 4UART 0 TX, GPIO 5eTPU1, GPIOGPIONote: Timer and PWM functions may replace eTPU functions 6eTPU0, GPIOTimer8 Line B, CAN1 RX, GPIO 7eTPU3, GPIOGPIO 8eTPU2, GPIOProg Clock Out 1, GPIO 9eTPU5, GPIOPWM0 CH1, GPIO 10eTPU4, GPIOGPIO 11eTPU7, GPIOProg Clock Out 0, GPIO 12eTPU6, GPIOPWM1 CH0 H, GPIO 13eTPU9, GPIOPWM1 CH3, GPIO 14eTPU8, GPIOGND 15eTPU11, GPIOPWM0 CH0 L, Timer 11 In, GPIO 16eTPU10, GPIOTimer1 CLK, GPIO 17eTPU13, GPIOTimer2 Line A, GPIO 18eTPU12, GPIOTimer2 Line B, GPIO 19eTPU15, GPIOTimer0 Line B, GPIO 20eTPU14, GPIOTimer2 CLK, GPIO 21UART 1 RX, CAN0 RX, GPIO 22UART 1 TX, CAN0 TX, GPIO 23UART1 /RTS, UART2 /RTS, GPIO 24UART1 /CTS, UART2 /CTS, GPIO 25SPI Clock, I2C SCL, GPIO 26eTPU CLK, GPIOSPI /CS3, GPIONo UART2 /RTS 27SPI MISO, I2C SDA, GPIOSPI MISO, GPIONo I2C SDA 28SPI MOSI, GPIO 29UART0 /CTS, GPIO 30SPI /CS0, GPIO 31T0IN, GPIOGPIO 32UeTPU0 disable, GPIOSerial1 /RTS, GPIONo UART2 /RTS 33T2OUT, DACK2, GPIOSerial1 /CTS, GPIONo UART2 /CTS 34T1OUT, DACK1, GPIOSerial2 RX, GPIONo Timer 35LeTPU0 disable, GPIOSerial 2 TX, GPIONo Timer 36T0OUT, DACK0, GPIOGPIONo Timer 37T1IN, /DREQ1, T1OUT, GPIOGPIONo Timer 38UART0 /RTS, GPIO 39I2C SDA, CAN0 RX, GPIO 40SPI /CS1, GPIO 41UART2 RX, GPIOSerial4 RX, GPIO 42I2C SCL, CAN0 TX, GPIO 43/IRQ1, GPIOInput pin can be used as an IRQ 44UART2 TX, GPIOSerial4 TX, GPIO 45/IRQ 3, GPIOInput pin can be used as an IRQ 46Ground 47/IRQ5, GPIOInput pin can be used as an IRQ 48/IRQ7, GPIOInput pin can be used as an IRQ 49Ground 50Vcc 3.3V Edit Table MOD5270 J1 Header Header PinMOD5234 Signal NameMODM7AE70 CompatibilityNotes 1Ground 2Ground 3Vcc 3.3V 4R/W/WR0, /WE, GPIO 5/CS1, GPIO/CS2, GPIO 6/CS2, GPIO/CS0, GPIO 7/CS3, GPIO/CS3, GPIO 8/OE/RD, GPIO 9/BS2/WR1, /BS1 10/BS3/BA0 11/TIP 12D16D0 13/TA, GPIO/WAIT, GPIO 14D18D2 15D17D1 16D20D4 17D19D3 18D22D6 19D21D5 20D24D8 21D23D7 22D26D10 23D25D9 24D28D12 25D27D11 26D30D14 27D29D13 28Reset In 29D31D15 30Reset Out 31Clock Out 32A0A0 33A1A1 34A2A2 35A3A3 36A4A4 37A5A5 38A6A6 39A7A7 40A8A8 41A9A9 42A10A10 43A11A11 44A12A12 45A13A13 46A14A14 47A15A15 48Vcc 3.3V 49Ground 50Ground Edit Table MOD5270 Header Header PinMOD5270 Signal NameMODM7AE70 CompatibilityNotes 1Ground 2Vcc 3.3V 3UART 0 RX, GPIO 4UART 0 TX, GPIO 5n/c 6GPIO 7GPIO 8GPIO 9GPIO 10GPIO 11GPIO 12GPIO 13GPIO 14Ground 15GPIO 16GPIO 17GPIO 18GPIO 19GPIO 20GPIO 21UART 1 RX, GPIO 22UART 1 TX, GPIO 23GPIO 24GPIO 25SPI Clock, I2C SCL, GPIO 26SPI /CS3, UART2 /RTS, T3OUT, GPIOSPI /CS3, GPIONo UART2 /RTS 27SPI MISO, I2C SDA, GPIOSPI MISO, GPIONo I2C SDA 28SPI MOSI, GPIO 29UART0 /CTS, GPIO 30SPI /CS0, GPIO 31T1IN, GPIOGPIO 32UART1 /RTS, UART2 /RTS, GPIOSerial1 /RTS, GPIONo UART2 /RTS 33UART1 /CTS, UART2 /CTS, GPIOSerial1 /CTS, GPIONo UART2 /CTS 34T1OUT, GPIOSerial2 RX, GPIONo Timer 35T2IN, GPIOSerial 2 TX, GPIONo Timer 36T2OUT, GPIOGPIONo Timer 37T1IN, GPIOGPIONo Timer 38UART0 /RTS, GPIO 39I2C SDA, GPIO 40SPI /CS1, GPIO 41UART2 RX, GPIOSerial4 RX, GPIO 42I2C SCL, GPIO 43/IRQ1, GPIOInput pin can be used as an IRQ 44UART2 TX, GPIOSerial4 TX, GPIO 45/IRQ 3, GPIOInput pin can be used as an IRQ 46Ground 47/IRQ5, GPIOInput pin can be used as an IRQ 48/IRQ7, GPIOInput pin can be used as an IRQ 49Ground 50Vcc 3.3VVcc 3.3V Edit Table MOD5272 J1 Header Header PinMOD5272 Signal NameMODM7AE70 CompatibilityNotes 1Ground 2Ground 3Vcc 3.3V 4R/W/WR0, /WE, GPIO 5/CS1/CS2 6/CS2/CS0 7/CS3/CS3 8/OE/RD, GPIO 9/BS2/WR1, /BS1 10/BS3/BA0 11/TIP 12D16D0 13/TA/WAIT 14D18D2 15D17D1 16D20D4 17D19D3 18D22D6 19D21D5 20D24D8 21D23D7 22D26D10 23D25D9 24D28D12 25D27D11 26D30D14 27D29D13 28Reset In 29D31D15 30Reset Out 31Clock Out 32A0A0 33A1A1 34A2A2 35A3A3 36A4A4 37A5A5 38A6A6 39A7A7 40A8A8 41A9A9 42A10A10 43A11A11 44A12A12 45A13A13 46A14A14 47A15A15 48Vcc 3.3V 49Ground 50Ground Edit Table MOD5272 J2 Header Header PinMOD5272 Signal NameMODM7AE70 CompatibilityNotes 1Ground 2Vcc 3.3V 3UART 0 RX 4UART 0 TX 5Vcc ADC 6GPIO 7GPIO 8GPIO 9GPIO 10GPIO 11GPIO 12GPIO 13GPIO 14Ground 15GPIO 16GPIO 17GPIO 18GPIO 19GPIO 20GPIO 21UART 1 RX, GPIO 22UART 1 TX, GPIO 23GPIO 24GPIO 25SPI Clock, GPIO 26SPI /CS3 27SPI MISO, GPIO 28SPI MOSI, GPIO 29UART0 /CTS, GPIO 30SPI /CS0, GPIO 31T1IN, GPIOGPIO 32PWM0 33GPIO 34PWM1, Timer1 OutSerial2 RX, GPIO 35SPI /CS2, UART1 /CTSSerial 2 TX, GPIO 36T2OUT, GPIOGPIO 37PWM2, Timer1 InPWM0 CH0, GPIO 38UART0 /RTS, GPIO 39GPIO 40SPI /CS1, GPIO 41Not used 42GPIO 43/IRQ1Input pin can be used as an IRQ 44Not used 45/IRQ 3Input pin can be used as an IRQ 46Ground 47/IRQ5, UART1 /RTS /IRQ, GPIOInput pin can be used as an IRQ 48/IRQ6, GPIOInput pin can be used as an IRQ 49Ground 50Vcc 3.3V Edit Table MOD5282 J1 Header Header PinMOD5282 Signal NameMODM7AE70 CompatibilityNotes 1Ground 2Ground 3Vcc 3.3V 4R/W/WR0, /WE, GPIO 5/CS1, GPIO/CS2, GPIO 6/CS2, GPIO/CS0, GPIOAlso CAN1 TX 7/CS3, GPIO/CS3, GPIO 8/OE/RD, GPIO 9/BS2/WR1, /BS1 10/BS3/BA0 11/TIP 12D16D0 13/TA, GPIO/WAIT, GPIO 14D18D2 15D17D1 16D20D4 17D19D3 18D22D6 19D21D5 20D24D8 21D23D7 22D26D10 23D25D9 24D28D12 25D27D11 26D30D14 27D29D13 28Reset In 29D31D15 30Reset Out 31Clock Out 32A0A0 33A1A1 34A2A2 35A3A3 36A4A4 37A5A5 38A6A6 39A7A7 40A8A8 41A9A9 42A10A10 43A11A11 44A12A12 45A13A13 46A14A14 47A15A15 48Vcc 3.3V 49Ground 50Ground Edit Table MOD5282 J2 Header Header PinMOD5272 Signal NameMODM7AE70 CompatibilityNotes 1Ground 2Vcc 3.3V 3UART 0 RX, GPIOAlso AFE0 ADC10 4UART 0 RX, GPIOAlso AFE1 ADC0 5ADVCCVREFPMaximum input 3.3V 6ADC_IN3, GPIOAFE1 ADC3, CAN1 RX, GPIOMaximum input 3.3V 7ADC_IN1, GPIOAFE0 ADC0, GPIOMaximum input 3.3V 8ADC_IN2, GPIOAFE0 ADC6, GPIOMaximum input 3.3V 9ADC_IN56, GPIOGPIOMaximum input 3.3V 10ADC_IN0, GPIOGPIOMaximum input 3.3V 11ADC_IN53, GPIOGPIOMaximum input 3.3V 12ADC_IN52, GPIOGPIOMaximum input 3.3V 13ADC_IN55, GPIOGPIOMaximum input 3.3V 14Ground 15GPTA3, GPIOTimer 11 In, GPIO 16GPTB3, GPIOTimer 1 CLK, GPIO 17GPIOTimer 2 Line A, GPIO 18GPIOTimer 2 Line B, GPIO 19GPIOTimer 0 Line B, GPIO 20GPIOTimer 2 CLK, GPIO 21UART 1 RX, GPIOAlso AFE0 ADC1 22UART 1 TX, GPIO 23GPTA0, GPIOCAN1 RX, GPIO 24GPTB0, GPIOProg CLK 2, GPIO 25SPI Clock, GPIO 26SPI /CS3 27SPI MISO, GPIO 28SPI MOSI, GPIO 29UART0 /CTS, UART1 /CTS, T2IN, GPIOSerail0 /CTS, CAN0 TX, GPIOAlso AFE0 ADC5 30SPI /CS0, GPIOAlso CAN1 TX 31UART0 /CTS, UART1 /CTS, T0IN, GPIOGPIO 32UART0 /RTS, UART1 /RTS, T3OUT, GPIOSerial1 /RTS, GPIO 33UART0 /CTS, UART1 /CTS, T20UT, GPIOSerial1 /CTS, GPIO 34UART0 /RTS, UART1 /RTS, T10UT, GPIOSerial2 RX, GPIO 35SPI /CS2, GPIOSerial 2 TX, GPIO 36UART0 /CTS, UART1 /CTS, T0OUT, GPIOGPIO 37UART0 /RTS, UART1 /RTS, T1IN, GPIOGPIO 38UART0 /RTS, UART1 /RTS, T3IN, GPIOSerial0 /RTS, CAN0 RX, GPIOAlso AFE0 ADC2 39I2C SDA, UART2 RX, GPIOI2C SDA, GPIO 40SPI /CS1, GPIO 41CAN RX, UART2 RX, GPIOSerial4 RX, SPI /CS1, GPIO 42I2C SCL, UART2 TX, GPIOI2C SCL, GPIO 43/IRQ1, GPIOInput pin can be used as an IRQ 44CAN TX, UART2 TX, GPIOSerial4 TX, GPIO 45/IRQ 3, GPIOInput pin can be used as an IRQ 46Ground 47/IRQ5, GPIOInput pin can be used as an IRQ 48/IRQ7, GPIOInput pin can be used as an IRQ 49Ground 50Vcc 3.3V Edit Table ### SSL/TLS SSH Embedded IoT Security Suite Don't Get Burned! Enable Robust Embedded IoT Security Capabilities in Minutes! Security is Our Standard. IoT data privacy and security is no laughing matter. Data breaches can be devastating and it's often inadequate encryption technology and configuration that's to blame.The NetBurner SSH, SSL/TLS Embedded IoT Security Suite™ is shipped standard with all of our current generation of devices. You can rest assured that NetBurner has your back as you design and deploy secure, scalable embedded networks. Our easy-to-use tools and amazing technical support team make implementation simple.Our powerful yet small-footprint security solution enables robust embedded data encryption protecting IoT from unauthorized device monitoring, control, re-configuration, eavesdropping or manipulation. Defend IoT from... Eavesdropping / Interception / Hijacking Protect from Man-in-the-Middle Attacks, IoT Communication Protocol Hijacking, and Network Reconnaissance. Nefarious Activity / Abuse Denial of Service, Malware, Manipulation of Hardware & Software or Information, Targeted and Brute Force Attacks Built-in Embedded IoT Security You Can Trust Top-Tier SSL/TLS Libraries NetBurner's Embedded IoT Security Suite™ uses the wolfSSL SSL/TLS libraries for its size, speed and robust capabilities. Full-featured and trusted embedded security. Key Points TLS Version v1.3Secure Webpages with HTTPSSecure File Transfer with FTPSSecure WebsocketsSecure Data Communications with SSL/TLS as a Server or ClientSecure Shell (SSH) CapabilitySmall Footprint for Lightweight Embedded PerformanceWorld-Class Technical Support with NetBurner's US-Based In-House Team Features Support for ECC & RSA Certificates with SSL/TLSSupport for Onboard, Auto-Generated, Self-Signed SSL/TLS CertificatesSSL/TLS Session ResumptionSSL/TLS Peer VerificationSSL/TLS Client CertificatesSSL/TLS Key Sizes from 1024 to 4096 BitsSSH Key Sizes from 512 to 4096 BitsCustomize to Suit Any Application with Low-Cost Development KitsUses the Latest SSL/TLS Ciphers Example Code Our Embedded IoT Security Suite™ comes with example code to get you up and running fast:Two Serial Port Server with User Authentication, Certificate & Key AccessSeveral SSL/TLS examples show how to run your device run as a server, client, HTTPS web server, FTPS server, store keys and certs on an external SD card, send/receive mail securely, & more.PEM Encoded Certificates & Public- Private Key Pairs (OpenSSH style) SSL/TLS Implementation Overview NetBurner Embedded IoT Network Secured with SSL/TLSNetBurner Serial to Ethernet Converter with SSL/TLS encryption over internet Why NetBurner's Embedded IoT Security Suite™?​ NetBurner SSL/TLS SSL/TLS libraries written for performance & ease of useIncludes the latest ciphers for v1.3Supports Datagram Transport Layer Security (DTLS)SSL/TLS integrated with our TCP/IP stack and web server for secure web pages with HTTPS in just a few function calls32-bit NetBurner processor platforms can easily handle the demands of connecting and transmitting data using SSL/TLS, unlike 8-bit or 16-bit microcontrollers NetBurner SSH (Secure Shell) SSH enables secure data exchange between embedded network devices on a network or the Internet Replace TELNET and other insecure remote shells with a secure alternative Server authentication (username and password) is required for security but the administrator can allow anonymous operation Embedded IoT Security FAQ blank What are the fundamental protocols for embedded IoT security? NetBurner provides SSL/TLS libraries which are the foundation upon which most commercial and industrial security protocols and architectures are built. What is SSL/TLS? SSL/TLS is a cryptographic protocol that provides security and ensures data integrity for transmissions made over a TCP/IP network. How does SSL/TLS secure embedded IoT from attacks? SSL/TLS is primarily used to enable devices to serve secure web pages (HTTPS) over a local network or the Internet. IoT edge node data, control commands, configurations and other data payloads can be reliably encrypted thus preventing eavesdropping, hijacking and abuse. What is SSH? SSH is a crytpographic protocol that allows for secure data exchange even over an insecure network. SSH enables data to be exchanged between two network devices over a secure channel— it’s a secure replacement for TELNET and other insecure remote shells. SSH supports remote command-line interface, logins, and command execution, and other network services. Can SSL/TLS be used for UDP? Yes, NetBurner fully supports Datagram Transport Layer Security (DTLS). Have questions or don't see what you're looking for? Let us know at sales@netburner.com, or submit your request with this form. NetBurner Embedded IoT Security Articles ### OEM Embedded Design Services and IoT Solutions CUSTOM EMBEDDED DESIGNAND OEM SOLUTIONS NetBurner OEM Products and Solutions Are: IPC Class 3 IPC Class 3 design and qualification are available for high reliability or harsh operating environment electronic products where equipment downtime cannot be tolerated. Read more on IPC standards. Robust & Reliable Designed and tested for a -40°C to +85°C  industrial operating temperature range. You can trust our rugged products reliability, longevity, and life cycle support. RoHS Compliant Compliant lead-free hardware. Rest assured that your products will be safer and internationally marketable. Read our RoHS documentation. Fully Supported NetBurner bolsters your design and product life cycle management with in-house technical support, firmware updates, comprehensive tools and libraries. Designed in the USA NetBurner sales, support and services are based out of San Diego, CA with our highly experienced and qualified team. We proudly design our products in the USA and manufacture them to our exacting standards. A Complete Embedded Solution Developing embedded hardware and the applications that run on them from the ground up is no small feat. Let NetBurner's experienced embedded engineers work with your team to provide a complete solution or product design based on your requirements.  Accelerate Success and Reduce Risk Why not concentrate on developing and delivering reliable applications and products instead of reinventing network protocols, drivers, and designing hardware? Work with NetBurner's OEM design services and move faster.In parallel to NetBurner designing your custom specified hardware you can go full-speed ahead developing deployable application software using our acclaimed development kits. Our embedded development kits are prized for their scalability, power, and ease of use. NetBurner solutions are trusted to reduce risk and improve functionality with complete and proven designs that include hardware, a TCP/IP Stack, SSL/TLS, drivers, a highly optimized RTOS, and all the necessary tools. REQUEST A FREE CONSULTATION Or Call 1-858-558-0293 How Will You Network Enable Your Device? You Could Design It All Yourself... ... and hope all of the time and effort pays off. Research RTOSResearch CompilerResearch TCP/IP StackResearch Web ServerResearch SSL/TLSDesign HardwareConfigure CompilerPort RTOSPort TCP/IPPort Web ServerPort SSL/TLSIntegrate ComponentsTest and Update Components and HardwareWrite Application Code...And may good fortune find you! The NetBurner Way ... breathe easier with a scalable platform. Run Our Proven Operating System Use Our Rock-Solid Networking Stack Use Our Comprehensive Libraries and Tools Power for Your Products NetBurner offers both ARM Cortex and NXP Coldfire System on Modules. If you are new to NetBurner you can try out our latest Embedded ARM IoT Development Kit! All of our SOM Development Kits use our SOM platform cores which enables rapid transition from prototyping to production. Learn More TutorialsOur Learn Blog has numerous tutorials that demonstrate how simple it is to develop applications with NetBurner platforms.Click HereFeatured Dev KitOur ARM Cortex M7 Development Kit for embedded IoT, edge computing, automation and control applications and products.Shop ARM Dev KitExample ApplicationsThe NetBurner example applications are provided with all of our NetBurner Network Development Kits. Example applications give you a solid foundation for some common application interfaces and features that you can build on.View Example AppsEmbedded Design KitsOur range of Embedded IoT Development Kits include software, hardware, tools and support to accelerate your development and deployment. NetBurner Dev Kits enable robust, scalable products and solutions.Shop Dev Kits Previous slide Next slide ### Feature Request Submission Thank you for your feature request! We appreciate the interest in improving our company and products. We will get back to you as soon as possible. If you're interested in one of our services or products, or just more about our company in general, you can follow the links below to find the perfect solution to your challenge.

Get involved with the NetBurner Community​

Our community is made up of industry professionals and makers who are passionate about what they are creating. We have extensive resources available to help you solve even the hardest of challenges. NetBurner Forum

Read the NetBurner Documentation​

Explore documentation on all of our products and download deployment tools designed to make your development process easier and more efficient. NetBurner Documentation

Get Started Now!

Our development kits are ready out of the box. Order, receive, and create! Browse Our Kits

Explore our Products and Solutions

ARM® Embedded SOMs for IoT

Massively accelerate IoT product development, reduce project risk, scale-up and sell faster with our embedded system on modules! Explore

Development Kits
NetBurner SDK

Everything needed for the Maker or Pro to get started with our easy to use and flexible DIY development suite. Create and Customize! Explore

Serial to Ethernet
Web Servers

Reliable networking products that are ready to go out of the box! Use for Industrial Automation and equipment upgrades with your legacy serial assets. Explore

Explore the Learn Blog

### Contact Submission Thank you for contacting us! We appreciate the interest in our company and products. We will get back to you as soon as possible.

Explore our Products and Solutions

ARM® Embedded SOMs for IoT

Massively accelerate IoT product development, reduce project risk, scale-up and sell faster with our embedded system on modules! Explore

Development Kits
NetBurner SDK

Everything needed for the Maker or Pro to get started with our easy to use and flexible DIY development suite. Create and Customize! Explore

Serial to Ethernet
Web Servers

Reliable networking products that are ready to go out of the box! Use for Industrial Automation and equipment upgrades with your legacy serial assets. Explore

Get Started Now!

Our development kits are ready out of the box. Order, receive, and create! Browse Our Kits

Explore the Learn Blog

### Thank you for Subscribing! Thanks for subscribing! You're almost finished...We still need you to confirm your email address to complete the subscription process. Please click the link found in the email we just sent you.

Passion for embedded IoT - photo Ian Schneider

Go back to newsletter sign up page. ### Confirmation NetBurner Newsletter Subscription Confirmation Your subscription to our list has been confirmed. Thanks again for subscribing! We won't let you down. ### Support All NetBurner Development Kit's include a support package that can be renewed annually. You can view those renewal options on our site. Our Support Portal is a great way to place support requests and to gain access to the latest software. Our User Forum is fantastic to engage with our community and get a wider array of people responding to your issues and questions. Search the forum for threads that interest you. ### Feature Requests Fill in our feature request form and tell us what enhancement in our software, firmware, hardware, support, forums, websites that you need. We'll be back in touch. Our form will provide an email receipt for your records. Thanks! Notice: JavaScript is required for this content. ### Manage Serial Key Usage ### NetBurner Software Software, Protocols, & Tool Suite The NetBurner solution provides all the hardware, software, and tools needed for your product to take advantage of network communications. All components are integrated and fully functional, so you can begin working on your application immediately. Development Environment You can use the NBEclipse Integrated Development Environment (IDE) or command line tools. The GNU GCC C/C++ compiler and linker is included with the development kit and fully integrated into NBEclipse. Read More Software Libraries Libraries include a Real-Time Operating System (RTOS) based on uC/OS, TCP/IP Stack, Web Server, Board Support Package, and processor peripheral drivers. Read More Deployment Tools When you product is ready to be shipped to your customers you can use our deployment tools such as IPSetup to configure network settings or Autoupdate to update your applications in the field through a network connection. Read More ### Deployment Tools Deployment Tools Specialized tools to help you deploy IoT better Virtual COM Port Driver This Windows utility enables you to easily share serial port devices over the network (Internet or LAN) with NetBurner devices. When the attached serial port device sends communication data, it is actually transmitted over TCP/IP network and back from the network to your serial device. Download Virtual COM Port Driver IPSetup IPSetup is a Windows program used to configure NetBurner hardware through a network connection. Running IPSetup will automatically identify your NetBurner device (even if its IP address is 0.0.0.0). Download IPSetup MTTTY Serial Terminal MTTTY (Multi-Threaded TTY) is an easy to use Windows serial communications program. Download MTTTY Serial Terminal AutoUpdate AutoUpdate will download a new code image to your NetBurner device. This update can be done from any point that has network access. AutoUpdate can be run as a Java GUI application. Download AutoUpdate (Windows) Download AutoUpdate (OS X) ### About Us About Us Established in 1998San Diego, CA “Between rockets, robotic cars, flying drones, and bitcoin receipt printers…I’m endlessly amazed by the innovative projects our team members are able to create with our products. It’s never a dull day at NetBurner!” B. Dunnigan Netburner HQ, San Diego, CA Origins of NetBurner In 1998 the NetBurner name originated with the development of network device programmers, in which embedded programs are "burned" into integrated chips. It became apparent that to network-enable any embedded device required expensive tools and software licenses, as well as a significant amount of development time to produce a product. Our goal then became to provide high quality affordable network enabling technologies. Bitcoin PrinterRead ArticleRobotsRead ArticleAutonomous VehiclesRead Article Previous slide Next slide Product Development at Heart Whether you want to design your own hardware or need an off the shelf solution, NetBurner development kits and products provide a single source for the software, hardware, tools, and support to develop a finished product. Kits includes source for our real-time operating system (RTOS), TCP/IP stack, C/C++ compiler and debugger, Eclipse IDE, over 100 example applications, and an embedded hardware module.It doesn't matter if this is your first network application, you can be Networking in One Day! NetBurner standard products are complete network solutions that can be designed into your product. We also provide custom OEM design and manufacturing services to suit any application. Our Dream The NetBurner team is super proud of the quality, ease of use, flexibility, durability, and support that is associated with our family of products. NetBurner is where it is today thanks to all of the amazing people, applications, and companies that we’ve served. In a time of massive growth in connected embedded devices, cloud computing, AI, sensor fusion, and the Internet of Things, we find it thrilling to be one of the enabling technologies that helps you realize your goals and dreams. ### Virtual COM Port NetBurner Virtual COM Port / Virtual Serial Port Easily Add Virtual Serial Ports to Your Computer!​ Enable serial-based applications to communicate over a network connection through a virtual serial port on your PC, eliminating the need for a DB9 interface. Virtual COM Port software is available free of charge to owners of genuine NetBurner devices. Virtual COM Port Software DownloadIf you purchased a NetBurner device through our website, you may login and download the Virtual COM Port software driver directly with your NetBurner.com store account. If you own a NetBurner device but don't have purchase information, feel free to contact Sales (sales@netburner.com).NetBurner VCOM capabilities allow you to:Connect serial devices to computers without a physical COM portContinue to use legacy serial hardware or software on new computersConnect using Ethernet cable or Wi-Fi through internet or LANEasily set up and use a virtual COM port Recommended Virtual COM Port Devices Buy Now! Buy Now! Buy Now! Buy Now! Buy Now! Buy Now! Buy Now! Part Number SB800EX-JDDW-IRSB800EX-JDD-IRSBL2EX-100IRSBL2EXA-100IRNANO54415-200IRSB70LC-100IRSBL2E-100IR Price (Qty 1)$249.00$189.00$99.00$99.00$79.00$59.00$31.50 RS-232 RS-422/485 Metal Enclosure Wi-Fi b/g/nOptionalOptionalOptional SSL/SSH DB9 Ports2211 (DB15)000 UARTs2212822 Max Baud Rate921,600921,600115,200115,200115,200230,000115,200 Custom Baud Rates SPI I2C Digital I/O Real-Time Clock Support Industrial Temp ImageNamePriceRS-232RS-422/485Metal EnclosureWiFiSSL/SSHDB9 PortsUARTsMax Baud RateCustom Baud RatesSPII2CGPIOReal-Time ClockTemperature SBL2e$38.50 – $2,160.00Price range: $38.50 through $2,160.00Requires external level shifterRequires external level shifter2115,200110Industrial (-40°C to 85°C) SBE70 LC$75.00Requires external level shifterRequires external level shifterOptionalYes2230,000Yes1115Industrial (-40°C to 85°C) NANO54415 Ethernet System-on-Module and Serial to Ethernet Device$79.00Requires external level shifterRequires external level shifterOptionalYes8115,200Yes34301Industrial (-40°C to 85°C) SBL2e X / XA - Serial to Ethernet Server$129.00YesYes1 (DB15)2 (SBL2EXA), 3 (SBL2EX)115,2001 (SBL2EXA)9 (SBL2EXA)Industrial (-40°C to 85°C) SB800 EX 2 Port Serial to Ethernet Server - SSL/TLS$199.00 – $265.00Price range: $199.00 through $265.00YesYesYesOptionalYes22921,600Yes1Industrial (-40°C to 85°C) PK70 EX 4-Port Serial to Ethernet Servers$349.00 – $626.00Price range: $349.00 through $626.00YesYes (PK70EX-485CR, PK70EX-MMSCR)YesYes4 (plus console)5115,200YesCommercial (0°C to 70°C) More about our Virtual COM Products The NetBurner Virtual COM Port is most commonly used with our Serial-to-Ethernet Devices, but will work with nearly any NetBurner product, except the MOD5213.For a full list of Serial to Ethernet (S2E) hardware please check out our Serial to Ethernet product comparison table. Device configuration options for a specific module can be found on each particular device's product page. Our amazingly versatile Ethernet System-on-Modules also support VCOM but with just a touch more setup than the S2E products. Check out our Ethernet System-on-Modules comparison table for more information. Our NANO54415 is both an S2E and Core Module and is also recommended, above, for VCOM applications.Our VCOM software includes the Virtual COM driver software and the MTTTY serial terminal application which helps test and debug your virtual serial configurations from your PC. Serial-to-Ethernet devices are pre-programmed with the NetBurner Serial-to-Ethernet Application. For more information on the application click here. Please see the License Terms below for the allowable use of this software.Our "How to create a virtual COM port" article provides more details on the virtual COM port driver and utilities. It includes a tutorial on set up, a link to the driver, and an example tutorial on how to run legacy COM port-dependent software applications with only a USB port and Ethernet port at your disposal. Read our article about it by clicking below. Virtual COM Driver License Terms Permission is hereby granted to purchasers of NetBurner System-on-Modules and serial-to-Ethernet modules (NetBurner Devices) to use this program to create a virtual serial communications port on a Windows computer so long as the sole purpose is to connect to the NetBurner Device. No other rights to use this program or its derivatives in part or in whole are granted. Articles ### Policies ### Serial Enabled Web Server PINK SERIAL-ENABLED WEB SERVER

Send SSL secure email, generate custom web pages, send and receive network data.

PINK serial enabled web server The goal: Enable a microcontroller to communicate over a network or the Internet The method: Connect a serial port to a Serial-Enabled Web Server module. The result: Send email, send or receive UDP data, or create a web page that is dynamically updated by on-board variable data.

The NetBurner PINK Serial-Enabled SSL Web Server adds secure web server capability to your micro-controller enabling it to communicate over a network or even the Internet. It supports over 100 web-accessible variables, allowing for dynamic web pages. Features include a ftp web server for web pages and files, sending e-mail, UDP messages to alert you to events or provide status messages, and much more. Communication with the host controller is done using a simple TTL serial interface.

Device Connectivity

10/100Mbps Ethernet RS-232 and RS-422/485 ready (require external level shifter) PINK70LC-100IR-1

Choose your Serial-Enabled Web Server

Part NumberVersionVCC PINK70 1005V NNDK-PINK-KIT1005V PINK70 LC1003.3V NNDK-PINKLC-KIT1003.3V Articles ### Development Kit DEVELOPMENT KITS Accelerate your embedded prototyping capabilities Everything you need to quickly and easily create custom applications from your Mac or Windows PCNetBurner Standard Development Kits (SDKs) are popular for rapidly learning, developing, testing and customizing almost any aspect of our standard NetBurner product capabilities. Quickly create or modify web pages, data filtering, or network applications. The kits include all the hardware and software you need to build your embedded application. Better yet, the first year of Software & Tools Updates and first six months of Technical Support are included! Why do developers love working with NetBurner development kits? Software blank Example Source Code Get hands-on familiarity with the NetBurner platform by studying, building, and modifying the included source code examples. Each example consists of buildable and executable source code that illustrates how to accomplish one or more tasks. Power and Design Freedom Code in C/C++ for a high speed, true object oriented application. Design UI’s in HTML, JavaScript, CSS. Customize or override factory defaults. Eclipse-Based IDE NBEclipse can run standalone or as a plug-in to an existing Eclipse IDE install. It provides a great environment to manage projects, edit code, debug, and download your application to NetBurner devices. Software Libraries ANSI C/C++ compiler and linker (GNU Based), TCP/IP stack, Web server, E-mail protocols, RTOS, Flash file system, and more. Optional Software Modules Embedded SSL & SSH Security Suite (Module License Version), SNMP V1 (Module License Version) Hardware blank Development Boards that Scale Our development boards expose system peripherals and make it easy to design and test with a given module. We provide even schematics for development boards so that you can use them in your own designs. Epic RTOS Stop running those stock engines for your IoT and edge computing projects. Get highly optimized real-time multitasking and task management and kill the bloat. Simple Firmware Updates Update your module’s application over a web page, 10/100 Ethernet or device serial port. USB Power and Data Now you can communicate with processor UARTs from your Mac or Windows PC. The on-board USB port also enables you to power the development board. Flash Card Storage The FAT12/16/32 flash file system gives developers the flexibility to store and exchange data through flash cards. NetBurner provides a standard API, complete C++ based source code, drivers, and ample examples to get started. Support blank Rapid Email Support Our prompt email support provides excellent results.  Your request is received by our in-house support team, and the individual best suited to answer the question will assume responsibility for your inquiry. This method avoids a tiered approach of forcing you to go through many transfers to finding the right help. Documentation Robust and generous docs for novice through expert developers and makers. Getting started guides, manuals, and application notes can help you load your first application code image in minutes. Community Forum The NetBurner message boards have been used to discuss any hardware or software issues with NetBurner developers like you. It has been a great place for developers in the NetBurner community to share new ideas and to communicate unique implementations of their product. Social Media and Blog Our Learn blog and social media channels are a great way to learn more about IoT and embedded networking. We accept and respond to comments, questions and communications through all of these channels. Join us on Facebook, YouTube, LinkedIn or Twitter. Even subscribe to our newsletter to be notified of our latest articles. Choose your development kit family Embedded System on Module SDKMost Popular for IoT Projects!! Serial to Ethernet SDKEasily Customize Defaults Network Time Server SDKTime Server Customization Wireless SOM SDKEasily Customize WiFi Defaults PINK SDKEasily Customize Legacy Dev KitsOldies but Goodies Compare Development Kits by NetBurner Product Family System On Module Serial to Ethernet Product Kits Time Servers PINK Wireless Legacy System On Module Part NumberCreates Applications for the Listed PlatformsTCP/IP StackSSL/TLS and SSHWireless OptionIDE Graphical DebuggerLifecycle NEW! NNDK-SOMRT1061-KITSOMRT1061 200IR VersionStandard Network PlatformLatest NNDK-MODM7AE70LC-KITMODM7AE70 100 & 200 VersionStandard Network PlatformLatest NNDK-MOD54415LC-KITMOD54415 100 & 200 VersionStandard Network PlatformLatest NNDK-MOD54417LC-KITMOD54417 100 & 200 VersionStandard Network PlatformLatest NNDK-NANO54415-KITNANO54415 200 VersionStandard Network PlatformLatest NNDK-MOD5234LC-KITMOD5234 100 & 200 VersionStandard Network PlatformMature NNDK-MOD5270LC-KITMOD5270 100 & 200 VersionStandard Network PlatformMature NNDK-MOD5213-KITMOD5213 100 VersionEmbedded Platform (non-network)Mature Edit Table Serial to Ethernet Part NumberCreates Applications for the Listed PlatformsTCP/IP StackSSL/TLS and SSHWireless OptionIDE Graphical DebuggerLifecycle NNDK-SB800EX-KITSB800EX JDD/JDT/TDD/TDT/JDDW/JDTW VersionStandard Network PlatformLatest NNDK-SB800EXW-KITSB800EX JDD/JDT/TDD/TDT/JDDW/JDTW VersionStandard Network PlatformLatest NNDK-SB700EX-KITSB700EX 100 VersionStandard Network PlatformMature NNDK-NANO54415-KITNANO54415 200 VersionStandard Network PlatformLatest NNDK-SBE70LC-KITSBE70 LC 100/200Standard Network PlatformLatest NNDK-CB34EX-KITCB34EX 100 VersionStandard Network PlatformMature NNDK-SBL2E-KITSBL2e 100/200/X/XA Version | SBL2e BOB 100 Version | SBL2e Chip 236 VersionSingle Chip Network PlatformMature NNDK-SBL2EBOB-KITSBL2e 100/200/X/XA Version | SBL2e BOB 100 Version | SBL2e Chip 236 VersionSingle Chip Network PlatformMature NNDK-SBL2EX-KITSBL2e 100/200/X/XA Version | SBL2e BOB 100 Version | SBL2e Chip 236 VersionSingle Chip Network PlatformMature NNDK-SBL2EXA-KITSBL2e 100/200/X/XA Version | SBL2e BOB 100 Version | SBL2e Chip 236 VersionSingle Chip Network PlatformMature NNDK-PK70EX232-KITPK70 100/232/485/MMS/NTP VersionStandard Network PlatformMature NNDK-PK70EX485-KITPK70 100/232/485/MMS/NTP VersionStandard Network PlatformMature NNDK-PK70EXMMS-KITPK70 100/232/485/MMS/NTP VersionStandard Network PlatformMature Edit Table Product Kits Part NumberCreates Applications for the Listed PlatformsTCP/IP StackSSL/TLS and SSHWireless OptionIDE Graphical DebuggerLifecycle ### Wireless Modules WIRELESS Add wireless capability to your NetBurner module in minutes! The goal: Enable devices to communicate over a wired or wireless network.​The method: Add a NetBurner Ethernet Module and NetBurner Wireless Module.The result: The device can communicate over a wired or wireless network.With the NetBurner 802.11b/g/n Wireless Solution installed, your NetBurner Ethernet System-on-Module can have both Ethernet and wireless communication active at the same time. The software programming is minimal; once you add the second network interface, your network and web server communication will be routed automatically.Wireless Standards: IEEE 802.11 b/g/n, 2.4GHz RF band mode PASecure data communications with 128-bit WEP, WPA-PSK (TKIP), WPA2-PSK AuthenticationIndustrial temperature range (-40°C to 85°C) Module CompatibilitySOMRT1061MODM7AE70MOD54415MOD54417NANO54415MOD5234MOD5270MOD5272Device Connectivity 802.11b/g/n SPI & UART Interface NBWIFIIN Pricing Part NumberDescriptionQty. 1Qty. 25Qty. 50Qty. 100Qty. 250Qty. 500Qty. 1000 NBWIFIIN-SOM-UFLIR802.11b/g/n Wireless SOM (External Antenna Ready)$34.99$29.95$28.20$24.92Buy Now! NBEXP-WIFI-INIR802.11b/g/n Wireless SOM (Breakout Board with Header)$48.90$48.25$47.50$46.90$45.25Buy Now! NNDK-NBWIFIIN-UFL-KIT802.11b/g/n Wireless Development Kit (External Antenna Included)$99Buy Now! NBANTIN-W24PUU.FL Antenna$1.99 Buy Now! Articles ### Network Product Kit with Add-on Boards NETWORK PRODUCT KIT WITH ADDON BOARDS Send email, generate custom web pages, send and receive network data. The goal: Quickly create a finished product that can be controlled, configured, and monitored using Ethernet.​The method: Add additional functionality with a pre-built add-on board, or create your own custom board. the add-on boards are installed inside the PK70 EX enclosure.​The result: Access device from the Internet or a local area network (LAN)​ NetBurner has traditionally offered CPU processor boards that provide easy access via header pins to the general purpose processor and digital I/O. These "core modules" include ram, flash, 10/100 Ethernet and can be programmed using our software tools suite. To use it you have to build a board to plug into and a case to go over it. We have also offered serial to ethernet devices in a finished box all ready to go to deploy as a finished product. We kept getting requests to add features to the box or a box to the processor boards.The solution is the Network Product Kit - it combines the best of both worlds!The Network Product Kit combines the design of a finished product, the flexibility of a network module, and the power of the NetBurner development suite into a ready to use platform for use in both prototype or production. The primary advantage of the Network Product Kit is that the electronics are in a professional grade enclosure with a power supply.The most exciting feature is the Add-on board slot. You can use one of our standard Add-on Boards or create your own.Just insert the card, add the case, write your software, and you have a finished product!Modular add-on options: Add-on Options FPGA Programmable Xilinx I/O Multi I/O NTP Time Server with GPS Quad UART RS-232, 422, 485 Prototype Boards Ethernet Network Product Kit Core Part NumberMHzRAMFlashDigital I/OFlash CardUARTI2CSPIOther Features PK70EX-100IR147.58MB4MB14On Board1 TTL115-bit address bus and 8-bit data bus with 3-chip selects Add-on Board Options Part NumberAdd-On Board TypeSpecial Features NBPKX500-100CR FPGA Board- Programmable Xilinx Spartan 3E FPGA- High-density 62-pin connector NBPKBM-100CR Multi I/O Board- Eight 12-bit analog-to-digital inputs- Two 16-bit digital-to-analog outputs- 16 digital I/O NBPKBD-100CR Programmable Xilinx Digital I/O Board- Programmable Xilinx CPLD- 32 digital I/O NBPKBG-100CR NTP Timer Server with GPS Board- Network Time Protocol (NTP) server- Precision GPS time reference NBPKBP-100CR Prototype Board- Create your own Personality Blade NBPKBU-232CR Quad UART (RS-232) Board- Network enable up to 4 RS-232 serial devices NBPKBU-485CR Quad UART (RS-422/485) Board- Network enable up to 4 RS-422/485 serial devices NBPKBU-MMSCR Quad UART (RS-232/422/485) Board- Network enable up to 4 RS-232/422/485 serial devices Articles ### Network Time Server NETWORK TIME SERVER (NTP) Provide accurate time for all devices on your network Spring Forward with the New NTP1061 Check it out! Get ready for NetBurner's most flexible NTP server yet:accurate timekeeping on one cable.As millions of us prepared to spring forward an hour this March, NetBurner made sure the world's devices don't miss a beat. We launched the NTP1061 Outdoor Network Time Server right when the time changed at 2AM Sunday March 8, introducing an affordable, weatherproof, self-contained NTP server to a market that's stuck in the past. A single Power Over Ethernet cable is now all it takes to deliver sub-millisecond time accuracy to an entire network, no manual clock-setting or antenna wiring required."NetBurner customers have made it clear that our NTP servers are an important cornerstone of their time-sensitive operations," said NetBurner engineer Paul Breed. "With the NTP1061 we wanted to remove every barrier to deploying precise network time. No separate antenna, no dedicated power run, no unnecessary expenses: just plug in a single Power over Ethernet cable, mount the unit with a clear view of the sky, and your whole network has access to sub-millisecond time precision. It really is accurate timekeeping on one cable."The NTP1061 synchronizes directly with all major GNSS satellites to provide a Stratum 1 time source, precise to under 1 microsecond, serving up to 10,000 requests per second over the network with 1-millisecond accuracy. Configuration and real-time satellite monitoring are handled through an intuitive web interface secured with HTTPS. Its compact form factor (just 13x6 cm and barely over 100 grams) along with an IP65-rated enclosure and a wide -40°C to +85°C operating range, make it equally at home on a rooftop, at a factory, or in the field.NetBurner is committed to supporting engineers and integrators at every stage of their deployment lifecycle, including help with developing custom solutions. The NTP1061 delivers an affordable, all-in-one solution that eliminates the complexity and cost of traditional GPS time server installations, making self-contained NTP accessible to organizations of any size.Orders for NTP1061 will be accepted starting March 8, for delivery beginning in May 2026. For more information, visit the product page or contact NetBurner Sales at sales@netburner.com or (858) 558-0293. Be first in line to get yours! http://www.youtube.com/watch?v=PTxTAe_ib_w The goal: To enable time synchronization of multiple devices.The method: Set all host devices to get their time from a time server.The result: The time server provides accurate time for host devices.NetBurner Network Time Servers use the Network Time Protocol (NTP) to enable host devices on your network maintain accurate time. Timing is synchronized to information received from GPS satellites. Once plugged in and configured, all network devices can be set to get their time from the NTP Time Server.High performance GPS receiver with antenna connectorUp to Stratum 1 accuracy with optional GPS antennaWeb-based configurationCustomize the PK70 with a development kitPK70 Device Connectivity10/100Mbps EthernetStandard SMA female connectorDEBUG serial port PK70 EX NTP with External GPS Antenna (sold separately) Network Time Server Product Lineup Part NumberRequests /secNTP PrecisionPowerMountingAntennaMHzRAMFlashOther Features PK70EX-NTP1,000<5ms7-24V Barrel Jack, TerminalDesktop, DIN RailExternal SMA147.58MB4MBCustomizable with Dev Kit NTP106110,000<1ms48V PoERoof, PoleInternal52832MB8MBSelf-contained outdoor unit Pricing and Accessories Part NumberDescriptionPrice (qty 1) NTP1061 Outdoor PoE Network Time Server$299 Buy Now! PK70EX-NTP Network Time Server (PK70 NTP Version) *$349 Buy Now! NNDK-PK70EXNTP-KITPK70 EX NTP Development Kit – Great for Customizing! *$399 Buy Now! NBANT-555 PK70 GPS Antenna$19.95Buy Now! DIN-100PK70 DIN Rail Mounting Kit (100 Version, double sided)$8.94 Buy Now! DIN-200PK70 DIN Rail Mounting Kit (200 Version, single sided)$5.46 Buy Now! * GPS Antenna not included. Purchase NBANT-555 GPS Antenna for connectivity with GPS. Articles ### Serial to Ethernet SERIAL TO ETHERNET Access serial ports over SSL & SSH protected Ethernet! Network connectivity for legacy serial devices! NetBurner's complete family of serial to Ethernet converters and device servers are ready to run right out of the box with no programming. The  setup, configuration, and diagnostic programs are easily accessed via the web page interface or included network utilities. The goal: Easily control, configure, or monitor a serial device using Ethernet.The method: Connect serial port (COM port) to a NetBurner Serial to Ethernet device server.The result: Access devices from the Internet or a Local Area Network (LAN) using SSH, SSL, or HTTPS.What is a serial to Ethernet converter?A serial to Ethernet converter (or device server) is a device that will take a serial data signal and send it out over a network connection. Additionally, it will take any network data received and turn it into a serial signal.What is a serial to Ethernet converter used for?A serial to Ethernet converter is used when you want to connect a serial device that isn't network-enabled to a computer that either is too far away (sometimes halfway around the world!) or simply doesn't have an appropriate serial port available.Are serial to Ethernet converters secure?This depends on the serial to Ethernet converter being used. For serial data being transmitted over a network connection to be secure, the converter needs to be able to support encryption with an SSLTLS connection.Can I use serial to Ethernet converters to allow two serial devices to connect over a network?Yes, depending on the capability of the serial to Ethernet converter. This is called "serial tunneling". To do this, you will need two serial to Ethernet converters, with each connected directly to a serial device. They will need to be configured to talk and listen to one another, but once they are set up, they will effectively send the data between the two serial devices as if they are directly connected by a serial cable.What if an application on my PC needs a serial port, but doesn't have one?If an application on your PC is designed to talk directly to the serial device but your computer doesn't have a serial port available, you will need to create a virtual serial port, also known as a virtual COM port. It will effectively act as a serial to Ethernet converter locally on your computer by taking your serial data and making it available over a TCP/IP connection. This is often used in conjunction with a serial to Ethernet converter, which receives the application data sent by the PC over a network connection and passes it along to the serial device that it is connected to. Need a customized solution? NetBurner Serial to Ethernet Development Kits are available to customize any aspect of operation including web pages, data filtering, or custom network applications. Popular Devices Compare Serial to Ethernet devices Factory Application Features Additional Features with Development Kit Factory Application Features Part NumberVersionsUARTsRS-232RS-422/485Max Baud RateMHzFlashRAMOther FeaturesCustom Label OptionSSL, SSH, HTTPS SupportPower Via SB800 EXJDD, JDT, TDD, TDT, JDDW, JDTW, TDTC2921,6002508MB64MB DDR2Serial Port, Barrel Connector SB700 EX1002921,600147.52MB8MBSerial Port, Barrel Connector NANO544152008115,2002508MB64MB DDR2 SBL2e100, 2002115,2005010 Digital I/O Four 12-bit A/D inputs SBL2e CHIP SBL2e BOB236, 2002115,2005010 Digital I/O Four 12-bit A/D inputs SBL2e X1001115,20050Barrel Connector SBL2e XA1002115,200509 Digital I/O Four 12-bit A/D inputsBarrel Connector PK70 EX 2322325115,200147.54MB8MB2 Position Terminal Block, Barrel Connector PK70 EX 4854855115,200147.54MB8MB2 Position Terminal Block, Barrel Connector PK70 EX MMSMMS5115,200147.54MB8MB2 Position Terminal Block, Barrel Connector CB34 EX1002115,200147.52MB8MB2 Position Terminal Block, Serial Port, Barrel Connector Edit Table Additional Features with Development Kit Part NumberVersionsSSL, SSH, HTTPS SupportFlash Card SupportCustom RatesSPII2CDigital I/OReal Time Clock SupportExternal TimerOther Features SB800 EXJDD, JDT, TDD, TDT, JDDW, JDTW, TDTCNetwork Time Protocol (NTP) SupportOptional IEEE 802.11 b/g/n WifiOptional CAN bus SB700 EX100Network Time Protocol (NTP) Support NANO54415200Network Time Protocol (NTP) SupportOptional CAN bus SBE70 LC100, 200 SBL2e100, 200 SBL2e CHIP SBL2e BOB236, 200Up to 1 Additional UART Optional CAN bus SBL2e X100Up to 2 Additional UARTs SBL2e XA100 PK70 EX 232232 PK70 EX 485485 PK70 EX MMSMMS CB34 EX100Optional CAN bus, MicroSD Card Support Edit Table Looking for Virtual Com Port Solution? Some of our most popular Serial-to-Ethernet (S2E) devices are VCOM-ready straight out of the box! Check out all of our Virtual Com Port Solutions! All Virtual Com Port Solutions What our Serial to Ethernet users are doing Industrial Automation and Controls Legacy and other serial device users in industrial applications requiring rugged and reliable connectivity with Industrial temperature ratings. Smart Cities and Smart Buildings Make better use and extend the life of existing infrastructure. NetBurner allows for full integration of assets with sophisticated IT systems and databases. Transportation and Infrastructure Trusted by engineers for proven reliability in locomotive, automotive and other transportation platforms and infrastructures. Related Articles ### Products ### System on Modules SOMs ETHERNET SYSTEM-ON-MODULES​​ with High-Performance Connectivity Options Intelligent Processorsby ARM®ARM processors remove the complexities of IoT with a complete IoT products and pre-integrated subsystems that enable customers and partners to rapidly design and deploy flexible IoT solutions. Shop ARM® SOMs Add Ethernet connectivity to an existing product or use it as your product’s core processor. The NetBurner Ethernet System-on-Module is a device containing everything needed for embedded IoT, edge computing or automation. Get the power and precision of real-time embedded processing, multi-tasking, network control and system monitoring. For a very low price point, solve the problem of network-enabling devices with 10/100 Ethernet, including those requiring digital, analog and serial interface, industrial protocols and Internet-based control and accessibility. Learn more about the benefits of working with NetBurner products. The goal: Easily control, configure, or monitor almost any device using Ethernet over a Local Area Network (LAN), Wide-Area Network (WAN), or the Internet using an user defined interface.The method: Create and deploy applications from your Mac or Windows PC. Get hands-on familiarity with the NetBurner platform by studying, building, and modifying source code examples.The result: Interact and access devices from just about anywhere! Design to meet your platform needs for web, mobile, desktop and IoT, automation or Machine to Machine (M2M) applications. Several modules are footprint and API compatible, enabling migration with minimal impact on the mother board hardware design. The SOM I/Os, are routed directly from the processor to the module I/O pins. Given the high performance of the core processor, external bus, and serial interfaces, the module series is well suited to be the core processor of an entire product. Adding peripherals is as simple as adding them to the bus and configuring the chip select to address the new peripheral. The serial ports offer high bandwidth and a rich feature set. The serial ports have partially full and partially empty interrupt capability, allowing the processor to service the ports with no interruption in data flow. Popular Devices Choose your System-on-Module Part NumberVersionsMHzRAMFlashEthernetInterfaceDigital I/OFlash CardUART (hwhs)Data BusADCDACPWMI2CCANSPITimerOther SOMRT1061 (i.MX RT1061 ARM M7)20052832MB8MB288 pin, 1.0mm pitch, 1.0"x1.0", castellated PCB67Ready7 TTL (3)16, 880323336 MODM7AE70 (ARM M7)100 & 2003008MB2MB1Two 50-pin connectors53Ready7 TTL (3)161111232441-Wire SSI MOD54417100 & 20025064MB32MB2Two 50-pin connectors42On Board8 TTL (2)1682542341-Wire, Single and Dual Ethernet MOD54415100 & 20025064MB32MB1Two 50-pin connectors42On Board8 TTL (2)1682542341-Wire, Single and Dual Ethernet NANO5441520025064MB8MB152-pin Mini PCI express connector30Ready8 TTL (3)062842341-Wire SSI MOD5270100 & 200147.58MB512KB1Two 50-pin connectors47Ready3 TTL (3)320001017 MOD5234100 | 200 | 1588147.58MB2MB1Two 50-pin connectors49Ready3 TTL (2)160001115eTPU MOD52131006632MB256KB1Two 20-pin connectors333 TTL (1)08081114Non-network What our System on Module users are doing Energy and Power NetBurner provides connectivity over nearly the entire energy industry. Our users rely on Industrial temperature ranges and long-term reliability in extreme environments.  Aerospace and SATCOM NetBurner helps engineers deliver mission critical, reliable and rugged solutions for numerous aerospace, defense and Satellite Communications (SATCOM) applications. Connected Health The health and medical industry demands high data security, accurate timing, and reliability. Connecting with the latest smart devices and user interfaces enables new ways to care for patients. Articles ### SNMP Simple Network Management Protocol (SNMP) SNMP v1, v2c, v3 are supported on NetBurner platforms by DMH Software and can be obtained at dmhsoftware.com.DMH Softwarewww.dmhsoftware.comSNMP Agent solutions, has integrated the Advanced SNMP Agent SDK into the NetBurner Network Development Kit.DMH Advanced SNMP Agent SDK comes with an SMIv2 MIB-Compiler for Rapid MIB Development. All SNMP versions: SNMPv1, SNMPv2c and SNMPv3 are fully supported.Product Evaluation: DMH Software's SNMPv3 SDK "The DMH Software Advanced SNMP Agent was designed to produce a small executable with embedded and real-time applications in mind. The provided API consisted of a small, concise and well thought out set of functions. Additionally, I am pleased to report that the SMIv2 MIB compiler generated modular code of good quality and that DMH Software's response time on technical issues was superb." Mark Ellison, Ellison Software ### Software Libraries Software Libraries A robust set of software to meet your needs NetBurner Real-Time Operating System (NBRTOS) The NetBurner RTOS is a preemptive multitasking real-time operating system designed to be very efficient and full featured, providing rapid real-time response and a small footprint. You can easily create and manage multiple tasks and communicate between tasks with the intuitive API. The RTOS is integrated with the I/O system to make communication with the other system components, such as the TCP/IP Stack, quick and easy.Real-time preemptive multitasking operating systemSemaphores, Mail Boxes, Message Queues, FIFOs, Mutexs and TimersStack CheckingTask Debugging ToolsThe I/O system is integrated with the RTOSAlso see the Comparing RTOS to Infinite Loop Designs application note. For more information on programming with NetBurner’s RTOS, please see the NetBurner RTOS section of our Programmers Guide. Embedded Flash File System (EFFS) The FAT32 flash file system gives developers the flexibility to store and exchange data through on-board flash chips (power fail safe) or SD flash cards. Additional features include bad block management and wear leveling. NetBurner provides a standard API, complete C++ based source code, drivers, and ample examples to get started. Please see the EFFS section of our Programming Guide for more information. Use of the EFFS with SD Flash cards requires exclusive use of the QSPI bus. NetBurner TCP/IP Stack NetBurner's TCP/IP stack was written to be a high performance stack for embedded applications. It is integrated with the RTOS, Web Server and I/O system, to enable easy development of network applications. The stack is available on hardware platforms with more than 128K of RAM. For an in-depth look at the NetBurner TCP/IP stack, please see the Network Protocols section of our Programmers Guide. The following protocols are supported:ACME Certificate ManagementAESCertificates and KeysDHCP/BOOTPDHCPv6DNSDTLSFTP Client and Server, FTPSGDB Network DebuggingHTTP, HTTPS, Web Client and ServerICMPIGMP (multicast)IPv4, IPv6Multi-homeNTP, SNTPPOP3PPPSMTPTLS 1.2 and 1.3 (WolfSSL)SSH Client and Server (WolfSSL)Statistics CollectionSyslogTCPTelnetTFTPUDPVLANWeb Sockets Point-to-Point Protocol (PPP) The Point-to-Point Protocol (PPP) module enables network communications through a direct serial link, modem, or cellular modem. The development kit includes an example application that can dial in to an ISP or receive incoming calls to establish a PPP connection. Embedded Web Server The NetBurner web server is integrated with the TCP/IP stack and RTOS, enabling you to quickly develop dynamic web pages and content. Simply provide your HTML/CSS/JavaScript, images, Java classes or other web resources in the html directory of your NetBurner project and the development tools will automatically publish them on your device Supports dynamic HTML, including function calls and variables into your NetBurner C/C++ code Supports Forms, Cookies and Passwords Supports WebSockets, JSON, HTTPS, TLS 1.3, and ACME automated SSL certificate management Extensive examples to show you how to get the most out of your web server and take advantage of modern web technologies For more information on web programming with NetBurner modules, please see the section HTML Processing in our Programmers Guide, as well as our Learn blog. More Info For more information about our software stack, please see:Programmers GuideNetBurner Library APILearn Blog ### NBEclipse IDE NetBurner's Eclipse IDE Create & deploy applications from your Mac, Windows, or Linux PC Inside the NBEclipse IDE Everything You Need to Build Your Embedded Application One-click App UpdateUpdate firmware in seconds Code CompletionWrite more code in less time DebuggerQuickly & easily step through code NOTE: SBL2e series devices do not include graphical debugger. NBFindFind NB devices on network NBConfigConfigure NB settings Compare File HistoryShow code changes made over time DocumentationAmple documentation is provided Application WizardQuickly & easily step through code Project ImportImport C/C++ projects in seconds Prefer your own program, or the command line? The NetBurner development tools also support a command line interface if you prefer your own development environment, editor or want to use standard Unix/Linux Makefiles. The make utility can then be invoked from within other project development environments such as VSCode, Sublime Text, Atom/Pulsar, TextMate, JetBrains, NetBeans, Emacs or Vim. Interested? Want to try NetBurner? Check out our Development Kits ### J1939 Quick Summary: J1939 is the automotive CAN standard developed by the Truck & Bus Control and Communications Network Subcommittee of the Society of Automotive Engineers. SAE maintains family of standards which govern the design and use of devices that transmit electronic signals and control information among vehicle components. Planned for use in light, medium and heavy-duty trucks, it is also now being used in conventional passenger vehicles. NetBurner J1939 Product Summary: All NetBurner products that have a CAN port and support the standard NetBurner development software support CANopen. Contact Real Time Automation for J1939 Embedded Gateway and Master and Slave Source File solutions. Overview: J1939 was designed for the CAN 2.0 (CAN Part B) specification. It is unique in that it is the only application layer in this paper that uses the larger 29 bit identifier and the only one that does not require a master. Instead of the traditional Master-Slave relationship, it uses a peer to peer protocol where most messages are broadcasted versus directed to individual nodes. In J1939 each CAN Node is referred to as an Electronic Control Unit (ECU). Every ECU has at least one node address. In certain applications ECUs have multiple node addresses in the same electronic assembly. J1939 uses three methods to communicate over the CAN bus. Destination specific communications use the PDU1 (Protocol Data Unit 1) format to send and receive data. The PDU1 format allows a message to be directed to specific ECU (CAN Node). The destination address is included in the CAN PDU1 CAN frame. Broadcast Communications use the PDU2 (Process Data Unit 2) format to send a message to multiple nodes. The PDU2 message format identifies a message number versus a node number. In these applications receiving ECU's monitor the CAN bus for specific messages. For example a display unit may ignore all other messages as it monitors the bus waiting for the PDUs containing Fuel Temperature and Fuel Pressure. Proprietary Communications use both PDU1 and PDU2 formats to send data. This is commonly used in service tools. Data transferred on the CAN bus is defined as Parameter Groups (PGs). PG's define where the data is located in the CAN Data frame, priority and transmission repetition rate. PG's are identified with Parameter Group Numbers (PGN's) and are similar to EDS (Electronic Data Sheets) used in DeviceNet. Ethernet/IP Server C Source Code The easiest way to add support EtherNet/IP on all your NetBurner Coldfire products! More Information ### CANopen Quick Summary: The European Community developed the CAN Open standard as a publicly funded project and is now an accepted international standard. The standard is controlled by the non-profit trade association "Can In Automation" (CiA). CiA supports the protocol and provides CAN Open technical and marketing information through its website, trade shows, fairs and exhibitions. CAN Open is found in applications as simple as coffee makers and as complex as critical medical and transportation systems. It is also strong in industrial applications. NetBurner CANopen Product Summary: All NetBurner products that have a CAN port and support the standard NetBurner development software support CANopen. Contact Real Time Automation for CANopen Embedded Gateway and Master and Slave Source File solutions. Overview: CAN Open refers to a CAN frame as a Communications Object (COB). COB's normally use the eleven bit CAN identifier but also support the 29 bit identifier. A specific identifier in CAN Open is called the COB-Id. The COB-Id defines the Node address and a function code. The COB-Id specifies if the COB is a Process Data Object (PDO) or a Service Data Object (SDO). PDO's and SDO's are types of communication objects which transfer application data between nodes. Using multiple CAN frames SDO's move more than eight bytes of data. SDO's are used for high volume, low priority asynchronous messages. SDO are transferred between a client and a server using three types of transmission methods. Expedited transfers - used to send small bursts of data Segmented Transfers - sends more than four but less than 128 bytes of data Block transfers - used to send blocks of data with almost no size restraint Expedited transfers require no pre-initialization. Although data is limited to four bytes, initialization and data are sent in the same CAN frame. The first half of the CAN Data field (Byte 0 - Byte 3) is used for message information such as where to store the data and how many bytes in the Data field is NOT data. The second half contains the data. All CAN Open nodes must support Expedited Transfers. Segmented Transfers use a COB almost identical to the Expedited Transfer to initialization the Server node. This first COB prepares the Server node and expects the Server node to reply to the client whether or not the intended dialog can be preformed. The area of the Expedited CAN Data field normally used for data is used to define the number of bytes to be transferred. Following the initialization frame data is transfer in segments (CAN frames) where one byte (Byte 0) is used to state what segment the CAN frame is and the remaining seven bytes are data. The receiver of the data acknowledges each segment of data by sending a reply. Support of Segmented Transfers is optional. Block Transfers are much like Segmented Transfers in that they both use similar initialization frames and they both send segments of data. Where they differ is Block Transfers send blocks of segmented messages and the receiving node only acknowledges the last segment of each block. Process data objects are used for small data transfers (eight bytes or less). PDO's have the advantage of passing higher priority data. Messages can even be synchronous. PDO's must be predefined at both the Client and Server using a PDO mapping. The PDO mapping defines whether a PDO is consuming or producing data. A PDO that is mapped to an indicator light is a consuming object. A PDO mapped to a switch is a producing object. Because PDO mapping defines everything about the data, only the COB-Id is used for message data management. The entire eight bytes of the CAN Data frame is used for data. CANopen Contact Real Time Automation for CANopen Embedded Gateway and Master and Slave Source File solutions. ### PROFInet IO Quick Summary: Built on standard Ethernet technologies, PROFInet IO uses traditional Ethernet hardware and software to define a network that structures the task of exchanging data, alarms and diagnostics with Programmable Controllers and other automation controllers. PROFInet IO is one of two open Ethernet standard automation "views" from Profibus International. While PROFInet IO focuses on Programmable Controller data exchange, PROFInet CBA (Component Based Automation) focuses on distributed automation systems. PROFInet CBA provides a DCOM-based system for organizing automation systems into networks of peer devices that can automatically exchange data using predefined relationships between the interfaces of the automation components. PROFInet CBA is thoroughly discussed in another paper. NetBurner PROFInet IO Product Summary: No NetBurner products currently support PROFInet IO but solutions are expected to be soon available from Real Time Automation. Overview: PROFInet IO is very similar to Profibus on Ethernet. While Profibus uses cyclic communications to exchange data with Programmable Controllers at a maximum speed of 12Meg baud, PROFInet IO uses cyclic data transfer to exchange data with Programmable Controllers over Ethernet. As with Profibus, a Programmable Controller and a device must both have a prior understanding of the data structure and meaning. In both systems data is organized as slots containing modules with the total number of I/O points for a system the sum of the I/O points for the individual modules. PROFInet IO uses three different communication channels to exchange data with programmable Controllers and other devices. The standard TCP/IP channel is used for parameterization, configuration and acyclic read/write operations. The RT or Real Time channel is used for standard cyclic data transfer and alarms. RT communications bypass the standard TCP/IP interface to expedite the data exchange with Programmable Controllers. The third channel, Isochronous Real Time (IRT) is the very high speed channel used for Motion Control applications. PROFInet IO is a unique industrial Ethernet application layer. It offers many benefits over competing application layers including: High Speed Operation - The real time communication channel provides high speed message exchange by bypassing the time required to process the TCP/IP stack Seamless and nearly identical Siemens S7 PLC integration to Profibus Support for time critical motion control applications Short Startup Distributed Intelligence Ease of installation Minimum commissioning time and engineering support PROFInet IO classifies devices into three types; IO-Controllers, IO-Devices and IO-Supervisors. IO-Controllers are devices that execute an automation program. Controllers, functionally similar to a Profibus Class 1 Master, exchange data with IO-Devices. IO-Devices are distributed sensor/actuator devices connected to the IO-Controller over Ethernet. In Profibus terms, IO-Devices are similar to Profibus slaves. IO-Supervisors are HMIs, PCs or other commissioning, monitoring or diagnostic analysis devices. These devices are similar to Class 2Profibus Masters. IO-Controllers map IO data from PROFInet IO devices into the process image of the controller. In Siemens S7 Programmable Controllers, I/O data, alarms and status data is mapped into the process image in much the same way it is done for Profibus devices. These data values are then available for use by the control program. IO-Controllers must support the following kinds of services: Cyclic Data Exchange - The exchange of data between IO-Controllers and IO-Devices Acyclic Data Exchange - The exchange of Configuration and Diagnostic data Alarms - Alarm data exchange from an IO-Device to an IO-Controller Context Management - Connection processing IO-Supervisors are used for commissioning and diagnostic data collection. IO-Supervisors can read and write internal diagnostic data associated with the PROFInet IO stack or diagnostic data provided by the application program of a device. IO-Supervisors can also read and write configuration data using special, non cyclic record data object services. These types of devices may only be used during the commissioning process or they may be used as an HMI to display diagnostic data to the end user. A PROFInet IO system requires at least one IO-Controller and one IO-Device. Systems can be configured in various configurations; multiple IO-Controllers for a single IO-Device; single IO-Controllers for multiple IO-devices and multiple IO-Controllers with multiple IO-Devices. The network representation of a device is the view of the device from the network. In Modbus and Modbus TCP, devices are represented as a series of registers (16-bit integers) and coils (bits). In EtherNet/IPT and DeviceNetT devices are represented as objects. Other networks have other network configurations. In LonworksT, data is represented by a series of "data tags" that the device provides to the outside world. In every case above, the device presents some view of itself to the outside world. That representation is the network representation. The PROFInet IO network representation is very similar to Profibus. It consists of a device with slots, subslots and channels. Subslots are subcomponents of a slot. Each subslot is assigned a number of I/O points or channels. A channel is the PROFInet IO term which refers to one physical discrete input, discrete output, analog input or analog output. A device can have almost any number of slots, subslots and channels. Except for Slot zero, every other slot and subslot contains status, diagnostic and alarm data for the channels of that slot. For points transferred to an IO-Controller, provider status and diagnostic information is automatically transferred on every I/O scan cycle. For points transferred to an IO-device, consumer status is returned to the IO-Controller. Even though PROFInet devices and GSD files refer to "Slot zero", there is no Slot zero. The first I/O slot of a device is slot one. Instead of referring to an actual slot, Slot zero refers to the device itself. No I/O data is contained in Slot zero. In place of I/O data, Slot zero manages all the generic device data like the vendor name, product catalog number and software and hardware version information and other similar information. Modules are specific functional components that can be associated with a slot. Modules can be virtual or real. A module, real or virtual, must be plugged into a slot before the I/O device goes online. The module gives the slot a specific identity. For example, a 16 discrete input module gives the slot a 16 discrete input identity. In the same way that modules provide identity to slots, sub-modules provide subslot identity. The 16 discrete input module can be composed of one 16 discrete input sub-module, two 8 input sub-modules or four, 4 input sub-modules. IO-Controllers associate to a device and all the slots and subslots. The current version of PROFInet IO only supports devices associated to one IO-Controller at a time. Future versions of PROFInet IO may lift this restriction and associate to IO-Controllers by slot. In an IO-Controller like a Siemens 317 Programmable Controller, the I/O points or channels for the subslots assigned to that Programmable Controllers is collected and that data group forms the I/O data image that is transferred between the IO Device and the IO Controller. For example, if you have a PROFInet IO device with four input slots (16 inputs each) and two output slots (16 outputs each), the I/O image transferred between the controller and device is 4 bytes in the direction of the Programmable Controller and 2 bytes in the direction of the IO Device. Internally in an IO Controller, all PROFInet IO inputs are assigned to the Input data table and all outputs are assigned to the Output Data Table, just as is done for Profibus. ### Modbus Quick Summary: The most widely used protocol in all of industrial automation. A very simple-to-understand and easy to implement device representation and standard serial communications make Modbus very popular. On a Modbus network every device looks to the network as a collection of coils (bits) and registers. A Modbus Master reads and writes these coils and registers using a very simple, concise command set. Communication flows in only one direction at a time. A Modbus Master sends a request. A Slave answers the request. NetBurner Modbus TCP Product Summary: All NetBurner products that have a serial port and support the standard NetBurner development software support Modbus RTU including all Core Modules and Serial-Ethernet Converters. Contact Real Time Automation for Modbus solutions. Overview: Modbus is a Master-Slave communication network in which every Modbus Slave device looks to the Master as a set of coils (bits) and Registers. Modbus Coils are the Slave's discrete inputs and outputs while Registers are 16-bit, unsigned values. Registers can be connected to real world analog data points. There are no requirements for the number and type of coils and registers supported by a Modbus device. Modbus can be implemented on any device with a serial port making it available to any 8-bit microprocessor. Though it can be used in a Single Master/Single Slave configuration over RS232 communications it is usually implemented using RS485. RS485 is a multi-drop, daisy-chained communications standard, normally used with 32 nodes or less. In an RS485 network every Modbus Slave device is identified with an 8-bit address. Address 255 is reserved and used for broadcast communications. Modbus uses a simple Master/Slave communication mechanism. A Modbus Master issues a message to a specific slave. The message requests the value of some number of coils or registers or sets some coils or registers of a particular slave on the network. The command is received by every Slave on the network and replied to by the slave with the address matching the message address. A Modbus Master also has the capability to issue "broadcast" write messages to all slaves on the network using address 255. The Modbus message set in practice is extremely concise. Though there are twenty-some commands only a few are actually ever implemented. The most common commands are read coils, write coils, read registers, set register and set multiple registers. The small command set is another reason for it's great popularity in the world of small control devices Modbus Gateways on a CB34 The fastest, easiest way to move your Modbus data. More Information Modbus TCP Server C Source Code The fastest way to Modbus enable all your NetBurner products! More Information ### DeviceNet™ Quick Summary: DeviceNet is a low-level industrial application layer protocol for industrial automation applications. DeviceNet connects simple industrial devices (sensors and actuators) with higher-level devices such as Programmable Controllers. Built on the standard CAN (Controller Area Network) physical communications standard DeviceNet uses CAN hardware to define an application layer protocol that structures the task of configuring, accessing and controlling industrial automation devices. DeviceNet is very popular in the United States especially with users of Rockwell Automation Programmable Controllers. NetBurner DeviceNet Product Summary: All NetBurner products that have a CAN port and support the standard NetBurner development software support DeviceNet. Embedded Gateway and Master and Slave Source File solutions are available from Real Time Automation. Overview: DeviceNet is a CAN open standard created by Allen Bradley in the mid 1990s. To encourage its development and widespread use, management of the specification was transferred to the Open DeviceNet Vendor Association (ODVA). The ODVA is a non-profit organization that develops and markets DeviceNet and promotes its worldwide adoption. DeviceNet uses abstract object models to describe communication services, data and behavior. A DeviceNet Node is built from a collection of Objects. These objects organize the system behavior and group data using virtual objects much like C++ uses objects and instances to organize data. A node can even have multiple identities. Objects implement services such as Get Attribute and Set Attribute. Required objects are present in all nodes. The Identity and DeviceNet Objects are required objects. The Identity Object contains data such as the Vendor ID, Device Type and Serial Number. The DeviceNet Object contains data describing the DeviceNet CAN connection such as the node address and network baud rate. DeviceNet is based on the Part A specification and uses the eleven bit identifier in four different ways. These "Message Groups" define the structure of communications between any two communicating end points. Each group maps one or more of the highest bits as priority bits. For example, the value of bits nine and ten of the eleven bit ID Field define the Group number giving Group 1 the highest network priority. The remaining bits of the identifier are mapped between a DeviceNet Message ID field and a Media Access Control Identifier (MAC Id). Message Groups support different number of Message ID's and MAC ID's. DeviceNet uses two types of messaging schemes, Explicit Messaging and I\O Messaging. Explicit Messages configure end points and provide general communications between any two nodes. Explicit Messages use part of the CAN Data Field for message management. I\O Message is used to transfer data. The entire CAN Data Field can contain message data. One of the most extraordinary features of CAN (and DeviceNet) is bitwise arbitration. Bitwise Arbitration is the process that CAN uses to prioritize messages without losing any network bandwidth. On a CAN network "zero" bits dominate "one" bits. As a device transmits a message it listens to the bits on the network. If a device transmits a one and hears a zero, it knows that a higher priority message is being transmitted and it discontinues transmitting. The node with the higher priority message hears the bits it is transmitting and never knows it conflicted with a lower priority message. The message sequence on the network is preserved. Data to be transferred using DeviceNet is defined in Electronic Data Sheets (EDS). EDS's are very useful because host computers being used as masters can read EDS's and use this information to configure DeviceNet nodes. DeviceNet Gateways on a CB34 The fastest, easiest way to move your DeviceNet data. More Information DeviceNet™ Slave C Source Code The fastest way to DeviceNet enable all your NetBurner products! More Information ### Ethernet/IP Quick Summary: Ethernet/IP, promoted by the ODVA, is much more sophisticated protocol than Modbus TCP. EtherNet/IP classifies EtherNet/IP nodes as predefined device types with specific behaviors. The set of device types and the EIP application layer protocol is based on the Control and Information Protocol (CIP) layer used in both DeviceNetT and ControlNetT. Building on these widely used protocol suites the CIP-based protocols provides a seamless integrated system from the sensor-actuator network to the controller and enterprise networks. Ethernet/IP uses all the transport and control protocols used in traditional Ethernet including the Transport Control Protocol (TCP), the Internet Protocol (IP) and the media access and signaling technologies found in off-the-shelf Ethernet interface cards. Structuring EtherNet/IP on these standard PC technologies allows EtherNet/IP to work transparently with all the standard off-the-shelf Ethernet devices found in today's marketplace. It also means that EIP can be easily supported on standard PCs and all their derivatives. Even more importantly, basing EIP on a standard technology platform ensures that EIP will move forward as the base technologies evolve in the future. NetBurner EtherNet/IP Product Summary: All NetBurner products that have an Ethernet port and support the standard NetBurner development software support EtherNet/IP. Embedded Gateways, ASCII to Rockwell Automation Programmable Controller modules and Client and Server Source File solutions are available from Real Time Automation. Overview: Four independent groups have joined forces to develop and promote EtherNet/IP as a public domain Ethernet application layer for Industrial Automation. These groups include the ODVA, the Industrial Open Ethernet Association (IOANA), Control Net International (CI) and the Industrial Ethernet Association (IEA). The goals of this effort illustrate how EIP provides a wide-ranging, comprehensive, certifiable standard suitable to a wide variety of automation devices: 1. Ethernet/IP uses the tools and technologies of traditional Ethernet Ethernet/IP uses all the transport and control protocols used in traditional Ethernet including the Transport Control Protocol (TCP), the Internet Protocol (IP) and the media access and signaling technologies found in off-the-shelf Ethernet interface cards. Building on these standard PC technologies means that EIP works transparently with all the standard off-the-shelf Ethernet devices found in today's marketplace. It also means that EIP can be easily supported on standard PCs and all their derivatives. Even more importantly, basing EIP on a standard technology platform ensures that EIP will move forward as the base technologies evolve in the future. 2. Ethernet/IP is a certifiable standard The groups supporting EIP plan to ensure a comprehensive, consistent standard by careful, multi-vendor attention to the specification and through certified test labs as has been done with DeviceNet and ControlNet. Certification programs modeled after the programs for DeviceNet and ControlNet will ensure the consistency and quality of field devices. 3. EIP is built on a widely accepted protocol layer EIP is constructed from a very widely implemented standard used in DeviceNet and ControlNet called the Control and Information Protocol (CIP) and is illustrated on the attached drawing. This standard organizes networked devices as a collection of objects. It defines the access, object behavior and extensions which allow widely disparate devices to be accessed using a common mechanism. Over 300 vendors now support the CIP protocol in present day products. Using this technology in EIP means that EIP is based on a widely understood, widely implemented standard that does not require a new technology shakedown period. EtherNet Gateway on a CB34 EX The fastest, easiest way to move your EtherNet/IP data. More Information ASCII to Ethernet/IP Gateway The fastest way to move ASCII data to in and out of Logix, PLC5 and SLC Controllers! More Information Ethernet/IP Server C Source Code The easiest way to add support EtherNet/IP on all your NetBurner Coldfire products! More Information ### Industrial Automation Industrial Automation Unlocking the power of industrial protocols DeviceNet DeviceNet is a low-level industrial application layer protocol for industrial automation applications. DeviceNet connects simple industrial devices (sensors and actuators) with higher-level devices such as Programmable Controllers. Built on the standard CAN (Controller Area Network) physical communications standard, DeviceNet uses CAN hardware to define an application layer protocol that structures the task of configuring, accessing and controlling industrial automation devices. DeviceNet is very popular in the United States especially with users of Rockwell Automation Programmable Controllers.About DeviceNetDeviceNet Gateways on a CB34 EtherNet/IP EtherNet/IP uses all the transport and control protocols used in traditional Ethernet including the Transport Control Protocol (TCP), the Internet Protocol (IP) and the media access and signaling technologies found in off-the-shelf Ethernet interface cards. Structuring EtherNet/IP on these standard PC technologies allows EtherNet/IP to work transparently with all the standard off-the-shelf Ethernet devices found in today's marketplace. It also means that EIP can be easily supported on standard PCs and all their derivatives. Even more importantly, basing EIP on a standard technology platform ensures that EIP will move forward as the base technologies evolve in the future.About EtherNet/IPEtherNet/IP Gateways on a CB34 CANopen CANopen is found in applications as simple as coffee makers and as complex as critical medical and transportation systems. It is also strong in industrial applications.About CANopen Modbus The most widely used protocol in all of industrial automation. A very simple-to-understand and easy to implement device representation and standard serial communications make Modbus very popular.About ModbusModbus Gateways on a CB34 PROFInet IO Built on standard Ethernet technologies, PROFInet IO uses traditional Ethernet hardware and software to define a network that structures the task of exchanging data, alarms and diagnostics with Programmable Controllers and other automation controllers.About PROFInet IO J1939 J1939 is the automotive CAN standard developed by the Truck & Bus Control and Communications Network Subcommittee of the Society of Automotive Engineers. SAE maintains family of standards which govern the design and use of devices that transmit electronic signals and control information among vehicle components. Planned for use in light, medium and heavy-duty trucks, it is also now being used in conventional passenger vehicles.About J1939 ### Newsletter Sign Up * indicates required Email Address * First Name Last Name Send me... Newsletters Product Change Notices and Software Updates Interests DIY Maker Projects Professional Engineering Applications Product Releases Industry Tech News Email Format html text Marketing Permissions: NetBurner, Inc will use the information you provide on this form to be in touch with you and to provide updates and marketing. Please let us know all the ways you would like to hear from us: Emails  Customized online advertising You can change your mind at any time by clicking the unsubscribe link in the footer of any email you receive from us, or by contacting us at nbnews@netburner.com. We will treat your information with respect. For more information visit our privacy page. By clicking Subscribe, you agree that we may process your information in accordance with these terms. We use Mailchimp as our marketing platform. By clicking below to subscribe, you also acknowledge that your information will be transferred to Mailchimp for processing. Learn more about Mailchimp's privacy practices here. View previous campaigns. ### Reviews The following unsolicited customer testimonials were taken from the public newsgroups. The names and email addresses have been removed to protect the privacy of some individuals. "We've just shipped the first of our systems that uses NetBurner. Before I go on, let me thank you (and the other support members at NetBurner) for your patience and advice in helping us get up and running with our new topology." "We got a NetBurner and it looks great. You really can get Networked in 1 day!"
"Check out the NetBurner board (netburner.com). I have been using one for about a year to develop an industrial monitoring and control system. It works as advertised and the software seems stable and genuinely useful. I have no financial interest in NetBurner - just a satisfied customer."
"I had my NetBurner board up on the network in about 15-20 minutes, about the time it took to unpackage it, read the documentation, hookup a small hub and the power supply, and run the configuration program to set the network address."
"We have been using the NetBurner board for a couple of projects and are quite satisfied. We also had NetBurner do custom driver software for proprietary expansion hardware, and I am satisfied with that work as well."
"I should be able to get my demo running by next week. So far I am very impressed with both the NetBurner hardware and software."
"The sample programs are good, and fairly comprehensive for the uses of the board."
"These people make a board based on the ColdFire processor. They provide complete sources including a RTOS with support for http, PPP, telnet, ftp. The tools are the latest GCC and a patched version of newlib to support special hardware instruction to speed up fixed point arithmetic. We have integrated this board into a product of our oun manufacture and have found the Netburner company to be responsive and their product reliable."
"We have been using the NetBurner for a few projects and it is an excellent choice for getting started or just for building network appliances. What's more, their GCC compiler and kernel works right out of the box!! You will be networking in one day -- just like they advertise."
"I really appreciate all the help - you've put us way ahead of the game, and kept us ahead of schedule in general. Thanks again for making this project a success as far as we're concerned!"
### Partners Partners Our partners make everything we do, possible.The following companies have worked with NetBurner to produce hardware or software included in NetBurner products or are VARs who produce hardware or software for their own NetBurner based product. Technology Partners Distributors Consultants Technology Partners​ Microchip TechnologyAs the leading supplier of automotive-qualified Ethernet devices with the broadest portfolio in the market, we have the solution you need to get connected. Our automotive-grade PHYs, switches, bridges, controllers and security ICs are designed to meet the rigorous demands of a wide variety of in-vehicle networking applications. NXPNetBurner is a member of the NXP Design Alliance program. We provide a complete solution for 32-bit microprocessor platforms including: low-cost hardware modules, RTOS, TCP/IP Stack, Web Server, C/C++ compiler, Integrated Development Environment and deployment tools. HCC EmbeddedNetBurner has partnered with HCC Embedded to provide a complete solution for a flash file system and flash memory cards. The Embedded Flash File System (EFFS) enables embedded systems developers to add one or more types of Flash memory storage such as: on-board flash chips, SD Flash Cards, Compact Flash Cards, Multi-Media Cards, RAM Drives, NAND and NOR Flash arrays. Additional features include wear-leveling, bad block management and CRC32 checks. The system contains an easy to use flexible common reentrant API. DMH SoftwareNetBurner and DMH Software have partnered to offer an enhanced SNMP Agent solution for NetBurner platforms. DMH Software, a world-wide provider of SNMP Agent solutions, has integrated the Advanced SNMP Agent SDK into the NetBurner Network Development Kit. DMH Advanced SNMP Agent SDK comes with an SMIv2 MIB-Compiler for Rapid MIB Development. All SNMP versions: SNMPv1, SNMPv2c and SNMPv3 are fully supported. Real Time AutomationMove your data where you want, when you want, and how you want. Real Time Automation offers device converter solutions that move data from one device to another using almost any technology or protocol. Best of all, these devices are simple to use and can be set up and running in less than five minutes. Move your data between EtherNet/IP, DeviceNet, Modbus RTU, Modbus TCP, BACnet/IP, ASCII, Ethernet TCP, and even your proprietary protocol. RTA is also available for software and custom device converters. Distributors Mouser ElectronicsMouser Electronics is one of the 20 largest supplier authorized distributors of electronic components in North America. The company's product lines include semiconductors, passives, interconnects, electromechanical, power sources, embedded development kits, and specialty products. Mouser Electronics is a leading on-line, catalog and national electronics distributor featuring award-winning service. Digi-Key CorporationDigi-Key Corporation is one of the fastest-growing electronic component distributors in the World. Omniscient Electronics Pvt. Ltd.Omniscient Electronics Pvt. Ltd., is a distributor of NetBurner products in India. Consultants Professional Software Associates, Inc.Professional Software Associates, Inc. (PSA), headquartered in Lapeer, Michigan, established in 1993. On the basis of NetBurner products, we are able to design solutions which apply embedded, mobile, client-server, and web technologies to a variety of scientific and engineering challenges with a primary focus on Enterprise IoT. PSA provides its services throughout the United States and internationally. Our solutions are deployed in a range of industries such as rail, medical, industrial, smart buildings, logistics and automotive. We deliver services that create value through the following principles: Disciplined software development process, based on IEEE standards NASA TRL methodology to define the development projects stages profound technical expertise Timely and cost-effective integration of hardware and software technology StratusIOTsolutions, LLCToday’s Tech landscape is churning with new ideas, and one of the most pervasive is the networking of embedded devices and cloud connectivity. Leveraging 9 years of Netburner development, StratusIOTsolutions is completing our 33rd ground-up design using NetBurner SBL2e, PK70, MOD5234, 5234 OEM, and NANO. The-Control-FreakAdd SCPI to your NetBurner controller. We can provide a fully dressed out starting point for your project such as a MOD54415 with a FAT32 MicroSD “hard drive”, extendable web based configuration and display, FTP access to your data files and safe and fast AES Encrypted UDP access. Start your development from a known good starting point and distinguish your product as a polished modern offering while actually saving time and money during development. FractalSmiths, LLCFractalSmiths specializes in developing embedded real-time applications with remote control capabilities utilizing popular IP-based protocols, XML parser, and SQLite for both ad-hoc and conventional networking platforms. Ruff DesignsEmbedded Hardware, software and systems design. Experience with standard modules and complete custom processor designs. SoftwareFlair, Inc.Hardware, software and product designs. In-depth experience with standard modules and complete custom processor designs. Our extensive knowledge of protocols, real-time analysis, error detection. web interfaces, QOS metrics, and transport routing (Ethernet to/from Serial ports), provide an effective and attractive time to market solution. Baring ForgeThe Baring Forge NetBurner engineers have been doing both large and small scale embedded products for over 10 years. Our specialty is the NetBurner platform, but we also have extensive experience in all areas of embedded software, ranging from custom drivers, high performance network stacks, custom boot code, and specialized remote monitoring web interfaces. If you need it done, we have the experience and background to make it happen. In addition, we're able to provide you the PC based tooling you need to interface and manage your targets. Quality documentation (design, requirements, user guides) is part of our normal workflow, and can be tailored to your specific needs. Our team will work with you to get things done. If you're a small business owner looking to bootstrap you're product in, or an established business looking for a robust turnkey platform, we'll work with you to get you the product you need. Pacific ResearchPacific Research has over 25 years of experience in designing industrial and consumer electronic products. Our hardware design skills include analog, digital, mixed signal and embedded microcontrollers, including NetBurner modules. Our software skills include assembly, C/C++, and Pascal for both embedded and Windows applications. We can provide design support beginning with the initial concept, product packaging, circuit board layout, prototypes, software and testing. Once the design is finished, we can also help to get the product into production. Some of our recent projects include; VoIP, RTP for Embedded, porting speech codecs for embedded application, XML phraser for embedded applications, vehicle tracking system, UV disinfection system monitoring, reverse osmosis control systems, including many others. We have also developed electronic device that were built into running shoes. Bluewater Designworks, LLC. Bluewater Designworks is a RI-based product design firm that helps clients integrate software, firmware, electronics, sensors, and mechanical elements into well-considered, microcontroller-based products. We bring 25 years of multidisciplinary experience that includes the launch of many successful consumer, medical and scientific products. We enjoy collaborating with other design professionals, scientists, and your own in-house experts. Whether it's a one-of a kind specialty device, or a high-volume product, we can work to define appropriate requirements, prove feasibility, build prototypes, and get it into the field reliably. Most of our current work focuses on using the NetBurner platform in oceanographic and environmental monitoring instruments that range from simple data loggers to fully autonomous, underwater robots that use multiple processors for tasks like navigation, mission planning and control, manipulator and camera control, and communications via multiple serial, Ethernet or satellite data links. OBE Systems, Inc.Founded in 1991, OBE Systems, Inc. provides embedded hardware and software engineering services to solve a diverse set of problems. Designs include NetBurner-based network appliances, battery powered handheld medical devices, industrial data acquisition systems, motion control software, high-speed interfaces, virtual reality / gaming, RF and IR remotes and communications, keypads, LCD displays, USB. Software/firmware experience with uCOS and the NetBurner platforms, as well as Windows (.Net, MFC, CE), Unix/Linux, Palm, LabView, and many real time operating systems; programming in assembly, C, C++, C#, and Java on 8-, 16- and 32-bit processors. Pesce Pty Ltd.The industrial software division of Pesce Pty Ltd specialize in delivering innovative and robust solutions to industrial, scientific and technical software problems. Our team has extensive experience with C++ software development for the NetBurner platform. Pesce has a proven track record delivering systems to the alternative energy, utilities, food processing and manufacturing industries. We provide software development and rapid prototyping for embedded control systems, data acquisition, process control, simulation, and operator interfaces Kod Integrations, LLC.Kod (code) Integrations, LLC is a software and hardware automation solutions provider, with particular emphasis on software development instrumentation automation and control. For years, we have been providing automated test and systems control solutions for a number of industries seeking cost effective, professional solutions that meet their specific needs. We are well versed in the Netburner product line, with particular emphasis on the PK70 and its numerous personality blades. We have provided solutions to customers that leverage the ongoing list of features made available via the PK70; anywhere from simple data acquisition and data logging to fully architected, fully interactive web-app driven products. Please, visit our Netburner solutions site to learn more about some of our more recent works with the PK70. Kod Integrations has also built its foundations on years of experience in LabVIEW architectural design and development. A developed application can be as simple as a one-off custom GPIB-based instrument driver or as involved as a full on high-throughput manufacturing testing and tracking system. Recognizing the growing need for web-enabled instrumentation integration, we also bring to the table solid experience in Java based web application development. Technologies leveraged are HTML, XHTML, JSP, JSTL, CSS, Javascript, Struts, Java, JDBC and Hibernate. If you have any questions whatsoever or simply want to discuss your particular application, please feel free to contact us. Micro Technology ServicesMTSI is a full service NetBurner design firm. We have not only designed over a dozen different products with embedded NetBurner modules but also provide embedded hardware, software, PCB layout, and assembly solutions. MTSI has been helping companies develop products for over 21 years and has earned PC Magazine's Editor's Choice award for both hardware and software products. Applications using a web interface is one of our specialties. Innovation Design and Solutions, Inc.Innovation Design and Solutions provides electronic design and product development services with a unique perspective and results-oriented approach, offering turnkey product development or consultation with an in-house development team. Services include quick turn prototyping. Innovative Software/Firmware Products, Inc.Innovative Software/Firmware Products, Inc. specializes in software, hardware and firmware development for embedded products. Typical designs include: embedded hardware/firmware, FPGA and FPGA interface logic as well as PC based software for communicating with the embedded device. ISFP, Inc. works closely with clients and provides consulting, quick turn proof of concept prototyping as well as complete solutions. ISFP, Inc. has a wide range of experience in 8/16/32 bit micro controller hardware designs, designs with FPGAs and C/C++ firmware for embedded systems and Windows based products. Ellison Software Consulting, Inc.Founded in 1996, Ellison Software Consulting uses standards based technologies to provide software design and development services for the remote monitoring, control and configuration of internet-enabled devices and services. Ellison Software Consulting works with you to design your enterprise MIB modules and to implement SNMP applications- SNMPv3 Agents within the embedded NetBurner development environment and SNMPv3 management applications for the configuration and monitoring of your NetBurner devices and services. Decades of experience with SNMP applications and MIB design; Java and C/C++. ### Careers Careers Working at NetBurnerOur development team is small and versatile. It isn’t uncommon for our engineers to work at all levels from designing hardware to writing example applications and everywhere in between. Most of our current software is the result of one of our developers sitting down and asking themselves “How can I build something that does this?” “What is the most efficient way we can do that?” or “This seems really hard to do. Is there any way I can make that better?” If you constantly find yourself working on projects and asking yourself these questions, here’s one more “Would you consider a job working at NetBurner?”We believe that every developer should be focused on what drives them. Frequently, that means we sponsor teams to compete in competitions like the Sparkfun Autonomous Vehicles Challenge (AVC) and the X prize challenge. Several of our developers have used our hardware to build home automation software, giant LED displays, worked with robots, and any number of other projects. If you have a passion for making things work, we’re always looking for a few good people. Take a look at who we’re hiring here . Open Positions FIRMWARE ENGINEER SOFTWARE ENGINEER EVANGELIST, CONTENT MARKETER EVANGELIST INTERN FIRMWARE ENGINEER Firmware EngineerNetBurner is looking for someone who likes twiddling bits and talking to things (well, more metaphorically speaking). We’re looking for someone who likes to straddle the line between hardware and software: firmware. Have you ever debugged your code with an oscilloscope? Do you consider parasitic capacitance as part of your software’s performance? Do you like seeing physical things do your bidding? Perhaps this is the right job for you.Responsibilities:Working with hardware engineers on new product developmentAssisting with the bring-up of new hardwareCreating bare metal hardware drivers for peripherals such as SPI, I2C, UART, ADC, DAC and Ethernet controllers.Working with the higher level software team on driver integrationRequirements:Ability to understand reference manuals and synthesize the information into working codeFluent understanding of C/C++ as well as hardware memory mappingThe ability to work well in a loosely structured environment SOFTWARE ENGINEER Development Engineer – Build ToolsResponsibilities:Developing and maintaining GCC based cross-compiling tool chains across multiple OS platformsDeveloping and maintaining GNU Make based build systemsMaintaining a Continuous Integration (Jenkins) system.Qualifications:Professional and positive communication and writing skills.Experience with C/C++.The ability to be self-managed and work well in a loosely structured environment. EVANGELIST, CONTENT MARKETER Evangelist, Content Marketer Responsibilities: Content Marketing Search engine optimization Social media marketing Demonstrations Publishing example applications Creating new content Working as part of our business development team to reach new markets Communicate with customers for research and promotions Administration and updates to our existing website Knowledge of web analytics Gather articles from our engineers to publish in the company newsletter Market research to find interesting topics for learn site articles EVANGELIST INTERN Evangelist Intern Do you ever find yourself working in your field of expertise for fun? Projects can range from purely software to real-time embedded control. Previous projects include: an autonomous vehicle (Sparkfun AVC winner), USB device communication, sensor control and monitoring through cloud services, an interactive kiosk, servo control, an audio player, and streaming websocket based device console. Qualifications: Professional and positive communication and writing skills. Experience with C/C++ You must be self-managed and committed to working in a fast-paced environment. Previous experience completing one or more projects outside of normal classwork Network programming and JavaScript a plus If you don’t see something that fits your skillset, but you still want to work for us, tell us about your dream job and send your resume to jobs@netburner.com. ### Press 2026Spring Forward with NetBurner's New Outdoor NTP1061 Network Time Server2024NetBurner Unveils New Flexible SOMRT1061 System-on-Module for Industrial IoT ApplicationsNetBurner's SOMRT1061 Module Aims to Deliver 'Networking in One Day' for Space-Constrained IoT WorkNetBurner SOMRT1061 – A stamp-sized dual Ethernet SoM powered by NXP’s i.MX RT1061 crossover processorNetBurner SOMRT1061 SoM Features Dual Ethernet in Tiny From Factor2019A Call to Arms: The All-New NetBurner ARM®-Powered IoT System-on-Module2017NetBurner SB800 EX Serial-to-Ethernet Server With Secure WiFi for IoT and Industrial Controls2010Serial to Ethernet with SSH Security and Development Kit Option 2009Serial to Ethernet with SSH and SSL Security for $49 SSH & SSL Suite Secures Small Footprint Embedded Network Devices 2007Embedded Network Controller Kit Eliminates Need to Design Custom Enclosure2006NetBurner Integrates Advanced Flash File System into its Embedded Ethernet Development Kits10/100 Ethernet Module Enables Complex Timing Applications with eTPU Co-processorFully Customizable Industrial CAN Ethernet-Serial ServerNetBurner Introduces $99 Eclipse Network Development Kit for Embedded Ethernet Applications2005NetBurner 32-bit ColdFire Module in 40-Pin DIP for $19 ### RoHS Compliance NetBurner Certificate of RoHS Compliance NetBurner products are RoHS compliant as of March of 2006, and RoHS 3 compliant as of April 22, 2019. Download our RoHS Certificate Of Compliance Restriction of Hazardous Substances (RoHS 3) To the best of our knowledge, based on the information from our suppliers and internal processes within our operation, modules manufactured by NetBurner do not contain any of the hazardous substances above their acceptable limits as described in DIRECTIVE 2011/65/EU of the European Parliament and of the Council of 8 June 2011 on the restriction of the use of certain hazardous substances in electrical and electronic equipment: Hazardous Substance LimitPPM Cadium100 Hexavalent Chromium1000 Lead1000 Mercury1000 Polybrominated Biphenyls (PBB)1000 Polybrominated Diphenyl Ethers (PBDE)1000 Bis(2-ethylhexyl) phthalate (DEHP)1000 Butyl benzyl phthalate (BBP)1000 Dibutyl phthalate (DBP)1000 Diisobutyl phthalate (DIBP)1000 For additional information, please reference the RoHS directive, or the RoHS website. ### Business Continuity Statement Last Updated 23MAR20 Introduction In order to minimize the impact of a significant business disruption, NetBurner has developed a business continuity plan that is designed to safeguard our customers, employees, property, business data, inventory, and manufacturing processes. Due to the sensitive and confidential nature of this information, it is maintained internally. However, in an effort to establish transparency with our customers, and in order to encourage open communication, this document has been written and provided to give an overview of the considerations and preparations that have been made, as well as the steps that would be taken in the event that a disruption does occur. Significant Business Disruptions The significant business disruptions that have been evaluated include, but are not limited to, the following: Flood Fire Earthquake Pandemics IT systems failure (e.g. phone systems and networking) Cybersecurity attacks Loss of key personnel Loss of manufacturing or component suppliers Proactive Steps The ability to recover from a disruption depends heavily on the preparation taken before such an event occurs. NetBurner realizes this, and has taken several proactive measures that are needed to resume business operations should such an event take place. These are steps are expansive, and cover all aspects of the business. Additionally, they are frequently evaluated and improved upon. Some of these measures include the following: Establishing and practicing business wide backup procedures to prevent data loss Backups are maintained onsite, as well as at multiple offsite locations Distributing key business solutions offsite when practical and safe to do so Our systems run on servers located on the East Coast, West Coast, and in Europe Team cross training Equipment maintenance Maintaining and updating employee contact information Establishing communication protocols with customers and employees when a disruption occurs Security policy training and reviews Establishing a list of qualified alternate manufacturing facilities and component suppliers that can handle our production requirements Reactive Steps The exact measures taken in the event of a disruption will vary widely depending on the nature and the severity of the event in question. NetBurner has guidelines, policies, and procedures that are well established with its employee base in order to respond to such disruptions, and reviews these internally on a regular basis. Should such a disruption impact NetBurner’s ability to conduct business on any level, notifications will be sent to affected customers through established channels including, but not limited to: The NetBurner website at www.netburner.com We have the ability to rapidly update our website from multiple locations worldwide Our Part Change Notices (PCN), software update notices, and newsletter Twitter, at @NetBurner Facebook, at https://www.facebook.com/netburner Additionally, we can be reached through our sales email, at sales@netburner.com, which is distributed by offsite servers to the entire sales team as well as to our ticketing system. ### NetBurner Standard Hardware Warranty NetBurner (hereafter referred to as the Seller) warrants that its hardware products (hereafter referred to as Products) sold hereunder will at the time of shipment be free and clear of all liens and encumbrances, and will be free from defects in material and workmanship. Refund/Exchange Policy If products sold hereunder are not as warranted, Seller shall, at its option, refund the purchase price, repair, or replace the product - provided proof of purchase and written notice of non-conformance is received by Seller within one (1) year from date of initial shipment, and provided said nonconforming products are, with Sellers written authorization, returned FOB Seller's authorized repair center within thirty (30) days from expiration of said one year period. This warranty shall not apply to any products Seller determines have been, by Buyer or otherwise, subjected to testing for other than specified electrical characteristics or to operating and/or improper testing, repair, alteration, damage, misuse, mishandling, neglect, assembly or processing that alters physical or electrical properties. This warranty excludes all costs of shipping, customs clearance, and related charges outside the contiguous 48 United States. This warranty excludes all software products. In no event shall Seller be liable for any incidental or consequential damages. This warranty extends to Buyer only and not to Buyer's customers or users of Buyer's products and is in lieu of all other warranties whether express, implied or statutory implied warranties of merchantability or fitness. Order Cancellation Policy Please submit any cancellation via email to sales@netburner.com, or call on our business phone. Email cancellations must contain the following: First name, last name, order number, and email address. This information must be identical to the information originally submitted on your order. Please provide contact information so that we may contact you if we have questions in regard to canceling your order. Every effort will be made to accommodate the cancellation of your order, providing your order has not been charged and/or shipped out. In the event that a cancellation was submitted (via email or phone), and your order was shipped out after, we will gladly refund the complete balance charged including shipping. However, if the cancellation was documented as received after the order was shipped, we will refund the merchandise total less shipping. Shipping Costs Customer assumes all costs in shipping to/from us. All replacement/repaired products are shipped UPS Ground unless a rush is requested. The cost of such a shipping upgrade is to be paid by the customer prior to shipment. Warranty Procedure We suggest you contact our tech support team first by posting a question in our Help Desk to determine whether the item is indeed defective before shipping. Then make an online return merchandise authorization (RMA) request. See Return Policy for more details. Out of Stock Policy The most important thing to keep in mind when ordering is that our stock balances fluctuate throughout the day with sales demand. Items are constantly being sold and our stock is constantly being replenished. Most items ship within 2 weeks. Just because the item you ordered is NOT identified as out-of-stock does not necessarily mean that it will be in-stock at the moment you order it. We will notify you if the item you ordered is out-of-stock. We first try to reply via email and give you 3 days to reply. Be sure to give us your current email address and phone number. If you have any questions about our hardware warranty, please contact us. ### No Access [dlm_no_access] ### Get NNDK Tools Thank you for choosing NetBurner for your product development! The NetBurner Network Development Kit (NNDK) Tools make designing and deploying sophisticated embedded applications easy. If you don't yet have a support account with us, please take a few seconds to create one so we can provide you with the latest software release.  Start at Step 1, below. However, if you already have a support account, login and download the latest version of our development tools here. If you have purchased a development or evaluation kit for one of our Serial to Ethernet devices, you can find the Quick Start Guide and links to the Serial to Ethernet Application manuals here.If you have purchased a development kit for one of our System on Modules, select your device from the dropdown list to find the relevant Quick Start Guide. MODM7AE70 NANO54415 MOD54415 MOD54417 MOD5270 MOD5234 MOD5213 SOMRT1061 MODM7AE70 Quick Start GuideSOMRT1061 Quick Start GuideNANO54415 Quick Start GuideMOD54415 Quick Start GuideMOD54417 Quick Start GuideMOD5270 Quick Start GuideMOD5234 Quick Start GuideMOD5213 Quick Start Guide Step 1: Register a new NetBurner Support AccountNOTE: You will need to enter the entire serial number including the platform type (no spaces).For example: "MODXXXXX:12342343242432"The red card that came with your development kit contains the serial number you will need to create your support account and to install the software. Step 2: Registering will enable you to:Download the latest NNDK software (You will need the serial number to unlock the NNDK software.)Create new support requestsKeep a history of past support requests Step 3: Begin reading the NetBurner Eclipse Getting Started GuideLoad application examples from the C:nburnexamples directory Additional Application Resources Technical Support: https://support.netburner.com/Customer Forum: https://forum.embeddedethernet.com/Application Notes: Available on product page for each hardware platform. ### Contact Contact Us! Whatever your question or problem is, we're here to help. Notice: JavaScript is required for this content. Mailing AddressNetBurner, Inc.16855 W Bernardo Drive, Ste 260San Diego, CA 92127P: (858) 558-0293F: (858) 558-8549General Information and Salessales@netburner.comSupport ResourcesCustomer Support Website Facebook Twitter Linkedin Youtube ### Privacy Policy For each visitor to NetBurner's website, our web server does not automatically recognize information regarding the domain or e-mail address. We collect, store, and analyze information from our website traffic for statistical purposes. For example, we count the number of visitors to the different pages of our website in order to help make them more useful to visitors. This information does not, and will never, identify you personally. Additionally, we utilize 3rd party tools to help aggregate and make sense of this data. Specifically, these are Google Analytics, Facebook Analytics, and Hotjar. Any personal information that we collect is volunteered by the consumer. This includes site registrations for NetBurner support, emails to our sales department, signing up for our monthly newsletter, or registering for our forums at forum.embeddedethernet.com. This information is used to customize the content and/or layout of our page for each individual visitor, used to notify consumers about updates to our website and/or products, used by us to contact consumers (when requested by customer) for marketing purposes, and to assist our customers during support and sales requests. This information is never sold to third parties. Our customers always have the following rights: Right to be forgotten: Subscribers may contact NetBurner directly to request deletion of their data from individual user's accounts, or across multiple NetBurner users' accounts (if applicable), unless it is prohibited by law. Right to object: Subscribers or contact have a right to contact us to object or stop the use of their data for direct marketing. Right to rectification: You may access and update your subscriber profile to correct or complete subscriber/contact information upon their request at any time. In addition, subscribers and customers may contact NetBurner directly to access, correct, and/or delete information that may be held about the data subject. Right of access: Our Privacy Policy describes what data we collect and how we use it. As mentioned above, subscribers or contacts may contact us directly to request to access information that we hold about them. Right of portability: You may request that we transfer or export your data in a machine readable format such as CSV. With respect to Ad Servers: We do not partner with or have special relationships with any ad server companies. If you feel that this site is not following its stated information policy, or if you have any questions, comments, or requests regarding your personal data and our policies, please contact us. Who we are Our website address is: https://netburner.com. What personal data we collect and why we collect it Comments When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection. An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment. Media If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download and extract any location data from images on the website. Contact forms We use contact forms to provide a convenient method to contact us. We do not share that data with 3rd parties and securely store such correspondence. Cookies If you leave a comment on our site you may opt-in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year. If you have an account and you log in to this site, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser. When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed. If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day. Embedded content from other websites Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website. These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website. Analytics Who we share your data with We collect, store, and analyze information from our website traffic for statistical purposes. For example, we count the number of visitors to the different pages of our website in order to help make them more useful to visitors. This information does not, and will never, identify you personally. Additionally, we utilize 3rd party tools to help aggregate and make sense of this data. Specifically, these are Google Analytics, Facebook Analytics, and Hotjar. How long we retain your data If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognize and approve any follow-up comments automatically instead of holding them in a moderation queue. For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information. What rights you have over your data If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes. Where we send your data Visitor comments may be checked through an automated spam detection service. Your contact information Any personal information that we collect is volunteered by the consumer. This includes site registrations for NetBurner support, emails to our sales department, signing up for our monthly newsletter, or registering for our forums at forum.embeddedethernet.com. This information is used to customize the content and/or layout of our page for each individual visitor, used to notify consumers about updates to our website and/or products, used by us to contact consumers (when requested by customer) for marketing purposes, and to assist our customers during support and sales requests. This information is never sold to third parties. Additional information How we protect your data We utilize multiple firewalls, encryption techniques and company personnel policies to ensure that data is secure and protected. We used tools to monitor system incursions, transgressions and access and hack events. What data breach procedures we have in place We will contact users and the authorities as soon as practicable upon discovery of a data breach. What third parties we receive data from We utilize 3rd party tools to help aggregate and make sense of this data. Specifically, these are Google Analytics, Facebook Analytics, and Hotjar. What automated decision making and/or profiling we do with user data We may run digital advertising utilizing re-marketing techniques that involve cookies on occasion. ### Ts and Cs Terms and Conditions of Sale Please download the following to view the NetBurner Terms and Conditions of Sale Terms and Conditions of Use PLEASE READ THE FOLLOWING TERMS AND CONDITIONS OF USE CAREFULLY BEFORE USING THIS WEBSITE. All users of this site agree that access to and use of this site are subject to the following terms and conditions and other applicable law. If you do not agree to these terms and conditions, please do not use this site. Copyright The entire content included in this site, including but not limited to text, graphics or code is copyrighted as a collective work under the United States and other copyright laws, and is the property of NetBurner, Inc.. The collective work includes works that are licensed to NetBurner, Inc.. Copyright 2003, NetBurner, Inc. ALL RIGHTS RESERVED. Permission is granted to electronically copy and print hard copy portions of this site for the sole purpose of placing an order with NetBurner, Inc. or purchasing NetBurner, Inc. products. You may display and, subject to any expressly stated restrictions or limitations relating to specific material, download or print portions of the material from the different areas of the site solely for your own non-commercial use, or to place an order with NetBurner, Inc. or to purchase NetBurner, Inc. products. Any other use, including but not limited to the reproduction, distribution, display or transmission of the content of this site is strictly prohibited, unless authorized by NetBurner, Inc.. You further agree not to change or delete any proprietary notices from materials downloaded from the site. Trademarks All trademarks, service marks and trade names of NetBurner, Inc. used in the site are trademarks or registered trademarks of NetBurner, Inc. Warranty Disclaimer This site and the materials and products on this site are provided "as is" and without warranties of any kind, whether express or implied. To the fullest extent permissible pursuant to applicable law, NetBurner, Inc. disclaims all warranties, express or implied, including, but not limited to, implied warranties of merchantability and fitness for a particular purpose and non-infringement. NetBurner, Inc. does not represent or warrant that the functions contained in the site will be uninterrupted or error-free, that the defects will be corrected, or that this site or the server that makes the site available are free of viruses or other harmful components. NetBurner, Inc. does not make any warrantees or representations regarding the use of the materials in this site in terms of their correctness, accuracy, adequacy, usefulness, timeliness, reliability or otherwise. Some states do not permit limitations or exclusions on warranties, so the above limitations may not apply to you. Limitation of Liability NetBurner, Inc. shall not be liable for any special or consequential damages that result from the use of, or the inability to use, the materials on this site or the performance of the products, even if NetBurner, Inc. has been advised of the possibility of such damages. Applicable law may not allow the limitation of exclusion of liability or incidental or consequential damages, so the above limitation or exclusion may not apply to you. Typographical Errors In the event that a NetBurner, Inc. product is mistakenly listed at an incorrect price, NetBurner, Inc. reserves the right to refuse or cancel any orders placed for product listed at the incorrect price. NetBurner, Inc. reserves the right to refuse or cancel any such orders whether or not the order has been confirmed and your credit card charged. If your credit card has already been charged for the purchase and your order is cancelled, NetBurner, Inc. shall issue a credit to your credit card account in the amount of the incorrect price. Term & Termination These terms and conditions are applicable to you upon your accessing the site and/or completing the registration or shopping process. These terms and conditions, or any part of them, may be terminated by NetBurner, Inc. without notice at any time, for any reason. The provisions relating to Copyrights, Trademark, Disclaimer, Limitation of Liability, Indemnification and Miscellaneous, shall survive any termination. Notice NetBurner, Inc. may deliver notice to you by means of e-mail, a general notice on the site, or by other reliable method to the address you have provided to NetBurner, Inc.. Miscellaneous Your use of this site shall be governed in all respects by the laws of the state of California, U.S.A., without regard to choice of law provisions, and not by the 1980 U.N. Convention on contracts for the international sale of goods. You agree that jurisdiction over and venue in any legal proceeding directly or indirectly arising out of or relating to this site (including but not limited to the purchase of NetBurner, Inc. products) shall be in the state or federal courts located in Los Angeles County, California. Any cause of action or claim you may have with respect to the site (including but not limited to the purchase of NetBurner, Inc. products) must be commenced within one (1) year after the claim or cause of action arises. NetBurner, Inc.'s failure to insist upon or enforce strict performance of any provision of these terms and conditions shall not be construed as a waiver of any provision or right. Neither the course of conduct between the parties nor trade practice shall act to modify any of these terms and conditions. NetBurner, Inc. may assign its rights and duties under this Agreement to any party at any time without notice to you. Use of Site Harassment in any manner or form on the site, including via e-mail, chat, or by use of obscene or abusive language, is strictly forbidden. Impersonation of others, including a NetBurner, Inc. or other licensed employee, host, or representative, as well as other members or visitors on the site is prohibited. You may not upload to, distribute, or otherwise publish through the site any content which is libelous, defamatory, obscene, threatening, invasive of privacy or publicity rights, abusive, illegal, or otherwise objectionable which may constitute or encourage a criminal offense, violate the rights of any party or which may otherwise give rise to liability or violate any law. You may not upload commercial content on the site or use the site to solicit others to join or become members of any other commercial online service or other organization. Participation Disclaimer NetBurner, Inc. does not and cannot review all communications and materials posted to or created by users accessing the site, and is not in any manner responsible for the content of these communications and materials. You acknowledge that by providing you with the ability to view and distribute user-generated content on the site, NetBurner, Inc. is merely acting as a passive conduit for such distribution and is not undertaking any obligation or liability relating to any contents or activities on the site. However, NetBurner, Inc. reserves the right to block or remove communications or materials that it determines to be (a) abusive, defamatory, or obscene, (b) fraudulent, deceptive, or misleading, (c) in violation of a copyright, trademark or; other intellectual property right of another or (d) offensive or otherwise unacceptable to NetBurner, Inc. in its sole discretion. Indemnification You agree to indemnify, defend, and hold harmless NetBurner, Inc., its officers, directors, employees, agents, licensors and suppliers (collectively the "Service Providers") from and against all losses, expenses, damages and costs, including reasonable attorneys' fees, resulting from any violation of these terms and conditions or any activity related to your account (including negligent or wrongful conduct) by you or any other person accessing the site using your Internet account. Third-Party Links In an attempt to provide increased value to our visitors, NetBurner, Inc. may link to sites operated by third parties. However, even if the third party is affiliated with NetBurner, Inc., NetBurner, Inc. has no control over these linked sites, all of which have separate privacy and data collection practices, independent of NetBurner, Inc.. These linked sites are only for your convenience and therefore you access them at your own risk. Nonetheless, NetBurner, Inc. seeks to protect the integrity of its website and the links placed upon it and therefore requests any feedback on not only its own site, but for sites it links to as well (including if a specific link does not work). Taxes and other charges Prices are exclusive of taxes, impositions and other charges, including sales, use, excise, value-added (VAT) and similar taxes or charges imposed by any government authority, international shipping charges, forwarding agent's and broker's fees, bank fees, consular fees, document fees, and import duties. If applicable, VAT, along with any applicable brokerage fees, will be due at time of delivery. If you feel that this site is not following its stated information policy, please contact us. ### NetBurner Platform & 2.8 Product Documentation & Downloads Need the latest 3.0 Documentation? Try this page instead. Tabular Search File Tree Explorer Tabular Search Explore NetBurner 2.8 Docs with Searchable Table: Title Categories Update Date Download Adding an Ethernet RJ-45 Connector 1 file(s) 27451 downloads Legacy MOD5272 Docs, Legacy MOD5282 Docs, MOD5234 Docs, MOD5270 Docs, MOD5441X Docs, PINK70 LC Docs, SB70LC Docs, SBE70 LC Docs, SBL2E CHIP & BOB Docs, SBL2E Docs July 12, 2021 Download ARM Cortex-M7 Processor Technical Reference Manual 1 file(s) 11901 downloads MODM7AE70 Docs, SBE70 LC Docs, SOMRT1061 Docs December 14, 2023 Download ARMv7-M Architecture Reference Manual 1 file(s) 6823 downloads MODM7AE70 Docs, SBE70 LC Docs, SOMRT1061 Docs December 14, 2023 Download AutoUpdate (OS X) 1 file(s) 51001 downloads Deployment Tools October 11, 2018 Download AutoUpdate (Windows) 1 file(s) 58897 downloads Deployment Tools September 22, 2021 Download Blade Board Mechanical Diagram 1 file(s) 9114 downloads PK70 EX Docs October 11, 2018 Download CAR-SOMRT1061 200IR Mechanical Diagram 1 file(s) 662 downloads SOMRT1061 Docs March 1, 2024 Download CB34 EX Datasheet 1 file(s) 17822 downloads CB34 EX CAN Docs November 13, 2023 Download CB34 EX Hardware Manual 1 file(s) 8764 downloads CB34 EX CAN Docs March 23, 2020 Download CB34 EX Hardware Revision 1 file(s) 9640 downloads CB34 EX CAN Docs March 23, 2020 Download CB34 EX Hardware Revision Comparison 1 file(s) 8124 downloads CB34 EX CAN Docs March 23, 2020 Download CB34 EX Latest Factory Application Firmware 2 file(s) 9425 downloads CB34 EX CAN Docs April 30, 2024 Download CB34 EX Mechanical Diagram (Bottom) 1 file(s) 5087 downloads CB34 EX CAN Docs March 23, 2020 Download CB34 EX Mechanical Diagram (Top) 1 file(s) 6515 downloads CB34 EX CAN Docs March 23, 2020 Download CB34 EX Quick Start Guide 1 file(s) 13117 downloads CB34 EX CAN Docs March 23, 2020 Download Certificates and Keys 1 file(s) 13038 downloads PINK70 LC Application Notes, SB700EX Application Notes, SB70LC Application Notes, SB800EX Application Notes October 11, 2018 Download Comparing RTOS to Infinite Loop Designs 1 file(s) 68052 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, MODM7AE70 Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Application Notes, PK70 EX MMS Development Kit, PK70 EX NTP Application Notes, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBE70 LC Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit June 23, 2021 Download Creating a Custom Square Wave 1 file(s) 2610 downloads MOD5213 Development Kit October 11, 2018 Download Custom Baud Rates 1 file(s) 57723 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, NBWIFIN Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBE70 LC Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit July 2, 2021 Download Databus I/O Expansion 1 file(s) 16832 downloads Legacy MOD5272 Application Notes, Legacy MOD5282 Application Notes, MOD5234 Application Notes, MOD5270 Application Notes, MOD5441X Application Notes October 10, 2018 Download Debugging Network Communications 1 file(s) 38913 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, NBWIFIN Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download DIN-100 Mechanical Diagram 1 file(s) 23757 downloads CB34 EX CAN Docs, Legacy SB72 EX Docs, PK70 EX 232 Docs, PK70 EX 485 Docs, PK70 EX Docs, PK70 EX MMS Docs, PK70 EX NTP Docs, SB700EX Docs, SB800EX Docs October 10, 2018 Download DIN-200 Mechanical Diagram 1 file(s) 24895 downloads CB34 EX CAN Docs, Legacy SB72 EX Docs, PK70 EX 232 Docs, PK70 EX 485 Docs, PK70 EX Docs, PK70 EX MMS Docs, PK70 EX NTP Docs, SB700EX Docs, SB800EX Docs October 10, 2018 Download Embedded Flash File System Implementation Guide 1 file(s) 52095 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit October 11, 2018 Download Embedded Flash File System Programming Guide 1 file(s) 11095 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit October 10, 2018 Download Errata: MOD-DEV-100 1 file(s) 12009 downloads Legacy MOD5272 Docs, Legacy MOD5282 Docs, MOD5234 Docs, MOD5270 Docs October 10, 2018 Download eTPU 1 file(s) 5627 downloads MOD5234 Application Notes October 11, 2018 Download Freescale Coldfire MCF5213 Errata 1 file(s) 1380 downloads MOD5213 Development Kit October 10, 2018 Download Freescale Coldfire MCF5213 Hardware Specification 1 file(s) 1334 downloads MOD5213 Development Kit October 10, 2018 Download Freescale Coldfire MCF5213 Reference Manual 1 file(s) 1784 downloads MOD5213 Development Kit October 10, 2018 Download Freescale Coldfire MCF52235 Datasheet 1 file(s) 2985 downloads SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 10, 2018 Download Freescale Coldfire MCF52235 Errata 1 file(s) 3352 downloads SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 10, 2018 Download Freescale Coldfire MCF52235 Reference Manual 1 file(s) 3312 downloads SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 10, 2018 Download Freescale Coldfire MCF5235 Errata 1 file(s) 2126 downloads CB34 EX CAN Development Kit, MOD5234 Development Kit October 10, 2018 Download Freescale Coldfire MCF5235 Hardware Specification 1 file(s) 2271 downloads CB34 EX CAN Development Kit, MOD5234 Development Kit October 10, 2018 Download Freescale Coldfire MCF5235 Reference Manual 1 file(s) 3718 downloads CB34 EX CAN Development Kit, MOD5234 Development Kit October 10, 2018 Download Freescale Coldfire MCF5271 Errata 1 file(s) 5914 downloads Legacy SB70 Development Kit, MOD5270 Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit October 10, 2018 Download Freescale Coldfire MCF5271 Hardware Specification 1 file(s) 5805 downloads Legacy SB70 Development Kit, MOD5270 Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit October 10, 2018 Download Freescale Coldfire MCF5271 Reference Manual 1 file(s) 5650 downloads Legacy SB70 Development Kit, MOD5270 Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit October 10, 2018 Download Freescale Coldfire MCF5272 Errata 1 file(s) 1354 downloads Legacy MOD5272 Development Kit, Legacy SB72 EX Development Kit October 10, 2018 Download Freescale Coldfire MCF5272 User’s Manual 1 file(s) 1899 downloads Legacy MOD5272 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit February 1, 2019 Download Freescale Coldfire MCF5282 Reference Manual 1 file(s) 1390 downloads Legacy MOD5282 Development Kit October 10, 2018 Download Freescale Coldfire MCF5441x Datasheet 1 file(s) 3452 downloads MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, SB800EX Development Kit October 10, 2018 Download Freescale Coldfire MCF5441x Errata 1 file(s) 2830 downloads MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, SB800EX Development Kit October 10, 2018 Download Freescale Coldfire MCF5441x Reference Manual 1 file(s) 3175 downloads MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, SB800EX Development Kit October 10, 2018 Download Getting Started Guide: NetBurner's Eclipse IDE (NBEclipse) 1 file(s) 19274 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download How to Increase User Flash Storage 1 file(s) 12424 downloads Legacy MOD5272 Application Notes, Legacy MOD5282 Application Notes, Legacy SB70 Application Notes, Legacy SB72 Application Notes, MOD5270 Application Notes, PINK70 Application Notes, PINK70 LC Application Notes October 10, 2018 Download How To Order A NetBurner Part With Options 1 file(s) 34713 downloads CB34 EX CAN Docs, Legacy SB72 Docs, PK70 EX 232 Docs, PK70 EX 485 Docs, PK70 EX Docs, PK70 EX MMS Docs, PK70 EX NTP Docs, SB700EX Docs, SB800EX Docs, SBL2e XA Docs, SBL2EX Docs October 10, 2018 Download How to Write Your Own Serial Driver (serial 70) 1 file(s) 30559 downloads Legacy SB70 Development Kit, MOD5270 Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit October 11, 2018 Download How to Write Your Own Serial Driver (serial 72) 1 file(s) 3688 downloads Legacy MOD5272 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit October 11, 2018 Download I2C I/O Expansion 1 file(s) 15329 downloads Legacy MOD5272 Application Notes, Legacy MOD5282 Application Notes, MOD5234 Application Notes, MOD5270 Application Notes, MOD5441X Application Notes October 11, 2018 Download IP Setup 1 file(s) 106806 downloads 3.0 Deployment Tools, Deployment Tools February 1, 2019 Download Legacy MOD5272 Datasheet 1 file(s) 5203 downloads Legacy MOD5272 Docs November 10, 2023 Download Legacy MOD5272 Quick Start Guide 1 file(s) 2295 downloads Legacy MOD5272 Docs October 10, 2018 Download Legacy MOD5282 Datasheet 1 file(s) 11667 downloads Legacy MOD5282 Docs November 10, 2023 Download Legacy MOD5282 Quick Start Guide 1 file(s) 2786 downloads Legacy MOD5282 Docs October 10, 2018 Download Legacy NBWIFIUG Datasheet 1 file(s) 3105 downloads Legacy NBWIFIUG Docs October 10, 2018 Download Legacy NBWIFIUG Mechanical Diagram 1 file(s) 2024 downloads Legacy NBWIFIUG Docs October 11, 2018 Download Legacy NBWIFIUG Product Discontinuation Notice 1 file(s) 2515 downloads Legacy NBWIFIUG Docs October 11, 2018 Download Legacy NBWIFIUG Quick Start Guide 1 file(s) 1954 downloads Legacy NBWIFIUG Docs October 11, 2018 Download Legacy SB70 Datasheet 1 file(s) 8770 downloads Legacy SB70 Docs November 10, 2023 Download Legacy SB70 Latest Factory Application Firmware 1 file(s) 2076 downloads Legacy SB70 Docs October 11, 2018 Download Legacy SB70 Quick Start Guide 1 file(s) 4746 downloads Legacy SB70 Docs October 11, 2018 Download Legacy SB70 User's Manual 1 file(s) 1971 downloads Legacy SB70 Docs October 11, 2018 Download Legacy SB72 Datasheet 1 file(s) 5652 downloads Legacy SB72 Docs November 13, 2023 Download Legacy SB72 EX Datasheet 1 file(s) 4720 downloads Legacy SB72 EX Docs November 10, 2023 Download Legacy SB72 EX Latest Factory Application Firmware 1 file(s) 1484 downloads Legacy SB72 EX Docs October 11, 2018 Download Legacy SB72 EX Mechanical Diagram 1 file(s) 1132 downloads Legacy SB72 EX Docs October 11, 2018 Download Legacy SB72 EX Quick Start Guide 1 file(s) 2298 downloads Legacy SB72 EX Docs October 11, 2018 Download Legacy SB72 EX Recovery 1 file(s) 3154 downloads Legacy SB72 EX Development Kit October 11, 2018 Download Legacy SB72 EX Revision History 1 file(s) 956 downloads Legacy SB72 EX Docs October 11, 2018 Download Legacy SB72 EX Serial Tunneling 1 file(s) 1497 downloads Legacy SB72 EX Docs October 11, 2018 Download Legacy SB72 General Purpose I/O 1 file(s) 1706 downloads Legacy SB72 Application Notes October 11, 2018 Download Legacy SB72 Mechanical Diagram 1 file(s) 1434 downloads Legacy SB72 Docs October 11, 2018 Download Legacy SB72 Mechanical Diagram 1 file(s) 1932 downloads Legacy SB72 Docs October 11, 2018 Download Legacy SB72 Monitor Recovery 1 file(s) 940 downloads Legacy SB72 Development Kit October 10, 2018 Download Legacy SB72 Part Change Notice: Ethernet PHY Updated 1 file(s) 2084 downloads Legacy SB72 Docs October 11, 2018 Download Legacy SB72 PHY Patch 1 file(s) 1322 downloads Legacy SB72 Docs October 11, 2018 Download Legacy SB72 Quick Start Guide 1 file(s) 1780 downloads Legacy SB72 Docs October 11, 2018 Download Legacy SB72 Revision History 1 file(s) 1067 downloads Legacy SB72 Docs October 11, 2018 Download Legacy SB72 User's Manual 1 file(s) 1777 downloads Legacy SB72 EX Docs October 11, 2018 Download Legacy SB72 User's Manual 1 file(s) 1598 downloads Legacy SB72 Docs October 11, 2018 Download LocalDiscovery Tool (NNDK 3.x) 1 file(s) 7315 downloads September 26, 2019 Download macOS Big Sur PCN 1 file(s) 66271 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, NBWIFIN Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBE70 LC Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit July 2, 2021 Download MCF5272 End Of Life Notice 1 file(s) 6188 downloads End of Life Products November 18, 2020 Download Mechanical Diagram (Bottom) 1 file(s) 1657 downloads SB700EX Docs October 11, 2018 Download Mechanical Diagram (Top) 1 file(s) 3566 downloads SB700EX Docs October 11, 2018 Download MOD Mechanical Diagram (100 Version) 1 file(s) 16672 downloads Legacy MOD5272 Docs, Legacy MOD5282 Docs, MOD5234 Docs, MOD5270 Docs, MOD5441X Docs October 10, 2018 Download MOD Mechanical Diagram (200 Version) 1 file(s) 15960 downloads Legacy MOD5272 Docs, Legacy MOD5282 Docs, MOD5234 Docs, MOD5270 Docs, MOD5441X Docs October 10, 2018 Download MOD5213 Configuration: MOD-DEV-40 1 file(s) 2677 downloads MOD5213 Docs October 10, 2018 Download MOD5213 Datasheet 1 file(s) 4653 downloads MOD5213 Docs November 10, 2023 Download MOD5213 General Purpose I/O 1 file(s) 3283 downloads MOD5213 Application Notes October 10, 2018 Download MOD5213 Interrupt Controller 1 file(s) 2008 downloads MOD5213 Application Notes October 10, 2018 Download MOD5213 Mechanical Diagram (100 Version) 1 file(s) 2172 downloads MOD5213 Docs October 11, 2018 Download MOD5213 Pin I/O Class 1 file(s) 3397 downloads MOD5213 Application Notes October 10, 2018 Download MOD5213 Programmable Interrupt Timer 1 file(s) 2600 downloads MOD5213 Application Notes October 10, 2018 Download MOD5213 Programming Guide 1 file(s) 3059 downloads MOD5213 Development Kit October 10, 2018 Download MOD5213 Pulse Width Modulation 1 file(s) 2592 downloads MOD5213 Application Notes October 10, 2018 Download MOD5213 Quick Start Guide 1 file(s) 2873 downloads MOD5213 Docs October 10, 2018 Download MOD5213 RS-232/ CAN Transceiver 1 file(s) 1856 downloads MOD5213 Application Notes October 10, 2018 Download MOD5213 Schematic 1 file(s) 2070 downloads MOD5213 Docs October 10, 2018 Download MOD5213 Schematic: MOD-DEV-40 1 file(s) 2230 downloads MOD5213 Docs October 10, 2018 Download MOD5234 1588 Datasheet 1 file(s) 7953 downloads November 10, 2023 Download MOD5234 Datasheet 1 file(s) 13188 downloads MOD5234 Docs November 10, 2023 Download MOD5234 DMA Timer 1 file(s) 12844 downloads CB34 EX CAN Application Notes, MOD5234 Application Notes October 10, 2018 Download MOD5234 DMA Timer 1 file(s) 5398 downloads MOD5234 Application Notes October 11, 2018 Download MOD5234 General Purpose I/O 1 file(s) 5223 downloads MOD5234 Application Notes October 10, 2018 Download MOD5234 Hardware Design Notes 1 file(s) 5828 downloads MOD5234 Application Notes October 10, 2018 Download MOD5234 How to Write Your Own Serial Driver 1 file(s) 6395 downloads MOD5234 Development Kit October 11, 2018 Download MOD5234 Interrupt Controller 1 file(s) 11555 downloads CB34 EX CAN Application Notes, MOD5234 Application Notes October 10, 2018 Download MOD5234 Pin I/O Class 1 file(s) 5707 downloads MOD5234 Application Notes October 10, 2018 Download MOD5234 Programmable Interrupt Timer 1 file(s) 13496 downloads CB34 EX CAN Application Notes, MOD5234 Application Notes October 10, 2018 Download MOD5234 Quick Start Guide 1 file(s) 5744 downloads MOD5234 Docs October 10, 2018 Download MOD5234 Quick Start Guide (LC Version) 1 file(s) 10165 downloads MOD5234 Docs October 10, 2018 Download MOD5270 Datasheet 1 file(s) 16037 downloads MOD5270 Docs November 10, 2023 Download MOD5270 DMA Timer 1 file(s) 5436 downloads MOD5270 Application Notes October 10, 2018 Download MOD5270 General Purpose I/O 1 file(s) 5397 downloads MOD5270 Application Notes October 10, 2018 Download MOD5270 Hardware Design Notes 1 file(s) 5289 downloads MOD5270 Application Notes October 10, 2018 Download MOD5270 Interrupts 1 file(s) 24290 downloads Legacy SB70 Application Notes, MOD5270 Application Notes, PK70 EX 232 Application Notes, PK70 EX 485 Application Notes, PK70 EX Application Notes, PK70 EX MMS Application Notes, PK70 EX NTP Application Notes, SB700EX Application Notes, SB70LC Application Notes, SB800EX Application Notes October 10, 2018 Download MOD5270 Pin I/O Class 1 file(s) 6642 downloads MOD5270 Application Notes October 10, 2018 Download MOD5270 Quick Start Guide 1 file(s) 10062 downloads MOD5270 Docs October 10, 2018 Download MOD5270 Quick Start Guide (LC Version) 1 file(s) 7221 downloads MOD5270 Docs October 10, 2018 Download MOD5272 Example of an Interrupt Request 1 file(s) 1402 downloads Legacy MOD5272 Development Kit October 10, 2018 Download MOD5272 General Purpose I/O 1 file(s) 997 downloads Legacy MOD5272 Application Notes October 10, 2018 Download MOD5272 Hardware Design Notes 1 file(s) 983 downloads Legacy MOD5272 Application Notes October 10, 2018 Download MOD5272 Pin I/O Class 1 file(s) 1296 downloads Legacy MOD5272 Application Notes October 10, 2018 Download MOD5282 Dev Source 1 file(s) 1464 downloads Legacy MOD5282 Development Kit October 10, 2018 Download MOD5282 End of Life Notice 1 file(s) 415 downloads End of Life Products, Legacy MOD5282 Docs May 22, 2024 Download MOD5282 General Purpose I/O 1 file(s) 1258 downloads Legacy MOD5282 Application Notes October 10, 2018 Download MOD5282 Hardware Design Notes 1 file(s) 1409 downloads Legacy MOD5282 Application Notes October 10, 2018 Download MOD5282 How to Install Dev Driver 1 file(s) 1334 downloads Legacy MOD5282 Development Kit October 10, 2018 Download MOD5282 How to Write Your Own Serial Driver 1 file(s) 2168 downloads Legacy MOD5282 Development Kit October 11, 2018 Download MOD5282 Interrupts 1 file(s) 1902 downloads Legacy MOD5282 Application Notes October 10, 2018 Download MOD5282 Pin I/O Class 1 file(s) 2399 downloads Legacy MOD5282 Application Notes October 10, 2018 Download MOD5282 Programmable Interrupt Timer 1 file(s) 2746 downloads Legacy MOD5282 Application Notes October 10, 2018 Download MOD5282 Pulse Width Modulation 1 file(s) 1627 downloads Legacy MOD5282 Application Notes October 10, 2018 Download MOD54415 Pin I/O Class 1 file(s) 4991 downloads MOD5441X Application Notes October 10, 2018 Download MOD54415 Quick Start Guide 1 file(s) 5177 downloads MOD5441X Docs October 10, 2018 Download MOD54417 Mechanical Diagram (100 Version) 1 file(s) 2148 downloads MOD5441X Docs October 10, 2018 Download MOD54417 Mechanical Diagram (200 Version) 1 file(s) 2288 downloads MOD5441X Docs October 10, 2018 Download MOD54417 Quick Start Guide 1 file(s) 4610 downloads MOD5441X Docs October 10, 2018 Download MOD5441X Embedded Ethernet System on Module Datasheet 1 file(s) 16248 downloads MOD5441X Docs November 10, 2023 Download MOD5441X Product Change Notice 1 file(s) 5314 downloads MOD5441X Docs December 14, 2020 Download MOD5441X STEP Files 3 file(s) 1684 downloads MOD5441X Docs December 15, 2023 Download MODM7AE70 Datasheet 1 file(s) 13411 downloads MODM7AE70 Docs November 10, 2023 Download MODM7AE70 Mechanical Diagram (100 Version) 1 file(s) 4448 downloads MODM7AE70 Docs December 14, 2023 Download MODM7AE70 STEP Files 2 file(s) 1206 downloads MODM7AE70 Docs December 15, 2023 Download MODRT1171 Datasheet and Pinout 2 file(s) 3 downloads MODRT1171 Docs October 22, 2024 Download MODRT1171 STEP File 1 file(s) 2 downloads MODRT1171 Docs October 22, 2024 Download MTTTY Download 1 file(s) 116688 downloads Deployment Tools July 3, 2019 Download MTTTY Serial Terminal 1 file(s) 67033 downloads 3.0 Deployment Tools, Deployment Tools January 25, 2019 Download NANO54415 Adapter Schematic 1 file(s) 379 downloads NANO54415 Docs April 23, 2024 Download NANO54415 Datasheet 1 file(s) 7373 downloads NANO54415 Docs, NANO54415 Docs November 10, 2023 Download NANO54415 Errata 1 file(s) 753 downloads NANO54415 Development Kit October 10, 2018 Download NANO54415 Latest Factory Application Firmware 2 file(s) 3009 downloads NANO54415 Docs, NANO54415 Docs April 30, 2024 Download NANO54415 Mechanical Diagram (200 Version) 1 file(s) 2850 downloads NANO54415 Docs, NANO54415 Docs October 11, 2018 Download NANO54415 Pin I/O Class 1 file(s) 3386 downloads NANO54415 Application Notes, NANO54415 Application Notes October 10, 2018 Download NANO54415 Quick Start Guide 1 file(s) 3525 downloads NANO54415 Docs, NANO54415 Docs October 10, 2018 Download NBANT-464 (ANT555 Datasheet) 1 file(s) 2941 downloads PK70 EX NTP Docs October 10, 2018 Download NBPKBD-100CR End of Life Notice 1 file(s) 405 downloads End of Life Products, PK70 EX Docs May 2, 2024 Download NBWIFI Adapter Schematic 1 file(s) 546 downloads NBWIFIN Development Kit April 23, 2024 Download NBWIFIIN Datasheet 1 file(s) 13225 downloads NBWIFIIN Development Docs, NBWIFIN Docs April 18, 2024 Download NBWIFIIN Hardware Configuration 1 file(s) 4296 downloads NBWIFIIN Development Docs, NBWIFIN Docs October 5, 2024 Download NBWIFIIN Programmers Guide 1 file(s) 5316 downloads NBWIFIIN Development Docs, NBWIFIN Docs February 12, 2019 Download NBWIFIIN Quick Start Guide 1 file(s) 9947 downloads NBWIFIIN Development Docs February 12, 2019 Download NBWIFIIN Schematic 1 file(s) 4118 downloads NBWIFIIN Development Docs, NBWIFIN Docs February 12, 2019 Download NetBurner License Datasheet and Price List 1 file(s) 4373 downloads October 19, 2018 Download NetBurner Support 1 file(s) 2767 downloads February 3, 2020 Download Network Programming Examples 1 file(s) 59344 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, NBWIFIN Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download Network Programming Guide 1 file(s) 58094 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, NBWIFIN Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download Network Programming Guide 1 file(s) 14312 downloads SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download Network Security Libraries 1 file(s) 66776 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, NBWIFIN Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download NNDK 1.98 RC5 Compile Error for bsp.o 1 file(s) 2797 downloads MOD5213 Development Kit October 11, 2018 Download NNDK Installation Notes 1 file(s) 20789 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, NBWIFIN Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download NNDK USB Driver for Windows 1 file(s) 3261 downloads March 25, 2022 Download PCN 009 – Additional Flash Memory Chip Qualification 1 file(s) 3778 downloads MOD5441X Docs July 30, 2021 Download PCN 012 Ethernet RJ-45 jack modification 1 file(s) 3138 downloads MOD5441X Docs March 2, 2023 Download PCN 013-MOD5441X Additional flash memory chip qualification 1 file(s) 2923 downloads MOD5441X Docs March 2, 2023 Download PCN014-MOD5441x Assembly modifications for MOD54415 revision 2.3, MOD54417 revision 1.6 1 file(s) 2697 downloads MOD5441X Docs March 2, 2023 Download PINK70 / PINK70 LC User's Manual 1 file(s) 3578 downloads PINK70 Docs, PINK70 LC Docs October 11, 2018 Download PINK70 Example Code 1 file(s) 1472 downloads PINK70 Docs October 10, 2018 Download PINK70 HTML Examples 1 file(s) 1909 downloads PINK70 Docs October 10, 2018 Download PINK70 Javelin Stamp Example Code 1 file(s) 1577 downloads PINK70 Docs October 10, 2018 Download PINK70 Latest Factory Application Firmware 1 file(s) 1727 downloads PINK70 Docs October 11, 2018 Download PINK70 LC Latest Factory Application Firmware 1 file(s) 2181 downloads PINK70 LC Docs October 11, 2018 Download PINK70 LC Quick Start Guide 1 file(s) 2178 downloads PINK70 LC Docs October 11, 2018 Download PINK70 Quick Start Guide 1 file(s) 2152 downloads PINK70 Docs October 11, 2018 Download PINK70 Tools 1 file(s) 1491 downloads PINK70 Docs October 11, 2018 Download PINK70 UDP Terminal 1 file(s) 1610 downloads PINK70 Docs October 11, 2018 Download PK70 Custom Design Program 1 file(s) 4790 downloads PK70 EX Development Kit October 11, 2018 Download PK70 EX 232 Datasheet 1 file(s) 5167 downloads PK70 EX 232 Docs November 13, 2023 Download PK70 EX 232 Latest Factory Application Firmware 2 file(s) 2077 downloads PK70 EX 232 Docs April 30, 2024 Download PK70 EX 232 Revision History 1 file(s) 1826 downloads PK70 EX 232 Docs October 11, 2018 Download PK70 EX 232 User's Manual 1 file(s) 2148 downloads PK70 EX 232 Docs October 11, 2018 Download PK70 EX 485 Datasheet 1 file(s) 4547 downloads PK70 EX 485 Docs November 13, 2023 Download PK70 EX 485 Latest Factory Application Firmware 2 file(s) 2111 downloads PK70 EX 485 Docs April 30, 2024 Download PK70 EX 485 Revision History 1 file(s) 1756 downloads PK70 EX 485 Docs October 11, 2018 Download PK70 EX 485 User's Manual 1 file(s) 2117 downloads PK70 EX 485 Docs October 11, 2018 Download PK70 EX Datasheet 1 file(s) 11637 downloads PK70 EX Docs November 13, 2023 Download PK70 EX MMS Datasheet 1 file(s) 4126 downloads PK70 EX MMS Docs November 10, 2023 Download PK70 EX MMS Latest Factory Application Firmware 2 file(s) 2916 downloads PK70 EX MMS Docs April 30, 2024 Download PK70 EX MMS Revision History 1 file(s) 1654 downloads PK70 EX MMS Docs October 11, 2018 Download PK70 EX MMS User's Manual 1 file(s) 2450 downloads PK70 EX MMS Docs October 11, 2018 Download PK70 EX NTP Datasheet 1 file(s) 10682 downloads PK70 EX NTP Docs November 10, 2023 Download PK70 EX NTP Latest Factory Application Firmware 1 file(s) 4864 downloads PK70 EX NTP Docs November 15, 2019 Download PK70 EX NTP Mechanical Diagram (Top) 1 file(s) 4378 downloads PK70 EX NTP Docs October 11, 2018 Download PK70 EX NTP Revision History 1 file(s) 2694 downloads PK70 EX NTP Docs October 11, 2018 Download PK70 EX NTP User’s Manual 1 file(s) 6665 downloads PK70 EX NTP Docs February 7, 2020 Download PK70 EX NTP User's Manual: GPS Blade Board 1 file(s) 4101 downloads PK70 EX NTP Docs October 11, 2018 Download PK70 EX Product Change Notice: Industrial Temperature Range 1 file(s) 6956 downloads PK70 EX Docs October 11, 2018 Download PK70 EX Reference Guide: NBPKBM 1 file(s) 5368 downloads PK70 EX Docs October 11, 2018 Download PK70 EX User's Manual: NBPKX500 1 file(s) 5463 downloads PK70 EX Docs October 11, 2018 Download PK70 Flash Memory PCN 1 file(s) 9544 downloads PK70 EX Development Kit February 22, 2021 Download PK70 Quick Start Guide 1 file(s) 14624 downloads PK70 EX 232 Docs, PK70 EX 485 Docs, PK70 EX Docs, PK70 EX MMS Docs, PK70 EX NTP Docs October 11, 2018 Download Power Over Ethernet 1 file(s) 30441 downloads Legacy MOD5282 Application Notes, MOD5234 Application Notes, MOD5270 Application Notes, MOD5441X Application Notes, NANO54415 Application Notes, NANO54415 Application Notes, SB70LC Application Notes, SBL2E Application Notes, SBL2E CHIP & BOB Application Notes October 11, 2018 Download Price Increase Notice for 2022 1 file(s) 2591 downloads December 10, 2021 Download Programmable Interrupt Timer 1 file(s) 1928 downloads Legacy MOD5272 Application Notes, Legacy SB72 Application Notes, Legacy SB72 EX Application Notes October 11, 2018 Download Programmable Interrupt Timer 1 file(s) 32064 downloads Legacy SB70 Application Notes, MOD5270 Application Notes, PK70 EX 232 Application Notes, PK70 EX 485 Application Notes, PK70 EX Application Notes, PK70 EX MMS Application Notes, PK70 EX NTP Application Notes, SB700EX Application Notes, SB70LC Application Notes, SB800EX Application Notes October 10, 2018 Download Reference Guide: NetBurner PC Tools 1 file(s) 17662 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download Runtime Libraries 1 file(s) 13468 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download SAM E70/S70/V70/V71 DataSheet 1 file(s) 6213 downloads MODM7AE70 Development Kit, SBE70 LC Development Kit June 23, 2021 Download SAM E70/S70/V70/V71 Errata 1 file(s) 4761 downloads MODM7AE70 Development Kit, SBE70 LC Development Kit June 23, 2021 Download SAM E70/S70/V70/V71 Reference Manual 1 file(s) 6340 downloads MODM7AE70 Development Kit, SBE70 LC Development Kit June 23, 2021 Download SB70 and SB70LC End of Life Notice 1 file(s) 830 downloads End of Life Products, Legacy SB70 Docs, SB70LC Docs May 22, 2024 Download SB70 Mechanical Diagram (100 Version) 1 file(s) 1854 downloads Legacy SB70 Docs October 11, 2018 Download SB700 EX Latest Factory Application Firmware 2 file(s) 3767 downloads SB700EX Docs April 30, 2024 Download SB700 EX Quick Start Guide 1 file(s) 6810 downloads SB700EX Docs October 11, 2018 Download SB700EX Datasheet 1 file(s) 8732 downloads SB700EX Docs November 10, 2023 Download SB700EX Hardware Revision 1 file(s) 2171 downloads SB700EX Docs October 11, 2018 Download SB70LC / PINK70 LC General Purpose I/O 1 file(s) 5899 downloads PINK70 LC Application Notes, SB70LC Application Notes October 11, 2018 Download SB70LC / PINK70 LC General Purpose I/O 1 file(s) 6346 downloads PINK70 LC Application Notes, SB70LC Application Notes October 11, 2018 Download SB70LC / PINK70 LC Pin I/O Class 1 file(s) 7003 downloads PINK70 LC Application Notes, SB70LC Application Notes October 11, 2018 Download SB70LC / PINK70 LC Pin I/O Class 1 file(s) 6661 downloads PINK70 LC Application Notes, SB70LC Application Notes October 11, 2018 Download SB70LC Datasheet 1 file(s) 14592 downloads SB70LC Docs November 10, 2023 Download SB70LC Latest Factory Application Firmware 1 file(s) 5283 downloads SB70LC Docs February 5, 2021 Download SB70LC Mechanical Diagram (100 Version) 1 file(s) 5430 downloads SB70LC Docs August 3, 2021 Download SB70LC Mechanical Diagram (200 Version) 1 file(s) 5597 downloads SB70LC Docs August 3, 2021 Download SB70LC Quick Start Guide 1 file(s) 5416 downloads SB70LC Docs August 3, 2021 Download SB70LC Revision History 1 file(s) 5149 downloads SB70LC Docs August 3, 2021 Download SB70LC Schematic: SB70LC-ADPT-100CR 1 file(s) 7015 downloads SB70LC Docs, SBE70 LC Docs August 3, 2021 Download SB70LC STEP Files 2 file(s) 1806 downloads SB70LC Development Kit December 15, 2023 Download SB800 EX Build Options 1 file(s) 2915 downloads March 27, 2019 Download SB800 EX Datasheet 1 file(s) 14081 downloads SB800EX Docs November 10, 2023 Download SB800 EX Latest Factory Application Firmware 2 file(s) 6656 downloads SB800EX Docs April 30, 2024 Download SB800 EX Latest Factory Application Firmware Wifi Enabled 2 file(s) 6219 downloads SB800EX Docs April 30, 2024 Download SB800 EX Quick Start Guide 1 file(s) 6568 downloads SB800EX Docs March 27, 2019 Download SBE70 LC Datasheet 1 file(s) 5992 downloads SBE70 LC Docs November 10, 2023 Download SBE70 LC STEP Files 4 file(s) 3305 downloads SBE70 LC Development Kit December 15, 2023 Download SBL2e CHIP & BOB Datasheet 1 file(s) 13593 downloads SBL2E CHIP & BOB Docs November 10, 2023 Download SBL2e Datasheet 1 file(s) 28753 downloads SBL2E Docs November 10, 2023 Download SBL2e Dual Serial to Ethernet User's Manual 1 file(s) 12734 downloads SBL2E CHIP & BOB Docs, SBL2E Docs October 11, 2018 Download SBL2e Evaluation Kit Quick Start Guide 1 file(s) 11997 downloads SBL2E Docs October 11, 2018 Download SBL2e Latest Factory Application Firmware 1 file(s) 9124 downloads SBL2E CHIP & BOB Docs, SBL2E Docs June 8, 2020 Download SBL2e Mechanical Diagram (100 Version) 1 file(s) 9690 downloads SBL2E Docs October 11, 2018 Download SBL2e Mechanical Diagram (200 Version) 1 file(s) 9468 downloads SBL2E Docs October 11, 2018 Download SBL2e Pin I/O Class 1 file(s) 13931 downloads SBL2E Application Notes, SBL2E CHIP & BOB Application Notes, SBL2e XA Application Notes, SBL2EX Application Notes October 11, 2018 Download SBL2e Quick Start Guide 1 file(s) 13190 downloads SBL2E CHIP & BOB Docs, SBL2E Docs October 11, 2018 Download SBL2e Revision History 1 file(s) 8338 downloads SBL2E CHIP & BOB Docs, SBL2E Docs October 11, 2018 Download SBL2e Schematic 1 file(s) 9533 downloads SBL2E Docs October 11, 2018 Download SBL2e Serial Tunneling 1 file(s) 13699 downloads SBL2E CHIP & BOB Docs, SBL2E Docs, SBL2e XA Docs, SBL2EX Docs October 11, 2018 Download SBL2e STEP Files 2 file(s) 2203 downloads SBL2E Development Kit December 15, 2023 Download SBL2e X Datasheet 1 file(s) 6255 downloads SBL2EX Docs November 10, 2023 Download SBL2e X Latest Factory Application Firmware 1 file(s) 2757 downloads SBL2EX Docs June 1, 2021 Download SBL2e X Quick Start Guide 1 file(s) 3927 downloads SBL2EX Docs October 11, 2018 Download SBL2e X Revision History 1 file(s) 1798 downloads SBL2EX Docs October 11, 2018 Download SBL2e X User's Manual 1 file(s) 2397 downloads SBL2EX Docs October 11, 2018 Download SBL2e XA Datasheet 1 file(s) 4602 downloads SBL2e XA Docs November 10, 2023 Download SBL2e XA Latest Factory Application Firmware 1 file(s) 2404 downloads SBL2e XA Docs October 11, 2018 Download SBL2e XA Quick Start Guide 1 file(s) 2348 downloads SBL2e XA Docs October 11, 2018 Download SBL2e XA Revision History 1 file(s) 1722 downloads SBL2e XA Docs October 11, 2018 Download SBL2e XA User's Manual 1 file(s) 2550 downloads SBL2e XA Docs October 11, 2018 Download Schematic: MOD-DEV-100 1 file(s) 12074 downloads Legacy MOD5272 Docs, Legacy MOD5282 Docs, MOD5234 Docs, MOD5270 Docs October 10, 2018 Download Schematic: MOD-DEV-70 1 file(s) 17961 downloads MOD5234 Docs, MOD5270 Docs, MOD5441X Docs, MODM7AE70 Docs January 25, 2019 Download Secure Serial Factory App User’s Manual 1 file(s) 19307 downloads NANO54415 Docs, SB700EX Docs, SB70LC Docs, SB800EX Docs, SBE70 LC Docs, SOMRT1061 Docs August 1, 2023 Download SerialDownload Pdf 1 file(s) 66960 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, NBWIFIN Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download Software and Protocols: Embedded 1 file(s) 3691 downloads MOD5213 Development Kit October 11, 2018 Download Software and Protocols: Network Single-Chip 1 file(s) 15323 downloads SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download Software and Protocols: Network Standard 1 file(s) 21748 downloads Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit October 11, 2018 Download SOMRT1061 200IR Datasheet and Pinout 2 file(s) 1804 downloads SOMRT1061 Docs October 22, 2024 Download SOMRT1061 200IR Mechanical Diagram 1 file(s) 583 downloads SOMRT1061 Docs March 1, 2024 Download SOMRT1061 Altium Component Library 1 file(s) 302 downloads SOMRT1061 Docs April 29, 2024 Download SOMRT1061 Footprint 1 file(s) 562 downloads SOMRT1061 Docs May 7, 2024 Download SOMRT1061 KiCad Footprint 1 file(s) 462 downloads SOMRT1061 Docs April 22, 2024 Download SOMRT1061 Quick Start Guide 1 file(s) 628 downloads SOMRT1061 Docs March 26, 2024 Download SOMRT1061 STEP File 1 file(s) 589 downloads SOMRT1061 Docs March 1, 2024 Download Spot Buy Pricing Notice for 2022 1 file(s) 2730 downloads December 10, 2021 Download Standard Serial Tunneling 1 file(s) 25784 downloads CB34 EX CAN Docs, NANO54415 Docs, NANO54415 Docs, PK70 EX 232 Docs, PK70 EX 485 Docs, PK70 EX MMS Docs, SB700EX Docs, SB70LC Docs, SB800EX Docs, SBE70 LC Docs, SOMRT1061 Docs August 1, 2023 Download UBLOX GPS Receiver Chip Specification 1 file(s) 4112 downloads PK70 EX NTP Docs July 14, 2020 Download uCOS Library 1 file(s) 66372 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, NBWIFIN Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download UDPTerminal 1 file(s) 4285 downloads August 23, 2019 Download USB Host Driver Developer Manual 1 file(s) 1284 downloads Legacy MOD5272 Development Kit October 11, 2018 Download USB Stand Alone Driver Developer Manual 1 file(s) 1538 downloads Legacy MOD5272 Development Kit October 11, 2018 Download USB Virtual COMM Port Driver 1 file(s) 12479 downloads SBL2E Development Kit October 11, 2018 Download Virtual COMM Port Driver (Windows 7 – 10) 1 file(s) 197236 downloads 3.0 Deployment Tools, Deployment Tools September 26, 2023 Download What Female Header is Used to Accept a NetBurner Module on the Development Carrier Board? 1 file(s) 19368 downloads Legacy MOD5272 Application Notes, Legacy MOD5282 Application Notes, MOD5234 Application Notes, MOD5270 Application Notes, MOD5441X Application Notes, MODM7AE70 Application Notes January 25, 2019 Download Writing Assembly Code for the NetBurner Coldfire Platform 1 file(s) 72916 downloads CB34 EX CAN Development Kit, Legacy MOD5272 Development Kit, Legacy MOD5282 Development Kit, Legacy NBWIFIUG Development Kit, Legacy SB70 Development Kit, Legacy SB72 Development Kit, Legacy SB72 EX Development Kit, MOD5213 Development Kit, MOD5234 Development Kit, MOD5270 Development Kit, MOD5441X Development Kit, NANO54415 Development Kit, NANO54415 Development Kit, NBWIFIN Development Kit, PINK70 Development Kit, PINK70 LC Development Kit, PK70 EX 232 Development Kit, PK70 EX 485 Development Kit, PK70 EX Development Kit, PK70 EX MMS Development Kit, PK70 EX NTP Development Kit, SB700EX Development Kit, SB70LC Development Kit, SB800EX Development Kit, SBL2E CHIP & BOB Development Kit, SBL2E Development Kit, SBL2e XA Development Kit, SBL2EX Development Kit October 11, 2018 Download File Tree Explorer Explore NetBurner 2.8 Docs with File Tree:   ### Company Established in 1998 In 1998 the NetBurner name originated with the development of network device programmers, in which embedded programs are "burned" into integrated chips. It became apparent that to network-enable any embedded device required expensive tools and software licenses, as well as a significant amount of development time to produce a product. Our goal then became to provide high quality affordable network enabling technologies. Product Development Whether you want to design your own hardware or need an off the shelf solution, NetBurner development kits and products provide a single source for the software, hardware, tools, and support to develop a finished product. Kits includes source for our real-time operating system (RTOS), TCP/IP stack, C/C++ compiler and debugger, Eclipse IDE, over 100 example applications, and an embedded hardware module. Whether this is your first network application, or you are an experienced network programmer, you can be Networking in One Day! NetBurner standard products are complete network solutions that can be designed into your product. We also provide custom OEM design and manufacturing services to suit any application. Working at NetBurner Our development team is small and versatile. It isn’t uncommon for our engineers to work at all levels from designing hardware to writing example applications and everywhere in between. Most of our current software is the result of one of our developers sitting down and asking themselves “How can I build something that does this?” “What is the most efficient way we can do that?” or “This seems really hard to do. Is there any way I can make that better?” If you constantly find yourself working on projects and asking yourself these questions, here’s one more “Would you consider a job working at NetBurner?” We believe that every developer should be focused on what drives them. Frequently, that means we sponsor teams to compete in competitions like the Sparkfun Autonomous Vehicles Challenge (AVC) and the X prize challenge. Several of our developers have used our hardware to build home automation software, giant LED displays, worked with robots, and any number of other projects. If you have a passion for making things work, we’re always looking for a few good people. Tell us about your dream job and send your resume to jobs@netburner.com. ### Learn Then NetBurner Learn Blog provides IOT and embedded technology and industry news, trends, tutorials, code examples, guides and best practices to our community. ### Learn More 20 Years in Networking and IoT Complete IoT Connectivity & Networking Solution​ Netburner's ease of use, robust functionality, performance, longevity and scalability lets embedded engineers, developers, product teams, startups, makers and innovators do their best. Our rugged and reliable technologies stand the test of time and are proven on Earth and beyond. IoT Connectivity Toolkit & Resources Remote Automation Interface & Protocols IoT Security SSL/TLS Turnkey IoT & Networking Out of the box product and embedded functionality that's well supported and easy to use. High Performance Robust Real-Time Operating System optimized for high-speed networking, task management and IO. Faster Time to Market Reduce R&D cost, engineering time, and resources with our developer friendly solutions. Scalable from the Ground Up Embedded products designed to technically and economically scale with lifecycle management front of mind. Industrial Temp & Rugged With a +85°C to -40°C operating temperature range, you can trust our rugged products reliability, longevity, and life cycle support. Developer & App Friendly Design freedom to build whatever you want, how you want it and with thorough documentation. Data Security Support for SSL/TLS v1.3, HTTPS, and SSH. Amazing Support Timely, top quality email support from actual in-house engineers and our expert team. Innovation & Experience 20 years as IoT Pioneers and still exploring the frontier. IoT Cloud Compatible Data autonomy and cloud ready. AWS IoT Core, Azure, Google IoT -- just choose your cloud service. 0 Countries + 0 Fielded Devices 0 Years Continuous Use Who we are. We do everything for our users and believe that your success is quite literally our success. That's why we provide as complete and well supported of an IoT and Automation solution as possible. From our learning friendly development kits , to our software tools, documentation and support we strive to get you proving out your technology faster and with an edge towards scalability and sustainability. We're not only in the business we live and breath IOT and embedded. Staying on top of the latest tech, practices and trends is our passion. Check out one of our stories from our entry at the Sparkfun Autonomous Vehicle Challenge to see what we mean! More on Our Story Get Started with Our Development Kits! Start Here Featured Product Lines Systems on Module Product-ready Embedded Ethernet SOM webserver with a rocket-like RTOS, stellar scalability and loads of freedom. View Modules ARM® POWER! IOT Developer Kits Reach escape velocity in a flash with our easy to use and adaptable Development Kits complete with SDK software. View Kits Serial to Ethernet Keep to serial devices and software suites running with our serial to ethernet servers and Virtual COM port products. View Products ### My account ### Checkout ### Cart ## Posts ### Introducing the NTP1061 Outdoor Time Server Nobody likes the feeling of sifting through log files or getting multiple devices to synchronize at the millisecond level, and facing an uphill battle. In today's digital world, things fundamentally need to be in order: if a computer thinks a door closed before it opened, or if a suspicious login doesn't show up right next to suspicious network traffic, it's going to be difficult to make the right decisions. Devices everywhere come with public NTP servers that synchronize over the internet, but at a certain point that's just not good enough, or you don't have an internet connection: that's when you know it's time for a time server. There are a handful of satellite-based time servers out on the market, but usually the very first requirement is a satellite antenna with a clear view of the sky, which complicates deployment: is there a window or rooftop or convenient wall nearby? Will the antenna cable reach? What if you want to mount the server with the other network gear? Deployment can be a hassle. On top of all that, you might not want to spend thousands of dollars, which limits your options further. Say hello to the NTP1061. Just find a place with a clear view of the sky, anywhere an Ethernet cable can reach, plug into your pre-existing Power Over Ethernet switch, and the hard part is done! We designed the NTP1061 from the ground up to remove as many barriers to precise time as possible. The NTP1061 is a self-contained, weatherproof unit that locks onto all major GNSS satellite constellations and serves time to your entire network at Stratum 1 accuracy: that means it's synchronized directly to GPS, not to some other source. Its GPS chip is capable of timing precision better than 1 microsecond, and our hardware delivers that time to devices on your network with sub-millisecond accuracy at rates of up to 10,000 NTP requests per second. The hardware is built for real-world conditions. Its IP65-rated enclosure and wide operating range (-40°C to +85°C, or -40°F to +185°F) make it at home on a rooftop, in a factory, or anywhere in the field. At just 13×6 cm (5x2.4 in) and barely over 100 grams (3.5 oz), it's small enough to mount just about anywhere. Configuration and satellite monitoring are handled through an HTTPS-secured web interface, no serial cable or special software required. Deploy Install your NTP1061 in three easy steps. First, unpack and use a spare Ethernet cable to connect it to a standard 48-volt Power over Ethernet switch. You should see the green and yellow Ethernet lights illuminate on the bottom of the unit, and a red light turn on inside the unit. Then, discover the unit's IP address and connect to its web-based configuration page. If your NTP1061 and computer are both connected to the same Internet connection, just visit https://discover.netburner.com -- within seconds of bootup it should appear in the list with links to the Device Web Page. (Ignore the Config page for now, that's for advanced configuration.) You can also simply visit http://nbntp.local if your computer supports mDNS/Bonjour. If you don't have Internet access, we also offer Local Discover options. Finally, you can look at your network's DHCP server: NetBurner devices have MACs starting with 00:03:F4 . The first thing you'll want to do is set a password on the Configuration page. On the Clock and Status pages you can see the current time and satellite status. We also suggest setting a Static IP or using a DHCP reservation so your NTP clients have a consistent place to get their time. Finally, choose a mounting location where the unit has a clear view of the sky: in front of an unglazed window, on a rooftop, or using a 1-inch NPT threaded pipe, angled fittings, and a flange to mount on a wall. Make sure it's secured vertically to keep water out and keep the antenna pointed to the sky. Run an Ethernet cable from that location to your PoE switch and plug it all in. Confirm that the NTP1061 comes online at the desired IP address, confirm that it has good satellite reception, and configure your local devices with the time server's IP address. You're done! Using Using the NTP1061 couldn't be simpler. When the integrated GPS module has a satellite lock for accurate time, any devices configured to use the NTP1061 as their time server will automatically synchronize their time, either over the NTP or SNTP protocols. The main page is a local and UTC clock, which appears once an accurate time signal is received: You can check the reception of satellites overhead on the Status page: And you can configure network and password settings on the Configuration page: The Raw Data and Advanced pages are for special situations and not required for normal operation. Wrap-up We think the NTP1061 represents a new level of affordability, ease, and precision in the network time server market, and can't wait to hear about all the innovative ways you use it! Be first in line to get yours by visiting the NTP1061 product page, with the first units shipping in May 2026. ### Tracking Traps on the MODM7AE70 – Part 2 NetBurner's Smart Trap feature greatly helps with debugging issues by automatically outputting stack and register information during a crash. In part 1 of this blog post series, we reviewed the basics of reading the trap output and call stack, like understanding the Faulted PC address, task information, and using addr2line to find what memory addresses correspond to which lines of code in your program. Now we will look at a more complex type of crash that complicates efforts to simply run addr2line and find the problem. We'll talk about how the memory registers are laid out in a NetBurner ARM device, and even dive into the exception frame to understand what's happening when things go wrong. These are deep topics that can take a lot of learning and experience to master, but today we hope to offer some lifelines to developers who might be new to these concepts. The NetBurner MODM7AE70 and SBE70LC products use the Microchip SAME70 and SAMD20 processors to provide high performing and reliable ARM® embedded IoT capabilities for secure automation and industrial IoT applications. For a very low price point, this ARM® Cortex-M7 embedded system-on-module (SOM) solves the problem of securely network-enabling devices with 10/100 Ethernet, including those requiring SSL/TLS, auto certificate creation, industrial protocols, digital, analog, I2C, SPI, CAN, and much more. The products can also be used as an edge node microcontroller, edge processor or IoT gateway. Microchip® ARM® processors, combined with NetBurner’s acclaimed reliability and ease-of-use, provide a solution you can depend on. View Product Page Or, learn more about NetBurner IoT. First, we'll look at the example code for this post, pasted below. You'll notice that we present an option to test a return address corruption crash. Loading the code onto your device and plugging the device's USB cable into your computer, that options menu should be presented to you via the serial console (MTTTY, CoolTerm, or similar.) We use a MODM7AE70 powered by the Microchip SAM E70 for this example, but any NetBurner ARM device with a v3.x NNDK should work, including the SOMRT1061. The Code This example demonstrates what happens when a buffer overflow overwrites the saved return address on the stack. When the function returns, execution attempts to jump to invalid memory, causing a hard fault. The code intentionally creates a buffer overflow by copying a 70-character string into a 32-byte buffer without bounds checking in the corruptReturnAddress() function. When this function tries to return, the CPU attempts to jump to the corrupted return address, triggering a smart trap. To run the code, create a new ARM-based NetBurner project (MODM7AE70, SOMRT1061, etc), paste the following into your main.cpp, and run it on your NetBurner device: #include #include #include #include #include #include #include const char * AppName="SmartTrap"; void corruptReturnAddress() { volatile char intermediateBuffer[24]; volatile char vulnerableBuffer[32]; const char* overflowText = "http://www.example.com/THISISTHEFAILINGPATH/Testing/OverflowText.html"; iprintf("Calling function to force return pointer to stackrn"); OSTimeDly(TICKS_PER_SECOND); // Fill intermediate buffer for trace visibility for (uint32_t i = 0; i < sizeof(intermediateBuffer); i++) { intermediateBuffer[i] = 0xCC; } // Overflow buffer to corrupt return address (stored after local variables on ARM stack) volatile char* overflowPtr = vulnerableBuffer; for (uint32_t i = 0; i < strlen(overflowText); i++) { overflowPtr[i] = overflowText[i]; } } /* Task wrapper for return address corruption example */ void ReturnAddressCorruptionTask(void* pd) { volatile char taskBuffer[48]; // For trace visibility for (uint32_t i = 0; i < sizeof(taskBuffer); i++) { taskBuffer[i] = 0xAA; } corruptReturnAddress(); OSTimeDly(TICKS_PER_SECOND); } void UserMain(void *pd) { init(); WaitForActiveNetwork(); EnableSmartTraps(); iprintf("Application: %srn", AppName); while (1) { iprintf("nSmart Trap Examples - Select:rn"); iprintf("5: Return Address Corruptionrn"); switch(getchar()) { case '5': { iprintf("Loading return address corruption example...rn"); OSTimeDly(TICKS_PER_SECOND); static uint32_t ReturnCorruptionTaskStack[256]; OSTaskCreatewName(ReturnAddressCorruptionTask, NULL, &ReturnCorruptionTaskStack[0], &ReturnCorruptionTaskStack[255], MAIN_PRIO - 1, "ReturnCorrupt"); iprintf("Return address corruption task created. Waiting...rn"); OSTimeDly(TICKS_PER_SECOND * 3); } break; default: iprintf("Invalid choicern"); } OSTimeDly(TICKS_PER_SECOND); } } Understanding the Smart Trap Output Here's what the smart trap shows when this crash occurs: -------------------Trap information-----------------------------Trap Vector = (04)MMFSR = 01FPCAR = 204030F8xPSR = 60000004PriMask = 01FaultMask = 00BasePri = 00Faulted PC = 50474E48-------------------Register information-------------------------R0 =7001414C R1 =70048FA4 R2 =0000006C R3 =00000000R4 =4C494146 R5 =00000005 R6 =00000006 R7 =00000007R8 =00000008 R9 =00000009 R10 =0000000A R11 =0000000BIP[R12]=00000001 SP[R13]=70048F88 LR[R14]=70006E33 PC[R15]=50474E48XPSR =61000000-------------------RTOS information-----------------------------Priority masking indicates trap from within ISR or CRITICAL RTOS sectionCurrent task prio = 00000031Current task TCB = 200014A0This looks like a valid TCBThe current running task is: ReturnCorrupt#31-------------------Task information-----------------------------Task | State |Wait| Call StackEnet#26|Fifo |0002|70006776,70006E2A,70006B78,700115FC,000004A4Config Server#28|Semaphore |0228|70006776,70006E2A,70006A90,70004A8C,70004AE8,7003C33A,70034006,000004A4ReturnCorrupt#31|Running | |50474E48Main#32|Timer |0028|70006776,70006E2A,700067E8,7002409C,000004A4Idle#3F|Ready | |7002D240,000004A4 The Key Clue: Faulted PC The first thing to notice is the Faulted PC value: 50474E48. This doesn't look like a normal code address. On NetBurner ARM devices, valid code addresses are in the 70xxxxxx range. When you convert this hex value to ASCII, you get "PGNH" - part of the string "FAILINGPATH" from our overflow text ("INGP"), but in little-endian byte order, which is reversed. The reason it's "PGNH" instead of "PGNI" is that ARM clears the least significant bit of return addresses (the Thumb mode bit). This is the smoking gun: the return address has been overwritten with data from our overflow string. Understanding NetBurner ARM Memory Layout Before diving deeper into registers, it's important to understand the memory regions on NetBurner ARM devices: The 70xxxxxx Region:This memory region contains both:- Executable code (instructions): Your compiled program code lives here- Process/thread stacks (PSP): Each task's stack for normal execution When you see addresses like PC=70006E33 in call stacks, those are code addresses. When you see SP[R13]=70048F88, that's a task stack address - both in the same 70xxxxxx region. The 20xxxxxx Region:This region contains:- Main Stack (MSP): Used by exception handlers and interrupt service routines- System data structures: Like Task Control Blocks (TCBs) In the example output, notice FPCAR=204030F8 and Current task TCB = 200014A0 - both are in the 20xxxxxx range. ARM's Dual Stack Pointers: ARM Cortex-M processors have two stack pointers that switch automatically: - PSP (Process Stack Pointer): Active during normal task execution, points into the 70xxxxxx region- MSP (Main Stack Pointer): Active during exceptions/interrupts, points into the 20xxxxxx region What the SP Register Tells You: The SP (Stack Pointer) register shows which stack was in use when the fault occurred: - SP in 70xxxxxx range → Exception occurred during normal task code (using PSP)- SP in 20xxxxxx range → Exception occurred while already in an ISR or exception handler (using MSP - a nested exception) In our example, SP[R13]=70048F88 is in the 70xxxxxx range, confirming the crash happened during normal task execution. The smart trap even labels it as "Process Stack Dump" rather than "Main Stack Dump". Understanding ARM Registers The ARM Cortex-M7 has 16 general-purpose registers that are visible in the smart trap output: - R0-R3: Function arguments and return values- R4-R11: General-purpose registers that must be preserved across function calls- R12 (IP): Intra-procedure call scratch register- R13 (SP): Stack pointer - points to the current top of the stack- R14 (LR): Link register - holds the return address when a function is called- R15 (PC): Program counter - points to the currently executing instruction In our crash, notice that R4 contains 4C494146, which is ASCII "LIAF" - more of our overflowing string, reversed. The ARM Exception Frame When a fault occurs on ARM Cortex-M, the processor automatically pushes certain registers onto the stack in a specific order. Understanding this "exception frame" is crucial for debugging stack corruption issues. The Process Stack Dump shows the actual stack contents at the time of the crash: -------------------Process Stack Dump----------------------------70048F68: 7001414C 70048FA4 0000006C 00000000 00000001 70006E33 50474E48 6100000070048F88: 2F485441 74736554 2F676E69 7265764F 776F6C66 74786554 6D74682E AAAAAA6C The exception frame layout at byte offsets from the stack pointer (70048F68) is: - 00-0C: R0-R3 (function arguments)- 10: R12 (swap register)- 14: LR (link register when exception triggered)- 18: PC (faulted program counter) - the corrupted return address appears here- 1C: XPSR (status register) Looking at offset 0x18 (the 7th word), we can see 50474E48 - our corrupted return address. Debugging When addr2line Won't Help Since the Faulted PC contains garbage (ASCII text instead of a valid code address), running addr2line on it won't provide any useful information. In these cases, you need to look at other registers and call stacks: 1. Check the LR (Link Register): In our example, LR contains 70006E33, which is a valid code address. Running addr2line on this can help identify where the function was called from. It may not be precise, but it can be a clue. 2. Examine the call stack: The trap output shows call stacks for all tasks. These can provide clues about the execution path leading to the crash. 3. Analyze the stack dump: Look for patterns in the hex dump. Converting values to ASCII by pasting them into a hex editor can reveal strings or data that corrupted the stack. 4. Check register values: Unexpected values in registers (especially readable ASCII like we saw in R4) indicate memory corruption. The more experience you get with debugging these issues, the more patterns you'll see in terms of what's expected or weird. The Fix The root cause of the crash in our example is unbounded string copying. The fix is to use safe string functions and correct sizes: strncpy(buffer, source, sizeof(buffer) - 1);buffer[sizeof(buffer) - 1] = ''; // Ensure null termination You can also check sizes before copying, and handle unexpected sizes appropriately (for example, it may not crash the device copying only the first 32 bytes of a 70-character URL into a buffer, but it will probably not behave as desired.) Conclusion Understanding ARM registers and the exception frame layout is essential for debugging complex crashes on NetBurner devices. When the Faulted PC is corrupted, you need to be a detective: examine all the registers, investigate what various hex values actually mean and why, and trace through the exception frame to understand what went wrong. The smart trap feature provides as much information as we can provide, but it's up to you to know where to look and how to interpret it. With practice, these debugging skills will help you track down elusive crashes. Any more advanced, and you'll need to look into attaching the GDB debugger or disassembling your program for more clues. As always, we love feedback. If you have any comments or thoughts, please feel free to drop them in the comments section below. Alternatively, you can mail us directly at sales@netburner.com. ### Supercharge NetBurner Development with AI You know AI can write emails and answer trivia questions for you, and you might even use it to help you write code, but did you know that there are plugins to let AI access complex tools in your development environment? These plugins are written in MCP (Model Context Protocol), which is sort of a LLM-friendly API that describes various third-party commands and how to use them in a standardized way. We've been looking for ways to help developers access and use our suite of tools more easily and effectively, from improved documentation and tooling to dabbling with AI assistants in development environments, and towards that end we've produced some MCP tooling that might be useful for NetBurner customers. Consider it an early beta preview: there are still some rough edges but we'd love to hear your feedback about it! The core piece is a new MCP tool installed in your NetBurner NNDK version 3.5.5+ at nburn/pcbin/netburner_mcp_server.exe (on Windows, there's a different extension on Mac/Linux.)If your NetBurner environment is a normal install you don't have to do anything other than adding this as a MCP tool to your AI development environment of choice. We have used this with: Claude Code on WSL, Linux, and Windows, as well as Claude Desktop on Windows with additional file access MCP tools. It should work with Cursor, Windsurf, or any other local stdio MCP-supporting AI tool. We're also trying out a template-based generation strategy for making brand-new NetBurner projects. It's highly experimental, but may simplify the process of looking at examples and creating a custom project based on common use cases. Here are installation instructions for Claude, followed by a list of the actual tools exposed. All operations should start by telling the AI to use the NetBurner learn tool. MCP Installation Instructions If you're using Claude Code, you can skip most of these instructions and simply run claude mcp add netburner C:/nburn/pcbin/netburner_mcp_server.exe followed by claude in the directory of your project. For Claude Desktop, open Settings > Developer and under Local MCP Servers click the Edit Config button. Edit Claude's JSON configuration file to include the NetBurner MCP Server. { "mcpServers": { "NetBurner": { "command": "C:/nburn/pcbin/netburner_mcp_server.exe", "args": [] } } } The tools should be available after restarting Claude, and you can use them directly or ask about them: Template System When creating a new NetBurner project, you can ask the AI to combine various NetBurner templates to bootstrap your code: Be sure to tell Claude where you want your project to live, and give Claude filesystem permissions to that folder first, so it saves in the right place. You may want to restart Claude after changing these system-level settings as well, to ensure they apply. Once the templated project is created, the MCP tooling allows your AI agent to build and deploy your project to NetBurner hardware, as well as read error output to debug any issues! NetBurner MCP Tools Overview 1. Documentation & Learning Tools netburner:how-to-learn-netburner - START HERE FIRST! Returns essential NetBurner documentation including core concepts and fundamental docs. Must be used before other search tools. 2. Build & Compilation Tools Note: The make output tools work with cached build results from recent builds in the same project directory. netburner:netburner-make - Execute NetBurner make build Common targets: clean, (no target), load (deploy to device) Parameters: projectDir, target, platform, deviceIP (for loading), flags, trace, unlock netburner:netburner-make-output - Retrieve full stdout/stderr from last build Parameters: projectDir, stream (stdout/stderr/both), fromLine, lines netburner:netburner-make-grep - Search through cached build output Parameters: projectDir, pattern, stream, contextLines, maxLines netburner:netburner-make-errors - Get structured error analysis from build Parameters: projectDir, errorTypes, severity 3. Device Discovery & Management netburner:discover-netburner - Discover NetBurner devices on the local network netburner:get-netburner-device - Get details for a specific device by IP Parameters: deviceIP 4. Device Configuration Tools Note: Some device operations may require username/password if the device has authentication enabled. netburner:get-netburner-config - Get configuration from a device Parameters: deviceIP, path (optional), username, password netburner:set-netburner-config - Set configuration values on a device Parameters: deviceIP, data, path (optional), username, password, unlock netburner:get-netburner-schema - Get configuration schema from a device Parameters: deviceIP, username, password 5. Device Diagnostics netburner:get-netburner-diag - Get diagnostic information from a device Parameters: deviceIP, elfFile (optional for stack decoding), username, password Important: Check FreeSockets, ExtraIO, and Buffers - if any are under 20, there's a problem 6. Remote Console Connection Tools Important: Console tools only work on devices with remote console enabled (requires #include  and EnableRemoteConsole() in the device code) netburner:connect-netburner-console - Connect to device console via WebSocket Parameters: deviceIP, bufferSize (default: 65536), unlock netburner:disconnect-netburner-console - Disconnect from current console netburner:get-netburner-console-status - Get console connection status netburner:send-netburner-console - Send command to device console Parameters: command, addNewline (default: true), unlock 7. Remote Console Output Analysis netburner:netburner-console-output - Retrieve console output from buffer Parameters: fromLine, lines, unlock netburner:netburner-console-tail - Get recent console output (like Unix 'tail') Parameters: lines (default: 50), unlock netburner:netburner-console-grep - Search console buffer with regex Parameters: pattern, contextLines, unlock netburner:netburner-console-errors - Extract error messages from console Parameters: severity (errors/warnings/all), unlock netburner:clear-netburner-console - Clear console buffer Parameters: unlock 8. Development Utilities netburner:get-netburner-paths - Get NetBurner installation paths Returns: NBROOT, TOOLCHAINPATH, AIDOCPATH netburner:addr2line - Convert addresses to file/line/function info Parameters: elfFile, addresses (array) 9. Database Tools (Restricted Access)There are also database search tools for finding NetBurner functions, examples, and documentation, but these require explicit user permission and should only be used as a last resort after trying: Templates Documentation Code examples Existing code search We built a detailed complete function database for the AI to use as reference.This seems to overwhelm the AI with too much available information and the AI got lost. So we put it behind a specific user driven unlock and we may remove the AI function database as it may be more problematic than useful and switch entirely to the template system we created.The intent is that the AI can't automatically get access to this database without the User explicitly giving him permission.If you want to give the AI access to this tool you can do one of three things: Run the UnlockDB prompt (if your tool supports prompts) mentioned below. Paste the content of nburn/docs/aidocs/UnlockDb.prompt into the AI. Tell the AI that the Database unlock code is LowLevelAccess2024 MCP Prompts:For those tools that support MCP prompts we add three prompts:ExistingProject:Tells the AI how to work with an existing NetBurner project and how to use AI tools. NewProject: Tells the AI how to create a net Netburner Project from scratch and use the AI project template system. UnlockDB: Tells the AI how to unlock the function database (#9 mentioned above). If your system does not support MCP prompts, you can find the contents of these prompts in *.prompt files in nburn\docs\aidocs Wrapping Up This tool is brand new and still under development, so we'd love to hear your feedback about it! Did it help you in your workflow, make it easier to learn the NetBurner ecosystem, or help you understand the documentation? ### Embedded MQTT: Getting Started the Easy Way I'm an intermediate level embedded developer and I've heard the term “MQTT” a lot recently but never really delved into the details. I decided to spend a Saturday to understand what it is and implement it on an embedded device so I can use it for other projects, like sensors and various controllers that need to be monitored and controlled but are behind a router and firewall. I have experience with C/C++ embedded programming, network programming, Windows and Linux. I'll use the MODM7AE70 as the embedded platform, but the exact same code will work on any NetBurner platform, like the new SOMRT1061. NetBurner also has a new build-in MQTT library, which allows integrating with MQTT in just a few lines of code and no external libraries, unlike prior AWS, Azure, and Paho tutorials. My goals were: Understand what MQTT is Send MQTT messages from an embedded device to a client PC, both locally and through the Internet. What is MQTT My first stop was to do some research about MQTT. The information that came up is summarized below. The MQTT standard site is at mqtt.org. MQTT, (Message Queuing Telemetry Transport), is a lightweight, TCP-based messaging protocol designed for low-bandwidth and high-latency environments, particularly well-suited for machine-to-machine (M2M) communication and IoT applications. It uses a publish-subscribe messaging model, where devices (clients) publish messages to topics, and other devices subscribe to those topics to receive messages. Being a visual person, I searched for a picture and found the one below: Ref: https://medium.com/@jaydev.dave93/what-is-mqtt-protocol-c6a0cafffa8c But this picture leaves out what to me is the biggest benefit of MQTT, the ability to actually communicate with these devices on their respective networks. Inserted between the MQTT broker and each those three devices is usually a router or firewall that prevents any two of them from talking to each other. In a typical scenario, the laptop is unable to communicate directly with the temperature sensor because the router/firewall blocks incoming connections. I often don’t even know what the internal IP address of the temperature sensor is. The MQTT Broker solves this problem by enabling each of the three devices to connect to the broker with an outgoing TCP connection which is allowed by the router/firewall. The broker then keeps track of what each client is subscribed to, called the “topic”. When the temperature sensor “publishes” data to the broker with the “temperature” topic, the broker sends the data to the clients subscribed to the temperature topic. Subscribers can also choose to subscribe to a "topic filter" using wildcards, making it easy to subscribe to many similarly-named topics at once. In the old days what we had to do was configure the temperature sensor router/firewall to do port forwarding so that any incoming TCP connections for the temperatures sensor on a specific port number would be forwarded to the temperature sensor IP address. This is both a security risk and difficult to maintain with router updates and configuration. Now, with this "push" architecture, only the MQTT Broker needs to be centrally accessible. Hardware, Software and Tools Wanting to take baby steps my strategy was to first test that the broker was working by using publish and subscriber utilities, then move on to the NetBurner. My list of items to find was: Embedded platform to be the MQTT publisher MQTT Subscriber Client to run on my computer Local MQTT Broker so I can test without using an external Internet broker Internet MQTT Broker that would represent a production implementation Embedded Platform This will be the NetBurner development kit, which includes the hardware, software, tools and many MQTT example programs. I decided to use the MQTT Simple example that publishes an integer value when the value changes. The part numbers for these kits are NNDK-MODM7AE70-KIT or NNDK-SOMRT1061-KIT, available at www.netburner.com. MQTT Broker The best broker I came across is called Mosquitto (https://mosquitto.org/). They offer both a free test server on the Internet, and a local broker that runs on Linux and docker. For my local MQTT Broker I was unable to locate one that runs natively on Windows and I am not familiar with Docker, so I chose my Linux VM that runs on my Windows 11 PC. You could also use a Raspberry Pi. If you can only use Windows, you may need to use Docker, but I think the Mosquitto implementation is the same as I describe in this article. Disclaimer: my Docker experience in the past was bad because enabling Windows WSL2 on my PC caused issues. I neither endorse nor oppose it, it seems most people use it just fine. There are Mosquitto Docker images at: https://hub.docker.com/_/eclipse-mosquitto. The description on their web page is: Eclipse Mosquitto is an open source (EPL/EDL licensed) message broker that implements the MQTT protocol versions 5.0, 3.1.1 and 3.1. Mosquitto is lightweight and is suitable for use on all devices from low power single board computers to full servers. The Mosquitto project also provides a C library for implementing MQTT clients, and the very popular mosquitto_pub and mosquitto_sub command line MQTT clients. There are a number of ways Mosquitto can be used: The mosquitto_pub and mosquitto_sub commands provide publish and subscribe functionality. The Mosquitto Broker can be run locally. Mosquitto offers a free Internet MQTT broker you can use at test.mosquitto.org in the following modes: Plain MQTT MQTT over TLS MQTT over TLS (with client certificate) MQTT over WebSockets MQTT over WebSockets with TLS If you would like to use them in a professional deployment, they also offer a Cedalo MQTT Platform trial. Note: If you are running a Linux VM like me, make sure it is in bridge mode and not NAT mode. Also, the firewall needs to be off or you need to enable a rule to let port 1883 through on TCP for plain MQTT, or 8883 for MQTT over TLS. MQTT Publish and Subscriber Utilities Since my main computer runs Windows 11, I found a free Windows tool called MQTTX at https://mqttx.app. It is a great diagnostic tool and can both publish and subscribe. For my Linux VM, I have the Mosquitto utilities. I like this because I can first test the broker, publish and subscribe operation on the Linux VM as localhost, then verify I can access the Mosquitto Broker on the Linux machine externally from Windows.  Once I can do that, I have confidence I can do it from the NetBurner embedded platform. Mosquitto Broker and Utilities Installation I installed Mosquitto on the linux VM according to these instructions: https://docs.vultr.com/install-mosquitto-mqtt-broker-on-ubuntu-20-04-server Note: If you are reading this long after this article was published, do a search for: “how to install mosquitto on linux”.   Mosquitto Internet Broker Test I tested a connection to the test.mosquitto.org MQTT Broker three different ways: Windows MQTTX Linux VM NetBurner Windows MQTTX Running MQTTX, I created a new connection for test.mosquitto.org called MosquittoTestServer. It is running on port 1883 which is the default port for plain MQTT. The Client ID must be unique for every device. An easy way to do that is to use a prefix and the last few octets of the MAC address, like “nburn1234”. You can also see the Linux connection in the list, more on that later. Once the data is entered, click on Connect in the upper right corner. If all goes well and the connection is successful, you will see the screen below. The next step is to subscribe to a topic by clicking on the + New Subscription box. For my testing I picked a topic name of: testtopic/mqttx. That is all we need to do, so click on Confirm at the bottom of the page. QoS means quality of service (what level of guarantee MQTT will give your message's delivery), you can leave that at the default for now. Back at the connection screen I can see my subscription topic, the subscriber receive message window on the right side, and a publish message window with the message content and a button on the bottom right to send the message: “hello”.   Clicking on the green send arrow in the bottom right publishes the message, and I can see the message received in the receive window. Mission accomplished !  So what exactly has happened here? MQTTX made a TCP connection to the test.mosquitto.org MQTT Broker. We created a topic on the broker named “testtopic/mqttx”. MQTTX can both publish and subscribe to that topic. We published a hello message to the broker. The broker sent the message to the MQTTX subscriber. Linux Mosquitto My linux test consists of 3 terminal windows. From top to bottom: the broker status, publisher and subscriber. Note that even though it is installed, we are not using the local broker for this test; we are using the same test broker as in the previous window's MQTTX test at test.mosquitto.org. The local Mosquitto Broker will be covered more below, but for those interested, the broker status is provided by running “sudo systemctl status mosquito”: mosquitto.service - Mosquitto MQTT Broker Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2025-06-15 10:03:06 PDT; 1 day 2h ago Docs: man:mosquitto.conf(5) man:mosquitto(8) Process: 7561 ExecStartPre=/bin/mkdir -m 740 -p /var/log/mosquitto (code=exited, status=0/SUCCESS) Process: 7562 ExecStartPre=/bin/chown mosquitto /var/log/mosquitto (code=exited, status=0/SUCCESS) Process: 7563 ExecStartPre=/bin/mkdir -m 740 -p /run/mosquitto (code=exited, status=0/SUCCESS) Process: 7564 ExecStartPre=/bin/chown mosquitto /run/mosquitto (code=exited, status=0/SUCCESS) Main PID: 7565 (mosquitto) Tasks: 1 (limit: 4545) Memory: 1.7M CPU: 20.454s CGroup: /system.slice/mosquitto.service └─7565 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf Jun 15 10:03:06 bob-virtual-machine systemd[1]: Starting Mosquitto MQTT Broker... Jun 15 10:03:06 bob-virtual-machine systemd[1]: Started Mosquitto MQTT Broker. The first step in our test is to make a TCP connection and subscribe to testtopic/mosquito by typing mosquitto_sub -h test.mosquitto.org -v -t "testtopic/mosquitto" in the subscribe terminal window. It will keep listening for messages until the program is terminated with Ctrl-C. Next, the MQTT message is published to the broker in the publish terminal window with: mosquitto_pub -h test.mosquitto.org -t "testtopic/mosquitto" -m "Hello, World!" Checking back with the subscriber terminal window we see our message from the broker! The -v verbose flag was used, so we see the topic as well as the message. Using the NetBurner Device Finally, let’s get that NetBurner talking MQTT. The first step is to build the MQTT Simple example. We will do that with the project wizard and choose “example” at the final screen. That will create the project and import any necessary files. Create a Project Select a NetBurner project: Set the Project Name to MqttSimple: Click on the Search button for the Target Platform and select the device: Notice that for the IP address is has nburn0B848F.local. NetBurner supports the .local naming to make things easier, but you could also use the numerical IP address of 192.168.1.94 instead. Select the Examples radio button. A list of all NetBurner examples will appear on the left. Select the MQTT Simple example The project will automatically build. The IDE is shown below with main.cpp in the editor. The bottom left window shows the NetBurner device details, the bottom right window shows the build output. Clicking on the green Play button in the NBEclipse tool bar will download the application. The full source code is below: #include #include #include #if (!PLAT_HAS_FILESYSTEM) #include "fs_main.h" #endif const char *AppName = "MQTT Object Simple Pub/Sub Example"; #define MQTT_TOPIC_NAME "testtopic/netburner" /* Enable MQTT client settings in the configuration server. This will create a * MQTT configuration section to set the broker url, username, password, * certificate, etc. */ MQTT::ConfiguredClient MqttClient; /* Create a MQTT variable integer object. mqtt_* objects automatically publish * and subscribe to the MQTT topic specified in the configuration system. */ MQTT::mqtt_int myInt(MQTT_TOPIC_NAME); /* * Main entry point for the example */ void UserMain(void *pd) { #if (!PLAT_HAS_FILESYSTEM) fs_main(); // filesystem for MQTT cert/key #endif init(); // Initialize network stack WaitForActiveNetwork(TICKS_PER_SECOND * 5); iprintf("Web Application: %s\r\nNNDK Revision: %s\r\n", AppName, GetReleaseTag()); // Publish every 3 minutes if the value has changed myInt.SetPublishInterval(TICKS_PER_SECOND*60*3); while (1) { // If any key is typed in the debug serial port interface, increment the // integer value. It will automatically be published. if (waitchar(TICKS_PER_SECOND)) { getchar(); // wait for keypress on serial terminal to increment myInt++; // increment mqtt variable } printf("myInt: %ld\r\n", (int32_t)myInt); } } Let’s take a quick look at that source code. We’re able to implement MQTT complete with publishing in just 3 lines of code. The first line is: MQTT::ConfiguredClient MqttClient; This instantiates an MQTT Client, and also enables MQTT client settings in the configuration server. An MQTT configuration section will appear in the configuration server web page on the NetBurner device at port 20034 in the web browser, and will allow us to set the broker URL, username, password, certificate, etc. Note that NetBurner Configuration Server settings can be configured in many ways, a web browser is not necessarily required: Serial port In your application itself JSON configuration uploads The second line is: MQTT::mqtt_int myInt(MQTT_TOPIC_NAME); This creates a MQTT variable integer object.  There are a wide range of mqtt_* objects in the NetBurner library and they automatically publish and subscribe to the MQTT topic specified in the configuration. Some others are listed below. All will automatically publish and subscribe to the specified topic. Note that you are not required to use this library at all and can subscribe and publish in any way you wish with any data you wish. These are just here to make the implementation easier if they are a good fit for your application. Variable Types mqtt_bool mqtt_float mqtt_int mqtt_uint mqtt_string GPIO Pins mqtt_IO             mqtt_IO_Input Defaults to GPIO input mqtt_IO_Output Defaults to GPIO output Base Classes mqtt_leaf Base class for all Mqtt Objects (MqttObj). Mqtt Objects provide a seamless bridge/synchronization to communicate information through an MQTT Broker via a Client object. You can create your own. mqtt_obj Base class for easy MQTT Objects (MqttObj). mqtt_obj are comprised of higher order parent objects that contain registered child objects. The 3rd and final line of MQTT code instructs the integer object to automatically publish at a specified interval. The default mode is to only publish when the value changed, but that can be changed with the function parameters. myInt.SetPublishInterval(TICKS_PER_SECOND*60); That is all that is needed!  The GPIO state change type is especially nice since all you need to do is specify the pin number. The NetBurner MQTT API documentation is located in the NetBurner API section here: https://www.netburner.com/NBDocs/Developer/html/index.html Locate the Device I can now open a web browser and go to discover.netburner.com from the same network as my device, and device's details. Click on the ConfigPage link to get to the configuration web page. Note that if you know the device IP address, you can type it in the web browser with port 20034. For example, http://192.168.1.94:20034 . MQTT Configuration Settings The configuration page is shown below. Open MqttClient section and set the Hostname to test.mosquitto.org, ClientId to nburn848f, and check the reboot checkbox at the bottom. Clicking on Update Record will submit and save the changes, then reboot the device. Testing With a Client At this point the NetBurner is publishing the integer value to the test.mosquitto.org broker. Now let’s configure MQTTX to subscribe to the topic. Below we can see the topic changed to testtopic/netburner, and the published integer values of 0 and 1 received from the broker at test.mosquitto.org: Checking the linux VM subscribed to the same topic we see it as well. It has incremented to 4: Setting Up The Mosquitto Broker Locally Running the Mosquitto Broker Mosquitto has already been installed in my Linux VM. Running a quick check in the status window I see it is running: mosquitto.service - Mosquitto MQTT Broker Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2025-06-15 10:03:06 PDT; 3 days ago Docs: man:mosquitto.conf(5) man:mosquitto(8) Process: 7561 ExecStartPre=/bin/mkdir -m 740 -p /var/log/mosquitto (code=exited, status=0/SUCCESS) Process: 7562 ExecStartPre=/bin/chown mosquitto /var/log/mosquitto (code=exited, status=0/SUCCESS) Process: 7563 ExecStartPre=/bin/mkdir -m 740 -p /run/mosquitto (code=exited, status=0/SUCCESS) Process: 7564 ExecStartPre=/bin/chown mosquitto /run/mosquitto (code=exited, status=0/SUCCESS) Main PID: 7565 (mosquitto) Tasks: 1 (limit: 4545) Memory: 844.0K CPU: 24.249s CGroup: /system.slice/mosquitto.service └─7565 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf Jun 15 10:03:06 bob-virtual-machine systemd[1]: Starting Mosquitto MQTT Broker... Jun 15 10:03:06 bob-virtual-machine systemd[1]: Started Mosquitto MQTT Broker. Configuring the NetBurner The IP address of the Linux VM is 192.168.1.52, so that is the MQTT Broker server address I must now set in the NetBurner MQTT configuration under Config > Sys > MqttClient > Hostname. The Mosquitto subscriber utility command line changes as well, from test.mosquitto.org to its own IP address, since that is where the broker is running. Note that you could use the Windows MQTTX utility as the subscriber as well. The command is: mosquitto_sub -h localhost -v -t "testtopic/netburner" or mosquitto_sub -h 192.168.1.52 -v -t "testtopic/netburner" Subscribing to the Topic Since the NetBurner will only publish on a change in the integer value, now that I have subscribed I push the reset button to reboot and send out the initial value of 0: That’s it! We now have multiple utilities to publish and subscribe, a local and Internet broker to test with, and an embedded device that can publish to either. You can read the ReadMe for the various MQTT examples in your NNDK for more ideas and usage details, or browse the MQTT library documentation (click on the MQTT namespace to view most of the info.) Tips Here are some of the problems I ran into: I thought my Linux firewall was disabled, but it was not. So no incoming TCP connection requests were getting through. There is a MQTT Broker configuration file located at /etc/mosquitto/mosquitto.conf. I had to add these lines in order to reach the broker: allow_anonymous true listener 1883 ### Bridging the Web-Embedded Divide, Part 2: Laundromat Continuing from Part 1 of our Web-Embedded Divide series, today we’re diving into the opposite direction: instead of submitting data from an embedded device to “the cloud,” we’ll be setting up a “cloud” server that controls one or more embedded devices.Bridging the disparate worlds of embedded programming and web development, microcontrollers and web servers is not always easy. In Part 1 we used PHP, the NetBurner DoJsonPost C++ function, and a basic SQL database like SQLite to log, display, and respond to data coming from our NetBurner microcontroller, specifically the status of DIP switches on the development board.In this post we’ll go for something a little more top-heavy: what if you want a lot of customer-facing web infrastructure (it’s usually not a great idea to give random people direct access to a webpage running on a resource-constrained embedded device in your office!) to intelligently and dynamically interact with affordable on-premise embedded systems?Mission StatementRefer back to Part 1: Switch Counter to get an overview of what we’re doing and some web/embedded concepts we’ve already covered, like client-server REST APIs, HTTP, and statefulness vs statelessness.This time, we’ve chosen a different architecture more typical of modern “Cloud” / “IoT” systems. Gone are the days of submitting an HTTP request directly to devices every time we want something, or polling every few seconds for status updates: people expect their phones to “just work” with all sorts of retail systems, and to receive realtime information that reflects physical hardware with minimal processing and overhead. One way of accomplishing this is with a “pub/sub” architecture: with a common message bus like MQTT forming the backbone, servers and devices can authenticate and exchange only what plaintext messages they find relevant under named “topics,” bidirectionally, even when some of the devices are behind firewalls or lacking public IP addresses. A single TCP/IP socket can be held open for long amounts of time, reducing overhead and delay when short status updates or commands are sent or received.However it’s scary to hand over control of an expensive machine and payment details to random customers! We need to architect things properly so someone can’t “hack” our equipment, get things for free, exploit vulnerabilities on our website/app, expose sensitive customer information, or fail in unexpected ways.Here’s the architecture we’ve chosen for this example:Notice that the Customer doesn’t need to know any details about the physical hardware, like Laundromat IP addresses or networks, and the Laundromat hardware doesn’t need to know anything about the customer. They don’t talk directly and don’t need any special network configurations, they just both talk to a Web Server and MQTT broker “in the cloud” (hosted by a provider like AWS, Azure, Google Cloud, DigitalOcean, etc.) The user experience is seamless in the way people expect nowadays when ordering food for pick-up via an app, or when paying for their groceries via QR code: they might be using their phone to control a retail or electronic experience right in front of their face or a hundred miles away, but their phone is actually talking to an Internet-connected server in a datacenter somewhere else and using real-time lightweight protocols like MQTT, WebSockets, or Web Push behind the scenes to rapidly and cost-effectively exchange messages between all interested parties: this complicated dance can sometimes be accomplished in less than a second and less than a kilobyte, with nearly no unnecessary waiting or requests besides setup and teardown, allowing services to scale to thousands of users for barely any per-user expense.Also notice that each part of the architecture is doing what it’s good at: customer devices can be mobile, personally identifiable, and network-connected. Customer-facing web servers can be scaled, copied, relocated, configured, updated, and integrated with databases or payment processors or third-party services as desired. The MQTT message broker manages authentication, authorization, and connectivity to all NetBurner modules even when they’re distributed across many locations and behind firewalls with many unknown configurations: some brokers even have rudimentary data storage, security, or device management functions that can help manage the physical hardware “fleet” and associated data. It also naturally separates concerns and security domains between the customer-facing and hardware-facing architecture: customer devices aren’t accessing the Laundromat directly, there’s a secured standards-based plaintext backend that limits the scope of possible actions. It will be very hard, for example, for someone to attack the NetBurner module directly when it’s inside a secured premise network and only responding to text sent over an MQTT channel. Finally, the NetBurner hardware is much more affordable and capable of being deployed on-premise at a laundromat versus a complete computer system. NetBurner devices can speak many customizable industrial protocols or simply toggle electrical signals or relays via GPIO, and operate reliably for years in extreme environments without having to worry about Windows Updates: interfacing with and network-enabling electrical hardware is the NetBurner bread and butter.Example 2: LaundromatWe’ve chosen to use a laundromat as an stand-in for any remote or nearby user controlling any physical hardware with any network-connected device like a phone or computer. This example could just as easily be about computers or control panels managing industrial or scientific machinery, or simply gathering and reporting on a “fleet” of low-overhead devices in the field! The key is that we’re exploring different protocols and architectures, and the harmonious balance between these different technologies. You’re well on your way to being a “full stack developer,” understanding the whole spectrum of the protocols and languages being used!This guide assumes that you have some way of running a NodeJS web server in a persistent way (not serverless per-request like with AWS Lambda, but a continually-running Node binary, perhaps behind a reverse web proxy) accessible at a “public” IP/URL that all the above devices can access. For test purposes this can be a computer at home, but in actual deployment a hosted server with a domain name, SSL, and public IP would be expected. Additionally, we assume that MQTT security/authentication, NetBurner hardware/software hardening, customer authentication/authorization, and network security will be handled separately: we’ll only be touching on it briefly. Finally, the embedded code is written for the NetBurner 3.5.4+ NNDK and devices.Concepts and StrategiesBefore we dive into the details, let’s examine why we’re making some of the choices we’ve made.QuestionsFirst, we’ve got a lot of moving parts and it’s important to get them right. Different people may be working on different parts of this project, so clearly defining each section and who’s responsible for what, with specific “APIs” (agreements on data format, message type, expected responses, errors, etc) will reduce arguments during debugging and prevent big problems later.For example, where should logic happen? Which parts of the system are authoritative about status and which are simply repeating or caching what something else said? Which parts exert control and which respond to that control?What protocols and architectures best fit the needs of this scenario, and work within the practical constraints of customers, partners, and internal systems? What happens to this design if one or more parts are rebooted, disconnected, unavailable, corrupted, or attacked?When choosing languages and frameworks, what are the pros and cons of strongly-typed languages like C++ vs weakly-typed languages like Javascript, and where do we validate and resolve conflicts/errors? What are our assumptions about how these languages should interact?Since embedded devices are generally stateful (they often persist at least some global variables and electrical states indefinitely) whereas HTTP is stateless (each request contains little or no information about previous requests, and can sometimes even be duplicated) how should we architect around this? Where should state be maintained, retrieved, or ignored, especially when considering high-volume web servers or our backend systems?AnswersIn order to show off the power and ease of the builtin NetBurner MQTT library, we’ve decided to use one mqtt_int for each data point we want to track. This will automatically handle MQTT publishing and subscription to/from named MQTT topics, as well as the conversion of plaintext MQTT data into strict C++ types. Obviously if something invalid is transmitted the local state could become invalid, however the simplicity of the system’s interfaces should prevent anything seriously wrong from happening: choosing an invalid number of credits or an invalid cycle can be easily identified and handled. We’ve chosen not to expose direct control of the machine (there is no “start” or “stop” via MQTT) but rather treat the NetBurner system like an alternative money handler that registers “coins” and customer preferences. The customer will still need to push the physical Start button on the desired laundromat machine, for sanity and safety. Status can then be reported back over MQTT to the customer’s device.We’ll use a hierarchical naming scheme typical of MQTT for our topic names, with a subscription namespace (“laundryExample”), device ID (“washer/dryer 1/2/etc”), and finally specific device attributes (“credits/cycle/timeLeft”). Topics are simply strings, however MQTT clients and servers are aware of wildcards, so hierarchies like this make it easier to subscribe to something like “laundryExample/#/credits” for a client that only cares about financial details. Debugging clients like MQTT Explorer also tend to show topics in collapsible trees, split on slashes.On the NetBurner side we’ve also chosen to set “readWriteFlags” on the credits and cycle topics, but “writeOnlyFlags” on the timeLeft topics. This demonstrates some basic security control over the MQTT channel: some other device could broadcast an invalid timeLeft value, which could temporarily confuse other clients, but it wouldn’t affect the NetBurner device’s internal variables. The read-write values are considered a collaboration between both the web server and the NetBurner device: they can be updated by either side, which will notify the other, providing bidirectional communication. If we wanted a little more resilience and reporting, we could have one topic for setting a value (from the web server) and another topic for reporting its current state (from the NetBurner device) but if we don’t need that level of architecture it would still be valid to decide on one side that the “topic” of the number of credits spent on a laundry machine is written, and on the other side that the “topic” is only read, to be clear about the state and responsibilities of the system. We’ve decided not to set the Retain flag in MQTT: the retain MQTT feature will re-publish old values to clients when they connect so that they recover the most recent state on reboot or after disconnection. This can be useful for caching statistics in the system, however it runs the risk of re-issuing old commands we don’t want anymore, or communicating old status information that may not be accurate anymore.On the web server side, the mqttjs library doesn’t do quite as much work for us, so we do need to manually handle incoming messages/topics and call parseInt() on data coming in from MQTT and toString() on data going out since MQTT is plaintext. We also want to do sanity checking on data coming in from customers or the Internet: we’ll use parse functions and RegEx matching to filter out obvious junk there.We don’t have a lot of error communication back and forth, though this could easily be added via other MQTT topics that are published or subscribed to as appropriate. For now, most obvious errors are handled internally and output on the serial console or in the HTTP response.Customer-facing/controlled state is handled in our array of machines inside NodeJS: it authoritatively maintains and publishes changes to the Credits and Cycle topics. Feedback about credit and cycle status from the NetBurner is received on sub-topics for display to the user.ImplementationPower Users: If you’re more comfortable with Git and Make than copy/paste and NBEclipse, the code and deployment tools are available on Github as well.RequirementsDecide on how you’d like to run an MQTT server and set it up. The default "test.mosquitto.org" server with no username/password may work, however it should not be considered reliable or used outside of development tests. Mosquitto.org is sometimes overloaded, so if it doesn't work consider setting up your own test MQTT server: my personal server is set up through HomeAssistant, and I tend to use AWS IoT Core or Azure Event Grid MQTT for work projects.SetupInstall the NetBurner NNDK if you haven’t already.Edit wwwroot/env.dist with MQTT username/password/host and other settings as desired, and save as wwwroot/.envNote that Docker will need to be rebuilt after any file changes.Running Web PortionTo run directly, install NodeJS and NPM and run:npm installnpm startTo run via Docker, install Docker and run:docker build . -t laundromatdocker run -p 8000:8000 -it laundromatRebuild and re-run if you make any source code or configuration changes.Running Embedded portionCopy-paste into a NBEclipse project or run make load -e DEVIP=192.168.1.100(changing the IP to match your NetBurner device)To find your device's IP, you can visit https://discover.netburner.comIf you encounter error messages about missing header files, ensure that your other environment variables like NNDK_ROOT and PLATFORM are set properly. You can always provide them on the command line like make load -e PLATFORM=SOMRT1061 -e DEVIP=192.168.1.100Final steps1. Finish configuring your NetBurner device by going to i.e. http://192.168.1.100:20034 and setting the following options under MqttClient:ClientId (i.e. laundromat-test)Hostname (i.e. test.mosquitto.org or the IP/Domain of your MQTT server)Password (password of your laundromat-test MQTT user, if any)Port (default 1883 for unencrypted, or 8883 for encrypted)TLS_Enabled (check if encrypted)Username (i.e. laundromat-test, if any)Note some MQTT servers ("brokers") will disconnect clients with duplicated usernames and/or client IDs, so if you have issues with immediate disconnections try making a separate username (and client ID) for each client. The web and embedded portions of this project each count as one client, so use different Client IDs for each.2. Click Update Record to save. Reboot your NetBurner device so the settings take effect.3. Connect a serial console to your NetBurner device and notice the output:Primary network interface configured for DHCP MAC Address = 00:03:f4:12:34:56 Type "A" to abort boot Application started NotConnected NotConnected Connected. Machine 0 is OFF [0 credits, 0 cycle, 0 time left] Machine 1 is OFF [0 credits, 0 cycle, 0 time left] Machine 2 is OFF [0 credits, 0 cycle, 0 time left] Machine 3 is OFF [0 credits, 0 cycle, 0 time left]You can press 0, 1, 2, or 3 to add "credits" to a machine, and S to start the machine(s). The status will be sent up via MQTT to the web app.4. Visit the webpage of your web app: http://localhost:8000If this doesn't work, double check your Docker networking settings and firewalls.You can also run the project directly with NodeJS via npm.The port number should appear in your system's "listening ports" output.You can try netstat -an | grep 8000 on Linux, Mac, and Windows Powershell.You can select a cycle and press Start to start a machine, and the status/request will be sent via MQTT to the NetBurner.Wrapping UpAnd that's it! You have a working client-server application where multiple web clients like mobile phones can contact a web server (run by NodeJS) which talks to an embedded backend (run on the NetBurner hardware) over an industry standard MQTT channel. This architecture can level up your ability to provide professional solutions to end-users who are used to "an app for that" without having to mess around with on-site IP addressing, firewalls, or port forwarding.Please play around with the code and make it your own! Hopefully this series has helped bridge the gap between the embedded and web development ecosystems, and some of the architectural considerations are easier to grasp on both sides. ### Including External Libraries: LVGL LED Display Part 1 Have you ever struggled to get compilers to properly include and link third-party libraries in your projects? Ever wondered if a NetBurner was powerful and flexible enough to render graphics to a screen so your project could have an integrated display? Struggle and wonder no further! In today's post, we'll guide you through creating a project in NBEclipse (or your preferred text editor using make on the CLI) that can build an application for a NetBurner device. The application will rely on LVGL being built as a static library, and we'll include and link that build all together in one project/folder structure. If you'd like to keep your projects separate, you can also reference our previous blog post about building and linking external libraries in NBEclipse. Both of these methods should work, it's just a matter of preference how closely you want your code to exist with library code. This guide was written for NNDK 3.5.2. It should be applicable for all 3.X NNDK releases. LVGL is a small graphics library for rendering GUIs, text, images, shapes, and more. The main project source will exist in the "src" folder, while LVGL will exist in the "lvgl" folder at the root of the project. When building, the application will first build LVGL based on a custom makefile. Then, it will build the application. In further builds, LVGL will only be re-built if its source or dependencies change. Install This project's files from Github: https://github.com/NetBurner/LvglLedDisplay NBEclipse from the NetBurner NNDK 3.5.2 or higher, if not already EEZ Studio from https://www.envox.eu/studio/studio-introduction/ For EEZ Studio, you may need to install some Python 3 dependencies: pip3 install pypng lz4 Configure Environment 1. Review the makefile that we've added to the lvgl subfolder. This makefile will contain the source files that will need to be built to generate the lvgl static library, instead of using lvgl's default cmake routine. This also includes special NetBurner rules to simplify the build. The makefile should reference all the source files necessary to build the project, but not unneeded things like the lvgl draw/nxp, drivers or others folders. Importantly, we will output the library .a file to a convenient parent folder for our project to pick up later. This will end up in the root of our project, at obj/release/liblvgl.a whether we use NBEclipse or make: # Generated static library file name NAME := liblvgl OBJDIR := ../obj # Source files to build C_SRC += $(sort $(wildcard src/*.c)) $(sort $(wildcard src/core/*.c)) $(sort $(wildcard src/display/*.c)) $(sort $(wildcard src/draw/*.c)) $(sort $(wildcard src/draw/sw/*.c)) $(sort $(wildcard src/draw/sw/blend/*.c)) $(sort $(wildcard src/font/*.c)) $(sort $(wildcard src/indev/*.c)) $(sort $(wildcard src/layouts/*.c)) $(sort $(wildcard src/layouts/flex/*.c)) $(sort $(wildcard src/layouts/grid/*.c)) $(sort $(wildcard src/libs/barcode/*.c)) $(sort $(wildcard src/libs/bin_decoder/*.c)) $(sort $(wildcard src/libs/bmp/*.c)) $(sort $(wildcard src/libs/ffmpeg/*.c)) $(sort $(wildcard src/libs/freetype/*.c)) $(sort $(wildcard src/libs/fsdrv/*.c)) $(sort $(wildcard src/libs/gif/*.c)) $(sort $(wildcard src/libs/libjpeg_turbo/*.c)) $(sort $(wildcard src/libs/libpng/*.c)) $(sort $(wildcard src/libs/lodepng/*.c)) $(sort $(wildcard src/libs/lz4/*.c)) $(sort $(wildcard src/libs/qrcode/*.c)) $(sort $(wildcard src/libs/rle/*.c)) $(sort $(wildcard src/libs/rlottie/*.c)) $(sort $(wildcard src/libs/thorvg/*.c)) $(sort $(wildcard src/libs/tiny_ttf/*.c)) $(sort $(wildcard src/libs/tjpg/*.c)) $(sort $(wildcard src/misc/*.c)) $(sort $(wildcard src/misc/cache/*.c)) $(sort $(wildcard src/osal/*.c)) $(sort $(wildcard src/stdlib/*.c)) $(sort $(wildcard src/stdlib/builtin/*.c)) $(sort $(wildcard src/themes/*.c)) $(sort $(wildcard src/themes/default/*.c)) $(sort $(wildcard src/themes/mono/*.c)) $(sort $(wildcard src/themes/simple/*.c)) $(sort $(wildcard src/tick/*.c)) $(sort $(wildcard src/widgets/*.c)) $(sort $(wildcard src/widgets/animimage/*.c)) $(sort $(wildcard src/widgets/arc/*.c)) $(sort $(wildcard src/widgets/bar/*.c)) $(sort $(wildcard src/widgets/button/*.c)) $(sort $(wildcard src/widgets/buttonmatrix/*.c)) $(sort $(wildcard src/widgets/calendar/*.c)) $(sort $(wildcard src/widgets/canvas/*.c)) $(sort $(wildcard src/widgets/chart/*.c)) $(sort $(wildcard src/widgets/checkbox/*.c)) $(sort $(wildcard src/widgets/dropdown/*.c)) $(sort $(wildcard src/widgets/image/*.c)) $(sort $(wildcard src/widgets/imagebutton/*.c)) $(sort $(wildcard src/widgets/keyboard/*.c)) $(sort $(wildcard src/widgets/label/*.c)) $(sort $(wildcard src/widgets/led/*.c)) $(sort $(wildcard src/widgets/line/*.c)) $(sort $(wildcard src/widgets/list/*.c)) $(sort $(wildcard src/widgets/lottie/*.c)) $(sort $(wildcard src/widgets/menu/*.c)) $(sort $(wildcard src/widgets/msgbox/*.c)) $(sort $(wildcard src/widgets/objx_templ/*.c)) $(sort $(wildcard src/widgets/property/*.c)) $(sort $(wildcard src/widgets/roller/*.c)) $(sort $(wildcard src/widgets/scale/*.c)) $(sort $(wildcard src/widgets/slider/*.c)) $(sort $(wildcard src/widgets/span/*.c)) $(sort $(wildcard src/widgets/spinbox/*.c)) $(sort $(wildcard src/widgets/spinner/*.c)) $(sort $(wildcard src/widgets/switch/*.c)) $(sort $(wildcard src/widgets/table/*.c)) $(sort $(wildcard src/widgets/tabview/*.c)) $(sort $(wildcard src/widgets/textarea/*.c)) $(sort $(wildcard src/widgets/tileview/*.c)) $(sort $(wildcard src/widgets/win/*.c)) # Generate a static library in the makefile folder TARGET_TYPE := lib # Boilerplate.mk contains all rules to build makefiles for NetBurner devices include $(NNDK_ROOT)/make/boilerplate.mk 2. There's also a makefile in the root of the project that includes all C and CPP files in src and src/ui. If you add any new source files, especially new LVGL images/fonts, add them as appropriate. Notice the NBINCLUDE line which allows #include to work without full paths and quotes: NAME = DisplayApplication NBINCLUDE += -I"lvgl/src" CPP_SRC += src/main.cpp src/Display.cpp src/Screen.cpp src/dma.cpp C_SRC += src/ui/images.c src/ui/screens.c src/ui/styles.c src/ui/ui.c src/ui/ui_image_map.c XTRALIB += $(OBJDIR)/release/liblvgl.a CREATEDTARGS += obj/htmldata.cpp CPP_SRC += obj/htmldata.cpp obj/htmldata.cpp : $(wildcard html/*.*) comphtml html -oobj/htmldata.cpp include $(NNDK_ROOT)/make/boilerplate.mk 3. If you change which fonts are being used, especially builtin fonts like Montserrat, edit lvgl/src/lv_conf.h to set their constant to 1Optionally Build with Make (CLI)If you choose to build on the CLI the process is straightforward, though you do need to build lvgl manually. Change the IP address in the command below to point to your SOMRT: cd lvgl make -j -e PLATFORM=SOMRT1061 cd .. make -j load -e DEVIP=192.168.10.150 -e PLATFORM=SOMRT1061 You can omit the PLATFORM and/or DEVIP variables if your Environment Variables are set properly. You'll only need to build the lvgl library once, and if changes are made.Optionally Build with NBEclipseIf you prefer to build using NBEclipse, first create a new NBEclipse project. Use the New Project wizard to generate a NetBurner C++ executable project. In this guide, the project name DisplayApplication will be used. Copy and paste the src and lvgl folders from the file system directly into the NBEclipse project root, as well as the .eez-project and map.png files.The project layout in the project explorer should now look like:⌄ DisplayApplication > Build Targets > Includes ⌄ src > ui > html ⌄ lvgl > src > overload DisplayApplication.eez-project DisplayFrame.stl makefile map.png README.mdAdd a pre-build step to the project. This step will run the LVGL makefile before building the application binary. Note that the makefile in the root of the project is not used by NBEclipse: it's there for CLI-based workflows.Right click on project and select PropertiesClick on C/C++ Build -> SettingsSelect the tab Build StepsAdd the command to run the makefile make -C ../lvglAdd the static library and header folders to the project.Right click on project and select PropertiesClick on C/C++ Build -> SettingsSelect the tab Tool SettingsUnder GNU C Compiler select Includes.Under the Include Paths (-I) pane, add the root folder that the static library uses as its base directory when #include statements are used in source. For LVGL, we use "${workspace_loc:/${ProjName}/lvgl/src}".Repeat the above step for GNU C++ Compiler.Under GNU C/C++ Linker, select Libraries.Add lvgl to the Libraries (-l) pane. You may think to add liblvgl.a here, but that would be incorrect. The GNU toolchain always prepends lib and appends the file extension automatically.Add ../obj/release to the Library search path (-L) pane. This is the folder that will contain the liblvgl.a static library that is built by the library makefile.With these changes in place, the application project will now properly build both the static library and the project binary, and appropriately detect and rebuild changes.RunningWe'll go over designing, building, and connecting the hardware in the next blog post, but for now the code should compile and run on a SOMRT development board with no screen connected.Assuming an Internet connection via an Ethernet cable that can access https://api.wheretheiss.at/v1/satellites/25544 and get time from pool.ntp.org, a connected display would load the GUI from LVGL into a bitmap buffer, and show the last 75 known positions of the International Space Station on a world map, once per minute. It would also show the current date and time. You can see this on the serial console once a minute with messages like 60 got lat -46 long 137 alt 429.627502showing the ISS coordinates retrieved from the web API.You can change the time zone and other settings by browsing to your NetBurner device's Config page, i.e. http://192.168.10.150:20034, and clicking the Expand All button followed by your changes and the red Update Record button.DesigningWe can easily edit the LVGL GUI design (which outputs C code under the src/ui folder) by opening DisplayApplication.eez-project in EEZ Studio.Notice that EEZ Studio is set up to generate includes at instead of . This is to reflect the desired project structure, and if your project has a different structure you may want to change this setting.Feel free to make any desired changes, like clicking on a widget and changing colors. Note that dark colors are chosen to make the display appropriate for a desk. The display can be extremely bright if light colors are used.Save and Build your EEZ project when done.Edit main.cpp accordingly if you want to modify GUI elements programmatically: the objects and objects_t struct is defined by EEZ Studio in ui/screens.h and contains any named UI elements. You can see how we make them functional in the body of UserMain().DevelopingThe core of LVGL is called inside of UserMain with the lv_init() and lvgl_display_init() functions. The ui_init() function loads the contents of the src/ui folder. UI objects are then made available in the objects variable, so we can adjust their function dynamically as desired inside UserMain. RTOS tasks are also created for LVGL's  lv_timer_handler and a DisplayTask function that does the work of actually driving the screen.The LED matrix display driver is implemented in three places: the DisplayTask function which calls functions in dma.cpp to push buffers out to the screen's pins, the lvgl_flush_cb LVGL callback which draws LVGL's display buffer into our internal Display object, and finally those Display and Screen objects we've implemented in those respective cpp files. We use Gray encoding to store and send color information to the display via PWM and the DMA routine mentioned above. You can see more about driving these RGB LED matrixes on Adafruit's website and GitHub.The easiest things to modify are just before and inside the main UserMain loop: tweaking the UI or changing behavior to suit you needs. Feel free to poke around the program and take to the forums to chat about importing your own libraries or setting up your own displays!EEZ BugsBe aware that EEZ Studio has a couple rough edges:Setting the chart dot size lv_obj_set_style_size(chart, 2, 2, LV_PART_INDICATOR) isn't supported inside EEZ Studio, so we do this in main.cpp instead.When changing a bitmap or other externally-referenced file, its source may need to be re-selected from the filesystem: these files are imported inside the EEZ project and won't automatically update themselves.When setting bitmaps in EEZ Studio, it may erroneously display the same bitmap across all bitmaps in the project. This should be ignorable and is a UI bug.Up NextThat's it for this post, we hope it's been a useful way to get started with external libraries in your NetBurner project or extending your NetBurner to produce beautiful graphics! Next in this post series we'll dive into how easy and flexible prototyping with the SOMRT1061 is, and some considerations/examples for those designs, plus producing and assembling your own LED display! ### Use Qwiic I2C and SOMRT1061 for Rapid Prototyping Who needs breadboards? With the new SOMRT1061 development board's Qwiic connector, adding off-the-shelf I2C devices and libraries to your prototypes has never been easier!You might not have noticed it in our recent NNDK release notes, but we've been hard at work retooling our I2C library to make use of the friendly Wire interface commonly used by other microcontroller platforms. Why? Because with the release of our new SOMRT1061 development kit and its Qwiic I2C connector, it's now possible to buy a device from a popular website like SparkFun and have it running on your NetBurner device in minutes! Your next ARM-powered Industrial IoT project can come together faster than ever with a wide assortment of affordable, reusable, plug-and-play modules. i.MX ARM Dev Kit Featured in this Article View Product Page Or, learn more about NetBurner IoT. The Project What's the best way to demonstrate these new capabilities? Let's keep it as simple as possible: this tutorial combines our Earthquake WebClient example that makes use of our elegant ParsedJsonDataSet library, with new Qwiic I2C examples for an OLED Display and a 12-button Keypad, both from SparkFun. A little bit of glue code to push the data where we want it, a few inputs and outputs, and we're done!Code in this blog post and associated GitHub repository are copyright NetBurner, Inc, and covered by the NetBurner license: see the NNDK license that came with your product for more details. Some included files are provided by SparkFun and have their own copyright notices. Arduino is a trademark of Arduino SA, but this tutorial contains no Arduino code: the included Arduino.h file enables compatibility with common libraries only, and is named as such only to enable that compatibility. The NetBurner logo included in this project's 3D files is a trademark of NetBurner. Getting Started with Qwiic https://www.youtube.com/watch?v=x0RDEHqFIF8Qwiic is an open standard created by SparkFun to easily connect I2C devices without breadboards or soldering.In this example, we'll use their 1.3" Qwiic OLED Display and 12-button Qwiic Keypad, but you can theoretically use any Qwiic product in their catalogue. If we don't have an example for it, our examples can be used as a guide for implementing the product's library in your NetBurner project. We've done our best to make the Wire object as close as possible to other platforms, and make a compatibility layer for the most common objects and functions found in Arduino.h. Advanced components may require more work, like audio codecs, radios, or sensors, but the foundation is here! 3D Printed Project Box To really bring a proof-of-concept home in a nice way, we've also put together a 3D-printable enclosure for our SOMRT1061 dev kit that exposes all the ports, plus cutouts for the screen and keypad we'll be using. It's made in the highly-customizable OpenSCAD with the help of the YAPP project box library, so we hope you'll find it useful in a variety of ways! The cutouts for the header pins are ready to use, just commented out in favor of the screen and keypad cutouts we'll be using for this post. Please use and modify to your heart's content! Bill of Materials Qty 1: SOMRT1061 Dev Kit (Dev Board, SOMRT1061 on carrier board, USB cable, Ethernet cable)Qty 1: SparkFun 1.3" Qwiic OLED DisplayQty 1: SparkFun 12-button Qwiic KeypadQty 2: Qwiic cables (ideally 100mm)For the 3D printed enclosure:The enclosure itself (see the Readme on GitHub)Qty 8: Heat-set M3 inserts for plasticQty 4: M3x4 socket-cap screwsQty 3: M3x8 socket-cap screwsQty 9: 1-inch long cut sections of clear 1.75mm plastic filament, and clear glue (optional)If printing with the default OpenSCAD settings with the outputWifi option set to true (for the optional NBEXP-WIFI-INIR WiFi expansion module):Qty 1: M3x20 socket-cap screwQty 1: the 11mm printed cylindrical spacer in the 3D fileOtherwise, print and generate an STL with outputWifi set to false and use:Qty 1: an additional M3x8 socket-cap screwNo spacer neededSoldering iron or other heated tip for the M3 insertsAppropriate hex key or bit for the M3 screws The Code Please download the code from our GitHub repository and copy-paste the files onto a new NetBurner project created with NBEclipse and configured with your SOMRT1061's IP address.To summarize, the real glue holding this project together is a compatibility layer that implements common APIs that these Qwiic and other Wire I2C devices expect. So for example we have a file called Arduino.h which just contains thin wrappers over standard NetBurner function calls: // Arduino.h // NetBurner "Arduino Compatibility" Shim #ifndef _NB_ARDUINO #define _NB_ARDUINO #include #include #include #include #include #include #include typedef bool boolean; typedef uint8_t byte; #define PI 3.1415926535 static inline void delay(int x) { if (x > (1000/TICKS_PER_SECOND)) { OSTimeDly(x/TICKS_PER_SECOND+1); } else for (volatile int i = 0; i < x*100000; i++); } static inline int min(const int a, const int b) { return a < b ? a : b; } static inline int max(const int a, const int b) { return a > b ? a : b; } static inline long map(long x, long in_min, long in_max, long out_min, long out_max) { long outD = (out_max - out_min); long inR = (x - in_min); long inD = (in_max - in_min); return outD*inR/inD+out_min; } static inline unsigned long millis() { return Secs*1000; } class String : public NBString { public: String(){}; /** * @brief Construct a new NBString object from an existing NBString object * * @param str Existing NBString object */ String(const NBString &str) :NBString(str) {}; /** * @brief Construct a new NBString object from a substring of an existing NBString object. * * @param str Existing NBString object * @param pos Starting position to copy * @param len Ending position to copy */ String(const NBString &str, size_t pos, size_t len = npos) :NBString(str,pos,len) {}; /** * @brief Construct a NBString object from a character string (null terminated array of characters) * * @param s String to initialize object */ String(const char *s) :NBString(s) {}; /** * @brief Construct a NBString object from a character string up to the specified amount * * @param s String to initialize object * @param n Number of characters to copy */ String(const char *s, size_t n) : NBString(s,n){}; String(uint32_t v) {siprintf("%lu",v); }; String(uint16_t v) {siprintf("%u",v); }; String(uint8_t v) {siprintf("%u",v); }; String(int32_t v) {siprintf("%ld",v); }; String(int16_t v) {siprintf("%d",v); }; }; #define HEX (16) #define DEC (10) #define OCT (8) #define BIN (2) class Print { size_t handle_unum(uint32_t v, int base) { NBString s; switch(base) { case 16: s.siprintf("%lX",v); break; case 10: s.siprintf("%ld",v); break; case 8: s.siprintf("%lo",v); break; case 2: s.siprintf("%b",v); break; default:return 0; } return print((const NBString)s); // (uint8_t *)s.c_str(),s.length() } size_t handle_inum(int32_t v, int base) { if(v0) { myOLED.erase(); myOLED.setCursor(0, 0); myOLED.print((char)rv); myOLED.display(); } OSTimeDly(1); } } Flashing the Complete Program Once you have all the code from GitHub copied, compiled, and uploaded to your SOMRT1061, your serial terminal should look something like this: Primary network interface configured for DHCP MAC Address = 00:03:f4:12:34:56 Type "A" to abort boot Application: QwiicBlogExample NNDK Revision: 3.5.2 Time Set Running OLED Earthquake example OLED begin success. Keypad begin success. Keypad is connected. Got 4 quakes: 0 ago - 4.9 4 km E of Limones, Panama 1 ago - 5.6 13 km SE of Manaca Civil, Panama 2 ago - 5.7 5 km SSE of Puerto Armuelles, Panama 4 ago - 4.6 70 km SW of Cañete, Chile Don't forget to connect up your Qwiic keypad and screen! Qwiic (and I2C) are usually daisy chainable in any orientation, so multiple devices can be connected in a row: 3D Printing Time to make a nice project box for your prototype!Check out the 3d-printed-enclosure subfolder on GitHub for the printable files. You can try loading the STL into a slicer directly, but we suggest opening the SCAD file in OpenSCAD and poking around first. There are also test-sample files available, which you can use as calibration examples to test your printer and OpenSCAD settings on a smaller model before copying those settings to the larger model, saving time and plastic. Case Assembly Here are all of the necessary parts laid out: After a successful print that passes a fit check, we start by installing the heat-set inserts with a soldering iron or other hot tip set to about 300 degrees Celsius. (PLA plastic melts at about 210 degrees C, but we also need to heat up the brass insert in a timely manner.) The taller posts can be installed with a regular-tipped iron. Shorter posts may benefit from the tip applied sideways to avoid hitting the plastic underneath, or by using a specialized tip for the purpose: The cut pieces of clear filament are inserted into the light tubes and optionally secured with a dot of clear glue:The button posts can also be installed through the hollow flanges labeled RST and IRQ. The button caps snap-fit onto the ends of the posts, so if the fit is slightly off they can be sanded or glued to attach securely, or reprinted with different settings based on your printer:The 3D printed straps can then be screwed in place with short M3 screws to hold the Qwiic keypad and screen:Almost done! Connect another Qwiic wire between the lid components and the Dev Board. The cable can either be connected through the outside and routed in through the WiFi slot, or it can be looped back around directly inside the enclosure base using the extra space in the Qwiic cutout:If using the WiFi module, it can now be installed above the Qwiic connector. The 11mm 3D printed spacer can be used to support the space between both circuit boards. Note that the WiFi module takes extra power, so it may be a good time to check if your computer's USB port provides enough power, and switch ports or use an external charger if not:And we're ready to put it all together! Fold the top half on top of the bottom half, routing the Qwiic wire underneath the WiFi module as you go. You can place the long M3 screw underneath to hold things in place if you want. The two halves should fit neatly together with no forcing or pinched cables:Finally the bottom screws can be secured:And you're done! Plug in power and Ethernet, and the most recent data from USGS.gov will appear. Press 8 to scroll "down", 2 to scroll "up", and # to get new data: Wrap-up Not only is the SOMRT1061 an exciting new platform with tons of capability packed into a small package, we've also loaded the SOMRT1061 Development Kit full of ways to quickly and easily bring your ideas to life. Whether it's the convenient Qwiic I2C system, onboard A2D, easy WiFi header, USB OTG ports, RTC, multiple CAN and UARTs, the fun RGB LED, or the flexible develop-prototype-production SOMRT1061 form factor, we hope NetBurner's new products empower you like never before.If you have any questions or feedback about this blog post or our products, please check out our Forums or contact us at sales@netburner.com or support@netburner.com ! ### Unveiling NetBurner's NXP i.MX RT1061 ARM M7 System-on-Module with Dual Ethernet At NetBurner, we're always striving to help our customers deliver products on time, under budget, and with a great feature set to choose from. We've also heard our customers' requests for platforms that can handle today's increasingly-demanding industrial IoT applications. To that end, we set out to develop a worthy successor to our single-chip SBL2e Serial to Ethernet product: today we announce our new SOMRT1061 system-on-module! It delivers improved performance, resources and security in a extremely small form factor of 25.4mm (1 inch) square. The SOMRT1061 also boasts more memory, more I/O and serial capability, dual Ethernet support, and lower power requirements to pack as much punch as possible into that tiny, versatile package. We're excited to see what new things you make with this! i.MX ARM Dev Kit Featured in this Article View Product Page Or, learn more about NetBurner IoT. Key Features The NXP i.MX RT1061 ARM Cortex M7 processor that lies at the heart of our module is rated for industrial temperatures and runs at 528MHz. Other key features include: 8MB Flash 32MB external RAM 1MB internal RAM 3  2-Wire Interfaces 8  12-bit Analog to Digital (ADC) Channels 3  I2C 5  SPI/QSPI 7  UARTs 3  CAN-FD Dual 10/100 Mbps Ethernet (with IEEE1588 and one onboard PHY) External Address Bus, 12 bit, 28 bit External Data Bus, 16 bit, 8 bit Up to 67 GPIO Flash Card Support (SDHC/SPI) Flex IO Bus Onboard USB PHY Use Cases Encrypted communications (SSL/TLS, SSH, HTTPS, MQTT, and more) Machine-to-machine (M2M) automation Digital, analog and serial control applications Edge node microcontroller, edge processor, IoT gateway and more Get Started with SOMRT1061 Today Whether you're a seasoned developer or a newcomer to the world of embedded computing, our team is here to support you every step of the way! For more information about the SOMRT1061, please see the product page or contact NetBurner Sales at sales@netburner.com . BUY AN i.MX ARM® DEV KIT NOW! https://www.youtube.com/watch?v=nL5ACZ8rolU SOMRT1061 200IR Datasheet and Pinout 660.21 KB 14008 downloads Download SOMRT1061 Part Numbers SOMRT1061 Module Only (Solderable) Part Number: SOMRT1061-200IR SOMRT1061 Module on Carrier Board (Header Pins) Part Number: CAR-SOMRT1061-200IR SOMRT1061 Development Kit Part Number: NNDK-SOMRT1061-KIT Kit includes all the hardware and software you need to customize the included platform hardware, which is on a carrier board for flexible prototyping. See product page for package contents. See the Press Release at NewsWire.com Header image background courtesy of wastedgeneration at pixabay.com ### New Feature: Easy SSL Certificates with ACME and Let's Encrypt Say goodbye to SSL/TLS certificate registration and renewal headaches, and beef up your NetBurner security!In our 3.5.0 NNDK release, we made it easier to get and update SSL/TLS certificates on your NetBurner device.Without automatic SSL renewal protocols like ACME and providers like Let's Encrypt, the process of requesting, renewing and installing a certificate can take hours (or even days, in the case of embedded or legacy systems) and is easy to forget. But thanks to the Internet Security Research Group's efforts, securing your project is about as painless as it can get -- not to mention at the bargain price of free! Perfect Timing. Try Our NXP i.MX ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. The Code In this tutorial we'll be modifying an existing basic HTML project, but you may prefer to use the example project code that ships with NNDK 3.5+ under examplesSSLacmeservlet — the basic web server example at examplesWebSimpleHtml is a good blank slate to start from.All code in this blog post are Copyright NetBurner, Inc, and may only be executed on NetBurner provided hardware. See the NNDK license that came with your product for more details. Getting Started with ACME Thanks to a new protocol defined in RFC8555 called ACME (Automatic Certificate Management Environment) and providers like Let's Encrypt and BuyPass, the process of getting and renewing publicly trusted SSL certificates is now almost painless. How painless you ask? Well, first we have to make a few assumptions that are unfortunately part of the ACME protocol and SSL certificate infrastructure itself: We assume that your device's web server is accessible via a public IP address (IPv4 or IPv6 on the Internet, either directly or via port forwarding on ports 80 and 443) And that it has a public DNS name registered like you.example.com If these two are true, then a public ACME certificate provider should be able to look up that domain name, contact your device's web server, validate your certificate request, and automatically install that certificate onto your device. (We currently support HTTP-01 authentication, not yet DNS-01.) This can work on your local network too, however again the ACME server will need to be able to contact your device by looking up whatever DNS name you're providing: that's part of the verification. So if you're trying to implement ACME SSL on your corporate network, you'll need to configure your ACME server and local DNS such that the server can browse to your NetBurner device's internal web server using the specified DNS name(s). Once those assumptions are met, adding ACME to your project requires only a few lines! Just edit your project's main.cpp to include the following at the top (outside your UserMain function): //Include the ACME server and cert managment stuff. #include #include #include #include //Define the default certificate names and email. Note ALT_NAME is required const char * DEFAULT_CERT_EMAIL= "changeme@Netburner.com";. const char * DEFAULT_CERT_ALT_NAMES= "changeme.example.com"; const char * DEFAULT_CERT_COM_NAME= "changeme.example.com"; //Make sure your system know what time it is. NtpClientServlet ntp_client; //And then create an ACME client //By default with no constructor this will have no email address //And register on the public (production, not staging) server. LetsEncryptAcmeServletObject acme_client; That's it! So how do you know it worked? You can do some debugging of the time (which is critical for proper SSL/TLS operation) and the ACME client like so: // Is Time valid? if(ntp_client.TimeIsValid())printf("Time is validrn"); // Print ACME diagnostic messages to the console acme_client.SetDiag(true); // Or get the current state: NBString state=acme_client.GetStateString(); // Or if you prefer a const char * you can print: printf("Acme State:%sn", acme_client.GetStateCC()); With SetDiag(true) enabled, your device's console will output diagnostic data showing the connection and certificate exchange process: End-User Settings Users can override the DEFAULT_*constants you specified above by visiting the NetBurner Config page for your device. This allows you to flash multiple devices with the same compiled app image and adjust the device DNS names or contact email addresses in the field or as the environment changes. Options and Limitations As you can see the default constants include a Common Name and Alternate Name you can specify, but if you want more than just those two you can specify multiple Alternate Names in one string separated by commas:const char * DEFAULT_CERT_ALT_NAMES = "example.com,demo.example.com,test.example.com,www.example.com";By default the system uses https://acme-v02.api.letsencrypt.org/directory (Let's Encrypt) as an ACME Certificate Authority, but you can change this by using a different client or instantiating the base client class. We've included a client for BuyPass, which is accessible by replacing the Let's Encrypt client with this: BuyPassAcmeServletObject acme_client; — note that BuyPass requires a contact email address to be specified in the CertData while for Let's Encrypt it's optional. In both cases the CA should email you if your certificate is in danger of expiring (fails to auto-renew.)If you're testing your ACME setup with the free Pebble server on your LAN (changing the default Pebble ports from 5002/5001 to 80/443 of course) just change your main.cpp to use a custom ACME client class override instead: // Create a custom ACME client to a local Pebble server: AcmeServletObject acme_client("https://192.168.10.90:14000/dir"); If you want your device to be able to discard its ACME certificate and get a new certificate, the function acme_client.Delete_Everything_Restart(); is also available. For further ACME client details see our upcoming documentation for NNDK 3.5+.Note that Let's Encrypt and BuyPass have rate limits. This means that if you're testing a lot or requesting many new certificates, you could end up having to wait days or weeks before your certificate order will be approved. If you're testing a lot, consider using the Let's Encrypt Staging endpoint, https://acme-staging-v02.api.letsencrypt.org/directory — you can do this easily by adding "true" to the Let's Encrypt ACME client constructor: LetsEncryptAcmeServletObject acme_client(true);Also, our ACME client currently does not support EAB (External Account Binding) or issuer-specific APIs, which means that Let's Encrypt, BuyPass, and self-hosted ACME issuers are the best choice for now: many other providers want you to have an account with them before they'll issue you a certificate. You can see a listing of ACME SSL providers here: https://acmeclients.com/certificate-authorities/ Wrap-up Now your project can create and automatically renew its SSL certificates, supported by all major browsers over HTTPS and many more TLS-enabled applications! We hope your projects benefit from the enhanced security and ease of protecting your NetBurner device with industrial grade encryption.If you have any questions or feedback about certificates, ACME, or NetBurner we welcome your comments on our Forums or at sales@netburner.com or support@netburner.com. ### New Feature: Remote Web Console Tired of scrounging for a USB cable to access your NetBurner serial console? No longer!A common problem when developing embedded applications is when you're testing, deploying, or maintaining the program on a device or in the field and physical access is limited. USB cables only stretch so far!Our team felt this limitation ourselves and with a name like NetBurner you'd expect a fully-network-enabled stack to be possible out of the box, right? Perfect Timing. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. So, over the holidays we whipped up a Remote Console powered by WebSockets, accessible over the same HTTP port used by normal NetBurner applications and customizable to your needs.It'll be part of the upcoming NNDK release, but we're also making the code available on its own so you can backport this feature to your NNDK 3.4 apps. The Code You can access or browse the files and instructions for this blog post via Github if you prefer! Downloading a ZIP of the repository via the green Code download button at the top right might be easier for you than copy-pasting from this post, your choice.This project was developed for NetBurner's NNDK 3.4+ -- older versions aren't guaranteed to be compatible.All code in this blog post and the Github repository are Copyright NetBurner, Inc, and may only be executed on NetBurner provided hardware. See LICENSE.md in the repository for more details. Figure 1: Architecture of our Switch Counter project Backporting You can skip this section and scroll down to Add Remote Console to Project if you're living in the future and already have an NNDK version higher than 3.4.x.Create these files under the specified folders in C:NetBurner or whatever your NNDK_ROOT is: // nbrtosincluderemoteconsole.h #ifndef NB_RMTCONSOLE_H #define NB_RMTCONSOLE_H void EnableRemoteConsole(); #endif // nbrtossourceremoteconsole.cpp #include #include #include #include #include #include #include #include #include #include #include extern http_wshandler *TheWSHandler; int ws_fd = -1; void BadRequestResponse(int sock, PCSTR url, PCSTR data); void NotAvailableResponse(int sock, PCSTR url); using namespace NB; int httpstricmp(PCSTR s1, PCSTR sisupper2); static int ShimFd; void ShimCallBack(int fd ,FDChangeType ct,void *p); int MyDoWSUpgrade(HTTP_Request *req, int sock, PSTR url, PSTR rxb) { if (httpstricmp(url, "/STDIO")) { if (ws_fd < 0) { int rv = WSUpgrade(req, sock); if (rv >= 0) { ws_fd = rv; NB::WebSocket::ws_setoption(ws_fd, WS_SO_TEXT); RegisterFDCallBack(ws_fd,ShimCallBack,0); return 2; } else { return 0; } } return 0; } NotFoundResponse(sock, url); return 0; } int shim_fd; IoExpandStruct shim_io; int OldStdio[3]; int ShimRead(int fd, char *buf, int nbytes) { int rv=0; if ( (!dataavail(OldStdio[0])) && ((ws_fd0)&& dataavail(ws_fd)) rv=read(ws_fd,buf,nbytes); else if(dataavail(OldStdio[0]))rv= read(OldStdio[0],buf,nbytes); bool da=((ws_fd>0)&& dataavail(ws_fd)); da|=dataavail(OldStdio[0]); if(da) SetDataAvail(fd); else ClrDataAvail(fd); return rv; } int ShimWrite(int fd, const char *buf, int nbytes) { write(OldStdio[1],buf,nbytes); if((ws_fd>0)&& (writeavail(ws_fd))) write(ws_fd,buf,nbytes); return nbytes; } int ShimClose(int fd) { return 1; } int ShimPeek (int fd, char *buf) { return 0; } void ShimCallBack(int fd ,FDChangeType ct,void *p) { if(dataavail(fd)) SetDataAvail(shim_fd); if(fd==ws_fd) { switch(ct) { case eReadSet: break; case eWriteSet: break; case eErrorSet: { int ows=ws_fd; ws_fd=-1; close(ows); } } } } void InitStdioShim() { shim_io.read=ShimRead; shim_io.write=ShimWrite; shim_io.close=ShimClose; shim_io.peek=ShimPeek; shim_fd=GetExtraFD(0,&shim_io); SetWriteAvail(shim_fd); OldStdio[0]=ReplaceStdio(0, shim_fd); OldStdio[1]=ReplaceStdio(1, shim_fd); OldStdio[2]=ReplaceStdio(2, shim_fd); RegisterFDCallBack(OldStdio[0],ShimCallBack,0); } int ServeValidResponse(int sock, HTTP_Request &pd) { writestring(sock, "HTTP/1.0 200 OKrnPragma: no-cachernContent-Type: application/jsonrnrn"); if(ws_fd>0) writestring(sock, "{"Valid":true}"); else writestring(sock, "{"Valid":false}"); return 1; } extern const unsigned long console_html_size; extern const unsigned char console_html_data[]; int ServeConsoleHtml(int sock,HTTP_Request &pd) { SendHTMLHeader(sock); writeall(sock,(const char *)console_html_data,console_html_size); close(sock); return 1; } CallBackFunctionPageHandler ValidWS("ValidWS.json", ServeValidResponse); CallBackFunctionPageHandler ServeConsole("console.html", ServeConsoleHtml); void EnableRemoteConsole() { InitStdioShim(); TheWSHandler = MyDoWSUpgrade; } Clear Log 2. Add these lines to nbrtossourcelibrary.mak: Make sure the second line is indented with a tab, not spaces. # nbrtossourcelibrary.mak $(OBJDIR)/CONSOLE_html.cpp: $(subst $(NNDK_ROOT)/,,$(LIB_PATH))/console.html compfile $< CONSOLE_html_data CONSOLE_html_size $@ #... LIB_CPP_SRC += $(addprefix $(OBJDIR)/, CONSOLE_html.cpp) Add remote console to project If you prefer, you can also use example-console/main.cpp from the Github repo in a new NetBurner project or copy-pasted as an example.Add the new include to the top of your project:#include Add to your UserMain function if not already: // UserMain() init(); // Initialize network stack // Start web server, default port 80, required for remote console StartHttp(); WaitForActiveNetwork(TICKS_PER_SECOND * 5); // Wait for DHCP address // Enable remote HTTP "serial" console. Not PW protected. EnableRemoteConsole(); Clean your NetBurner System Library (make -j20 clean-nblibs)Run As NetBurner Application (make load)Once uploaded to your NetBurner device, browse to /console.html (all lowercase) at the device's IP (i.e. http://192.168.1.100/console.html)Any stdout like getchar()'s output or printf() will be displayed on the console. Stdin is available via charavail() and getchar(). You can implement your own I/O or continue on for a full-fledged example. Adding custom I/O handling What's a remote console without some powerful I/O? This program stores user input in a command buffer and returns data or executes actions based on that input. It's also available as example-console/main.cpp in the Github repo if you prefer. We've implemented "time" and "reboot" commands, as well as debug output every 5 seconds, but you can customize as desired. Obviously this console page will be available without a username or password or encryption to anyone able to access your device's webpage, so either only use this carefully for debugging/development on trusted networks or implement your own security best practices for access control. We suggest being very careful about handling what's essentially a web-connected stdin and allowing only extremely limited commands/inputs. We've avoided storing over 100 characters in the command buffer for example. Restricting access to HTTPS only and requiring a password to do sensitive things like reboot would be good next steps. When done, your /console.html should look like this: // main.cpp #include #include #include #include #include #include #include #define SHUTDOWN_CUSTOM_REBOOT_REASON 100 void StoreCmdBuf(NBString &s, char c) { // 100-char command limit for safety if (s.length() < 100) s += c; } void ExecuteCmdBuf(NBString &s) { if (s == "time"){ printf("> Uptime is %lu seconds.rn",Secs); } else if (s == "reboot") { if( NBApproveShutdown(SHUTDOWN_CUSTOM_REBOOT_REASON)) { printf("> Rebooting.rn"); OSTimeDly(TICKS_PER_SECOND * 5); ForceReboot(); } } else { printf("rn> HELP:rn> (You typed [%s])rn", s.c_str()); printf("> time: get timern> reboot: rebootrn"); } } void ClearCmdBuf(NBString &s) { s.clear(); } void OutputTask(void * pd) { while(1) { iprintf("> Tick at %lurn",Secs); OSTimeDly(TICKS_PER_SECOND * 5); // delay 5 seconds } } /*----------------------------------------------------------------------------- * UserMain *----------------------------------------------------------------------------*/ void UserMain(void * pd) { NBString cmdBuf; // store user-entered commands in a buffer init(); // Initialize network stack //Enable system diagnostics. Probably should remove for production code. EnableSystemDiagnostics(); StartHttp(); // Start web server, default port 80 WaitForActiveNetwork(TICKS_PER_SECOND * 5); // Wait for DHCP address // Enable console.html piped to stdin/stdout EnableRemoteConsole(); // Make a background task for outputting some text without blocking OSSimpleTaskCreatewName(OutputTask,20,"Output"); // Main app loop while (1) { char c=getchar(); // getchar will block and also echo each char to stdout if(c=='n') { // newline executes command and clears buffer ExecuteCmdBuf(cmdBuf); ClearCmdBuf(cmdBuf); } else { // all other chars add to buffer StoreCmdBuf(cmdBuf,c); } } } Changing the console HTML If the default example console HTML/Javascript isn't quite to your liking, you can edit the console.html file we put in the nbrtos folder above. It just needs to be compiled into console_html.cpp afterwards for upload to the device.If you encounter issues with the console.html not updating, run compfile console.html console_html_data console_html_size console_html.cpp manually in your terminal after making any HTML changes. Try to keep the total HTML file size small to avoid issues. Wrap-up We hope you enjoy this powerful new ability to manage, monitor, develop and debug your NetBurner projects over the network without cables!Remember that with great power comes great responsibility, think thrice before exposing network-enabled tools to semi-public or untrusted networks or the Internet! If using these remote access/control features in a production or sensitive environment, please follow OWASP best practices or other industry infosec standards. ### C++ Exceptions, Unwind Tables, and 'relocation truncated to fit: R_ARM_PREL31' Most embedded developers who've worked with a Cortex-M4 or newer part with external memory will likely have encountered a linker error at some point telling them 'relocation truncated to fit: R_ARM_PREL31 against .ARM.extab…'. But what on earth does this cryptic message mean? Is there a solution to it? Why does it only appear in the link stage? The standard advice is for the user to enable the GCC flag -fno-exceptions, but that doesn't help if you actually want to use C++ exceptions. So, if that advice is a dead end, how are we to fix the underlying issue? In this post, we're going to be condensing several rather deep topics to their relevant bits and showing when you can and can't truly resolve this error. C++ Exceptions: Throwing, Catching, and Unwinding the universe. At it's core, C++ exceptions are what they sound like, a language mechanism for creating alternate paths for handling 'exceptional' conditions. In other words, they are a way of writing code without having to place innumerable validation checks everywhere and just assume that things are valid until they aren't, and the majority of the time, you don't need to pay the cost until then. The problem is that when you finally hit the exceptional condition, you need to unwind all the calls made up to that point, until you're back where you should have taken a different path through the code (i.e. the catch block). This is where we first encounter what's known as the Unwind Table. As you might imagine, the Unwind Table is a table of instructions that tells a language's implementations exception unwinding mechanism how to unwind the current state of the world, so that it can undo all the changes it's made, until it finally reaches a block that will handle the current exception. Generally speaking, the entry format of the Unwind Table is specified as part of an Exception Handling Application Binary Interface, so that (in theory), it is possible to unwind exceptions, regardless of what language was used for different parts of an executable. Within the Unwind Table, there are many entries, corresponding to specific scopes of execution (function, if/else, try block, etc.), which tell a language how to unwind from that point in execution. To minimize the processing time it takes to unwind and the space required to encode, the entries have multiple forms from maximally compact to maximally expressive, and utilize a virtual machine model with a compact instruction set that is highly focused at register and memory assignments. Which brings us to… The ARM Exception Handling ABI In ARM's case, the Exception Table has two main flavors: the general form and the compact form. To start, all table entries are multiples of the word size, i.e. 32 bits. This means that in order to flag which form an entry is, we need to sacrifice at least on bit to mark the entry format, so for that, we'll take the top bit of the first word of the entry. This leaves us with 31 bits remaining. Now, how might we indicate the address of the unwind routine to use in the general case, if we've already used one of the bits in the first word of the entry? How about an offset from the entry's address to the unwind routine? In other words, we can create a Pointer Relative offset to a new memory location. And if we need to refer to a lower address? Let's make it Signed. So, that's what we do, we create a Pointer Relative, 31 bit, signed offset value (Aka R_ARM_PREL31) calculated as the difference between the address of the offset and the address that it points to, in this case the 'personality routine' used to unwind our execution context. And here we find the core of our issue: 31 bits of offset is not sufficient to cover the entire memory space of the Cortex-M series of processors. So, why does this 31 bits of offset cause such a headache if it doesn't crop up all the time? For that, we need to take about hardware Memory Maps. The Cortex-M Memory Map Since each Cortex-M core has a slightly different flavor of behavior regarding the default map, we'll be discussing the Cortex-M7, as that is what I am most familiar with, and where folks seem to be encountering this problem the most. ARM defines the default Cortex-M7 Memory Map as follows (note the Normal Memory locations): 0x0000_0000-0x1FFF_FFFF: Code, Normal Memory, Typically ROM, Flash, or ITCM RAM 0x2000_0000-0x3FFF_FFFF: SRAM, Normal Memory, SRAM region, usually used for On-Chip SRAM 0x4000_0000-0x6000_FFFF Peripheral, Device Memory, Memory space for On-Chip, Memory Mapped peripherals 0x6000_0000-0x7FFF_FFFF: RAM, Normal Memory, Memory with Write-Back, Write-Allocate cache attribute 0x8000_0000-0x9FFF_FFFF: RAM, Normal Memory, Memory with Write-Through cache attribute 0xA000_0000-0xBFFF_FFFF: Device, Sharable Device Memory, Shared Device Space (think shared memory for coprocessors, GPUs, Accelerators, etc.) 0xC000_0000-0xDFFF_FFFF: Device, Non-Sharable Device Memory, Non-Shared Device Space (no idea what this would be…) 0xE000_0000-0xFFFF_FFFF: System, Strongly-Ordered or Device Memory (varied by block), Contains the Private Peripheral Bus with all Cortex-M standard peripherals Now, when you think about the historic usage of Cortex-M cores, they have been mostly used for Microcontrollers, with built in Flash memory, or more recently as a heterogeneous Real Time controller within a larger SoC, accessing only a small amount of internal SRAM. In both of these cases, we see that the entirety of the program instruction space would reside within the 0x0000_0000 to 0x3FFF_FFFF region of memory, which is just perfect for our 31-bits of signed offset. Additionally, if we want to only use the External RAM for program code, we find that that all would fit nicely in the 0x6000_0000-0x9FFF_FFFF space, and again is just perfect for our 31-bit signed offset. The trouble arises at the exact moment we want to use Off-Chip, or External RAM alongside either Flash/ITCM or internal SRAM for the instruction memory. Given that we have to put the unwinding routines somewhere, we can choose to place it in the low order memory of Flash/ITCM or SRAM, or in the high order memory of External RAM. If we choose to place in the low order memory, we find that the 31-bit offset is insufficient to reach the unwinding routine, when the unwinding instructions live in the high order memory, and vis versa. This is the root cause of the relocation truncated to fit: R_ARM_PREL31 against '.ARM.extab...' message and resultant linkage failure. So, now that we know what the error means, what can we do about it? Symbols: The Ouroborous and Hydra Problem For starters, we could try to fix this problem by just duplicating our unwind routines, placing one copy in low memory, and one in high memory. However, as we will see shortly, that creates a whole host of additional linkage issues, the primary of which is that of a priori knowledge. To begin, how might we go about duplicating our code in the resultant executable? We could try to tell the linker to just put specific functions in multiple places in memory. Unfortunately, this is antithetical to the behavior of most linkers, and even if we could force it to create multiple copies, odds are, we wouldn't be able to convince the linker to use the closer copy when computing the offset necessary, leading to the same issue as before; there has to be a way to achieve our goal. The short answer is that to deal with our problem there's three options: one that's a lot easier, but incompatible with certain hardware; one that's moderately difficult, but more complicated on the device code and a bit more expensive at runtime; and one that's modifying compilers and linkers, aka political along with being very, very hard. In our case, we're going to start with the easy one and work our way up from there. Linker Magic and Vendor Planning The simple solution is highly dependent on two things: manipulating a linker to create multiple Unwind Tables and running on hardware that has generally usable External Memory mapped to 0x6000_0000. If your platform does not allow you to place program data or instructions at approximately 0x6000_0000, this solution will not work, and you will need to see the later ones. Now, what is this solution and how does it work? First, you must define a section in of your linker script that will be used to store the low order memory unwind table, and a second section that will be used to high order memory unwind table. Specifically, if the unwind routines will live in high order memory, the low order table must live above 0x2000_0000, failure to do so will fail to resolve the truncation error. However, if the unwind routines are to live in low order memory, they must instead live above 0x2000_0000, otherwise you will still fail to link. Additionally, if the unwind routines are placed in high order memory, the must be placed at the start of the 0x6000_0000, such that and routine directly referenced in the low order unwind table is within 0x3FFF_FFFF of the start of the referenced routine. Conversely, if the unwind routines are in low order memory, the unwind routines and the high order memory unwind table must be placed such that the all directly referenced routines are within 0x4000_0000 of the end of the high order unwind table in the 0x6000_0000 block. Lastly, you must be able to tell the C++ implementation library which unwind table to use for a given instruction context. In the case of GCC using libunwind, that means defining the method unsigned __gnu_Unwind_Find_exidx(unsigned, int *), which takes an instruction address and a return pointer, that you return the start of the unwind table to use and place the table's length at the pointed address. And that's it. Magically, the link error goes away: exceptions can trigger across internal memory back out into external memory, and vice versa, all day long. Doomed by the Hardware So what if for whatever reason, we can't use sufficiently close memory in the 0x6000_0000 region for the easy solution? What can be done without major surgery to the linker software itself? Well, we can cheat and lie to the linker about what the actual memory map of the hardware is. That is, we can craft our linker script to include a fake region that lives at the top of the low order RAM region, but far above the end of the actual available internal SRAM, at something like 0x3F00_0000. The good news is that this will allow us to at least link. The bad news is that there's no way to actually use this block in the actual running image. For that, we need to reserve some additional space via the linker script, perform some manipulations of the final executable, and finally implement at least one trampoline function. First, we will need to use a tool (in my case, objcopy), to change the destination address for the low order table from our region of fake memory, to somewhere in valid low order memory, ideally, RAM (you'll see why in a moment). Next, we need to add a trampoline/veneer function in low order memory, for every unwind routine that we need to call. Lucky for us, GCC/libstdc++ only use one directly referenced routine: __gxx_personality_v0. So, we can create an assembly function trampoline that looks like: __gxx_personality_v0_veneer: ldr pc, =__gxx_personality_v0 .ltorg Now, the Fun part begins. Recall that the values in our unwind tables use a Pointer Relative offset, that depends on the address containing the offset itself. Well, we moved where these tables are located, but haven't actually modified the tables themselves. Predictably, the resulting addresses they refer to are now wrong! Which means we've got more work to do. To correct our table, we need to go through every PREL31 encoded value and calculate what the resulting address would be as if it were still at the original address, before we moved it, then calculate what the PREL31 encoded value should be for that result given where the value is now located, and then store that new value. But what about those values that reference the unwind routines in high order memory? The new offset is in excess of what can be encoded as PREL31! Oh no, we've hit our own truncated to fit issue. Well, remember when we set up our trampoline function? We simply compare all the values that could reference a high order address against the address of the unwind routines. If the original calculated value matches a high order routine, we instead use the corresponding trampoline function as the 'real' address to refer to, and calculate the new offset value against that address. And that's it! The rest of the owl is how to implement this approach, as there are a couple ways to go about it. The easier way is to use a simple objcopy to move the table destination in the executable, but leave the values as is, and then at startup, quickly recalculate all the offsets in the table. The harder way is to use a different (probably custom) utility to extract the table data, modify it in the manner presented, write the new table back, and move the destination address along the way. Politics: Software's Hardest Problem Given the complex mess the previous solution presents in terms of toolchain and build system complexities, you might ask: isn't there a better way? And you'd be correct! The correct way for this to work is for the linker to be aware that the offset that it is truncating is a reference to an unwind routine, and that it should create a trampoline to place in a specific section, that it can then refer to instead. This way, we can do away with the whole fake memory space shenanigans, and not worry about how the vendor configured the platform, at it just works. The problem is that adding this feature is a much more difficult task than the kludge described just prior, both in terms of just the pure software aspect and the political nature that such changes represent within the context of a large project (such as GNU LD). ### Bridging the Web-Embedded Divide, Part 1: Switch Counter There's a world of difference between a web application that runs on a $3000 server in a datacenter and an embedded application that runs on a $300 module in a factory.Between the two environments there are different computing and network resources available, different programming languages, architectures, delegation of responsibilities, overall perspective, and industry best practices. An embedded processor attached to a CNC machine probably shouldn't run a JavaScript app open to the public Internet, and a web app in a datacenter probably shouldn't make realtime decisions about CNC machine motor movements. One "stack" is optimized for business and network tasks, and the other is optimized for bare-metal I/O and industrial control tasks. The NetBurner MODM7AE70 and SBE70LC products use the Microchip SAME70 and SAMD20 processors to provide high performing and reliable ARM® embedded IoT capabilities for secure automation and industrial IoT applications. For a very low price point, this ARM® Cortex-M7 embedded system-on-module (SOM) solves the problem of securely network-enabling devices with 10/100 Ethernet, including those requiring SSL/TLS, auto certificate creation, industrial protocols, digital, analog, I2C, SPI, CAN, and much more. The products can also be used as an edge node microcontroller, edge processor or IoT gateway. Microchip® ARM® processors, combined with NetBurner’s acclaimed reliability and ease-of-use, provide a solution you can depend on. View Product Page Or, learn more about NetBurner IoT. At NetBurner we pride ourselves in bridging these gaps: we've done our best to make it easy to update embedded firmware and accomplish networked industrial I/O for over three decades, enabling "IoT" before we had a name for it, but also by bringing both worlds of web and embedded development into one system used by major manufacturers all over the world. Our native JSON library and SSL WebClient help these projects follow modern best practices in development, architecture, and security. Mission Statement This will be a two-part blog series in which we use a few minimalistic but realistic examples to help Web Developers and Embedded Developers design both web and embedded applications in a way that interfaces well with "the other side." The first example we call Switch Counter, which demonstrates a basic client-server web "REST" API, and the second example is an imaginary Laundromat that demonstrates a "push" or "pub sub" architecture to enable real-time digital payments.In our years of experience helping customers deliver results, we've found that miscommunication and misunderstanding between these two programming worlds can have each side wondering why the other side is being difficult, when in fact the difficulties of integration are small compared to the pain of a delayed or poorly-architected product. Starting out with a well-designed architecture that spans everything from C++ and UARTs to JavaScript and HTTPS makes the testing and release process that much smoother, but many developers don't "speak both languages" well enough to see why a certain architecture is better than what's easy and familiar. We hope that these examples provide a concrete basis for these conversations, designs, and implementations. Figure 1: Architecture of our Switch Counter project Example 1: The Switch Counter Power Users: If you're more comfortable with Git, Make, and Docker than copy/paste, GoDaddy, and NBEclipse, the code and deployment tools are available on Github as well.A common need for network-connected electronics is to submit data they've gathered about their operation to a central place for processing, reporting, analysis, and further action. Something as simple as the number of times a library patron walks through an optical sensor or as complex as government weather station observations both represent one-way submission of data from a client in the world to a server in a datacenter. Response data can also be used for local decision-making, like if firmware needs updating or if a device reboot is requested, even though the server has no way of initiating that server-to-client communication directly.For this example we use the DIP switches on the NetBurner MOD-DEV-70 development board to demonstrate any physical input and electronic sensor you can think of. With some jumper wires and the right components, you could modify this example to submit data about pretty much anything, and even act upon the server's response.The latest NetBurner device to use the MOD-DEV-70 development board with DIP switches is our MODM7AE70, based on Microchip's SAM E70 Arm® Cortex® M7 microcontroller and one of our most popular system-on-modules!This guide assumes two things:That you are familiar with publishing code to a web server and configuring the server to run server-side code and necessary libraries of your choosing. Any web host like GoDaddy, Dreamhost, Bluehost, or HostGator is fine, as is any self-hosted web server like Apache, Nginx, XAMPP, or Microsoft IIS. Their support teams should be able to help you with the basics of getting started. We've chosen to use PHP and SQLite3 for this example to keep things as basic and universal as possible, but there is nothing wrong with rewriting the PHP file in NodeJS, Python, Ruby, Perl, or ASP.Net as you see fit. Some web hosts may not have the PHP Sqlite3 extension installed and enabled, but this should be an easy task or the code can be trivially modified to use MySQL instead.That you have a NetBurner module and development board and are familiar with running NBEclipse IDE and uploading code to your NetBurner device. A tutorial is available here if you still need to do that part. We will be using the DIP switches on the NetBurner dev board to demonstrate physical and electronic inputs without delving into breadboards or soldering.Now that you have these fundamentals taken care of, let's get started! HTTP GET/POST Refresher As any web developer knows, the two most basic HTTP requests are GET and POST, and that HTTP uses TCP port 80 or port 443 for HTTPS (HTTPS is encrypted with TLS/SSL, as indicated by a lock icon in your browser address bar). GET requests are what happens every time a web browser or other program asks to simply view a web address without making any significant changes, and POST requests are what happens whenever a web form or other data is submitted to the server, like for an e-commerce order or login attempt. By convention, we avoid making changes to the system on a GET request (so you don't order fifty of something just because you hit the Back or Refresh buttons) and we don't repeat POST requests unless we really want to make changes multiple times. Most web browsers ask you if you really want to re-send a POST request, to prevent such problems.)This makes our most common website browsing experience very easy since any web browser on Earth can ask for webpages and send data back up as desired. One limitation of this basic structure, however, is that it says nothing about whether the web server has an urgent need to communicate with a client that isn't actively sending requests. It's only relatively recently that web browsers can ask a user if they'd like to receive "Push" notifications from a website, or that our smartphone apps are able to get information from the "cloud" as it arrives instead of by polling for updates every few minutes. We'll start by demonstrating the basic request architecture in this article, and delve into the opposite "Push" architecture in the next article. REST API Refresher REST is an acronym for REpresentational State Transfer, and describes an approach to web-based APIs and programs that make use of the web's existing structure rather than fighting it. Other older API architectures like SOAP or even RPC take different tradeoffs, but REST is generally accepted for its ease of implementation within the bounds of HTTP and web applications, especially because web servers are stateless and text-based by default: a basic webpage without any kind of data storage is the same no matter who views it or when each web request is handled by the server in its own separate context, and the contents may be viewed or parsed by an unlimited variety of clients or users. This can all be a major stumbling block for those new to web development since things like logging in, storing information, and maintaining state between requests are harder: we quickly need things like caching, cookies, and databases in order to create functional applications.REST takes all this in mind, so when we make a "RESTful" web app we do things like:make our URLs hierarchically represent the resources they Create, Read, Update, or Delete (commonly called CRUD)make full idiomatic use of the HTTP methods GET, POST, and sometimes also PUT, PATCH, and DELETEexpose unique identifiers and useful URLs to allow clients to navigate and make full use of API data without excessive requests or logicmake use of appropriate HTTP headers and response codes to allow automated clients to behave appropriatelycommunicate and represent objects using highly portable, open datatypes like XML or JSON: plaintext may not be the most efficient, but everyone can read itREST is a little bit looser of an approach than others, but it's also often more quick and lightweight. We don't necessarily need to implement a lot of things if our needs are simple, for example in this article we won't be implementing any capability to modify or delete data, and our authentication and validation will be very rudimentary, though they can and should become much more powerful in real-world usage. Stateful Embedded Systems Refresher Contrary to PHP, HTML and Javascript, the C++ programming language was not designed to operate in a web browser or even over a network and certainly doesn't just exist as a script that handles HTTP requests. When we write a program in C++, we usually write something that runs directly "on bare metal" and will continue running for as long (or as short) as we tell it to. We don't necessarily need a separate database, session cache, or external storage, because any variables we create can hang around indefinitely if we want. Here we're responsible for the entire lifecycle of the program and for all the memory and CPU usage we're requesting: a mistake in a long-running low-level program like this doesn't just make for a slow web server or laggy browser, it can lock up all of the hardware it's running on requiring a restart or even OS-level recovery!Since we're writing a program that will start on boot and continue running forever, managing our program's long-running state is a top priority: when we allocate memory, it will persist until we release it (or until the device freezes, crashes, or reboots.) Our program even contains its own while() loop that runs forever, so we need to pay attention to how, when, and where we're declaring variables and allocating memory so we don't end up with unintended infinite loops or runaway memory usage, unlike a script running inside of a separate web server that is somewhat sandboxed and only responsible for itself for the duration of one request.NetBurner is also not a multi-core system that can run multiple threads simultaneously, so it's important to use built-in NNDK functions for handling long-running or complex tasks when we can, rather than building basic functionality from scratch. For example, we wouldn't want a network listener loop running constantly and having us miss DIP switch events or vice versa. What looks like an elementary program can get complex quickly when you're responsible for everything that a CPU is doing! C++ and NetBurner Refresher Low-level compiled programming languages like C and C++ give you lots of power over how exactly electronic devices like CPU, memory, GPIO pins, and network devices are used, and are highly reliable once a compiled program is developed and tested. This is at the cost of increased complexity during development, however; we might hold some incoming data in a memory buffer, but if we assume that the data is 100 characters of text and it ends up being a kilobyte of binary data then some very weird things can happen if we don't design our program in a careful and thoughtful manner. Instead of always managing text handed to us over HTTP by default, we're managing bytes.Specifically, if we allocate memory by using functions like malloc() or keywords like new, we need to free() that memory when we're done. If we're using fixed-size buffers like char buffer[100], we need to use functions that respect that 100-character size and put a null-terminating byte at the end of strings so that other functions don't continue reading random bits of memory beyond what was intended. This is normally included in most functions we use, but it also means that you can only fit 99 characters of text in a 100-character buffer to have room for that terminator. Fortunately, in this program we aren't doing anything fancy, so the buffers and objects we're creating are freed once we hit the end of our while() loop and don't accumulate.If you can review some C++ learning materials to understand pointers, stacks, heaps, memory allocation and release, safe buffer management, and scopes, you'll be in a much better position to do your own C++ programming. The NetBurner library documentation is also a valuable reference to using NetBurner devices effectively since we include many functions for common tasks that would otherwise take a lot of effort to program yourself and are unique to the NetBurner system. Web-Embedded Project Objective We'll be creating a simple client-server embedded and web architecture that uses HTTP POST to submit information from a NetBurner device to a web server and uses HTTP GET to view that information from any web browser or API client. We'll also make sure that when clients submit or view data it's done in a reasonably safe and reliable manner.We'll only really be publishing two "resources" within one "collection" in our simple app: the Creation of a new entry in our database of Device Switch records, and Reading the list of all those entries. This is what POST and GET are supposed to be used for anyway outside of a REST context, so it'll be pretty plain. If we hypothetically wanted to extend this app to more functionality and use the full suite of REST methods, we could set up a hierarchy for accessing more resources either alongside or underneath Device Switch entries, like GET button.php?resource=presses&id=1234 to Read more details about a particular entry, or PATCH button.php?resource=presses&id=1234 to submit partial Updates to an entry's data, but these are left as exercises for the reader.We could even expose other queryable resources like Date information or Device Metadata without needing to change the database or restructure our URL hierarchy: we've left room for any such changes by architecting our database and URLs around the Resources being represented, instead of the tempting structure many new programmers find themselves creating where new programs are written and copy-pasted every time something new needs to be done, or accumulating an unwieldy bunch of mismatched parameters that get harder to manage with each change. That's the power of using industry standard API design patterns like REST from the very beginnings of a project, and doing a little bit of planning. Breaking out the Code Let's get a boilerplate HTTP GET and POST set up in a single-file PHP program that changes its behavior based on the HTTP method (GET/POST) and the passed variables in the query string or POST body. Other more advanced web frameworks use fancy web server configurations to create hierarchical URLs separated by slashes like /site/1/post/5/comment/22 but we don't need complexity today so everything will be in one file, and we'll use ?query=strings to keep our URLs straight.Upload this to any PHP-capable webserver you choose. We use SQLite 3 for this example for simplicity, so the PHP Sqlite library will need to be installed and enabled. On our system running Ubuntu this was accomplished with sudo apt install php8.1-sqlite3 however your system may be different. You may prefer to use MySQL, Postgres, or any other database engine, that's fine too, you'll just need to change the appropriate database lines according to those libraries' documentation. ### Boot and OS Security on NetBurner Devices “What verification is performed by the operating system on boot? Is there a mechanism by which the operating system verifies that the binary image is intended for a NetBurner product, and/or was generated from NetBurner tools? Can you provide a description of any sort of signing or validation that takes place upon reception of a flash image and, or at boot up?” If these kinds of questions come up for you when researching new platforms and development kits, you’re not alone. The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. For engineers with security on their minds, it’s often not enough to know what security ciphers and protocols your devices support for outgoing or incoming connections. In many cases the security on the device itself also comes into question. These security considerations generally revolve around ensuring that the application being programmed into a device, or loaded by the device on boot, is the application that is supposed to be there, and preventing malicious third parties from making unauthorized changes to the device.NetBurner strives to make security a priority for our devices and the applications that are running on them. In order to answer many of the questions that we get from customers regarding module and boot security, we’ve outlined how one of our more popular NetBurner devices, the MODM7AE70, boots, and outlined the many options developers have for making the boot process more secure. The Boot Process The first part of the boot process is controlled by a small microcontroller completely separate from the main processor. This part of the boot process cannot be compromised by any means short of hooking up a hardware debugger to the MODM7AE70. The microcontroller code cannot be extracted since the fuse bits are turned off. The only operation that could be performed is a full erase and reprogram with physical access to the hardware debug interface of the MODM7AE70 processor.Once the main processor boots, it attempts to load the main application from application flash memory located on the processor itself. The application is stored as a compressed image with a checksum. Security Options With the general boot process described, we’ll now dive into the various options available for making a device more secure. The question really boils down to how paranoid do you want to be? NetBurner modules provide options for even the most security minded developers. That said, there is always a balance between security and ease of use. Choosing some of the options listed below will make using the tools for development substantially more painful. Username and Password At the most basic level, you can set a configuration system username/password. This will prevent application updates to the device without a valid username and password being provided. To enable this, go into the device’s configuration system and enable it. This can be done through the web interface, or serially. Note that just having values saved for the username and password will enable this security measure. Setting the Username and Password Through the Configuration System The consequence of this setting is that you will now need to do code updates with the WGET utility with username/password, or by logging into the configuration web page and using the “Update Application” option. Update with TLS Only This option will force any changes to the configuration system and application uploads to use TLS only. This means that the device will be required to have a valid certificate and the secure config server will need to be enabled. Fortunately, both of these are fairly easy to accomplish. Automatic certificate generation is on by default in our modules using our NNDK 3.x tools. This will happen during the SSL/TLS initialization process. Enabling the secure configuration server is also fairly straightforward. This is done by adding the following function call to your UserMain() function: // False enables both TLS and non secure updates EnableSecureConfigServer(true); Code Signing This option will require application updates to be code-signed. Any attempted update with an application that isn’t properly signed will be rejected by the system. code update to flash unless it is signed. This can work with the eclipse development tools and without options 1 or 2 above, which makes development much simpler. The downside is it requires that anyone compiling application code for the device has access to the signing private key used for the signature.We have an example demonstrating this that can be found in the developer tools at:nburnexamplesWebsignedapp Application Hash Codes To verify that the application currently running on a device is what you’d expect it to be, it’s possible to generate and then publish/show a secure hash of the current running application code. This can be used to ensure that the application wasn’t swapped out from under you. To see how this is setup, please see the example located in the developer tools at:nburnexamplesSHA1Digest Things to Consider When trying to establish how much security is appropriate for your own products and applications, it’s important to take a minute and ask some questions about what your device is doing, where it’s located, and what the proper tradeoff is with regard to impact on development. Some key points to consider are listed below.How painful is it to cause a bricking of the device due to a loss of username/password/private key?How will security measures add additional steps and complexity during development?What is your threat model?What are you protecting? Protecting the message on a street sign, or the temperature of a freezer is different than protecting nuclear launch codes.What is your security perimeter / exposure surface?Is the hardware physically secure?These questions will have an impact on the measures you’ll need to take to ensure the most appropriate level of security for your designs. NetBurner is committed to ensuring that even the most stringent security standards can be met with our modules and development tools. If you have any questions about best practices or around specific requirements, please don’t hesitate to reach out to us as sales@netburner.com. ### Enjoying the Vue: Frontend Design for Embedded Systems In previous articles, we’ve discussed the basics of embedded systems web development, showing some fundamental concepts of HTML, CSS, and JS technologies. Although these are the pillars for any web-based application, nowadays, there're a variety of options that we can choose from to create dynamic and attractive user interfaces in less time. These tools are known as frameworks, and in this article we'll learn one which is very much in line with the requirements of embedded systems; this is Vue. Perfect Timing. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. We'll talk about how to implement Vue in your web interface projects using NetBurner devices, with a perspective focused on embedded systems developers with little to no experience in the world of web systems. Introduction Vue is an open-source framework for user interface design based on JavaScript. It was created by Evan You (a former Google employee) in 2014. It provides a declarative, component-based programming model that enables the creation of scalable applications for small and large projects.   At only seven years old, Vue is a younger framework compared to Angular (2010) and React (2013). However, that has not prevented it from gaining popularity among developers today. For example, companies such as Alibaba, Trivago, Netflix, and Adobe have started migrating some of their services to incorporate Vue. Image 1 shows the popularity of VUE compared to Angular and React based on the number of stars on GitHub. Image 1: Web frameworks trend based on Github stars. Why Vue? We've already pointed out that Vue is not the only choice of frameworks we have for user interface design based on web technologies, so why choose Vue over Angular and React? This could be a never-ending discussion because each one has exciting features. In this article, we'll focus on Vue because its features fit well with the requirements of embedded systems. We outline and examine some of those features below.  Learning Curve For those who come from embedded systems development, starting with web development can be a nightmare due to the many tools and technologies out there. That's why I consider the time it'll take us to learn a new technology a vital point; we can't afford to spend one year learning a tool that will surely be supplanted by newer technologies as soon as we master it.Vue is easy to learn if you have the basics of HTML/CSS and JavaScript. You can start developing applications in a couple of months; if you are very dedicated, you could even start converting your old web projects to Vue in a few weeks. But you must be careful. Even though it's a simple framework to learn, the better your JavaScript proficiency, the better your Vue code will be. Poor code could make your application difficult to test and maintain. Progressive Framework This is one of the most interesting features of using Vue. It's a progressive framework. That is, you can progressively migrate an application from another framework written with native HTML/CSS and JS.What does this mean for us? This means that Vue can work in one section of your project, and everything else works with another technology without having conflict between the two pieces. Image 2 shows an example of this. Only one component (blue) is handled by Vue and everything else by another library or framework. Figure 2: Example of progressivity in VUE This is very useful for embedded systems because if you already have a working system and want to add more functionality, it's enough to create a component managed by Vue without having to remake the complete application from scratch. Documentation One of the critical components to have when you start learning to use new technology is good documentation with which you can understand the specific topics. Vue provides well-organized documentation, starting from the basics and going to more advanced topics. You can find the documentation on the official Vue website. It contains everything you need to use this framework. In addition to the official documentation, you can find various videos and tutorials on the web. Versatility This section describes some benefits of working with Vue. Unlike other frameworks, it offers certain freedoms, which allows for a high level of customization based on your coding style or your team's standards. Coding Language Originally VUE ran on native JavaScript, making it very easy to use if you already knew how this programming language works. With Vue 3.0, you can also write code using Typescript, a JavaScript superset that allows you to add additional functionality. This includes adding variable typing, using interfaces, object-oriented code in an effortless way, etc. API Styles The creation of components in Vue can be done in two ways:Option API Composition API. Options API: The traditional way of working with Vue is the one I strongly recommend starting with. It's about organizing a component's information in properties that contain the object. Through these properties, you add functionality to the application.   A component based on the Options API looks like this: Count is: {{ count }} Composition API: This is the new way of creating components in VUE. Unlike the Options API, there's only one attribute where all of the application's functionality is placed. This allows it to have more fluid code, and the form is more similar to traditional JavaScript. A component based on Composition API looks like this: Count is: {{ count }} Once Vue is understood through the Options API, I recommend using the Composition API for all components created in the future. This is because you have more versatility in using the advanced features of Vue with this API.  How To use Vue with NetBurner Devices? In this section, we'll show how to use Vue on your favorite NetBurner board, so you can bring your next web-based user interface to the world quickly and easily.  We’ve modified the existing default application for the MODM7AE70 development board, but it will work for any NNDK 3.x.x based board. To demonstrate the progressiveness and ease of implementing Vue, we'll change a small part of the code in the LED/Switch Control Example section to work with Vue. The remaining application will work as is without any changes. Image 3 below shows the current LED/Switch Control Example page, and enclosed in red is the section to which we'll add Vue functionality. Currently, the LED control section uses the CPPCALL dynamic web function, which is a handy feature. The problem is that for this to work, there must be a browser reload for the new value to be displayed, which may not be very appealing to the user. Although this can also be solved with WebSockets, we want to give you another option for your toolbox.    Figure 3: LED section to which VUE functionality is to be added Build current example The first thing you need to do is to compile and load (you can use NBEclipse or command line) the example, which can be found in: nburnexamplesPlatformSpecificMODM7AE70MODM7AE70MODM7AE70FactoryAppOpen a web browser on your computer that is on the same network as your development board and access the IP of your device (this can be found by going to discover.netburner.com). You'll see a page like the one shown in Image 4. Figure 4: Example factory home page Adding an HTTP Endpoint With the above, you have verified that your system is ready. Before you add Vue, first, you need to make some changes in the firmware. Add an HTTP endpoint to allow communication through the HTTP GET verb. To do this, go to the src/webfuncs.cpp file and add the following code at the end. /*--------------------------------------------------------------------------------------- * Callback to intercept a GET request for URL leds-vue*. The purpose of this callback * is to change the status of the LEDs on the development board and get an echo of what * is received. * * - Sends a JSON header to the browser to specify the content that follows is application/json * - Change the status of the LEDs * - Create a small JSON to respond with the current value sent. * - A return value of 1 tells the system the HTML request was handled by the callback * * Notes: * - HTTP_Request is a structure containing detailed information of the request *--------------------------------------------------------------------------------------*/ int callbackGetLeds(int sock, HTTP_Request &pHttpRequest) { iprintf("Executing GET request callback function: callbackPostLedsrn"); iprintf("Request URL: %s, from: %Irn", pHttpRequest.pURL, pHttpRequest.client_IPaddr); // The URL will have the format: "leds-vue?number", where the value // of "number" will store the LED information. The following code // will test for the '?' character. If one exists, then the // number following the '?' is assumed to contain a value // indicating which LEDs are lit. If no '?' is in the URL, then // the LEDs are initialized to a known state. int32_t urlEncodeOffset = 9; uint8_t v = 0xAA; if ((*(pHttpRequest.pURL + urlEncodeOffset)) == '?') { v = (uint8_t)atoi((char *)(pHttpRequest.pURL + urlEncodeOffset + 1)); } putleds(v & 0xFF); // Create respond string to client with the JSON Conten-Type // And the JSON object with the value of the LEDs char leds_string[50]; sprintf(leds_string, "{"leds":%u}", v & 0xFF); writestring(sock, "HTTP/1.0 200 OKrnPragma: no-cachernContent-Type: application/jsonrnrn"); writestring(sock, leds_string); // Notify system we handled the GET request return 1; } /* * Declare the callback function. Parameters: * leds-vue* URL to intercept * callbackGetLeds Pointer to the callback function * tGet HTTP Request Type (ref HTTP_RequestTypes) * 0 User Access Group, 0 = no password * true When to call (beforeFiles parameter): * true: Always called for the specified URL * false: Only called if the if the requested URL cannot be satisfied elsewhere */ CallBackFunctionPageHandler getHandlerLedsVue("leds-vue*", callbackGetLeds, tGet, 0, true); This code adds an interceptor to the URLs with the format leds-vue*, which calls a callback (callbackGetLeds) that will be in charge of controlling the state of the LEDs on the development board. Adding the VUE Library VUE is a JavaScript library, so it's added to the project with the tag. There're two ways to do this: Using a Content Delivery Network (CDN): This requires the system to have an internet connection but saves memory space on the microcontroller. You can find the source here.  Embedded in the microcontroller flash: This does not require an internet connection but requires sufficient space available in the flash memory. The library minified for version 3.2.33 has an approximate weight of 160Kb.  In this article, we'll use the embedded way. You can download the minified version of the library here. In your project, inside the html/js folder, add a file called "vue.global.min.js" and paste the content of the Vue library.  Open the html/led.html file, and add the library obtained before at the end of the tag. Adding the Vue Application Section The library by itself does nothing. It is necessary to assign a space where the library will have domain. To do this, open the html/led.html file and look for the following section This current section controls the LEDs we want to replace, so delete it and add the following instead. This section will be the one that will control VUE. This must be identified by a unique id which will be used later to tell VUE where the application will be executed (in this case, it's called "app_vue", but it can be any name). Outside this section, everything will continue to work the way it was before, and VUE will only be able to modify and read values within this area. Adding VUE application code Once the VUE work area is ready, it's time to create the application code. To do this inside the html/js folder, create a file called "vue-app.js" and copy the following code. const { createApp } = Vue; createApp({ /** Reactive data */ data() { return { leds: 0, }; }, /** Methods */ methods: { toggleLed(index) { this.getLeds(this.leds ^ (1 = 0) endpoint += `?${value}`; // Send request over HTTP const response = await fetch(endpoint); const data = await response.json(); // Get the new value of leds this.leds = data?.leds ?? 255; }, getImageLedStatus(state) { return `images/${state ? "on" : "off"}.png`; }, }, /** LifeCycle */ mounted() { this.getLeds(170); }, }).mount("#app_vue"); This code has all the necessary functionality to change the status of the LEDs by using the following methods:getLeds: It is in charge of requesting and changing the status of the LEDs by sending an HTTP request through the endpoint "leds-vue?state" (which you previously configured in the board).toggleLed: Toggles the bit value of the corresponding LED and calls the getLeds function.getImageLedStatus: Gets the value of the image depending on the current state of the LED.mounted: Vue hook executed when the application is already mounted in the web client.At the end, you can see the mount method, which specifies the ID of the HTML section where this application will be mounted; this value must be the same that you assigned in the previous step. For all this to work, it's necessary to open the html/led.html file and add the application file at the end of the tag. Adding the Vue Application to HTML To finish, the only thing you have to do is execute the methods created before. To do this, add the following HTML inside the app_vue section within the html/led.html file. This is necessary to create the LEDs and give them functionality. Testing Code Everything is ready, just recompile the project. It's recommended to do a clean build. Once the code is loaded onto the development board, test the new function of the LEDs. Now without refreshing the page, you'll see the change in the state of the LED. Wrapping Up  Vue is an easy framework to implement in our current projects and designs. While it's required to know the syntax and features to use, the good news is that there're many courses, tutorials, and excellent documentation on how to use it. One of the main advantages is that we do not have to redesign our entire UI from scratch. Instead, we can gradually change the features you want to modify or add more interaction.   We hope this article will be helpful so that you can add a more dynamic UI using NetBurner devices and Vue in your future applications and projects.  We would like to hear from you, don't be a stranger and let us know what topics you would like to see in future articles! If you would like to share a project you are working on, you can drop us a comment below, or if you want to contact us directly, feel free to do it here. About the Autor ### How to Connect to an SSH Server In our previous article, we talked about the SSH protocol. We gave a short introduction to the history of the protocol, as well as an example to abstract the operation and the inner workings of it in a very generalized way. At the end of that article, we shared the documentation of our examples. Send Your Serial Data Securely SB800EX-JDDW-IR View Product Page Or, learn more about NetBurner Serial To Ethernet. In this article, we’ve provided a short user guide of what you need to know to test the functionality of an SSH server (including NetBurner applications using our wolfSSH powered library) with freely licensed software for either Windows, Linux, or Mac.  Installing the Software Since SSH server applications are the most common, in this article, we'll explain how to configure and use SSH client software on your computer.This section will explain how to install and set up SSH clients depending on your operating system. SSH Client (Windows) On Windows, there are a wide variety of SSH client software options, but for practical purposes, we'll look at one of the most popular and easy to use, which is PuTTY.  You can find the software on their official website and download the option that fits your computer architecture. You can feel free to follow the default configuration of the installation wizard to have PuTTY installed and blindly click "Next" until it's finished. The installer itself is relatively fast, and after a few seconds PuTTY will be installed and ready to use. When running the application, you'll see a screen like the one shown below, which indicates that the installation was successful. SSH Client (Command-Line, for Linux or Mac) Most of the time, the SSH client is already integrated with the command line of Linux and Mac distributions, so you don't have to install anything. To check that everything is in order, open a terminal and run the command: ssh -V This command will display the software and the SSH version used. In this case, I'm using an Ubuntu distribution of Linux, and OpenSSH is already installed and ready to go. SSH Authentication Using User and Password The SSH authentication using a username and password is very straightforward and easy to do.  This section will show you the steps necessary to use your SSH client to connect to an SSH server using your username and password.  Windows To connect to the SSH server using PuTTY on Windows, open the application and follow the steps below: 1. In the "Host Name” (or IP address) field, write the IP address of your SSH server.2. In the "Port" field, write the one of your SSH server; typically, it’s 22.3. Ensure the SSH option is selected in the Connection Type section.4. Press the "Open" button. 5. A security alert will appear asking you to accept the server's authenticity. Click the "Accept" button. 6. A new window will appear requesting the user with a "login as" caption. Enter the user that you registered on the SSH server. 7. You'll be prompted for the access password. Enter the value registered on the SSH server (when typing the password, you won’t see anything changing in the terminal, this is for security so that the length of your password cannot be seen).8. If your login was successful, you'd see a message from your SSH server or the start of a terminal, which informs you that the connection was successful. The image below shows an example of a successful connection on NetBurner devices.  9. From this point on, all the transmitted information is sent through an encrypted channel.10. You can simply close the PuTYY window or some SSH servers respond to the "exit" command to end the connection. Command-Line To connect to the SSH server using the command line on Linux or Mac, follow the steps below: 1. Open a terminal. 2. Execute the following command, changing the corresponding fields with your user and the IP of your SSH server. By default, port 22 is set, but you can specify it with the parameter "-p your_port". ssh your_username@host_ip_address 3. A message appears to ask you to validate the server's authenticity and type "yes". 4. A new line appears asking for your password; enter it, followed by hitting the enter key (when typing the password, you'll not see anything change in the terminal, this is for security so that the length of your password cannot be seen).5. If your login was successful, you'd see a message from your SSH server or the start of a terminal, which informs you that the connection was successful. The image below shows an example of a successful connection on NetBurner devices. 6. From this point on, all the transmitted information is sent through an encrypted channel.7. You can simply close the terminal window or some SSH servers respond to the "exit" command to end the connection. SSH Authentication Using Keys Another way to authenticate the SSH client to the SSH server is to use SSH keys, which is more secure than using a password because the latter can be targeted by brute-force attacks. This form of authentication is based on creating a public and private key pair. The public key will be shared with the server, and the private key will be stored on the computer and used each time the SSH client starts a connection. The server keeps a list of allowed users based on the client's public key, and each time a connection is made, it'll allow access if it matches the client that wants to connect. To authenticate using SSH keys, first, you need to generate the keys. The following steps show how to do it on Windows and command-line for Linux and Mac. Windows Creating Keys 1. Open PuTTYgen, which is included with the default installation. 2. PuTTY has several encryption algorithms to generate asymmetric keys. RSA is a common choice. Make sure to create it with at least 2048 bits. If the server supports it, we recommend using ECDSA, as you get smaller key sizes for the same security level. You can find the difference between some algorithms types In the following link.3. Press the "Generate" button. 4. To generate randomness, move the mouse inside the empty area. 5. After a few seconds, a public and a private key are generated. You can add a passphrase (which is highly recommended) to make your keys more secure. Keep in mind, however, that some SSH servers do not allow this option. 6. Save the private key in a safe place by pressing the "Save private key" button. 7. To save the public key, press the "Save public key" button, or if your SSH server requires the key in another format, you can press the Conversions menu option. 8. Alternatively, you can copy the public key directly to your clipboard from the PuTTY interface in the Key section. Authenticating with Keys Once you have your keys, you need to provide the public key you just generated to the SSH server. This process will depend on your SSH server; the most common is a user interface in which you can upload your public key.  After sharing the public key with the SSH server, you can connect your SSH client by following the steps below.1. Open PuTTY and enter the IP of your SSH server and the port (usually, it's 22). Then go to the Connection -> SSH -> Auth section. In the "Authentication parameters" section, click on the "Browse..." button and choose the file with the private key generated using PuTTYgen previously. 2. Press the "Open" button. The first time a security alert appears, you must accept the server's authenticity by pressing the "Accept" button. 3. If your login was successful, you'd see a message from your SSH server or the start of a terminal, which informs you that the connection was successful. The image below shows an example of a successful connection on NetBurner devices. 4. From this point on, all the transmitted information is sent through an encrypted channel.5. To terminate the connection, you can simply close the terminal window. Alternatively, some SSH servers respond to the "exit" command. Command Line Creating Keys 1. Open a terminal. 2. Run the following command, changing the < algorithm> option to the encryption algorithm of your choice and the option to the number of bits. For RSA, it's recommended to be at least 2048. ssh-keygen -t < algorithm> -b By default, if you just run ssh-keygen without any parameters, it'll generate a key pair using RSA with 2048 bits; more recent versions use 3072 bits by default. 3. When executing the command, the interface asks where to save the key. Type the path you want, or press enter to use the default path. If you already have a key in that path, you'll be asked if you want to overwrite it. If you have different keys for several SSH servers, you should name each key differently. 4. The next step is to write a passphrase, which will make your key more secure. You can leave it blank for no passphrase. 5. After a few seconds, you'll see the confirmation of the creation of the key pair and the paths where these were saved. Getting the Keys Once you have your keys, you need to provide the public key you just generated to the SSH server. This process will depend on your SSH server; most commonly, it'll have some sort of user interface where you can upload your public key.  With the command line, there're two ways to provide your SSH server with the public key. Copy directly using SSH To do this, you need to use the command sh-copy-id username@remote_host Where username and remote host are from your SSH server. This will copy the key to the server. It's important to note that your SSH server must have the password access option enabled. Since this is occasionally not available, you will have to do it manually. Copy it manually  To manually obtain the public key, run the following command, changing the for the name of your public key file. cat ~/.ssh/.pub This will print the public key in the terminal. You can copy it and provide it to your server as specified by your SSH server provider. Authenticating with Keys Once you have the keys and have shared the public key with the server, you can connect to the server. You can follow the same steps presented in the authentication section using a username and password. The only difference is that you will not be required to enter the password during the process. SSH Examples with NetBurner Devices At NetBurner, we have prepared a series of SSH Server and SSH Client examples that will help you to quickly deploy SSH applications on your favorite devices using out NNDK 3.x tools. The examples we currently have available are as follows:SshMinimalClient: Use the NetBurner device as an SSH client to connect to another SSH server.SshMinimalServer: Use the NetBurner device as an SSH server that allows connections from other SSH clients.SshServerUserAuth: Use the NetBurner device as an SSH server that allows for user authentication. This example uses NetBurner's UserAuth library to allow developers to manage username and authentication information.SshServerUserKey: Use the NetBurner device as an SSH server. This example allows new SSH keys to be uploaded to the device and managed via a web interface. Wrapping Up Hopefully, the content of this article will be helpful for you to test your SSH applications on NetBurner systems and help you get your application to reality in no time. At NetBurner, we're constantly looking for new ideas or suggestions for new content, so if you have something in mind that you would like to see in our blog, don't hesitate to post it in the comments. Or, if you have any questions, comments, or suggestions, feel free to contact us directly; we'll get back to you as soon as possible. About the Author ### Introduction to the SSH Protocol Introduction One of the most common tasks in local and Internet networks is controlling a device remotely to carry out configuration, maintenance, or even file exchange operations. To accomplish these tasks successfully and securely is essential to use a communication protocol that makes sure your data is not violated or mutated. Luckily, there's one that takes care of that, and it's called SSH. In this article, we'll give a brief introduction to the SSH protocol, the basics of how it works, and demonstrate how you can implement it in your future projects using your NetBurner devices.   Send Your Serial Data Securely SB800EX-JDDW-IR View Product Page Or, learn more about NetBurner Serial To Ethernet. SSH is an acronym for “Secure Shell”, and is a TCP  application protocol used to make secure connections to a remote device in order to perform file-sharing or host configuration tasks.This protocol was born as a successor to the Telnet protocol, which essentially serves to perform the same tasks as SSH. The only problem with Telnet is that the information was totally transparent during transmission, i.e., it had no encryption. This made it an excellent target for people who wanted to get your information. Using Telnet on the modern Internet is totally unthinkable because of all the security breaches it could cause.In 1995, the Finnish technology researcher Tatu Ylönen created the SSH protocol, inspired by a password sniffing attack at his university. This protocol replaced text-based Telnet communication with a new one, emphasizing encryption-based security.     For a long time, its version of SSH was released free of charge, but a few years later, it was decided to start commercializing the protocol, thus giving birth to the  SSH Communications Security Corporation. How does SSH Works? The operation of the SSH protocol is somewhat complex because it uses several encryption algorithms and multiple steps to ensure the security of your data. The good news is that you don't need to know the guts of SSH to be able to implement it very quickly in your projects.  In this article, we aim to help you understand how it works at a high level so that you can use SSH without having to be a mathematical expert in encryption.  Newbies Example One of the simplest examples that abstract SSH operation quite well is to imagine the following scenario.You have a friend to whom you want to send some important documents, but you don't want anyone to be able to intercept them on the way.First, ask your friend if he is available so that you can send him the files. 3. In case he answers yes. You share with him a list of the forms you prefer to send the documents. For example, a briefcase, a safety deposit box, a backpack, etc.4. He responds with a list of how he prefers to receive the documents. If he doesn't like any of them, the sending is interrupted. 5. If you both agree on one of the ways to send the documents, for example, you decided to use a briefcase, you’re ready to send your documents. You put your paper inside the briefcase and close it with a padlock that only you have the key to. You then send the briefcase to your friend.  6. Your friend receives the briefcase and puts a padlock on it that only he has the key to open and send it back to you. 7. You open your padlock with your key and send the briefcase back to your friend.8.Your friend receives the briefcase, opens the remaining padlock with his key, and obtains the documents you sent.   As you can see in this example, if someone were able to intercept the documents during the transaction, they wouldn't be able to see them since the briefcase would always have a lock on it. Since it's a protocol for sending "secrets," I call it "sshhhhh". via GIPHY As mentioned before, this example is a very abstract way of how SSH works. However, it's a good analogy of what happens. It seems to be a very complex process, but the protocol takes care of doing everything in a few microseconds and with high efficiency during the process.   The following section will give a more technical explanation of what really happens inside SSH. Technical explanation SSH is a protocol that works with the TCP client-server model, so there's a device that requests the connection (client) and a device to which you are trying to access remotely (server). TCP port 22 is usually used, but it can be changed depending on the required configuration.Generally speaking, the SSH protocol can be understood in 7 stages, which allow the necessary steps to be taken to communicate encrypted data effectively and efficiently. Image 1 shows the communication flow during these stages. TCP Handshake The client requests to connect to the server implementing a TCP Handshake, usually through port 22. If the server accepts the connection, the process continues. Identification String Exchange The client then builds and sends to the server a packet containing:SSH Protocol versionSoftware versionThe server responds with its own identification packet, which contains the same information, but representative of the server. Algorithm Negotiation Next, both the client and the server negotiate the algorithms for key exchange, message encryption, authentication code, and the compression algorithm. The client sends the server a list of algorithms supported by the software, sorted in order of preference (the highest in the list are the most preferred). This message is called the Key Exchange Initialization Message.Once the server receives this message, it sends back the same message with the list of supported server-side algorithms. The server will choose the first algorithm from the client’s list that it supports. If none of the algorithms used by the server and the client are compatible with each other, the connection will be closed and will not proceed to the next step.   Key Exchange In this stage, the secret key exchange is made using key exchange protocols, such as the Diffie-Hellman, to encrypt the data sent. In the case of SSH, one of the most common is the "Elliptic Curve Diffie Hellman” algorithm. These algorithms are basically complex mathematical equations that satisfy certain conditions, so obtaining encrypted information is very complicated unless you’re the intended recipient. The process starts when the client creates a pair of ephemeral keys, a private one that only the client will have and a public one sent to the server in a message. Once the server receives this key, it creates its own pair of ephemeral keys, public and private. A new shared secret key is generated with these keys and the public key sent from the client. Exchange Hash Once the server has that key, it starts another stage called "Exchange hash", using the key exchange protocol agreed upon during the previous phase. For this process, a message is created using as input:Client identification string. Server identification string.The payload of the client's Exchange initialization key message. The payload of the server's key Exchange initialization message. Server public key. This key is different from the one used in the key exchange algorithm. It's one of a pair used in asymmetric algorithms such as digital signatures or certificates and is provided to the server by an admin or responsible party.Client's public ephemeral key. This is the one sent by the client in the previous step. Server public ephemeral key. Secret shared key.    Once the message is created, the server uses its private key to sign or hash the message.The Hash is very important since it proves to the client that the server can generate a shared key based on the client’s ephemeral public key. It also allows the server to authenticate itself and assures the client that it's the server it claims to be. The server then creates a message containing the Hash, the server's public key, and the server's ephemeral public key generated based on the key exchange algorithm. This message is sent to the client.   Once the client receives this message, it uses the ephemeral server key and its private and public ephemeral key pair to create the shared secret key. Once it has this key, the client makes its own hash message with the same entries as the server. The client verifies the server's identity based on the digital signature or local databases. If the validation is not successful, the software used for SSH may display a message warning of this. It's up to the user to decide whether to accept the connection. Once the server's identity is taken, the client uses the server's public key to decrypt the hash message sent by the server and compares it with the one created by itself earlier. If the value is the same, the server's authenticity is validated. Encryption Keys From here onwards, the communication will be encrypted, but the shared secret key will not be used. Instead, it'll be used as a base to generate six more keys, three on each side of the connection. Two keys are used for encryption from server to client and vice versa, two initialization vector keys that are nothing more than two random numbers to make the symmetric algorithm more robust, and two more for integrity from client to server and vice versa used as a digital signature. At the end of this, the server sends a message to the client called "SSH Message NewKeys" and the client sends it back, agreeing between both parties that all data will be sent encrypted from then on. Service Request Last but not least, the client sends a message to the server requesting user authentication. The server responds with an acceptance message, and it's there where the user enters the username and password of the user who will log in to the remote server. If the user is successfully authenticated, a connection is then maintained where all communication will be through an encrypted and secure channel. Although the username and password is the most common authentication method, it's not the most secure because brute-forcing scripts can be used to guess your password. A safer way is to use SSH Keys, which authenticate the device based on keys that only the client device should have and should be kept secure. SSH Clients for Your Computer Now that you know how the SSH protocol works internally, here are a series of links so that you can use an SSH client using Windows, Linux, and Mac systems. You don't have to bother with these are very easy and simple to use.Linux SSH through command line. SSH Clients for Windows. SSH terminal and SSH Clients for MAC.  SHH at NetBurner As you can see, the SSH process is complex, but it ensures the security of your data. The good news is that when you are dealing with SSH applications, the software you use will do all the dirty work for you, and you won't have to worry about implementing all the intricate details.NetBurner is no exception, and that's why we have developed a series of examples using our SSH library that show you how to start run a server or client on your module. It’s included with our NNDK development kits, so you can integrate it into your embedded application at a low cost. Built with the SSH library developed by our friends at wolfSSL, there’s no easier way to add SSH to your project.You can find a detailed list of NetBurner's SSH examples along with a short description for each here. They provide a good base for your own project, whether you're writing a server or a client application. Designed to be short, to the point, and easy to work with, they demonstrate the libraries core functionality, while also showcasing how flexible it can be. Along with their API documentation, you'll be up and running in no time.  Useful links and References A brief history of SSH and remote access.Cryptography Basics - SSH Protocol ExplainedPublic key encryptionBeginners Guide To SSH Wrapping Up Hopefully, this article will be helpful to all those who are looking to implement the SSH protocol on their embedded systems using NetBurner. We would love to hear your comments, suggestions, or ideas for new content.Feel free to contact us directly with any questions or concerns. We'll be happy to help you. About the Author ### Connecting To Ubidots with NetBurner In previous articles, we talked about connecting your NetBurner embedded systems to AWS IoT Core and Azure IoT Hub using MQTT. But as we know, in this IoT world, there's a wide variety of options to choose from. The best choice will depend on the characteristics of your application, budget, and even personal tastes. With this in mind, we bring you another IoT platform alternative called Ubidots. Perfect Timing. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. This article is a small tutorial on how to start sending and receiving data using UBIDOTS and NetBurner systems through MQTT. This can help you take your next IoT project to the field quickly and easily. Introduction Ubidots is an IoT platform that empowers everything from prototypes, education, and research projects to scalable production-level IoT projects. It has different plans and a free version for non-commercial projects that includes most of the features of the paid version.The Ubidots platform allows you to send and receive data to the cloud from internet-enabled devices. You can use a variety of protocols, including MQTT, HTTP (REST API), and TCP/UDP for data transfer. It uses authentication methods and can be implemented over SSL/TLS protocols for data encryption (which we highly recommend using whenever possible).One of the features of Ubidots is that it can function as a broker, in other words, as data middleware. It also allows you to visualize and modify the transmitted data using drag and drop widgets, which can be integrated into Dashboards. This will enable you to have an IoT application that you can show to your team or customers in a short period of time. Figure 1 shows an example of two such dashboards. Examples of Ubidots dashboards. Taken from Ubidots blog iot dashboards One last feature we’d like to point out is that it also has an event handler. This is where you can create rules that trigger actions such as sending an email, SMS, voice call, or even calling another REST API using WebHooks. All the information about events is here.With this short introduction out of the way, let’s get started on our small tutorial that will demonstrate how to start sending and receiving data to Ubidots using MQTT with NetBurner development boards.  Requirements. This article is written using Windows 10 and the MODM7AE70 development board, though it should work for any platform using NNDK 3.x.x.Download the example application from our GitHub repo.It's helpful, though not necessarily required, to know the basics of MQTT. Create an Ubidots account. To use Ubidots services, we need to create an account. The good news is that there're free licenses available that we can take advantage of, as long as we only use them for prototyping, learning, or teaching IoT.To create an account, you need to follow these steps:Go to the official Ubidots website and click on the SIGNUP button. 2. Choose the "TAKE ME TO UBIDOTS STEM" option, the free license for non-commercial applications (in this article, you can find the limits of the free version). If you are looking to develop a production application, we recommend you check the prices of the paid license here. 3. Fill in the requested fields on the right side and then click on the "SIGN UP FOR FREE" button. 4. If the registration was successful, a series of welcome windows will appear, with information, links to valuable resources, and demos of what you can do with Ubidots. Just click on the "-> (Next Step)" button. 5. At the end of the welcome screen, Ubidots creates an example Dashboard. Just click on the "GO TO MY DASHBOARD" button to see it. The demo has a Gauge value from 0 to 100 and a table with historical data. Customizing the dashboard. Now that we have an account, we can start playing with the Ubidots tools. The user interface is intuitive, so we recommend you bring out your inner explorer and do a little digging around. Adding a variable. Now that you’ve gotten your hands a little dirty, let’s get to work. First, we're going to add a variable to send data to our embedded system. To do this, we follow the following steps:Under the Devices option, choose the submenu item with the same name. 2. A table will appear with a device. This was created by Ubidots automatically to save us time (we can add up to 3 in the free version). Click on the name Demo. 3. The device administration panel will appear. You can add new variables (maximum 10 in the free version), view the last value of the variables, see the latest activity time, set the device's location, etc. Click on the "Add Variable" section and then choose the "Raw" option (more information about the types of variables here). 4. Choose a name for the variable. In this case, we’ll use Leds. This name is essential since it'll identify the variable when sending or receiving data. You can change the color of the variable with the icon in the upper right corner (the paintbrush) and the representative icon itself with the one in the upper left corner (the cloud). Adding a widget. Once the new variable has been added, we can add a new widget to the dashboard to visualize the variable or change its status. To do so, follow the steps below:Click on the Data menu option and then on the Dashboards option. 2. Once in the demo Dashboard, click on the + button to add a new widget. For this example, we'll choose a slider widget. More information about widgets can be found here. 3. The slider configuration data will appear. Choose the variable we created in the previous section by clicking on the Add variables option. Choose the device, then the Leds variable, and click on the "ok" button. 4. Add the following settings in the next tab and click on the "ok" button. 5. The new widget will appear on the dashboard. According to your preferences, you can modify its position by dragging it or changing its size. Connect to Ubidots using MQTT and NetBurner. So far, we have configured a dashboard in Ubidots to view and modify data through a graphical environment. Still, the internet of things cannot exist without… things, meaning a device connected to the internet.In this section, we'll configure our NetBurner development system to send and receive data from Ubidots. Ubidots Broker MQTT. As we have mentioned before, Ubidots has several ways to communicate with devices, one of which is through MQTT. It's the one we'll use in this section. The program that we'll see next uses the Ubidots MQTT broker rules. The following article provides a good overview if you want to know them in detail. Code Review. We have developed an example program that fulfills three fundamental functions to help you build your projects faster using MQTT and Ubidots.Connecting to a broker using MQTT.Publish values to variables.Subscribe to variables.The code is based on the MQTT-Paho library, implemented for NetBurner systems. You can get it from the following GitHub link.Here is a brief explanation of the available methods:connect(): Connects to the Ubidots MQTT broker.publish(label, value): Publishes the value specified in the variable with the name label.subscribe(label, callback): Subscribes to the last value received from the broker of the variable with a name label. When receiving data, the callback passed in is executed. Subscriptions must be managed after a successful connection with the broker.keepAlive(): Allows the MQTT connection to stay open and receive subscription data. It must be called recurrently.registerCallback(event, callback): The specified callback is called when an event is executed. The available events are:UBIDOTS_EVENT_CONNECTED: Successful connection with broker.UBIDOTS_EVENT_DISCONNECTED: Broker connection failed.UBIDOTS_EVENT_SUBSCRIBED: Successful subscription.UBIDOTS_EVENT_PUBLISHED: Successful publication.UBIDOTS_EVENT_ERROR: Error during connection. Connecting to our Ubidots example. Now that we have everything we need, we need to perform the following steps to start the integration. Import source code to NBEclipse. Once the source code has been downloaded from GitHub, it's necessary to import it to NBEclipse to modify, compile, and upload it to our NetBurner development system. To do this, follow the new project instructions found in our documentation. Authenticating device. The application requires some additional data to connect to the Ubidots broker. These fields are:Token: This is a unique string of characters from our Ubidots account to authenticate the MQTT connection.Device name: Device to which the data will be sent.It's necessary to put this data into the project. To do this, we perform the following steps. Login to your Ubidots account. Click on the "My Account" option and the "API Credentials" option in the upper right corner. 2. A tab with your account credentials will be displayed. Click on the icon next to the Token section. This will copy a string of alphanumeric characters that we'll use later to your clipboard. Keep this token in a safe place. Remember that it provides MQTT access to your project. 3. In main.cpp file, change the value of the UBIDOTS_TOKEN definition to the token of your application (the one you got before). #define UBIDOTS_TOKEN "Add Here your Ubidots token." 4. In main.cpp file, change the value of the UBIDOTS_DEVICE_NAME definition to the name of your device. #define UBIDOTS_DEVICE_NAME "Add here the device name." If you followed the tutorial from the beginning, the name should be "demo". If you want to check it yourself or set it to something else, you can find it in the admin panel of your device in the "API label" section. PUB/SUB data to Ubidots. To send data, we use the publish method. In our Ubidots dashboard, we have a variable called "demo" with a table of historical data and a gauge, so we add that name to the first parameter of the method, as follows: ubidots.publish("demo", demo); To receive the changes of a variable, we use the subscribe method. Previously we configured a slider with the name "leds". To subscribe to the changes of that variable, we would add the following.  ubidots.subscribe("leds", ubidotsSubscribeHandler); If your variables aren’t named the same as the ones in the tutorial, you can get them by clicking on the variable in the admin panel of your device in the API Label section. The name will be displayed here. Testing the application. Once the changes are made to the base program, you'll be required to compile and upload the program to your NetBurner development system.If everything is set correctly (the token, device name, and variable name), you'll see some confirmation messages in the MTTTY serial terminal (red box in the image).When data is published, you'll see a confirmation message (green squares in the image), and the Ubidots dashboard will update the table value and gauge. When you change the slider, you'll see a confirmation message (blue color in the image). The following image shows the interaction of the MTTTY terminal with the current value in the Ubidots dashboard. Wrapping Up. Thanks for joining us on our journey into Ubidots. As always, we'd love to hear your thoughts and questions in the comments below. If you've used Ubidots in your own project, tell us about it! You can also email us directly at sales*at*netburner.com. ### An Introduction and Overview of Modbus Communication between industrial processes has led to factories operating with minimal human interaction and almost uninterrupted flow. This progress has allowed humankind to develop increasingly advanced technology in less time, making our lives more comfortable an in incredible pace. All of this is possible thanks to the ancestors of the communication protocols, especially the pioneer called Modbus. Perfect Timing. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. This article will outline a brief introduction to the Modbus operation, allowing you to better understand this widely used industrial protocol. Likewise, at the end of the article, we'll show you some recommended ready-to-use solutions as well as a software library that can be useful to implement Modbus in your own projects using NetBurner’s development kits. Introduction Industrial Automation makes heavy use of the Modbus protocol Modbus is an open-source protocol that operates under the single-master model and has been a standard since approximately 1979. The invention of Modbus triggered a revolution in industrial automation because it allowed communication between numerous parts of the industrial process using devices (controllers, sensors, actuators, HMI, etc.) of various brands and manufacturers.Modbus is one of the most widely accepted and used protocols in the industry today. Applications such as HVAC, building management systems (BMS), energy systems, etc., are just a few examples. Since its origin, the Modbus’ creators, Modicon (now Schneider Electric), decided to release the intellectual property of the protocol, which has allowed developers around the world to implement the protocol in their own products.The Modbus protocol is simple to understand. It works over different bus types with high reliability in data transmission. The best part is that it requires very little memory for its operation, making it perfect for implementing in a microcontroller.Some authors consider Modbus the "Grandfather" of industrial protocols, but I dare say that it's the Master and Lord of them all. Yes My Master Lga GIFfrom Yes My Master GIFs Modbus types Over the years, Modbus has been extended to operate in several environments, adding different ways to implement it. The most common are as follows:Modbus TCP/IP: It uses Ethernet as the physical layer and TCP/IP protocols for data transmission. It's based on the client/server model for data communication.Modbus over Serial: It uses a serial port and operates with RS-485/RS-422 or RS-232 interfaces for data transmission. It works using the master/slave model. There're two sub-types:Modbus RTU (Remote Terminal Unit): The data sent are in Hexadecimal format.Modbus ASCII: The data sent are in ASCII format.           Sometimes Modbus over serial uses radios (e.g., via LoRa) to transmit data wirelessly.Modbus Plus: This is a special case since it uses HDLC as the data link layer, allowing data transmission up to 1Mbs. Unlike the previous versions listed, this type of Modbus is Schneider Electric's proprietary standard.In industrial applications, it's common to find different Modbus types interconnected via Gateways. Figure 1 shows an example, the 460ECMC Gateway from our friends at RTA. Figure 1: The 460ECMC Modbus TCP/IP Gateway Protocol description Modbus is easy to understand because its implementation is not very complex. The following is a general description of the parts of the Modbus protocol and how it works. Single-master protocol principle As mentioned before, Modbus works on a single-master model, which means that a single master (TPC/IP Client) can have several slaves (TPC/IP Servers). The master requests and sends information to its slaves individually. Each one has a unique identifier (Slave number in the Modbus serial type and IP in the Modbus TCP/IP type).Figure 2 shows an example diagram of the above. Figure 2: Single-master principle diagram. As you can see, the master requests information from one of its slaves, and that slave is the only one that responds. Subsequently, the master writes data to another slave, and only that one receives it.If the slave device cannot process the data, it'll respond with an error code in its response message. This article shows the error codes in a later section. Data distribution (Memory Map) Before going into the structure of the messages that are sent and received, it's necessary to understand how Modbus devices store the data.Each slave device requires memory space to store the data that the master requests or sends. Each location is called a "Register" and is a variable of two bytes in length. It will have write or read properties (or both), depending on the application.Modbus builds its data model on tables with attributes that define the types of data to be stored. The following table shows the four categories proposed by the protocol: CategoryObject TypeAccess TypeDescription Discrete InputsOne bitRead-OnlyUsed for binary data provided by I/O systems, such as on-off selectors, thermocouples, water electrodes, etc. CoilsOne bitRead-WriteUsed for binary data that can be altered by application logic, for example, dry contacts, lamps, valves, etc. Input Registers16-bit wordRead-OnlyUsed for non-binary information of I/O systems. Such as pressure, humidity, temperature sensors. Holding Registers16-bit wordRead-WriteUsed for non-binary information that can be modified by application logic, e.g., frequency of a variable speed drive, maximum temperature, operating settings, etc. Modbus provides an example of a memory map ranging from 0 to 65535 registers (0 to 0xFFFF in hexadecimal), but in the end, the manufacturer chooses the amount and distribution of memory within the device to suit the application. Figure 3  shows an example diagram of how to distribute the data in the memory block of the device. You can see the range of register numbers for each memory block on the right side. The manufacturer defines the quantity and layout of memory depending on the application. Figure 3: Example of Modbus memory distribution. Figure 4 shows an example of a memory map of a Yaskawa variable speed drive. Although some registers appear to be of type Input Registers (read only), the manufacturer decided that all the registers of this drive are of type Holding Register. Figure 4: Modbus memory map example. Taken from the YASKAWA AC Drive-A1000 Technical Manual Frame Description Now that we understand how Modbus works in general, we'll go into the message’s layout. The structure is the same for messages that are sent and received and looks like the following figure. Figure 5: Modbus PDU. PDU (Protocol Data Unit) is the name of this and is generic for any type of Modbus, where:Function Code: On transmission (master message), this indicates to the slave the action to execute. On reception (slave response), it shows the action performed and exception indicator in case of error.Data: Contains information sent to the slave in write functions or the data received in reading functions. It can include register addresses, the amount of data, the current number of bytes sent or received, etc. These fields depend on each function code. In case of error, the first byte of this field will be the exception code. Modbus ADU Sometimes, depending on the type of Modbus or application, extra fields are required in the PDU. This's known as an ADU (Additional Data Unit). ADU for Modbus over Serial Figure 6 shows an example of the ADU when using Modbus over Serial. Figure 6: Modbus ADU. Where:Additional Address: This's a unique identifier of the Modbus slave. It consists of one byte of data. Number 0 is for broadcast commands, and the protocol reserves 248 to 255 numbers.Error Check: This's the result of the Redundancy Checking algorithm (called (Cyclical Redundancy Check) for Modbus RTU and LRC (Longitudinal Redundancy Check) for Modbus ASCII), calculated from the data that make up the message. It's used to determine an error when transmitting the message.When Modbus RTU or Modbus ASCII is used, other considerations need to be made when sending the frame, which you can find here. ADU for Modbus TCP/IP On the other hand, when working with Modbus TCP/IP the ADU is quite different, instead of the additional address field and error check, a field called MBAP (MODBUS Application Protocol header) the figure 7 shows an example of this. Figure 7: Modbus TCP/IP ADU. Where MBAP contains the following:Transaction Identifier: It's used for transaction pairing. The MODBUS server copies in the response the transaction identifier of the request.Protocol Identifier: It's used for intra-system multiplexing. Where 0 => for Modbus.Length: It's a byte count of the following fields, including the Unit Identifier and data fields.Unit Identifier: Typically used to communicate with devices connected to the Modbus TCP/IP server when used as a gateway.All the information about Modbus TCP/IP implementation can be found here. Function Codes The function codes indicate to the slave which action to execute. They consist of 1 byte of information with values from 1-255 in decimal; values between 128 and 255 are for exception codes.There're three categories of Modbus function codes:Public: These are the function codes approved by the Modbus community, with functions based on the operating principle of the protocol. These are the standard Modbus commands.User-Defined: Those that the user defines for a custom application. These codes range between 65-72 and 100-110.Reserved: Codes used by companies and are not available for public use. More information is on page 50 of the following document.  It's important to remember that fields are added to the frame depending on the function code. You can find all the function codes and examples of the data frame from page 10 of the Modbus Application Protocol, found here. This article will only mention the most used ones, based on my experience with HVAC systems.   Function Codes for Coils The following function codes are used to read and write Coil type registers (binary write/read):Read Coils (Function code: 0x01): Read from 1 to 2000 continuous values of coil data from a remote device. The response is packed into registers where the first bit of each represents the status of the coil. Where 1 = ON and 0 = OFF.Write Single Coils (Function code: 0x05): Change the value of a Coil register. The value 0xFF00 requests coil ON and 0x0000 requests coil OFF.Figure 8 shows an example of the frames for reading and writing coils (remember that each register consists of two bytes).  Figure 8: Examples of Coil requests. For Discrete Inputs Discrete inputs are read-only, so these only have the following command:Read Discrete Inputs (Function code: 0x02): Read from 1 to 2000 continuous values of Discrete Inputs (read-only binary) from a remote device. The response is packed into registers. The first bit of each register represents the status of a Discrete Input, where 1 = ON and 0 = OFF. Figure 9 shows an example of the frame and its correct answer. Figure 9: Example of Discrete Inputs request. For Holding Registers The following function codes are used to read and write Holding Registers (non-binary write/read). Based on my experience, these are used by manufacturers the most frequently.Read Holding Register (Function code: 0x03): Read continuous Holding Register data from a remote device. The response message consists of two bytes for each register. The binary content is right-justified. Depending on the characteristics of the master device, it can read from 1 to 127 registers simultaneously (125 for Modbus RTU).Write Single Holding Register (Function code: 0x06): Write a single value in a Holding Register of a remote device. The response message is an echo of the request after writing the data.Write Multiple Holding Register (Function code: 0x10): Write a data block to continuous Holding Register registers. The response consists of the function code, initial address, and the number of registers written.It's common to find devices that only support function codes 0x03 and 0x10 for reading and writing Holding Registers; this makes the implementation of Modbus very simple. Sometimes in serial interfaces, you'll find the function code 0x08 used to perform diagnostics in the serial communication loop.Figure 10 shows an example of the requests and correct responses for reading and writing Holding Registers should look like. Figure 10: Example of Holding requests. Exception Responses Exception codes are indicators sent in the response frame by the slaves. These represent errors during communication or interpretation of the data transmitted or requested. Error codes help the master determine what action to take depending on the error reported.Figure 11 shows the representation of the error response frame. Figure 11: Error exception structure. Where:Exception Function Code: These differ from a response without error because the function code sent to the response is incremented by 0x80, i.e., if a value greater than 128 in decimal is obtained, it's established that there was an error in the request. For example, if the request was a data reading of Holding Register type (0x03), the error code will be 0x83.  Exception Code: This describes to the master the cause of the error. Some of the most common exception codes are as follows:Illegal function (0x01): The requested function code is not supported by the slave device.Illegal data address (0x02): The requested address is not available on the slave device.Data value not allowed (0x03): The amount of data sent or requested is not allowed on the slave device.Device busy (0x06): The slave device is not ready to process the new request.Depending on the application, the user can add more exception codes, like the function codes. Figure 12 shows an example of an error response. The left side of the image is the request message (Read Holding Registers in this case), and the right side is the error response. Figure 12: Example of a request with error response. Modbus and NetBurner The theory is not enough to bring a product to reality. That's why we have two options for implementing the Modbus protocol using your favorite devices. Yes, of course, we're talking about NetBurner systems. Ready-to-Use Solutions If you want to play it safe with a fast time to market and certified devices, the best option is to take a look at the products of our commercial partner. We've worked with Realtime Automation for a very long time, and we can't recommend their off-the-shelf Modbus Gateways enough. The have versions that work over serial (RTU) as well as TCP/IP. Create your Own If you're looking to implement Modbus in your own projects, NetBurner’s characteristics, such as our robust real-time operating system, industrial temperature range, and  RoHS compliance make it an ideal candidate for your next design. In addition, combined with RTA's NetBurner compatible Modbus software library, you can get your own custom application up and running before you know it. Resources for Modbus Over Serial To implement Modbus RTU/ASCII, we recommend the following:In the following path, you'll find examples of using the serial port nburnexamplesserial. Which is necessary for the transmission of data.In this path, you'll find how to use the system timers nburnexamplestimers. These are necessary to generate inter-frame and inter-character delays and response timeouts.In the following article, you'll find more information about the operation of RS-485/RS-422 or RS-232 interfaces used in industrial devices.And a video by John Rinaldi of RTA to learn all about Modbus RTU. Resources for Modbus TCP/IP For Modbus TCP/IP, we recommend the following:In this path, you'll find examples of using the TCP socket nburnexamplesTCP. Used for data transmission.In the following article, you'll find information on how TCP/IP protocols work.And a video by John Rinaldi from RTA to learn all about Modbus TCP/IP. Wrapping Up Hopefully this article will be useful for those developers who are looking to implement a product for industrial use with this well-known protocol or for those who are curious to learn how things work.We'd love to hear your comments, suggestions, or ideas for new articles. If you have any questions, please don't hesitate to contact us directly at sales@netburner.com we'll be happy to reply as soon as possible.  ### Web Development for Embedded Engineers: Javascript (JS) In a previous article, we talked about web development basics, especially HTML and CSS. These technologies are responsible for creating the layout and styles of a website. This is enough to give us a static site, which nowadays is not enough. To add that missing dynamic functionality, we need to provide JavaScript. Perfect Timing. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. In this article, we'll describe some basic concepts needed to get started with JavaScript. We’ll also show how to implement it in our embedded systems projects, as well as provide some links that may be useful. Introduction Continuing with the construction example from the previous article, we already have a building with the structure (HTML) and all the decorative details (CSS). In theory, it's already a livable house. However, we can still add things internally, such as a stove, a refrigerator, LED lights, etc., that make the house more functional as a living space. This is where JavaScript (JS) comes in, and it’s personally my favorite part of web development.JavaScript is a lightweight, multi-platform, object-oriented programming language and is very simple to learn. It's currently one of the most widely used technologies in web development for both Front-End and Back-End (servers, databases, etc.).The most robust frameworks for developing web systems use JavaScript (Angular, Vue, React). It's a technology that is constantly changing. I recommend looking at this website, State of JS 2020, to get a better understanding of the current JavaScript landscape. It's updated every year with the language's new features, the popularity of frameworks, new libraries, etc.In the rest of this article, we'll show some code snippets that can serve as a handbook when developing with JS. Add JavaScript code to HTML code. There are two ways to add JS code to your website:Directly into the HTML file: This is done using the tag where everything inside is the JS code. It's usually placed between the or tags. Figure 1: Places to put JS code. Externally in a .js file: The method is to use an external file for the JS code. The file must have the extension ".js." We must add the src attribute to the tag, and the file can be hosted in your local directory or on a cloud server. Figure 2: Types of src in script tag You can find more information about when to use each option here. DOM Handling. One of the most important concepts of web development is understanding how to handle the Document Object Model (DOM). It's the representation of the website’s structure in an object that can modify page elements and styles using JS code. The DOM organizes HTML elements in a hierarchical (or also called tree) system. Each level of the hierarchy can have parent and child elements. Figure 3 shows an example of the DOM representation. Figure 3: Example of DOM The DOM isn’t part of JavaScript libraries or functions. Instead, it's intrinsic to each web browser (e.g., Chrome, Firefox, Safari, etc.), implemented with something called WEB APIs. These are libraries (also coded in JS) that can interact within our code. Although there is a standard for libraries written for the DOM, sometimes web browser developers implement some extra functions. That’s why web pages sometimes look better in some browsers than others.More information about the DOM is here. Get DOM elements There are several ways to access DOM elements from JS:Get element by ID: This returns the element with the provided ID, or null if it doesn’t exist. const element = document.getElementById(''); Get elements by Class: This returns an array of type HTMLCollection, where all of the included elements have the selected class. The array elements are fetched according to their order of appearance in the DOM. const elements = document.getElementsByClassName(''); Get elements by tag: This returns an array of type HTMLCollection, where all the included elements are of the specified tag. const elements = document.getElementsByTagName(''); Get elements by query: This function gets the elements according to the specified query. An element can be retrieved by ID using the '#' symbol (e.g., querySelector('#header')), by class using the '.' symbol (e.g. querySelector('.btn')), or by tag name (e.g. querySelector('h4')). It can even obtain an element by pseudo class(e.g. querySelector('li:last-child')), which is one of its most important functionalities. const element = document. querySelector(''); If there is more than one element, it will return the first one it finds. If you want to get all of the elements, the following method is what you need: const elements = document. querySelectorAll(''); With this function, you obtain an array of type NodeList elements that match the given query.This article explains the difference between NodeList and HTMLCollection. Choosing which way to get the HTML elements is more a matter of taste (and specific circumstances) since all browsers support the five approaches. I prefer to use querySelector() because it's more versatile and simplifies the code. Still, there are occasions where it's required to use another method to get the HTMLCollection array.  Modify DOM elements content. Once we have obtained the elements, we can modify their content, depending on their characteristics. The most common elements are text type or input type.To modify the inner content of text-type elements, we use the textContent method. For changing the input value of input-type elements, we use the value method. In figure 4, you can see an example of how to change text and input values. Figure 4: Process to change text and value of DOM elements. Create DOM elements. We can create HTML elements directly from our code with JavaScript, creating dynamic content on the web page. There are two methods for building elements.Create from scratch: In figure 5, you can see a small diagram of the basic steps used to create an element from scratch and an example of how to do it in code. Figure 5: Process to create a DOM element from scratch /* Create html element */ const newElement = document.createElement('p'); /* Add styles, classes, content, etc. */ newElement.style.color = '#f2f2f2'; newElement.textContent = 'This is a dynamic element'; /* Get node to add element */ const body = document.querySelector('body'); /* Append or prepend to a Node */ body.prepend(newElement); Automatic creation: This is a reduced form and is my personal favorite. Figure 6 shows the necessary steps to do it, and a snippet code below: Figure 6: Process for automatically creating a DOM element /* Create template string */ const html = `This is a dynamic element `; /* Get node to add element */ const body = document.querySelector('body'); /* Insert Adjacent HTML */ body.insertAdjacentHTML('afterend', html); In the following link, you can find more information about the first parameter of the insertAdjacentHTML() method. Change styles. The ability to modify styles of an element dynamically from JavaScript is one of its most used functionalities, especially when we use JS-free CSS frameworks. We have two ways to perform this task:Edit inline styles: This modifies the style of the element directly. The syntax for getting or modifying an inline style is as follows:.style.’’Example: /** Getting the style */ const style = document.querySelector('p').style.backgroundColor; /** Changing the style */ document.querySelector('p').style.backgroundColor = '#B91C1C'; Edit classes: This is the most common way to change styles and is also considered a best practice. To handle classes, the "classList" property is used, which contains the following methods:Deletes one or more classes from an element. remove(“class1”[,”class2”[,...”classN”]]) Adds one or more classes to an element. add(“class1”[,”class2”[,...”classN”]]) If the class exists, it removes it; otherwise, it adds it. toggle(“class1”) Replaces one class with another replace(“oldClass”, “newClass”) Returns a boolean value for the existence of a class in an element. contains(“class”) One example of how to use this is as follows: /* Create an element */ const myElem = document.createElement('div'); /* Add class "MyClass" */ myElem.classList.add("MyClass"); Event Handling. JavaScript has a compelling feature, the ability to execute code asynchronously with externally triggered events, such as clicks, hover, scroll, keypresses, etc. Events make JS the perfect complement to HTML and CSS since it allows the user to interact with the system.In the old days we used what is known as inline events, also called "onEvent". Nowadays, that is considered bad practice. The current way to handle events is using the addEventListener method, which is available for any DOM element. An example of how to assign an event to an element is as follows: /* Add click event listener */ document.querySelector('p').addEventListener('click', () => { console.log('You clicked'); }); Event handling is a complex topic because there are a lot of events to use and considerations for each one. To start with, we recommend the following documentation, which explains an introduction to events. HTTP Request Using Fetch One of the most common tasks in JavaScript is to request information from external sources using the HTTP protocol (more details in our article An Introduction to the HTTP Protocol).In the old days, we used to play with the XMLHttpRequest object to get data asynchronously with HTTP. Now, it’s considered good practice to use the native JS library called Fetch. It does the same job, but the big difference is that Fetch works with Promises, making it easier to handle the responses.To understand a little more about the difference between Fetch and XMLHttpRequest, I recommend reading the following guide.To learn how to use Fetch, you can use the following link as a guide.If you’re confused by the term Promises, I recommend that you first look at the asynchronous functionality of JS and then check out this link that explains how promises work. Embedded web pages using NetBurner At NetBurner, we know how complicated it can be to create embedded systems with web pages. For example, in a Raspberry Pi, you would have to install and configure a web server like NGNIX and then, with some line commands, put your web page files in the public folder, etc. If we talk about doing the same thing for a traditional microcontroller ... that’s a much longer process. That's why our systems already come with everything you need to serve your embedded pages in four easy steps.Create a project for your development system. It can be using our NBEclipse tools or from terminal commands. See our online documentation for more information. 2. In the HTML folder of the project, place your web page files. 3. Compile your project, and load it onto your device. 4. Open a web browser (e.g., Chrome, Firefox, Safari, etc.) on a device that is on the same network as your NetBurner module and enter its IP address. We have a wide variety of examples, which you can find in the path:nburnexamplesWebIn this article, you'll find information on how to generate dynamic content on your site.Also, if your website is quite robust, you can host the files on external memory (MMC/SD). Examples of how to do this are at the following path in your NNDK toolset:nburnexamplesEFFSFatHttp Next Steps Now that you know some essential web development concepts, studying and practicing with real examples is next. SPOILER ALERT!!, it's going to be a challenging road because there are many new tools to learn, but with patience, persistence, and perseverance, you can do it.My recommendation: take courses. You can find many courses that take you from zero to expert with real projects on the internet. As a first resource, you can use YouTube tutorials; the advantage is that these are free, the disadvantage is that these may not be well organized, and when you finish it, you may have doubts about where to continue. Many other websites offer courses on web development and provide a more structured approach to learning the material. Wrapping Up Hopefully, this article will be valuable for those of you who are just starting to get into web development. This article aims to be a handbook of some of the most useful pieces of JavaScript’s functionality to get you started and point you in the direction of some additional resources that can help you go much deeper.We'd love to read your comments, so don't be shy; the section below is yours.  If you have any questions, require more information, or have a topic you would like to see in future articles, feel free to email us directly at sales@netburner.com. ### Web Development For Embedded Engineers: HTML and CSS The explosion of the Internet of Things has required embedded systems engineers to interact more and more with the Internet at large. As a result, they have had to develop new skills and acquire new knowledge in order to solve evolving challenges and projects in the field. Because of the many technologies used for web development, as well as their constant change, the learning curve to become proficient with them can seem long and overwhelming. However, there is no need to worry, because nowadays there is a vast ocean of information, courses, and training that you can take to become an expert in a short time.  Perfect Timing. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. This article will outline some knowledge that can serve as a starting point for all those electronic (or related) engineers who are beginning the journey through the world of web development, especially for those who work on embedded systems solutions. Introduction Every day the number of websites increases, which is why web development has become one of the most in-demand professional careers today. It consists of creating user interfaces (the front-end) that interact with servers (the back-end) on the Internet or even the Intranet (local networks).It's essential to differentiate between web design and web development:Web designers are those who are responsible for creating the website’s look and feel. They're usually graphic designers (or related) who create the website's design with programs such as Adobe Dreamweaver, Figma, etc.Web developers are involved in implementing the web design using the languages used by web clients (or web browsers such as Chrome, Firefox, etc.), which are HTML, CSS, JS. Ideally, every web developer should know web design concepts. However, when it comes to developers who spent most of their education and career designing electronic diagrams, assembling circuits, or writing firmware, graphic design is not typically within their wheelhouse.In this article, we'll give an overview of the components that make up web development and share some resources and tips with you  that can be helpful tools in achieving a good web design.  First sight of web development. Web development is mainly made up of three languages:HTMLCSSJS (JavaScript)Although these are different languages, we should analyze them as one. It's like learning a foreign language; you need to know the verbs, adjectives, nouns, grammatical rules, etc. Can you imagine what English would be like if we only knew verbs? Even if we knew all of them and their possible combinations, we most likely wouldn't be able to communicate with each other. Likewise, with web development, it's necessary to know all of its elements to use it effectively. Fortunately, web development only has three elements; following the example of the English language, we can make an analogy as follows:  Figure 1: Analogy of web development languages HTML would be the nouns since they are the elements that help us name or identify the things we know. CSS is like adjectives because they complement the noun by giving it characteristics or attributes, and JS works like verbs because these describe the actions.  HTML HTML (HyperText Markup Language) is a standard that has been around since practically the beginning of the Internet (along with HTTP Protocol) for creating websites. Unlike the languages we embedded systems engineers know, however, HTML is a markup language, not a programming language.It consists of a series of elements or tags that create the content and structure of web pages.Making an analogy building construction, HTML's job would be to create all the metal frameworks, foundations, walls, roofs, etc. This structure rarely changes. To illustrate, the United States Department of Defense has been a pentagon since its foundation; internally, the layout might have changed, but it remains the same structure externally.Therefore, building out HTML is one of the most relevant jobs during web design because it's the underlying structure of the whole site.  HTML Syntax The syntax of HTML elements is straightforward, as Figure 2 demonstrates. Figure 2: HTML Syntax Element: Everything including the opening and closing tags.Opening Tag: Starts the element and places the element's name inside the '<>' Content: Content of the element, can be text or even other nested elements.Closing Tag: It's the same as the opening tag. The only difference is that it contains the '/' symbol before the element’s name. The elements without content don't include this, such as the tag
, representing a line break.More information about HTML elements is here. HTML Semantic The word semantic, according to the Cambridge dictionary, refers to:Connected with the meanings of words.In web development this term is used to refer to the fact that most HTML elements have a meaning, like:

: This is a paragraph.
: This is a section.Using the semantic elements of HTML is considered a good practice. Giving meaning to each of the parts of your website makes it easier to understand each of its components. Besides, this allows the design to become modular, allowing you to reuse those modules in other website features or projects.You can find more information about the semantic elements in the following link. Useful Tools Images Free One of the most valuable things found in web pages are the images. These give us a visual context of what our site represents or wants to express. However, finding the right image that is also free to use can be difficult. Below, we list some pages that offer pictures provided by the community, and you can use them for free in your projects.UnsplashPixabayPexelsFreeimagesDrawKitunDraw Image Compressor Whether our web page is on the Internet or embedded in a microcontroller (especially in this case), the size of the images is an essential factor; the heavier the images, the more memory is required, and the page load time becomes slower.That is why we list below some image compressors that reduce the image size without sacrificing quality:TinyPNGCompressJPEGIMG2GOSquooshOne other thing to consider is ensuring that the images are in the proper format. Using .jpg images for photo quality pictures is preferable while using .png for vector-based images will give you better results. Even better, serve the images in a next-generation format, such as WebP, to get the best results. HTML Validator Finding errors in HTML may be a bit tricky. Nested elements could be a problem if we forget to close some tag of an element. Here are some tools that can help you check your HTML code.The W3C Markup Validation ServiceFree Online HTML Validator CSS CSS stands for Cascading Style Sheets. Its function is to describe how HTML elements are displayed on the website, adding visual styles and presentation to those elements. It consists of rules written by the developer with which the font, color, spacing, layout, etc., can be modified.Continuing with the construction example, CSS would add the building’s finer details, including doors, windows, paint or decorations, flooring, furniture distribution, etc. All these details will vary between web pages. The styles won't be the same for a smart greenhouse site as for a clothing store site. This is where it can get complicated for us embedded systems engineers who lack an artistic background. Don't worry, though. In the following sections, we'll show you some key concepts and tools that will help you write some good-looking CSS without being a descendant of Van Gogh. CSS Syntax The syntax of CSS, also known as CSS rules, is shown in figure 3: Figure 3: CSS rule syntax Selector: Specifies which elements the styles will be applied to. These can be HTML elements (p, h1, div, etc.), classes (.btn , .spacer, .big) or IDs (#btn-login).Style: Feature applied to the selected element. There can be as many as you want; each one is separated by a ‘;’. It consists of two parts:Property: Name of style to be applied.Value: Value of the style to be applied. Box Model The very first thing we must understand is how the representation of elements in HTML works. We should imagine that our website is built with boxes and that each one can contain more boxes inside. In HTML, all elements have this model, called the box model.Let’s start by analyzing web pages we see on the Internet and imagine the model of boxes. For example, when we open our favorite website, we can immediately determine the boxes that compose the home page. Figure 4 shows an example of this. Figure 4: Box model example This skill seems obvious, but from my point of view, it's one of the most important. That’s because this thinking allows us to model our web system projects more effectively since layouts are designed based on this type of model. Box properties Now that we see those imaginary boxes on the web pages, we need to know their characteristics. As we saw earlier, all the components of a web page are rectangles (or squares sometimes), and each of these elements has the properties shown in Figure 5: Figure 5: Box model properties. Content: The part found inside our HTML elements, such as text, images, etc.Border: A line that marks the boundaries of the visible area of the HTML element.Padding: Invisible space around the content, but within the element itself.Margin: Invisible space outside the element. It's applied as a space between elements.As an example, we have the following image in which you can see some boxes (paintings) with CSS box properties. Figure 6: Box properties example. Box Types Just like when shopping online, we receive boxes of distinct sizes depending on the content. In web design, there are also different types of boxes, each one with unique functionalities.To choose the type of box, CSS uses the property display. The complete list of values for this property is here.The most common box types are:Block: Occupy all available space horizontallyInline: Occupy only the necessary space horizontally (note: horizontal margins and paddings are not applied to this type of elements).Inline-block: Occupy only the necessary space horizontally and block type properties (margins and horizontal spacing) can be applied. Flexbox Flexbox is one of the modern CSS functions used to generate 1-dimensional layouts. Basically, its function generates proportional empty spaces between elements inside a container, making it easier to align elements horizontally and vertically.Flexbox is the perfect replacement for the float properties (more information about that in the following link, All About Floats).Personally, when I started learning CSS, one of the things that made me hate it was all the chaos you had to do with float properties to align elements. Fortunately, if you are a beginner nowadays, you won't have to suffer from this since Flexbox solves these problems with float properties.Learning Flexbox is straightforward, but it requires a more detailed explanation. Here is a link to an excellent tutorial: A CSS Flexbox Tutorial for Beginners – What It is and How to Use It. CSS Grid  CSS Grid is one of the newest CSS features, and its primary function is to create 2-dimensional layouts. Essentially, CSS Grid divides a container into columns and rows filled with the container's child elements in any order desired.One of the advantages of using CSS Grid is that it makes HTML code easier because it doesn't require as many nested objects. It's important to keep in mind that CSS Grid does not replace Flexbox. Instead, both work together to create layouts. Here is a link to learn more about CSS Grid: A Complete Guide to Grid. Media Queries Media Queries is a handy tool to make our web designs responsive. In other words, the content is adapted to the different types of screens of a cell phone, tablet, laptop, etc., in order to provide the best presentation possible.This places screen size limits in our CSS code, and between each limit, you can modify the CSS rules that apply and overwrite the original ones.In order to effectively apply media queries, it's necessary to understand the responsive design models. For that, I leave this link, The State Of Mobile First and Desktop First.To learn how to apply them in our code, I leave this additional link A Complete Guide to CSS Media Queries. SASS SASS is a tool that gives CSS some superpowers. It's a CSS preprocessor, so it adds features that CSS does not have natively (functions, variables, nested rules, macros called mixins, etc.).This is one of my favorite tools for working with CSS. It feels more like one of the programming languages that we embedded systems engineers know. I strongly recommend that you learn this tool because it saves time when creating CSS rules. It will also keep the maintenance and growth of our website very orderly. On YouTube, you can find many resources to learn it. Previously it was a bit chaotic to install SASS, but nowadays, it's easy to do with a Visual Studio Code extension, and that's it. Many CSS frameworks use this tool, so it’s very beneficial to learn SASS to optimize the frameworks' code. Useful Tools Typography Typography is one of the key parts of web design because it can give the site some personality. Currently, there are a lot of fonts that we can use on our web pages. Below, I list some of the most popular ones, along with some links to download them for free.Serif: This is commonly used to create sites with a traditional or classic look and feel. Some of the most popular fonts are the following:Aleo.Cardo.Cormorant.Lora.Merriweather.Playfair Display. Sans-Serif: This is used for websites with a more modern look and feel. It's a clean and straightforward font which makes it a perfect choice for beginners. The most popular are the following:Inter.Lato.Montserrat.Open Sans.Poppins.Roboto.Work Sans. Colors In addition to typography, colors are also a big part of the personality of a website. For us engineers, it can be challenging to choose which colors to use (in my case, my brain only knows the RGB colors), so I have listed some links below that may be helpful.Open Color: This site gives us some helpful color schemes when using tints and shades of a color.Flat UI Colors 2: Contains a wide variety of color palettes that we can use for primary and accent colors.Tailwindcss Colors: Tailwindcss itself is a robust framework for front-end applications; its color palette is quite nice, so that's why I'm adding it to this list. Coolors: This  site has many utilities, a color picker, pick a palette from a photo, gradient creator, and color schemes.  Tint & Shade Generator: A convenient tool to generate tints and shades of colors.  Icons Icons help us give more context to the text of our web pages, and nowadays, they are a widely used feature. Here are some links where you can find free icon sets.BoxiconsPhosphor IconsIoniconsIcons8 Top 5 of lightweight frameworks Bulma Bulma is my favorite framework. It's effortless to use and has very flashy styles; besides, the documentation is very complete. It’s a modular framework, so you can add only the components you need in your application, which makes the resulting CSS very light. The most recent version to date is 0.9.3, and the weight of the files is 202kb with all the components, which is reduced by just adding the desired ones. Pico CSS Pico CSS is a framework based on the semantic elements of HTML, so it's not necessary to add classes to the elements. This makes our HTML code very easy to understand. The styles are elegant and are made in pure CSS, although you can use SASS too.The latest version is 1.3.3 and has two variants. One has all the framework elements with a weight of 50kb, and the other is a slim version with only the essential features at 35kb. Pure CSS Pure CSS  is a very light framework that includes the most common components (buttons, forms, tables, menus, grid, etc.).  It's possible to add only the elements used to the final CSS file.The most current version to date is 2.0.6, and the weight of the entire framework is 17kb. Milligram Milligram is a minimalist framework with subtle colors, and just like Pure CSS, it only has the essential components. It's effortless and fast to use.The recent version is 1.4.1 with a weight of 9kb. Skeleton Last but not least, we have Skeleton, which is not a framework to tell the truth. It's a boilerplate designed for when all the utilities of a framework are not required.  It's a tool that gives basic styles to the most common HTML elements and a Grid system, which is often more than enough for proofs of concept or small developments. The most recent version, 2.0.4, has not changed since 2014 (maybe that's why it's a skeleton) and consists of two CSS files with a total weight of 20kb. These weigh 8kb if we minify the files.I recommend looking at this page to be aware of the new CSS tools that are constantly emerging. It's updated with new features and improvements every year, so keep that in mind. References Most of the content comes from my own experience, but I would like to acknowledge Jonas Schmedtmann, who I have learned from his online courses and took some analogies from those. Wrapping Up Hopefully, this article will be helpful for those starting out in web development or as a handbook for those who have been at it for a while. In the second part, we'll talk about JavaScript, so stay tuned.We'd love to read your comments on your favorite front-end technologies or your best tips for beginners. Also, if you have any questions, comments, or suggestions for new content, don't hesitate to contact us directly at sales@netburner.com. ### An Introduction to the HTTP Protocol Nowadays, the Web is a chaotic environment, with many frameworks, plugins, protocols, libraries, etc. All of these tools are constantly changing; when you think you have mastered one of them, you find out that a new version has been released or that your previous work is already obsolete. Amid all this chaos, one protocol has been around since the beginning and probably will be for a long time. Created between 1989-1991 and established as a key standard for more than 20 years, I present the HTTP protocol. Perfect Timing. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. Introduction On August 6, 1991, one of the great revolutions of the internet began. When the computer scientist Sir Tim Berners-Lee published the first-ever web page as a publicly available service, the site was about the World Wide Web and how to make use of it. The page was hosted on Berners-Lee's computer and supported by one of the world's largest and most respected laboratories, the European Organization for Nuclear Research (CERN). The First Web Server Used by Tim Berners-Lee This historical milestone wouldn't have been possible without one of the oldest protocols on the internet, the HTTP protocol. This article commemorates the 30 years of the first web page, describing the operation of this protocol that gave life to everything we know today about the internet. What is the HTTP Protocol? HTTP is the acronym for HyperText Transfer Protocol. It was created to transfer HTML files between computers in a laboratory environment. Since then, it has evolved; nowadays, it's used to obtain high-resolution videos, images, download software, etc.HTTP is a protocol that is used everywhere there is a Web device. For example, for you to read this article, a series of HTTP commands had to be executed to bring your browser these lines of text, the colors of the web page, the images, the links ... practically everything. How Does the HTTP Protocol Work? The HTTP protocol works on the Client-Server model. It's a TCP/IP application protocol (information about TCP/IP in the following article TCP vs. UDP: Battle of the Protocols ). Currently, the standardized version of HTTP is 1.1, and it's the one that we'll describe here. In general, the operation of HTTP is as follows:The client device establishes a TCP connection with the server, usually on port 80.The client sends a request with HTTP syntax and waits for the server's response.The server processes the request and sends the client a response that includes a status code and the requested data (if any).The client closes the TCP connection. Before the client closes the session, phases 2 and 3 can be repeated as many times as necessary. The HTTP Protocol HTTP Messages HTTP messages are the form of communication between the client and the server. These are composed of information in ASCII format and include several lines, each separated by CRLF (carriage return, followed by line feed); that's why these are human-readable. There are two types of HTTP messages:HTTP Requests: Messages sent by the client. These include the information necessary for the server to analyze the request and understand what the client is asking for.HTTP Responses: Messages sent from the server in response to HTTP requests. These contain the request's status and include data that comply with the client's request.Both types of HTTP messages share a structure. This format is shown in the image to the right. HTTP Message Format Start-Line: Identifies the start of the HTTP request or response. The request contains the type and origin, and the response includes the status code and message. Both have the HTTP version used.Headers: These allow the exchange of additional information between the client and the server. Union of the Start-Line and Headers are known as Head.Empty-Line: Indicates the end of the meta-information.Body: Contains the data sent or received. Also known as the payload. HTTP Request Messages These are the messages sent by the web client (also known as User-Agent), such as a browser. These messages tell the server what action to take and thereby determine the required response. An example of a request message is shown in the figure below. HTTP Message Request Start-Line The Start-Line is made up of three parts:HTTP method: Also called HTTP verbs (although there are some nouns among them), indicate to the server what action to take for that request. Some of the most commonly used verbs are shown in the table below. Most Common HTTP Methods Origin: Relative path of the server resource. It can also include some queries represented by the '?' symbol. In the example above, it is /posts.HTTP version: It tells the server the format of the message. The standard is HTTP/1.1, as is shown above. Headers Optional values that give the server additional instructions on how to handle the request. The structure of a header is as follows:Case-insensitive string:value These can be classified into three types:Request / Response headers: Describe additional information about the requested resource or unique characteristics that the client/server requires, such as user identification using tokens or cookies or the content types that the client can understand.Representation headers: Describe information about the body, such as data compression, encoding, etc.Payload headers: Contain information about the payload, such as the length of the data or the encoding used. Body Not all requests require the body field. It's used to send data to the server to create new resources or update existing ones. HTTP Response Messages These are the messages sent to the client by the server. These have the same structure as the request messages, with the only difference being the Start-Line. An example of a response message is shown in the figure below. HTTP Response Request Start-Line:It's known as the Status-Line, and it's divided into three parts:HTTP Version: Usually HTTP / 1.1Status code: Notification if the request was successful or failed. In general, the error codes are divided into the groups presented in the table below. The complete list of status codes is at the following link,  HTTP Status Codes. Status text: A purely informative short text message that helps humans understand the status of the message. HTTP Responses The HTTP Protocol and NetBurner NetBurner would only be "Burner" if they didn't support the HTTP protocol. Below you can find the relevant examples for NNDK version 3.x.x. Server-Side Examples Web server: These examples can be found at the path, nburnexamplesWeb. Here, you'll find examples of serving embedded web pages and handling GET and POST requests.Secure web server: In the directory, nburnexamplesSSLSslWebDemo, you'll find an example of how to start a secure web server that serves pages over a TLS connection.Web server using EFFS-FAT: In the directory, nburnexamplesEFFSFatHTTP, you'll find an example of serving a web page hosted on external SD memory and accessing the files inside it is using the path /DIR.Web server using EFFS-STD: In the path, nburnexamplesEFFSStdHTTP, you'll find an example of how to serve files located in the flash on-chip file system.Configuration Web server: In the path, nburnexamplesConfigurationWeb, you'll find some examples of how to use and customize the configuration server hosted on port 20034. Client-Side Examples Web Client: In the directory, nburnexamplesWebClient, are examples of making GET and POST requests to servers hosted on the internet using auto-execution and straightforward tasks.Secure Web Client: In the directory nburnexamplesSSLSslGetHttps, you’ll find and example of how to create a HTTPS request to a server. And in nburnexamplesSSLSslClientVerifyPeerBasic and nburnexamplesSSLSslClientVerifyPeerEffs you have two examples of how to use peer verify with SSL/TLS.Serial to HTTP: This is an example of a GET request sent through the serial port, used for serial to Ethernet applications. It can be found in the directory nburnexamplesserialSerialHttpGetRequest. More Information HTTP was born to work as an application protocol for TCP, but SSL/TLS can replace it, making it HTTPS. HTTPS encrypts data being sent back and forth between the client and server and provides a mechanism to ensure that both parties in the connection are who they say they are. Using HTTPS to serve the web content is strongly encouraged. ( )HTTP is a stateless protocol. It doesn't save session information either in the client or the server; you can solve this with Cookies or Tokens. Both are sent as a Header and allows the handling of sessions.Currently, the HTTP protocol is directly related to the term REST (or REST-API, or RESTful API). REST is a set of rules and guidelines that allow data exchange between client and server using HTTP. The application defines these rules (that is, the rules can be unique for each application), making it very versatile for IoT applications and web systems.There is another term call GraphQL. It is a query language that replaces REST in applications which require versatility in the data obtained. Unlike REST with GraphQL, you can choose strictly which information fields are required on the client-side.Today, there is HTTP/2, which, unlike version 1.1, is no longer human-readable. In other words, it uses binary messages, which increases the optimization of network resources. It can handle multiple requests at the same time, as well as providing many other features. Although many sites are using this version, it is currently not as widely adopted as version 1.1. Useful Links and Resources We recommend the Mozilla developer docs covering the protocol found here, for a more in-depth look at HTTP. Wrapping Up Hopefully, this little guide helps all those developers who are beginning to venture into the world of the Web. As Tim Berners-Lee said, "When something is such a creative medium as the web, the limits to it are our imagination." We'd love to hear some ideas of products or articles you would like to see using HTTP or other tools or technologies in the comments below.If you have any other questions or concerns, don't hesitate to send us a direct message at sales@netburner.com. About the Author Jordan Garcia. IoT and industrial protocols engineer at Racom Microelectronics.Dog lover, bookworm, and sweet tooth. Fan of embedded systems, back-end and front-end development, and a constant joy in learning new things. Unique ability: to finding bugs in systems. ### How to Use Visual Studio Code to Debug Your NetBurner Applications In our previous article, we reviewed how to configure Visual Studio Code to compile, load, and be more productive in our NetBurner projects. These features are helpful functionalities when coding, but what if we have a bug? What tools can we use to make our code bug-free?In this article, we'll talk about how to configure Visual Studio Code to use its debugging features with GDB. In the end, we'll give some valuable tips when debugging. IoT Dev Kit Featured in this Article View Product Page Or, learn more about NetBurner IoT. Assumptions and Requirements This article assumes the following:Visual Studio Code is installed and configured as explained in the article How to Use Visual Studio Code with Your NetBurner Projects.This article is described for Windows 10 and using the MODM7AE70 development board, though it should work for any platform using NNDK 3.X. Introduction The NetBurner team works hard so that developers have easy-to-use development tools and a plethora of examples that allow us to focus on programming our applications instead of spending time configuring embedded systems. In addition, they also provide us with tools to uncover clues about bugs, such as TaskScan, SmartTrap, and Addr2line. However, to exterminate those bugs, we must find them; that is why it's essential to know the benefits that a debugger can offer us. So, grab your Proton Pack, because after this article you’ll be a "Bug Buster". A Brief Introduction to GDB The GNU Project Debugger (GDB) is a tool created in 1986 by one of the most influential advocates for free code, Richard Stallman. It's developed for Unix-like environments and allows us to analyze what happens inside programs during their execution.GDB is one of the most widely used debuggers for programs developed in languages such as Assembler, Fortran, Pascal, Rust, C, and C++, among others. It allows us to do things like pausing the program's execution under certain circumstances, displaying the state of local and global variables, following the path of functions in the stack, simulating execution conditions, etc.Like most software created for UNIX environments, it runs out of the command terminal. In addition, it has a remote operating mode that allows us to run our program on a different system than the one running GDB. This feature is essential for us, as it is ideal for debugging embedded systems.In this article, we won't go into too much detail about the commands and how GDB works. However, if you are interested, we recommend that you do a little research on the Official GDB Website. There is also a lot of free information on YouTube. For now, you can learn the basics with the GDB Song (to the tune of Do-Ri-Me, from the Sound of Music). GDB with NetBurner Command-Line tools The ARM team provides a tool that allows us to use GDB in the 32-bit architecture of our Cortex-M microcontrollers, the GNU Arm Embedded Toolchain. While this tool doesn't have all the native functionalities of GDB, we can still take advantage of it with the help of our IDEs.Fortunately, the NNDK 3.x.x software installation already includes the binaries needed to run the ARM debugging tools. These can be found at nburngccbin.Before running GDB, it's necessary to load the compilation with the debug symbols into the NetBurner module. For this, you will need to build the debug version of the application with the command, make -j loaddebug. This will also load the application on your module, using the environment variable DEVIP to figure out what module it should be loaded on.To run the debugger from the command line, run the following commands:arm-eabi-gdb -se ./obj/debug/.elftarget remote :2159The first command starts the GDB session using the .elf file to load the debug symbols. The second points the GDB session at the NetBurner module and tries to initiate the remote debugging session. Figure 1 shows a basic example of how to use GDB on the command line. The green lines indicate the commands that are used.  Figure 1: Example of Using GDB In the next section, we'll talk about how to setup Visual Studio Code to use GDB commands almost automatically. We won't directly use the command line for debugging, so don't feel overwhelmed. Debugging C/C++ With Visual Studio Code Preparing Visual Studio Code for Debugging Before we go any further, we need an example application to be able to test the debugger. I have created an example just for this purpose, which you can access from NetBurner's GitHub account. It has the basic configuration of the makefile and the Visual Studio Code files to compile and load the project in the NetBurner module. Figure 2 shows the contents of the sample folder. Figure 2: Example Project Content .vscode: Contains the Visual Studio Code configuration files to be able to execute the tasks of compiling, loading, compiling with debug symbols, etc. (More information in the article How to Use Visual Studio Code with Your NetBurner Projects). It also contains a file that will serve as a debugger configuration template.html: Basic HTML filessrc: Contains the main.cpp filemakefile: File that contains the compilation rules when using the NetBurner command-line tools (More information in article Building Applications with NetBurner Command Line Tools).ReadMe: File with a short description of the project's functionality.First, open the project in VS Code. There're two ways to do it:Right-click at the project's root and choose Open with Code, as shown in figure 3.In the upper menu, select the option File> Open Folder..., as shown in Figure 4. Choose the example folder in the popup that appears.The contents of the example folder will appear on the left side, as shown in Figure 5. Figure 5: VS Code with Opened Folder. Before we can start debugging, we need to load the program into our NetBurner module. To do this, click on the tasks.json file is in the .vscode folder. Look for the Build Debug & Load Project label, and change the value of DEVIP with the IP of your NetBurner module, as shown in Figure 6. Save the changes with the + shortcut. Figure 6: Change DEVIP in Build Debug & Load Project Click on Terminal> Run Task ... and choose the Build Debug & Load Project option, shown in Figures 6 and 7. This will load the program into the NetBurner module. Figure 6: Run Task Figure 7: Build Debug Proejct Option If the application builds without any errors and the module is connected correctly, we'll see the confirmation with a status of 200 in the terminal. The result is shown in Figure 8. This indicates that the NetBurner module is ready to debug using GDB. Figure 8: Status 200 After Loading It should also be noted that at the end of the compilation, the folder called obj will be generated automatically. Within obj, a folder named debug will be generate that contains a file called DBgdbdemo.elf. This file is essential since it's the one that we'll use to load the symbols into the debugger. The file name will change depending on the value of the makefile's NAME tag. The result is shown in Figure 9. Figure 9: Debug ELF file in obj Folder Debugger Configuration: launch.json File Figure 10: Open launch.json File It's time to configure the VS Code Debugger. To do this, click on the folder .vscode and open the file called launch.json, as shown in Figure 10.Some modifications must be made to adapt it to your development environment; inside the file, look for the "program" element and change the value of the template to the name of the ELF file generated during compilation. For us that is DBgdbdemo.elf. Figure 11: Change debug_elf in the "program" Element In the "setupCommands" element, you must make two modifications:In the "file" option, replace to the path where the project is located and replace with the name of the ELF file (same that the "program" element).In the "target" option, change the value of the template to the IP of your NetBurner module. Figure 12: Elements to Edit in "setupCommands" Element After the modifications, it's necessary to save the changes in the file. Figure 13 shows an example of how it looks in my environment. Figure 13: Example of launch.json File Now that we have the configuration ready to continue, open main.cpp, located in the “src” folder. Figure 14 shows how to do it. Figure 14: Open main.cpp File To run the debugger, click the option on the left menu Run and Debug and then the Start Debugging option, as shown in Figure 15. It can also be run with it the shortcut. Figure 15: Run Debug Session If everything was configured correctly and the NetBurner module is running the program to be debugged, a new perspective will be displayed, as shown in Figure 16. Figure 17: Debugger Perspective However, if there was any configuration or connection error, an error window will be displayed, as shown in Figure 18. In that case, check that the launch.json file has the correct values. Figure 18: Debugger Error Once the VS Code files are set up, they can be used as a template for other projects.With all of this configuration complete, it’s finally time for us to get into some actual debugging. The parts of the debugger and its functions are described below. Visual Studio Code Debug Toolbar The debug toolbar allows you to navigate through the code while it’s executing. It's located at the top of the editor and has the following functions (from left to right): Figure 19: Debug Toolbar Allows you to drag the toolbar horizontally in the editor.Continue/Pause execution ( shortcut).Step Over ( shortcut).Step Into ( shortcut).Step Out (+ shortcut).Restart (++ shortcut).Stop (+ shortcut). Breakpoints with Visual Studio Code Breakpoints allow you to stop the execution of the program at specific points and under certain circumstances. In VS Code, there are the following types of breakpoints: Simple Breakpoint It stops the execution of the program when it reaches the desired line of code. To add a simple breakpoint, move the mouse to the left of the line number that you want to stop at and click. A red dot will appear when a new breakpoint is added. When the program reaches the line to which we set the breakpoint, VS Code will mark the stop line and activate all the functions of the Debug toolbar. In the lower right window of VS Code, we have the option to edit, add, and delete breakpoints in our program, as shown in Figure 20. Figure 20: Breakpoint Functionalities Conditional Breakpoint Unlike the simple breakpoint, the conditional breakpoint only stops program execution when a specified condition is met. It's helpful for when we have loops or when the value of a variable is known before the program crashes.To add it, the procedure is like the simple breakpoint, only that when the red dot appears, you must right-click and choose the Add Conditional Breakpoint option. Then specify the condition that must be met. Logpoint This is a peculiar type of breakpoint because, unlike the previous ones, it doesn't stop the program's execution; instead, it only prints in the Debug Console window every time the program reaches the chosen line. It's helpful because, in printing, you can add program variables using curly braces ("{}").To add it, right-click on the red point of the breakpoint and choose the Add Logpoint option. Variables In the variables section, you can see the values of local variables and microcontroller registers at the time a breakpoint is hit, as shown in Figure 21. Figure 21: Variable Section You can also position the cursor on a variable and be able to see its current value. Variable values can be modified by double-clicking on them or right-clicking and selecting the Set Value option. Watch In the Watch section, you can add variables to display so that you can monitor their value when stopping with a breakpoint. One of the essential utilities of this section is that you can declare variables in different numerical bases (hexadecimal, binary, etc.). To add a variable, just click on the Add Expression option; a text box will appear where you write the variable's name to add, as shown in Figure 22. Figure 22: Add Watch Variable To choose the numerical base, the variable is added as follows:,Some codes are listed in the following table, and Figure 23 shows an example. Code Base b Binary x, h Hexadecmial d decimal c Character o Octal s Character STring Figure 23: Variables With Some Numerical Codes Call Stack In the Call Stack section, we'll see the stack of RTOS tasks. It's useful when we want to know the sequence of steps to execute some process or function.  Figure 24 shows the example of the stack that is made when calling addAndSquare(). Figure 24: Call Stack of addAndSquare Function Debug Console As seen in the Breakpoints section, the debugger console shows the result of GDB execution. In this terminal, you can execute GDB commands in case the VS Code tools are not enough for you. To perform a command, it's necessary to put the instruction -exec before the GDB command. Figure 25 shows the example of running the backtrace command. Figure 25: Debug Console Command Example Additional Information Personal Tips Try to remove all warnings from your program. These could be a nest of bugs in the future.Many developers use the famous "printf debug" (I include myself). In my personal experience, this is helpful when the program is small. However, when there are many tasks running and a lot of interactions between them, the use of "print debug" is not the best idea. There have been times when my program crashes, and the cause is the "printf" itself. I recommend that you use it as little as possible and replace it with the help of the debugger's Logpoints.Keep in mind that compiling the code with debug symbols increases the memory usage of the microcontroller. If you have a huge system or little memory, it may be that using the debugger is not an option. One way around this is to divide your program into modules that can be tested independently. This allows you to more easily find errors through unit testing, and can also help avoid issues with resource limitations.Try to use the "Delta Debugging" technique. This uses the divide and conquer strategy to try and reduce the input causing the problem. The less code you need to replicate the problem, the easier it will be to find the error; it's like catching an insect by covering it with a glass.Try to use as little dynamic memory as possible.I recommend adding some kind of internal logging system in your application in case the bug appears when the system is already in production (The following article may be helpful: Real-Time Data Logging for Embedded Systems and IoT – Tutorial) Useful Links and References GDB DocumentationGNU Arm Embedded ToolchainDebug C++ in Visual Studio CodeDebugging in Visual Studio Code  Warrior's Guide to Embedded Debugging – Part IDebug like a Warrior. Part II Troubleshooting NNDK version 3.3.2 and lower has a problem with the display of local variables and call stack on the MODM7AE70. To solve this, open /arch/cortex-m7/make/archinc.mk and remove -fomit-frame-pointer from both CPPFLAGS and DBCPPFLAGS.The C / C ++ Visual Studio Code extension version 1.6.0 has a bug with LogPoints. This bug makes the LogPoints work like a simple Breakpoint. We have reported it (https://github.com/microsoft/vscode-cpptools/issues/8065 ) so that the creators could fix it in a future version. In case you require LogPoints functionality, we recommended installing version 1.5.1 of the extension. Wrapping Up Hopefully, this information will help all those developers who seek to make their code bug-free. If you have any other tips or tricks on debugging, we would be delighted to hear from you! Leave us your comments below.If you have any other questions, concerns, or suggestions, please contact us directly by email. Also, remember that we have a team of "bug busters" that can help you find those complex problems. NetBurner Support. About the Author Jordan Garcia. IoT and industrial protocols engineer at Racom Microelectronics.Dog lover, bookworm, and sweet tooth. Fan of embedded systems, back-end and front-end development, and a constant joy in learning new things. Unique ability: to finding bugs in systems ### How to Use Visual Studio Code with Your NetBurner Projects In one of our recent articles, we explained the functionalities of the NetBurner command-line tools and how they can be used to compile and load applications directly to the NetBurner modules. Visual Studio Code is an excellent freeware tool that can integrate this functionality. It is also currently one of the most popular IDEs among multiplatform developers due to its large number of extensions and custom configurations. Visual Studio Code can be run on Windows, Linux, and macOS. IoT Dev Kit Featured in this Article View Product Page Or, learn more about NetBurner IoT. In this article, we are going to talk about a basic configuration of Visual Studio Code that will allow you to use the functionalities of the command line. This includes using Tasks, configuring auto-completion, and adding descriptions of functions using IntelliSence. Finally, we’ll also cover some tips that can help to enhance your coding. Requirements This article assumes the following:You have the NNDK tools installed.You verified operation of terminal commands following the article, Building Applications with NetBurner Command Line Tools Getting Visual Studio Code Visual Studio Code is one of the lightest, most flexible, and most customizable IDE's that exists today. Its large number of extensions and plugins allows the developers to configure their work environment as it is most comfortable for them, supported by a large community and by particularly good documentation.To get it, go to the official Visual Studio Code page and download the appropriate version according to your operating system. This is shown below in Figure 1. Figure 1: Visual Studio Code Download. Once installed on your operating system, start the IDE. Figure 2: Visual Studio Code Welcome Page For this example, we will be using Windows 10 and the example ShowInterfaces, found in the NNDK at nburnexamplesShowInterfaces. We will also be using the MODM7AE70. To open it, click on the "File->Open Folder" menu option, and select the example folder, as shown in Figure 3. Figure 3: Open Folder Once the folder is selected in the "Explorer" window, the files that are in the example folder will appear, as shown in Figure 4. Figure 4: Explorer Section Before we go any further, let’s make sure that we can build the application normally with the command line tools. Fortunately, Visual Studio Code has the option of having terminals integrated into the IDE, to open it click on the Terminal> New Terminal option, as shown in Figure 5. Figure 5: Open a New Terminal A command terminal will open at the bottom of the IDE using the folder example address, as shown in Figure 6. Figure 6: The Terminal Through Visual Studio Code In this terminal you can test the command line tools presented in the article Building Applications with NetBurner Command Line Tools. For example, we are going to execute the fundamental command, make -j, which will compile the ShowInterfaces example. The –j flag allows for multi-job builds, which significantly speeds up compilation time. Figure 7: Running make -j If everything is installed correctly, the terminal will begin to show a list of commands running (makefile magic). After a few minutes, we will be able to see the result of the compilation, as shown in Figure 8. Figure 8: A Successful Build And yeah… this is nice, but it’s nothing to brag about. So far, we have not done more than test one of the NetBurner command line tools. We could have easily done this without installing any software, and by using our command line directly. In the following sections, we will dive into in-depth explanations of some of the more interesting features of Visual Studio Code. Integrating Command Line in VS Code via Tasks Before continuing, we will be required to install a Visual Studio Code extension that will allow us to develop C/C++ applications. To install an extension, click on the “Extensions” option in the left side menu. Then, in the extensions search bar, write “c/c++”. Underneath the search bar, all of the extensions that match the search pattern will appear. From this list, choose the first option (more than 21.4M downloads) and press the "Install" button, as shown below in Figure 9. Figure 9:Install C/C++ Extension Once installed, return to the "Explorer" section and create a folder in the root of the example with the name “.vscode”. To create the folder, click on the “New Folder” option from the top menu, as shown in Figure 10. Figure 10: Create Folder Figure 11: Create File Inside this folder, create a file called "tasks.json". To do this, click on the ".vscode" folder and click on the menu option "New File", as shown in Figure 11.Inside the "tasks.json" file, add the following code. This includes some of the command line functionality grouped into JSON objects that can be executed from Visual Studio Code directly. Save the file with the + shortcut. // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format { "version": "2.0.0", "tasks": [ { "label": "Build Project", "type": "shell", "command": "make -j", "options": { "cwd": "${workspaceFolder}" }, "group": { "kind": "build", "isDefault": true }, "problemMatcher": { "base": "$gcc", "fileLocation": [ "relative", "${workspaceFolder}" ] } }, { "label": "Build & Load Project", "type": "shell", "command": "make -j load DEVIP=192.168.0.100", "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": { "base": "$gcc", "fileLocation": [ "relative", "${workspaceFolder}" ] } }, { "label": "Build Debug Project", "type": "shell", "command": "make -j debug", "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": { "base": "$gcc", "fileLocation": [ "relative", "${workspaceFolder}" ] } }, { "label": "Build Debug & Load Project", "type": "shell", "command": "make -j loaddebug DEVIP=192.168.0.100", "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": { "base": "$gcc", "fileLocation": [ "relative", "${workspaceFolder}" ] } }, { "label": "Clean Project", "type": "shell", "command": "make clean", "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": { "base": "$gcc", "fileLocation": [ "relative", "${workspaceFolder}" ] } }, { "label": "Run addr2line tool", "type": "shell", "command": "arm-eabi-addr2line -Cife obj/release/NetburnerBase.elf ${input:addr2line}", "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": { "base": "$gcc", "fileLocation": [ "relative", "${workspaceFolder}" ] } }, ], "inputs": [ { "id": "addr2line", "type": "promptString", "description": "Enter the address to search" } ] } Here is a short description of the fields in the "tasks.json" file:“label”: Friendly name to identify the task.“type”: This is set to the Shell (Console) type because the command to be executed will be of the bash, cmd, or Powershell type, depending on the operating system."command": Command to be executed by this task."options": {"cwd": "$ {workspaceFolder}"}: Specifies the current directory."group": {"kind": "build", "isDefault": true}: Specifies the group to which this task belongs. Note that there can only be one task in the “isDefault:true” group, and it is executed with the + + shortcut."problemMatcher": {"base": "$ gcc", "fileLocation": ["relative", "$ {workspaceFolder}"]}: Assigns the problem matcher for GCC, which scans the output from the terminal commands for errors, alerts, or build information.To run the tasks, just click on the "Terminal-> Run Task" option in the top menu, as shown in Figure 12. Figure 12: Running a Task A pop-up window will appear with the tasks available in the project. Figure 13: Application Tasks Task Description Build Project Run the make -j command. This is used to compile the program. It can be executed with the + + shortcut. Build & Load Project Run the command, make -j load DEVIP=xx.xx.xx.xx. This is used to compile the program and load it into the module. Note: The IP address must be changed manually to the IP of the module used. Build Debug Project Run the command, make -j debug. It is used to compile the program in debugger mode. Build Debug & Load Project Run the command make -j loaddebug DEVIP=xx.xx.xx.xx. This is used to compile the program in debugger mode, and then load it into the module. Note: The IP address must be changed manually to the IP of the module used. Clean Project Run the make clean command. This is used to clean the result of previous compilations. Run addr2line tool Run the command arm-eabi-addr2line -Cife obj/release/.elf . This is used to map a memory address to a line of code from the application. (More information on this can be found in the article Tracking Traps on the MODM7AE70 – Part 1). Note: The name of the application must be changed manually. When executing this task, Visual Studio Code will request the search address to be entered. When choosing a task to execute (in this case Build Project was chosen), a new tab will appear in the terminal section. This is where the command of the selected task will be executed. This is shown below in Figure 14. Figure 14: Task Execution To test the error detection functionality, we are going to purposefully cause an error in the application code. To do this, open "main.cpp". This can be found in the folder, "src", from the "Explorer" window. Add an error in the file, as shown in Figure 15 (console.log() is a JavaScript function, and isn’t available in C/C++). Note that when opening the file, it will show some errors related to the C/C++ extension saying that certain header files could not be found. These errors will be removed later. For now, we will focus on the GCC compilation error. Figure 15: Adding an Error to the Code Because console.log() only exists in JavaScript, compiling the example (running the task from Terminal> Run Task or by pressing the + + shortcut) triggers the error which is displayed in the “Problems” tab. It also marks the line in which the error is located, as we see in Figure 16, below. Figure 16: Problem Matcher in Action We already have Visual Studio Code configured and the tasks setup to compile and load our code onto a NetBurner module. However, we still have a problem in that it cannot find the header files . We are going to solve this once and for all by giving it a superpower: code completion and code hinting with IntelliSense. Adding Superpowers: IntelliSense I would dare to say that this is one of the most important tools to use Visual Studio Code. I won't lie to you, Eclipse also has a similar function, but it is not as powerful as VS Code. I have always said that the developer's best friend is code completion. This is especially true if you are a bit dyslexic like me. But enough talk, let's get to work.Inside the folder ".vscode", create a file called, "c_cpp_properties.json". In it add, the following code, and save the file with the + shortcut: ARM Based Platforms { "env": { "NB_PATH": "C:/nburn" }, "configurations": [ { "name": "Netburner MODM7", "cStandard": "c11", "cppStandard": "c++17", "browse": { "path": [ "${workspaceFolder}", "${NB_PATH}" ], "limitSymbolsToIncludedHeaders": false }, "includePath": [ "${workspaceFolder}", "${workspaceFolder}/src", "${workspaceFolder}/**", "${NB_PATH}/gcc/arm-unknown-eabi/sys-include/", "${NB_PATH}/arch/cortex-m7/cpu/SAME70/include", "${NB_PATH}/arch/cortex-m7/include", "${NB_PATH}/gcc/arm-unknown-eabi/include", "${NB_PATH}/gcc/arm-unknown-eabi/include/c++/8.1.0", "${NB_PATH}/gcc/arm-unknown-eabi/include/c++/8.1.0/arm-unknown-eabi", "${NB_PATH}/gcc/arm-unknown-eabi/include/c++/8.1.0/backward", "${NB_PATH}/gcc/arm-unknown-eabi/sys-include/**", "${NB_PATH}/gcc/lib/gcc/arm-unknown-eabi/8.1.0/include", "${NB_PATH}/gcc/lib/gcc/arm-unknown-eabi/8.1.0/include-fixed", "${NB_PATH}/libraries/include", "${NB_PATH}/nbrtos/include", "${NB_PATH}/platform/MODM7AE70/include" ], "intelliSenseMode": "gcc-arm" } ], "version": 4 } ColdFire Based Platforms { "env": { "NB_PATH": "${NNDK_ROOT}" }, "configurations": [ { "name": "Netburner MOD5441X", "cStandard": "c11", "cppStandard": "c++17", "browse": { "path": "${workspaceFolder}", "${NB_PATH}" ], "limitSymbolsToIncludedHeaders": false }, "includePath": [ "${workspaceFolder}", "${workspaceFolder}/src", "${workspaceFolder}/**", "${workspaceFolder}/overload", "${NB_PATH}/gcc/m68k-unknown-elf/sys-include", "${NB_PATH}/arch/coldfire/cpu/MCF5441X/include", "${NB_PATH}/arch/coldfire/include", "${NB_PATH}/gcc/m68k-unknown-elf/include", "${NB_PATH}/gcc/m68k-unknown-elf/include/c++/8.1.0", "${NB_PATH}/gcc/m68k-unknown-elf/include/c++/8.1.0/m68k-unknown-elf", "${NB_PATH}/gcc/m68k-unknown-elf/include/c++/8.1.0/backward", "${NB_PATH}/gcc/m68k-unknown-elf/sys-include/**", "${NB_PATH}/gcc/lib/gcc/m68k-unknown-elf/8.1.0/include", "${NB_PATH}/gcc/lib/gcc/m68k-unknown-elf/8.1.0/include-fixed", "${NB_PATH}/libraries/include", "${NB_PATH}/nbrtos/include", "${NB_PATH}/platform/MOD5441X/include" ], "intelliSenseMode": "${default}" } ], "version": 4 } Here is a short explanation of the fields in this file:"env": {"NB_PATH": "c: / nburn"}: Path where NNDK is installed.“name”: Name of the configuration.“cStandard” / “cppStandard”: Standard versions of C and C ++ used."browse": {"path": […,…]}: Addresses to search for declarations and definitions.“includePath”: […]: Addresses in which the files and libraries used are stored.Saving the file with these changes automatically resolves the errors that we had in the previous section. This is because VS Code now knows where to look for the header files. From now on we can position the cursor on a function and see its documentation. Because NetBurner uses Doxygen to document its code and VS Code recognizes the Doxygen syntax natively, you’ll usually see the function description along with its associated parameters and return values. Figure 17: Documentation with Doxygen syntax. In addition, when we start writing something, the editor will give us recommendations for possible parts of the code that we want to write.  Just choose the desired option from the pop-up menu and press the TAB key for the code to complete itself. Figure 18: Code Hinting and Code Completion Another handy feature can be observed if you hold down the CTRL key and position the cursor on a function. This will show you the content of that function. Figure 19: Function Peeking There are several other important features that are also available. These can be found by right clicking on a function. Some of the most useful are:Go to Definition: Open the .c/.cpp file where the function definition is located.Go to Declaration: Open the .h file where the function declaration is located.Peek Definition / Peek Declaration: Opens a pop-up window with the declaration or definition of the function. Figure 20: Declarations and Definitions More Information Visual Studio tasks: https://code.visualstudio.com/docs/editor/tasks.Visual Studio Code Intellisense: https://code.visualstudio.com/docs/editor/intellisense.Personal Recommendations:Bracket Pair Colorizer 2 (coenraads.bracket-pair-colorizer-2): Color the (), [] and {} Which helps to identify more easily where they open and close.Material Icon Theme (pkief.material-icon-theme): Change the icons of the files to a Material style format.TODO Highlight (wayou.vscode-todo-highlight): Highlight TODO and FIXME annotations and create a to-do listProject Manager (alefragnani.project-manager): It creates direct accesses to the projects used, which allows to open them easily. Wrapping Up Hopefully this information will help all those developers who prefer to use Visual Studio Code in their applications and projects, especially those who program in multiple languages and who like to customize their work environment. If you have some tricks of the trade on how to use Visual Studio Code, we would love to hear it! Let us know in the comments below. If you have any other questions or issues, please feel free to email us directly at sales@netburner.com.In a future post we will talk about another key piece of Visual Studio Code functionality: Debugging using GDB. Stay tuned! About the Author Jordan Garcia, IoT and industrial protocols engineer at Racom Microelectronics.Dog lover, bookworm, and sweet tooth. Fan of embedded systems, back-end and front-end development and a constant joy in learning new things. Special ability: to finding bugs in systems. ### How to Use OpenSSL's Client and Server for Testing In one of our recent articles, we review how it's possible to decrypt traffic encrypted with Wireshark for the purpose of debugging. That's all well and good when you have everything already set up, but what about just testing your server or your client? If you're responsible for developing both ends of the connection, having an easy way to test one side or the other against a known working component is invaluable. Fortunately, there is a tool out there that makes this relatively easy to do. Even better, it comes ready to go with the NNDK, so there's no need to go rooting around searching and installing various pieces of software. The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. In this article, we're going to walk through that tool, OpenSSL, and see how you can use it to test your custom client and your server applications. We'll also cover some valuable flags you might need when testing particular ciphers, session resumption, or other specific settings. Setting Up and Getting Started Before we can jump into our testing glory, we need to make sure we have a few things ready to go. Mainly, you'll need to make sure you have OpenSSL available on your machine. If you've installed the NNDK from one of our development kits, it should be located in the pcbin folder of your install directory. If you don't have our tools installed, you can find everything from the OpenSSL website. Make sure to pay attention to which version you grab, as that will determine which ciphers you can use during your testing. The version we currently ship our tools with is OpenSSL 1.1.0l. This version supports several of the latest ciphers and is perfect for our functional testing. OpenSSL Cipher List To determine what version of OpenSSL you currently have installed on your computer, open a command prompt and type the command, openssl version. If you want to see your current list of available ciphers, you can use the command, openssl ciphers. This command will display a very condensed list of what ciphers are currently available. The resulting output should look something like the following image. NetBurner Examples Used In this article, we're going to use two examples to help demonstrate testing with OpenSSL. The first will be our SSL\TLS server. The second will be our SSL\TLS client. You can find the example code for both of these in /examples/ssl/. The server is in the folder sslserver, while the client is in the folder sslclient. Like most of our examples, we have tried to make both of these a great launching point for more complex and complete applications. To load these applications on your device, you'll first need to know its IP address. If your device is connected to your local network and you have internet access, this is as easy as opening your browser and going to discover.netburner.com. NetBurner's Device Discovery Service Once you know this, building and updating your device with either of these examples is pretty straightforward. We walk through this in our documentation, which details how to get a project up and running using our custom IDE, NBEclipse. If you prefer to work from the command line, we recently wrote an article detailing the steps needed to go that route. Testing A Secure Server Application with OpenSSL Let's go ahead and load the SSL\TLS server example application on our module, a NetBurner MODM7AE70. This module will represent the custom secure server that we need to test using the OpenSSL client. Open a MTTTY terminal (or your preferred serial terminal), connect it to the proper com port, then power your device. You should see the following serial data when the application has booted and is ready for a connection. SSL\TLS Server Example Waiting on Connection Time to test our server. From a command terminal, we're going to enter the command: openssl client -connect : Where is the address of your device, and the port is the port the device is listening to for the connection request. By default, this is port 8883. If all goes well, the devices connect, and you'll see the following in the serial terminal. SSL\TLS Server Connected From your command line window, you'll see a bunch of text scroll by, as shown in the image below, followed by a fairly long list of numbers. The list of numbers is just test data that the module sends to verify the connection's functionality. The information above that, however, is pretty interesting and gives some specific information about the connection itself. In fact, let's take a minute to review what we're actually seeing here. The first section shows a little bit of information about the server certificate that was sent: depth=0 C = US, ST = CA, L = San Diego, O = "NetBurner, Server", CN = 10.1.1.128 verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 C = US, ST = CA, L = San Diego, O = "NetBurner, Server", CN = 10.1.1.128 verify error:num=21:unable to verify the first certificate verify return:1 The verify error listed here is because we're using a self-signed certificate and didn't provide the certificate authority's certificate needed to validate the server's certificate (a critical step in any production environment). If you wanted to do this, you would add the certificate authority file with the -CAfile flag. While we provide the self-signed certificates to use in the examples, we don't provide the corresponding Certificate Authority certificate used to generate them. Therefore, to use this flag with our above example, you would need to recreate your own self-signed certs. Fortunately, we have some scripts that make this incredibly easy to do, as well as an article detailing the steps explaining how to do it. The second section of the client connection output shows the certificate chain. Because we created self-signed certificates for use in this example, this list is very short. We have the certificate authority we created to sign the server's certificate and the server certificate itself. Certificate chain 0 s:/C=US/ST=CA/L=San Diego/O=NetBurner, Server/CN=10.1.1.128 i:/C=US/ST=CA/L=San Diego/O=NetBurner, Cert Auth/CN=NetBurner, Cert Auth Underneath this section, we have the server certificate itself. It's fairly unintelligible on its own, so we've left that chunk out. Below the server certificate are a few sections that give most of the details on the actual connection. This is where you'll find most of the information you can use to troubleshoot and test different aspects of your application, such as the protocol, the cipher suite used, the session ID or ticket, etc. No client certificate CA names sent Peer signing digest: SHA256 Server Temp Key: X25519, 253 bits --- SSL handshake has read 841 bytes and written 386 bytes Verification error: unable to verify the first certificate --- New, TLSv1.2, Cipher is ECDHE-ECDSA-AES256-GCM-SHA384 Server public key is 256 bit Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-ECDSA-AES256-GCM-SHA384 Session-ID: 334628C1F16F5372C444AB961C20668EB6BFB01CB18CEAF38B758761ADB82356 Session-ID-ctx: Master-Key: ADE5E1790DE0FCF5824DF9FA6D32846E4178E4DCADFD16A7629E3A8071D15A166915548456910940435C1608894DC49A PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 300 (seconds) TLS session ticket: 0000 - 4e 42 53 65 73 73 69 6f-6e 54 69 63 6b 65 74 00 NBSessionTicket. 0010 - c1 2f 72 09 e4 e7 94 01-96 30 15 b2 53 80 bc ec ./r......0..S... 0020 - 00 3c d7 9b 99 25 a0 66-39 58 2e bd 22 b2 88 b8 .<...%.f9X.."... 0030 - 6d d1 6d 55 7a f0 34 21-ae b1 3d a9 d9 49 44 ab m.mUz.4!..=..ID. 0040 - 88 bb 75 0d 6f c8 6c db-8c d9 09 7f ef 97 7f 24 ..u.o.l........$ 0050 - ac 28 7b fb 5a d8 a3 e8-5f a6 ec 31 b9 bf d4 ea .({.Z..._..1.... 0060 - 96 f3 7e aa a3 76 24 79-6a 92 e9 8f be 7e 00 00 ..~..v$yj....~.. 0070 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 .............. Start Time: 1625001123 Timeout : 7200 (sec) Verify return code: 21 (unable to verify the first certificate) Extended master secret: no --- In our example, we can see that we connected using TLS v1.2, with the cipher ECDHE-ECDSA-AES256-GCM-SHA384. We can also see that the server application sent us a session ID and ticket. Testing a Secure Client Connection with OpenSSL Now that we've covered how to use OpenSSL to test a secure server application let's flip things around and look at how you might use OpenSSL to test a client. To do this, first, you'll need to create a self-signed certificate and key that your server can use. As we mentioned above, the NetBurner NNDK provides a set of scripts that make this very easy. The scripts are located in the \CreateCerts\ECDSA directory. In addition, you can find the article that walks through how to use them here. The resulting files that you will need are Server.key and Server.crt. To get your server up and running, type the following command from your command line: openssl s_server -key Server.key -cert Server.crt -accept 4433 You should see an ACCEPT message in the command window, as shown below. This indicates to us that the server is waiting for a connection request. Let's not keep it waiting! Before you can load your client example onto the board, you'll need to make one small code change. Open up main.cpp, find the #DEFINE that sets the server's IP address, SSL_SERVER_NAME, and set it to your computer's IP address. Now you can build the application and load it onto your device as detailed by our documentation. When your client first boots it will attempt a connection to the IP address you specified above. If successful, you'll see some timing information and a connection counter from our serial terminal. The example is set up to repeatedly connect to the server in order to test session resumption. It should look something like the image below. SSL\TLS Client Example Successfully Connecting From the command prompt, if the connection is successful, you will see a lot of information displayed, beginning with the session parameters. Underneath that are the list of shared ciphers between the server and the client, as well as the supported and shared elliptic curves. Near the bottom, it will indicate which cipher was chosen for the connection. In our example, it is ECDHE-ECDSA-AES128-SHA. -----BEGIN SSL SESSION PARAMETERS----- MHUCAQECAgMDBALACQQgTbjfydxoIH/A1oFDyvvCqcP8mRn8spLuWB703PIBHdIE MNzexoTi38ZWE/hGTiGpZnNKlLMruW4cNkfkVQSFa5SFuW5F+WhuAP4wXGWP5eZW /6EGAgRg27JwogQCAhwgpAYEBAEAAAA= -----END SSL SESSION PARAMETERS----- Shared ciphers:AES128-SHA:DHE-RSA-AES128-SHA:AES256-SHA256:DHE-RSA-AES256-SHA:AES128-SHA256:AES256-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:AES128-GCM-SHA256:AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384 Signature Algorithms: ECDSA+SHA512:ECDSA+SHA384:ECDSA+SHA256:0x07+0x08:0x06+SHA512:0x05+SHA384:0x04+SHA256:RSA+SHA512:RSA+SHA384:RSA+SHA256 Supported Elliptic Curve Point Formats: uncompressed Supported Elliptic Curves: P-521:P-384:P-256:X25519:P-224:P-192 Shared Elliptic curves: P-521:P-384:P-256:X25519 CIPHER is ECDHE-ECDSA-AES128-SHA Secure Renegotiation IS NOT supported We connected 1 times, Failed 0 times DONE shutting down SSL CONNECTION CLOSED If you look at the subsequent connections, you'll notice that they happen much more rapidly, and with a lot less information. This is because we are using session IDs to speed up the handshake Other Useful Flags In addition to the base command and -CAfile flag we discussed above, the OpenSSL client has several useful options you can use to set specific behaviors for your tests, such as restricting the use of session IDs and tickets. Below are some of our favorites, but you can find the complete list for clients here, and for servers here. FlagDescription-CAfileThis dictates which certificate authority should be used to validate server certificates. This flag is extremely useful when you are using self-signed certificates, but you still want to make sure you can verify the connection.-verify_hostnameEnsure that the hostname you're connecting to is verified by your Certificate Authority list.-showcertsShow all of the certificates in the certificate list sent by the server.-cert Which certificate the client should send if the server is doing peer verification.-cipher Which ciphers the client will support. This command modifies the list sent to the server.-no_ticketDisable support for session tickets. Wrapping Up Hopefully this information has provided some useful insights on ways to use OpenSSL to help test your custom client and server applications. If you have a favorite option or trick that you use with the OpenSSL client or server, we’d love to hear it! Let us know in the comments below. If you have any other questions or issues, please feel free to email us directly at sales@netburner.com. ### Building Applications with NetBurner Command Line Tools In addition to the NBEclipse IDE, the NetBurner development kits provide command line tools that can be used to build and load applications directly onto NetBurner modules. While some prefer the simplicity associated with working from the command prompt, the command line tools can also be used to integrate with a different IDE, or to automate the build process for whichever build system you prefer. NetBurner's command line tools are supported for Windows, macOS and Linux. In this article, we will start with a quick example of building a NetBurner example, and then move on to the details of creating your own makefiles. The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. Building a NetBurner Application from the Command Line Command line builds use the make utility, and all NetBurner examples have an associated makefile.  The following demonstrates how to do a command line build of the example \nburn\examples\ShowInterfaces for a MODM7AE70 on Windows 10. The first step is to open a command prompt and navigate to the example directory. Once there, the key commands are: CommandDescriptionmake -jThe “-j” option builds the application using all available processor cores, which will greatly speed up the build. Note: if you have errors, they may be easier to view by using just “make” so the display is from a single thread.make -j loadBuilds the application and downloads the application image to a NetBurner device. If the DEVIP environment variable is defined it will be used, otherwise it needs to be added to command. For example, “make -j load DEVIP=192.168.1.1”. To set the variable in Windows: “SET DEVIP=192.168.1.140”.make cleanDeletes all object and image files.make -j debugBuild in debug mode. There are also various environment variables that can be used: VariableDescriptionPLATFORMSpecifies the NetBurner platform for the build. Typically used when you have multiple NetBurner platforms, such as MODM7AE70, MOD5441X, NANO54415, and SB800EX.DEVIPSpecifies the target IP address of your NetBurner device. If defined, you can run make -j load. In Windows, you can set the environment variables from the control panel or you can specify them from the command prompt with the SET command. For example, typing SET DEVIP=192.168.1.140 will set the DEVIP variable to 192.168.0.140. Calling just SET DEVIP will show you what value is currently assigned. For macOS and Linux, use the EXPORT command. It's important to note that if you set environment variables directly from the command line in Windows, they will only be set for that particular instance of the command terminal. If you were to open a second command prompt and look at the variables value, you will see that they are still set to their default values. Additionally, if you change them from the control panel, those changes will note be reflected in any currently open command prompts. You will need to reopen them for those changes to take affect. To build the example, type make -j from the example directory: Use "make -j" to Build an Example The first time you build a project it will build the system libraries, and you will see the files rapidly scrolling by. From that point forward only files that have changed will be built. When the build is complete you will see a build summary showing the build options and memory usage: A Successful Build The following shows an example when the load command is used. The load command invokes the nbupdate utility. If you are experiencing any difficulty in the application download, you can run the nbupdate utility from the command line to troubleshoot any issues. Creating a Makefile for your Project The screen shot below shows the file structure of the ShowInterfaces example we built in the \nburn\examples folder. The ShowInterfaces project folder contains: The project makefile The html folder for HTML source code The src folder for the application source code The obj folder for compiled object files The release folder for the compiled application image (ShowInterfaces.bin) and compiled library files The ShowInterfaces Example Folder Structure In an effort to simplify makefiles, the makefile for a project focuses on identifying the source files, and then invokes another makefile, \nburn\make\boilderplate.mk, that handles the low level details common to all NetBurner projects. Here is the makefile for the ShowInterfaces example we built earlier: NAME = ShowInterfaces CPP_SRC += \ src/main.cpp \ src/ip_util.cpp CREATEDTARGS += src/htmldata.cpp CPP_SRC += src/htmldata.cpp src/htmldata.cpp : $(wildcard html/*.*) comphtml html -osrc/htmldata.cpp include $(NNDK_ROOT)/make/boilerplate.mk Examining the Makefile So what does all of this actually do? Let's take a look. The NAME field specifies the name of the .bin file that will be generated. The CPP_SRC specifies the project’s C++ source code files. The ‘\’ continuation character is there to make it easier to read and list the source files one per line. Note that the path is relative to the project root folder, so files have a “/src” prefix. To add C files, add a C_SRC field, to add assembly language files add a AS_SRC field. The CREATEDTARGS, CPP_SRC, and comphtml utility process the auto-generated htmldata.cpp. This file contains everything in the project’s html folder. If your application does not have a web interface, none of these lines are necessary and you can comment them out with the ‘#’ character (just in case you decide to add one later). Finally, the boilerplate.mk file is called to complete the system processing. To create a makefile for your project you can start with this example and change the NAME and CPP_SRC C++ file names accordingly. That is it! Advanced Compiler Flags There are a few makefile fields worth noting for advanced control of the GCC compiler. It is beyond the scope of this article to go into all the available compiler flags, but we will use optimization as an example. To turn off optimization for your project you would add: EXTRACPPFLAGS := -O0. Note that is a capital letter ‘O’ followed by the number zero. FieldDescriptionEXTRACPPFLAGSAffects all C and C++ filesEXTRACFLAGSAffect all C filesEXTRACXXFLAGSAffects all C++ filesEXTRAASFLAGSAffects all assembly filesEXTRALINKFLAGSAffects the linker The Overload Feature As of NNDK 3.x, all of our system libraries are now build individually for each project. This is a fantastic feature if you need to modify some of the predefined values or source code on a per project basis. To do this, simply create an overload directory in your root project directory. When you know the files that need to be overloaded, copy them into the overload directory, being careful to ensure that the file path from the overload directory has the same path as the original system file. For example, if you wanted to overload nbrtos/include/predef.h then you would copy that files to project/overload/nbrtos/include/predef.h. For more information on how this works, please see our documentation. Additional Command Line Tools In addition to those mentioned above, there are some very useful command line tools that can be run directly from the command line. We've listed a few here, as well as a short description on what each does. localdiscover To locate your NetBurner device, localdiscover will send out a request to all of the NetBurner devices on your network and display the results in a web browser. The image below shows the device’s mac address as well as the IPv4, IPv6 and AutoIP addresses. From here, you can access the device's configuration page, or the web page being served by the application running on the device itself. The localdiscover App Shows Your NetBurner Device nbupdate nbupdate is a multi-platform command line utility. The format is: nbupdate . For example, nbupdate ShowInterfaces.bin 192.168.1.140. If the environment variable DEVIP is set, the IP address parameter is not required. As mentioned earlier, this is the same utility invoked by running make -j load. wget WGET is an industry standard utility that allows you to download files over TCP/IP protocols FTP, HTTP and HTTPS. If you are using macOS or Linux, WGET is usually already installed (or can using your package manager). Windows users will need to install it, please refer to this page. The WGET utility can be used for several things: Updating the device application image Retrieving device configuration information in JSON Updating device configuration information in JSON In the examples below we use a device IP address of 10.1.1.60 and an application name of myApplication.bin. Program an Application To program a new application into the device: wget --post-file=myApplication.bin 10.1.1.60:20034/appupdate.html All updates are processed by the Configuration Server running on the NetBurner device. The --post-file specifies that a POST operation is to be performed. The IP address and configuration port number are next, along with the server post destination that will always be appupdate.html. If using authentication with a username of "user", and password of "pass": wget --auth-no-challenge --user=user --password=pass --post-file=myApplication.bin 10.1.1.60:20034/appupdate.html Read The Configuration Read the current configuration into a file named config.txt: wget 10.1.1.60:20034/Config In this case the destination is Config, rather than appupdate.html. If you would like to specify a directory to store the file, use the -P option: wget 10.1.1.60:20034/Config -P \myDir Program New Configuration Settings The easiest way to do this is to first read the configuration and save to a file so you have a template to work with, then edit the settings you need. Then post the configuration file to each new device: wget --post-file=newconfig 10.1.1.60:20034/Config Wrapping Up It's clear that there are a multitude of ways to build and deploy applications to your devices. We want to make sure that every developer has a path that allows them to work as efficiently and effectively as possible, whether that's using NBEclipse, MS Visual Studio, or Vim. If you have any questions or comments on our utilities, we'd love to hear from you! Please drop a note in our comments below, or send us an email directly at sales@netburner.com. ### The Secret is Out: How to View Encrypted Data in Wireshark If you've ever had the... pleasure... of debugging a application using an SSL/TLS connection with Wireshark (or any other packet analyzer for that matter), you're probably deeply aware of the challenges involved. If you don't happen to fall into this unfortunate category of souls, we can still paint you a pretty good picture. The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. Update: As of NNDK version 3.5.0 (February 2024) there's an easy way of doing this. See the "Updated: Easy Alternative" section below for details. Imagine, for a moment, that you're sitting there, doing your developer thing. You've got two machines, your PC, and a brand new shiny MODM7AE70 development kit. Your project requires sending sensitive data from the device to your PC. No problem! With NetBurner's SSL/TLS libraries, you have the first iteration of your application up and running in no time. You set up a quick test scenario, and.... something isn't quite right. You see the data that you're sending out before it hits the network. However, what you're getting on the other side isn't correct. Maybe it's mangled, or is missing information, or ever other character has mysteriously turned into a '~'. "No worries," you say to yourself, "I'll just open Wireshark and see what's going on here." A few short minutes later you run the test again, and see the following. Wireshark Capture Showing Encrypted Data Most of this looks great, until you actually look at the data, and are greeted with, "Encrypted Application Data: ". Trying to debug issues over an encrypted connection with Wireshark is a lot like trying to edit an article in a language you don't know. Maybe you know what it's supposed to say. Unfortunately, that doesn't help you as you're staring at the mix of unfamiliar garbage sitting in front of your face. Fortunately, there is hope. Given the proper information, Wireshark can decode this information for you and let you see exactly what's being sent over the wire. In this article, we'll cover the steps you have to go through to get to this goldmine of debugging goodness. First, we discuss what information needs to be set in Wireshark and demonstrate how to do it. Then we'll look at how to get that information from the NetBurner device. Finally, we'll show what it looks like in action. Adding Secrets to Wireshark We won't dive too far into the TLS handshake in this article, but having a basic understanding of how it works will help explain what we need to do in Wireshark. In every secure SSL/TLS connection, information sent back and forth between the client and server is encrypted using a secret key (also called a premaster secret) that is generated by the client during the TLS handshake. Without this secret key, neither side can decrypt any messages that are encrypted by the other side. If you've ever seen a Christmas Story, the secret key is akin to the decoder pin Ralphie was so excited about, only to realize he had been duped into decoding a marketing message by Ovaltine. Hopefully your own encrypted data is a little more interesting... Without the Secret Key, You Can't Decrypt Messages The generation of this secret key and how it is securely sent from the client to the server is a bit out of the scope of this article, but we recommend the guide found here for those looking for a deeper explanation. The important part that we need to be aware of is that without this secret, our chances of being able to decrypt any messages captured between the client and server are pretty slim. Fortunately, adding this information to Wireshark is pretty straightforward. To add the secrets, first go to Edit->Preferences->Protocols->TLS from the Wireshark menu. From this window, at the bottom, you'll see the field labeled, "(Pre)-Master-Secret". From there, you'll hit a button labeled, "Browse", and then select the file containing your secret keys (more on this below for NetBurner applications). Wireshark Preferences Now that we know where to load the secret key, the question is where to get it. Fortunately, for NetBurner devices a few small code changes will give you everything you need to start looking at that network traffic. Please keep in mind that this should be used only for debugging purposes in non-production environments. When it comes to secret keys used out in the real world, Gandalf said it best... Changes to NetBurner Application Code Updated: Easy Alternative As of NNDK version 3.5.0 (February 2024), you can ignore the System Library Changes section below and simply edit\libraries\include\crypto\platform\\user_settings.h at about line 356. Uncomment the SHOW_SECRETS and HAVE_SECRET_CALLBACK lines so they're defined and you're good to go, no actual code required! System Library Changes Now let's look at getting that secret. As we mentioned before, in order to get the secret that is required to decrypt our packets, we'll need to make a few changes to the crypto libraries. Don't worry, though. These are short, painless, and easy to put in and take out. First, open the file \libraries\crypto\src\tls.c . At the top of the file, add the following snippet of code: #include void SaveMasterSecret( const char* pmsBuf, int pmsPos ) { iprintf("%s\r\n", pmsBuf); } #define SHOW_SECRETS (1) This bit of code sets a define that will make the secret accessible, and the function SaveMasterSecret() will simply output everything passed to it out the serial port. Next, down in the function MakeTlsMasterSecret(), replace /* print master secret */ puts(pmsBuf); with /* print master secret */ //puts(pmsBuf); SaveMasterSecret(pmsBuf,pmsPos); Now, choose any SSL/TLS example, or if you're already working on your application, rebuild the system libraries and the project. If you're using our latest tools, either with NBEclipse or via the command line, everything is taken care of when you rebuild the project itself, as all of the system libraries are included as a part of this process. If you're using our NNDK 2.x tools, you'll need to rebuild the system libraries separately before building the application. Example Code Changes For the purpose of this article, we'll be using our 3.x tools and will do our testing with the SSL client example. It very simple, and shows how the NetBurner device can connect to an SSL server. You can find this example in \examples\SSL\sslclient. For this example, you'll need to do two things in addition to the system changes above. The first is to add the IP address of your SSL server to the example. Simply change the macro SSL_SERVER_NAME to the proper IP address, and rebuild the application. The second is to actually start the SSL server that will receive the connection. For this we use this OpenSSL command from the command line: openssl s_server -key Server.key -cert Server.crt -accept 4433 -no_ticket -no_cache Note that you'll need to have a certificate (-cert) and key (-key) handy. We generated ours using the certificate generation scripts provided with the NNDK tools. For more info on that, see our article on self signed certificates. The flag -accept just dictates what port the SSL server will accept connections on. The flags -no_ticket and -no_cache will prevent connections from using session resumption, which will make our lives a tad easier when trying to decrypt the packets from Wireshark. After we've started the server, go ahead and start listening for the packets on Wireshark. If you're using MTTTY for your serial terminal, we recommend that you log the serial data directly to the file. This will prevent you from having to do a lot of reformatting to the keys like you would if you were to simply copy and paste. To log the data directly, go to Transfer->Log to File (text) from the top menu and select where you'd like to save the data. Finally, load the application to the module. You should see something like the following (we modified the example slightly to display only the secret keys). Secret Key Displayed In Serial Terminal When the example has completed its run, stop the logging and open the file everything was logged to in your text editor. We only want the lines starting with "CLIENT_RANDOM" in our file, so delete anything else. Putting it All Together If you haven't already, go ahead and stop the packet transfer capture in Wireshark. Now we have our packet data, secret keys, and we know how to install them into Wireshark. Let's go back and see if we can't figure out what's actually getting sent over the wire. Load the key file via the menu mentioned above (Edit->Preferences->Protocols->TLS), and voila! You can see in the image below that below the packet information is a tab that says, "Decrypted TLS (34) bytes)". When we click on that, it shows the data in the packet decrypted, just like we were hoping. Decrypted Packet Data What's Next Now that can see what's actually being sent between your devices in an encrypted connection, will all of your SSL/TLS and application debugging issues magically go away? Absolutely not! Working with encrypted connections can be challenging, even when you're able to see all of the pieces. That said, knowing what you're looking at will certainly make a huge difference. If you have any questions or additional tips and tricks that can be used while trying to debug encrypted connections, feel free to let us know in the comments below, or to email us directly at sales@netburner.com. ### Building and Linking External Libraries with NetBurner Projects We do our best to provide an extensive list of drivers and libraries for use with your projects and applications right out of the box. That said, sometimes you will want to include a specific external library that we just don't have built in support for. Fortunately, incorporating these libraries into your project is fairly straightforward. The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. In this demonstration, we will be linking in a small protobuf library called Nanopb. Protobuf (Protocol Buffer) is a serialization tool developed by Google emphasizing simplicity and performance. Nanopb is a small-footprint protobuf library implemented in ANSI C, targeting embedded devices. Building external libraries can be divided in to two steps. First, since most libraries found on the Internet are not prebuilt for a Coldfire or ARM processor, the library will need to be compiled under the NetBurner GCC toolchain. Then, the application project will need to link in the external library archive file when building. The process of building and linking an external project changes, depending on if they are being built within NBEclipse or on the command line, managed by a makefile. We'll show how to work through both scenarios below. In this example, everything was built under Windows 10, but should be applicable to all supported OS's. Setting Up the Environment To begin, clone the NetBurner nanopb-simple example to a local repository. Alternatively, if you wish to download the latest version of nanopb, download and extract the Nanopb package for your operating system. At the time of writing, the latest version used and tested in this example is 0.4.5. In the root directory of the package there are several C and H files, all of which have the prefix pb. They will need to be placed in the Library project, either in NBEclipse or on the command line (depending on how you're building the project). In addition, the generator-bin contains protoc.exe, a utility that compiles .proto files in to source files. These will be used in the application projects below. These files are all included and ready to go in the NetBurner nanopb-simple Github project linked above. NBEclipse NBEclipse has the ability to build both library projects and application projects. The type of project that is built is selected when creating a new project. Library NBEclipse Project To begin, a new project will need to be created that will generate a static library. Select File->New->Project... , select a NetBurner Project, and click "Next". By default, the default option for a project is an Executable, however, this project needs to be changed to a Static Library. Select "Static Library" and give the project a name. Click "Next" twice to get to the Device Options selection. Ensure that the target platform is set to the NetBurner platform that this project will be building for. Once selected, click "Next", and then "Finish". With an empty library project now created, copy and paste the source files from the Library folder of the NetBurner nanopb-simple example repository. Only the header and source files are required. Building the project will create a lib.a file in the release folder. Application NBEclipse Project With the library built, an application project can now be created that depends on the library. Create a standard NBEclipse project using the new project wizard. Copy and paste the source files from the Application folder of the nanopb-simple repository in to the project src folder. NBEclipse will begin building the project and fail. This is expected, since the project dependency settings have not been created. The application requires three tool settings to be set so that it will depend on the other library project. Begin adding the library project src folder to the include path of the application project. Right click on the application project and select "properties". Under C/C++ Build, select "Settings". Under Tool Settings, select GNU C++ Compiler->Includes. Click on the plus sign in Include paths, and add the library project src folder. Since this project may have C files in addition to C++, add the include folder under GNU C Compiler settings as well. To link to the required library, under GNU C/C++ Linker, select "Libraries". In the Libraries (-l) tab, add the name of the Library project. The lib prefix and .a filetype are not required (i.e., just type in nanopb). Under "Library search path (-L)", click plus and add the library project Release folder. Click apply to save settings. With these changes in place, the application project will now properly include the library project. Command Line Just as before, building and linking external libraries will require two projects. The first will build the library, while the second will utilize the library. This section will cover both project types. If you want to skip directly to the working example, it can be found on Github. Library Makefile Project A project that builds a library on the command line looks a lot like a project that builds an application. The makefile requires a name and it must list the source files of the library. NAME = libnanopb TARGET_TYPE = lib C_SRC += \ pb_common.c \ pb_decode.c \ pb_encode.c include $(NNDK\_ROOT)/make/boilerplate.mk The major difference between an application and a library makefile is the TARGET_TYPE variable. By default, this variable is set to app. It also supports lib and nblib. lib places the library in the project build directory, nblib places the library in the NNDK installation library directory, which defaults to /nburn/lib. Application Makefile Project Once the library is built, the application makefile will need some additional information to link in the external library. The application probably uses the headers from the external library, so it will also need to know where those headers are. NBINCLUDE += \ -I../Library XTRALIB += \ ../Library/obj/release/libnanopb.a The NBINCLUDE variable will add the directory listed to the compiler Include directive. With this, the C++ source can locate the headers from the external library with a typical include define #include . The XTRALIB variable will add the external library to the linking step of the toolchain. When the library makefile above used TARGET_TYPE=lib, it placed the library in the obj/release folder. In the application project, that location is used for setting XTRALIB. A Complete Makefile Make offers more complete dependency management if all of the steps of the build process are known. The application can be improved by adding the Library project as a target type, so that it will know how to build the library project if the library is missing. Both the Library project and Application project, along with the complete application makefile with dependencies can be found on Github. Wrapping Up With the above steps laid out, it's not hard to see how your embedded IoT applications can be extended to include all sort of interesting libraries. If this is something you've already tackled, we'd love to see what libraries you've included, and how you're using them in your products. Please feel free to share, or send us an email directly at sales@netburner.com. ### Setting Up a White Label Discover Server NetBurner's Discover Server is a web based application that can be used to locate and provide information on NetBurner devices running on a local network. These devices must be running applications built using NNDK 3.x. Being able to find these devices quickly from any platform without installing any additional software makes configuring and tracking these devices substantially easier than is otherwise the case. The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. However, there are cases where you might not want NetBurner's label on your products, or you might want to changes its native behavior in some way. It's okay, we understand. To help with this, we've made the Discover Server source code available to customers so that they can customize and run their own personalized versions (contact us at sales@netburner.com for more information). The Discover Server is designed to be run using several of Amazon’s Web Services. This document will take you through the process of setting these up and configuring them so that you can build and run your own Discover Server. Please note that an AWS account will be required, and running a Discover Server will incur service charges. The following services are used: Elastic Beanstalk running NodeJS DynamoDB IAM CloudWatch VPC Setting Up the AWS Services Create a Virtual Private Cloud (VPC) Amazon's VPC allows us to create a virtual network that our other services will operate in. To create a VPC, first log into the Amazon Console. From there, search for the VPC service in the search bar located at the top of the dashboard, and then click on it. Finding the VPC Service Click on the “Your VPCs” link on the left hand sidebar menu. VPC Dashboard Click on the “Create VPC” button at the top right. This should take you to the screen shown below. Creating a VPC Give it a name and a IPv4 CIDR block. This dictates the range of IP addresses that will be available. If you’re not sure what to put here, you can just put 10.0.0.0/16. Once everything is filled out, hit the “Create VPC” button. Setting the VPC Fields Create a Route Table Next we need to create a route table. The route table will dictate how network traffic is directed between the resources associated with our VPC. A public one will be created automatically, but we’ll need to manually create a private one for our private subnets. Click on the “Route Tables” link on the left hand sidebar menu. Route Tables Dashboard Click on the “Create route table” button at the top left of the page. Route Table Creation Screen Add a name, and then select the VPC that we just created, then hit the “Create” button. Create Subnets We’re going to create eight subnets. These will determine what resourced are exposed to the internet, and which resources can only be accessed internally. In this case, we will create four public and four private subnets. The four public subnets should have unique availability zones selected, as should the private subnets. Select the “Subnets” menu option from the left hand sidebar menu. AWS Subnet Dashboard Click on the “Create subnet” button at the top right of the screen. From the “Create subnet” screen, select the VPC that we just created in the previous step for the VPC ID. For the subnet settings, provide a name, choose an availability zone, and then assign a IPv4 CIDR block. For the name, provide some indicator that you can use to identify it as either a private subnet. If you’re having issues getting a correct IPv4 CIDR block, and used the value we listed above (10.0.0.0/16), you can use the following for each subnet: 10.0.0.0/2410.0.1.0/2410.0.2.0/2410.0.3.0/24 Creating Private Subnets Hit the “Add new subnet” button at the bottom, and fill out the information for an additional subnet. Do this two more times, for a total of four subnets. Repeat this process to create four public subnets. Again, make sure that each has a name that will help you identify them as a public subnet and a different availability zone from the other public subnets. You’ll also need to specify different IPv4 CIDR block values. If you used the CIDR block value we listed (10.0.0.0/16) when creating the VPC, and the CIDR block values we provided above for the private subnets, you can use the following for the public subnets: 10.0.5.0/2410.0.6.0/2410.0.7.0/2410.0.8.0/24 Creating Public Subnets From the main list of subnets we’ve created, check the box next to the one of the private subnets we’ve created. Click the button labeled “Actions▼”. From the submenu displayed, select, “Edit route table association”. Associating Subnets and Route Tables From the “Route table ID” dropdown in the “Subnet route table settings menu”, select the private route table that we created previously, then hit “Save”. Repeat this for the other three private subnets. Note that the public subnets are already automatically associated with the public route table (which is set to the VPC’s main route table) by default, so no action there is needed. However, we do need to make another change to the public subnets. Select one, and then from the same ““Actions▼” button, select “Modify auto-assign IP settings”. Enable Auto-Assign IP Addresses Make sure the box labeled “Enable auto-assign public IPv4 address” is checked, and hit the button, “Save”. Repeat this for the remaining three public subnets. Create an Elastic IP Address We’re going to need an IP address in a minute. Fortunately, AWS will let you reserve an IPv4 address and then associate it with various cloud services. We do this with their Elastic IP addresses. Let’s go ahead and create that now. First, head to the EC2 service panel. From there, select “Elastic IPs”, which can be found under the “Network & Security” menu on the left sidebar menu. The EC2 Dashboard From here, click on the orange button in the top right labeled, “Allocate Elastic IP address”. Creating an Elastic IP Address There’s not much to change on this page. Ensure that VPC is checked for the Scope, and then click on “Allocate”. A Good Elastic IP Address If all goes well, you’ll see the screen above. Write this IP address down so you have it handy for later. We’re going to use it a few steps from now. Create an Internet Gateway Now, we need to connect the piece that will connect our VPC to the outside world. This piece is called an Internet Gateway. To do this, head back to the VPC dashboard. From here, click on the “Internet Gateways” menu option under the “Virtual Private Cloud” menu on the left-hand side bar. The VPC Dashboard Click on the orange button labeled, “Create internet gateway” at the top right of the screen. We’re going to give it a “Name tag”, even though it’s not required, and then again hit the orange button labeled, “Create internet gateway”, this time at the bottom right of the screen. Creating an Internet Gateway We want to associate this with our VPC, so go ahead and click the grey button in the green bar at the top labeled, “Attach to a VPC”. Attaching the Gateway to a VPC From here, pick the VPC that you created in the previous steps and hit the button “Attach internet gateway”. Now we need to attach it to our main route table. From the left sidebar menu, select the menu option, “Route Tables”. Choose the main route table (the one that doesn’t have the private subnets directly associated with it), and click on the “Routes” tab. From here, click on the button labeled, “Edit routes”. Getting Ready to Edit a Route On the resulting screen, click on the button, “Add route”. Set the “Destination” field to 0.0.0.0/0. For the “Target”, from the dropdown that shows up, select “Internet Gateway”. Then, choose the internet gateway that we just created. It should auto-suggest it. Finally, click on the blue button labeled, “Save routes”. Add a New Target Create a Network Address Translation (NAT) Gateway Now we need to do something similar with a NAT gateway. From the main VPC dashboard, choose the menu option, “NAT Gateways” under the menu titled, “Virtual Private Cloud”, on the left sidebar menu. Select NAT Gateways from the VPC Dashboard From here, choose the big orange “Create NAT gateway” button in the top right corner. This should take you to the settings page for the gateway. Choose a name you can remember. For the “Subnet”, choose one of the public ones that was created earlier from the dropdown list. Finally, for the “Elastic IP allocation ID” field, select the IP address that we just created from the dropdown. When these have all been chosen, click on the orange button labeled, “Create NAT gateway” at the bottom right of the screen. Creating a NAT Gateway This might take awhile to fully come up and be listed as “Available”, but when it does, verify that the Elastic IP address is actually associated with the NAT gateway. From here, we’re going to attach this gateway to the route table we created previously that has the private subnets associated with it. Click on the “Route Tables” link under the menu titled, “Virtual Private Cloud” on the left sidebar menu. Choose the route table associated with the private subnets, and then click on the “Routes” tab near the bottom of the page. Choose the Route Table to Edit From here, click on the button labeled “Edit routes”, and then “Add route” on the resulting page. For the “Destination”, enter 0.0.0.0/0, and for the “Target”, choose “NAT Gateway”, followed by the NAT gateway that we just created (it should auto-suggest it for you). Finally, hit, “Save routes”. Create Identity and Access Management (IAM) Policies Before we can proceed with creating the main Elastic Beanstalk server, we need to create some security policies that will be used to regulate what resources and get access to others and to what extent. The AWS IAM service is Amazon's answer to managing security issues related to access management and authorization across their various cloud services. In our use case, we will need to create two polices. These will be assigned to a roll that will allow Elastic Beanstalk have the access it needs to both DynamoDB and CloudWatch. To create an IAM policy, go to the main IAM Role dashboard. The IAM Dashboard Click on “Policies” from the left side menu under the title, “Access management”. On the screen that’s displayed, hit the blue button at the top left labeled, “Create policy”. Because we’re going to just copy and paste a policy, we select the JSON tab. In the text are, copy and paste the following: { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "dynamodb:*", "Resource": "*" } ] } This policy will give broad access to DynamoDB. When this is done, click on “Review Policy” in the bottom right. Give it a name that you will remember and then click, “Create Policy”. Creating the DynamoDB IAM Policy We need to go through that process one more time, but this time we will be providing access to CloudWatch, which will allow us to set up alarms for server resource usage limits. This time, the policy to copy and paste will be: { "Version": "2012-10-17", "Statement": [ { "Action": [ "cloudwatch:PutMetricData", "ec2:DescribeTags" ], "Effect": "Allow", "Resource": [ "*" ] } ] } Again, review it, name it, and hit the button labeled, “Create policy”. Creating the CloudWatch IAM Policy Create Identity and Access Management (IAM) Roles Now we will create the IAM role that will have the policies attached. This role will be assigned to our Elastic Beanstalk instance. From the main IAM Role dashboard, and click “Roles”. On the screen that’s displayed, hit “Create role”. The IAM Roles Dashboard Select “EC2” under common use cases, and then click “Next: Permissions”. Creating an IAM Role Search for and select the two policies that were previously created and hit “Next: Tags”. Attach IAM Policies to the Role We don’t care about tags, so hit “Next: Review”. On the next screen, give the role a name, and a description if you like, then hit “Create role”. Review the Role Settings Create an EC2 Key Pair Our last step before creating the Elastic Beanstalk server is to create an EC2 key pair. To do so, first head to the main EC2 dashboard. Under the “Network and Security” menu on the left side bar, choose “Key Pairs”.  Hit the orange button labeled, “Create key pair”. The Key Pair Dashboard in EC2 Give it a name, and then hit “Create key pair”. Creating the Key Pair It will automatically download the keypair for you. It’s worth saving, though we won’t require it during the set up process. Set Up Elastic Beanstalk Finally, we’re ready to actually create our server. Head to the main Elastic Beanstalk dashboard, and set up a new application by clicking on the button labeled “Create a new environment” at the top right of the screen. The Elastic Beanstalk Dashboard Leave it selected as a “Web server environment” and click on the button, “Select”. From the next page, provide an “Application name”. The fields under the “Environment section will automatically populate, but feel free to change the name if you like. Creating an Elastic Beanstalk Environment Under the section labeled, “Platform”, leave “Managed platform” selected. For the Platform field, select “Node.js”. For the “Platform branch”, select “Node.js running on 64bit Amazon Linux”. Set “Platform version” to “4.7.0”, and for the “Node.js version”, choose 10.13.0. Under the section labeled, “Application Code”, select “Upload your code” and choose the .zip file that contains the Discover server application. Setting the Application Code When the file has successfully uploaded, select the button labeled, “Configure more options” at the bottom. Additional Configuration Options "Software" Settings Open up the “Software” tab with the “Edit” button. Set the “Node command” to npm start. At the bottom under Environment properties, add the following: Environment Software Settings NameValueDISCOVER_DB`{"Ref": "dynamodbtable"}`SNS_ERROR_TOPIC`{"Ref": "errortopic"}` When these values are set, hit “Save”. "Capacity" Settings In the section labeled “Auto Scaling Group”, set the “Environment type” to “Load balanced”, the “Max instances” to 4, and the “Instance type” to at least an m4.large. When these are set, hit “Save”. Environment Capacity Settings "Security" Settings Under the card labeled, “Security”, hit the “Edit” button. Select the “EC2 key pair” that you created earlier, and the “IAM instance profile”, and then hit “Save”. Environment Security Settings "Network" Settings Under the card labeled, “Network”, hit the “Edit” button. Environment Network Settings Select the VPC we created above. For “Load balancer subnets”, choose the public subnets. For “Instance settings”, choose the private subnets. Then hit the button labeled, “Save”. Designating Subnets Create the Environment When all of these settings have been set, hit the button labeled, “Create environment”. This process will take up to several minutes, though you should see the log messages show up as the server is started and the application is run. Spinning Up the Environment Eventually you will be redirected to the environment’s dashboard. The Environment's Dashboard Testing Your Discover Server To test whether the application is up and running correctly, click on the link listed underneath the environment name. It will open another tab (probably provide you with a security warning due to self signed certificates), and then take you to the discover server landing page. The Discover Server Wrapping Up We're more than happy to provide the official NetBurner Discover Server for you to easily find your NetBurner devices on your network. That said, we understand that there will be circumstances where you'd rather have more control with regard to what servers your devices are communicating with, what the service looks like, and what information is passed between them. To help with this, we provide the Discover Server code freely to our customers and have outlined how to get it up and running with AWS. If you're interested in spinning up your own copy of the Discover Server, feel free to reach out to us at sales@netburner.com. We're always happy to hear from our customers, and would love to talk with you about the potential benefits that come with having your very own cloud based platform that can track and help manage your NetBurner devices. If you have any questions or thoughts, please feel to leave them in the comments below, or email using the address listed above. ### How to Connect Your Embedded System to Azure IoT Hub with MQTT This is the first article in a two part series that will cover how to use our embedded systems to connect to Microsoft’s Azure IoT Hub service and send messages using the MQTT protocol. We’ll also review how to connect your IoT Hub with other services, so that you can verify your messages are getting sent and received properly. This example was built using our latest system on module, the MODM7AE70, but will also work with the MOD5441X, the NANO54415, and the SB800EX. IoT Dev Kit Featured in this Article View Product Page Or, learn more about NetBurner IoT. In this article, we’ll first walk through what you need to have in order to follow along, and review any assumptions we will make during the course of the article. Then we will briefly review what the test application will actually be using to connect to the Azure IoT Hub service. Next, we’ll walk through each of the other Azure services that will be used in the course of the project, discuss the role of each, and cover how to set them up. With that under our belt, we’ll cover how to compile and load the application on our module. Finally, we’ll talk about how to verify that the messages are getting properly sent and received from the device to the Azure services. The application that will be running on the MODM7AE70 is very simple. It will initialize a connection to the service, and then when a connection is successful, it will begin to send messages periodically. While we will be using the test application that we’ve developed for this example, we’ll hold off on diving into the code for our next article. Prerequisites and Assumptions This project was built using our latest toolset, NNDK 3.x. As mentioned previously, it was tested and run using the MODM7AE70, but should also work for the MOD5441X, the NANO54415, and the SB800EX. While it’s possible to port this application back to earlier versions of our toolset, we haven’t personally done this. This article will assume that you have downloaded and installed the latest version of our tools, and that you have a module that is up and running, and that is visible on your network. You can verify this by pointing your browser to discover.netburner.com if you are connected to an outside network. For information on getting started with the module right out of the box, please see our Quick Start Guides. This example also requires access to Microsoft Azure services, so a network connection is required to run the example application. This example application is hosted on GitHub and can be downloaded here. Whether you clone the repo or just download the application as a .zip file, you should end up with a folder containing two subfolders: src and html. These directories contain the source code for the example. The parent directory, AzureExample, will be the root folder for our application, and will be used as a reference point for the rest of the article. It’s extremely helpful to be able to monitor serial output as the device connects to the Azure Iot Hub and starts sending messages. The development boards are set to use the USB port for both power as well as to send and receive this debug serial data by default. You can also use UART0 to send out this debug information, which is a DB9 serial port on the MOD-DEV-70CR development board. If you don’t have a corresponding serial port on your computer to make that connection (and it’s not that common to have these days) but would like to use the DB9 port, we recommend getting a USB to DB9 serial adapter to get the job done for you. A Quick Review of the Example Application To keep things as easy as possible for this example, we made the application extremely simple. It will initiate a connection to the Azure IoT Hub we create, and upon a successful connection, will begin to send MQTT packets every 5 seconds. These packets contain a timestamp as well as an incrementing ID. We don’t dive too much into the code in this article outside of building the project and loading the application onto the MODM7AE70. We’ll save those juicy details for the follow-up article. Azure Services Overview There are a few key Azure services that we will need to use in order to get this project off the ground. Keep in mind that any real world application will likely involve many other services as well, since all we’re doing here is receiving the message and sending it to an Event Hub. From here, you’ll likely want to route it to another service so that the data can be properly processed and distributed to your needs. Azure Subscription This is how billing is managed for the services and resources that are used. It provides a way to logically group these together for management purposes. We don’t really do too much with this except to create it and assign all of the other instances of our services to it. Azure Resource Group This is a container that holds all of the resources used for an Azure solution. All of the instances of the services we use will belong to the same resource group. Azure IoT Hub This is the Azure service that our module will actually connect to. Events Hub The Event Hub service processes events that are triggered from other services. This service allows the collection and storage of events from many devices, and can make the processed information from those events available to other services. Event Grid System Topic Azure’s Event Grid is an event management system that can provide different Azure services and applications access to events. It will let you create event subscriptions that resources can subscribe to. When these specific events take place, they will be forwarded to all of the subscribed resources. A system topic in the Event Grid represents a specific subset of events that can be defined by you. In our case, this event will be the MQTT packet being received from the device on the Azure IoT Hub service. Putting the Pieces Together So now we know which services will be involved. Let’s take a minute to figure out how they are all tied together. Our IoT Application Setup with Azure We can see from the image above that the Subscription and the Resource Group just contain all of the other services and don’t participate directly in the application. The NetBurner module will connect to the Azure IoT Hub instance through the SDK, and will be registered as an IoT Device within the IoT Hub. Packets sent from the NetBurner module will be received in the IoT Hub through the connection with the IoT Device. This will register as an event that is then pushed to the Event Grid System Topic. The Event Grid System Topic will then look at any services or applications that are subscribed to that specific event through an Event Subscription. Those services and applications that are will have the event pushed to them. In our case, we will subscribe an Event Hub Instance to any event from our IoT Hub, which will cause it to receive corresponding events from the Event Subscription. Setup Now that we’ve reviewed the purpose of these services and seen how they relate to one another, let’s step through the process of actually setting all of this up. The very first step will be to point your favorite browser over to the Microsoft Azure web portal and sign in. You’ll need a Microsoft account to do this. If for some reason you’ve been able to get through the last three decades without doing this already, well, our hats are off to you. Today, however, will be the day. Fortunately, it’s free to set up. When you first log in, you should see a screen similar to the following (though if you’re logging in for the first time, you’ll likely also see some other notices as well): Figure 1: The Azure Dashboard The first thing we’ll address are the two overarching services that will tie all of the others together. To do this, we’ll create our subscription as well as a resource group. Creating a Subscription To create a subscription, click on the “Subscriptions” link found underneath the Navigate menu, as shown in Figure 1. This will take you to the main Subscription panel. From here, we’re going to hit the “+ Add” button, shown in Figure 2. Figure 2: The Azure Subscription Dashboard If this is your first time setting up a subscription, you’ll be asked to select an offer for your subscription. At the time of this writing, the offers are “Free Trial” and “Pay-As-You-Go”. Since this is just an example application (and because we didn’t just fall off the back of a turnip truck yesterday), we chose “Free Trial”. This gives you access to all of the services and $200.00 in credits within a 30 day period time period. To do this, click the “Select Offer” button, as shown in Figure 3. Figure 3: Setting Up Your Subscription At this point, you’ll be redirected to officially sign up for Azure. They’ll ask you for some personal information, as well as a credit card to save for your account. This is shown below in Figure 4, but it’s all pretty standard stuff for cloud service providers. Figure 4: Creating an Azure Account After you've finished this form and submitted it, you’ll be taken to the “Quickstart Center”. There’s a lot of really interesting tutorials and guides here that are worth looking at. However, we’re on a mission, so feel free to close this tab, and the tab showing the “Offers”, and return back to our main Subscription panel, as shown above in Figure 2. You might have to give the system time to propagate your request, but eventually you should see your new subscription displayed. When we did this, it was given the creative name, Azure subscription 1, as shown in Figure 5. Figure 5: Azure Subscription Success! As we mentioned before, we’re not really going to interact much with this subscription, other than to have other instances of services assigned to it. So, without further adieu, let’s move on to creating those other instances, starting with a Resource Group. Creating a Resource Group From our home panel, let’s hit the “Resource Groups” button, listed under the title, “Navigate”, as shown in Figure 2. The first time you come to this panel, you’ll see a few menu options, and a message in the middle of the screen telling you that you don’t have any resource groups. Let’s fix that now by hitting the blue button in the middle of the screen labeled, “Create resource group” as shown in Figure 6. Alternatively, you could hit the “+ Add” button, which is what you’ll have to do in the future. Figure 6: Creating a Resource Group This will take you to a screen where you’ll need to assign a subscription for your resource group, which is already pre-filled with our current subscription, and provide a name. For this, we will go with nb-resource-group. Creative, we know. We’re not going to use tags in this example, so once we’ve provided a name, we’ll hit the “Review + create” button located in the bottom left, as shown in Figure 7. Figure 7: Resource Group Settings The next screen just shows us a review of what we’ve chosen. Go ahead and hit the “Create” button labeled in the bottom left, as shown in Figure 8. Figure 8: Review Your Resource Group Settings When that’s completed, you will be taken back to the Resource Group panel, where you should see your newly created group listed, as shown in Figure 9. Let’s navigate back to the main panel, where we’ll start to create instances of some of the more meaningful services, such as the IoT Hub. Figure 9: Your Newly Created Resource Group Creating an IoT Hub You might notice that unlike the Subscriptions and the Resource Group buttons, there’s nothing to be found for the IoT Hub service under the main “Navigate” header. Never fear, however. We won’t be that easily dissuaded. Up near the top, you’ll find a search bar. Type in “IoT Hub”, and click on the resulting service listed with the same name, as shown in Figure 10. Figure 10: Navigate to Azure's IoT Hub Service If the next screen you see gives you dejavu, don’t worry. It looks a lot like the Resource Group screen from above, down to the big blue button in the middle, but rest assured, you’re on the right page. Let’s move forward by clicking on that blue button labeled, “Create IoT hub”, now, as shown in Figure 11. Figure 11: Add a New IoT Hub Creating an IoT Hub is a little more interesting than the subscription and the resource group was. We’ll step through the IoT Hub creation wizard, first selecting the Resource Group we just created above, and giving our IoT Hub instance the clever name of nb-test-hub, as shown in Figure 12. Figure 12: IoT Hub Settings We’re not really going to change anything on the Networking page. Just make sure that your “Connectivity method” is set to “Public endpoint (all networks)”, as shown in Figure 13. Please note that we’re choosing this for the sake of simplicity. In a real application, you’ll want to review this and pick an option that provides the best level of security for your application’s requirements. Once we’ve made sure our settings are correct for this example, hit the button labeled, “Next: Size and Scale”. Figure 13: Make the IoT Hub Public This screen lets you pick a scale tier, which will dictate how many messages per day you’re able to send. Since this is an example, we’ll be choosing, “F1: Free tier”, which, interestingly enough is not the default option. Once you’ve made your choice, we’re again going to bypass the tag selection, so go ahead and hit the button labeled “Review + create” down in the bottom left corner, as shown in Figure 14. Figure 14: Select the IoT Hub Pricing Tier This will take us to a screen where we get one last chance to review our Azure IoT Hub instance. Once you’re satisfied with the choices, go ahead and hit the “Create” button. This should take you directly to your newly created IoT Hub’s overview page with a message that will eventually tell you your deployment is complete, as in Figure 15 below. From here, we’re going to hit the button labeled, “Go to resource”. Figure 15: Return to the IoT Hub Dashboard This will take us to the main Azure IoT Hub instance panel, as shown in Figure 16. At this point, we’re going to scroll down the left side and hit the button labeled, “IoT devices”, which can be found under the “Explorers” heading. Figure 16: Head to Azure's IoT Devices Dashboard Doing this will take you to the “IoT Devices” page. Here, we’re going to go ahead and add an entry for the MODM7AE70 module we’ll be using to send our MQTT packets. To get started, hit the “+ New” button near the top of the page, as shown in Figure 17. Figure 17: Create a New Azure IoT Device This will bring us to the “Create a device” wizard. As with most of the other screens so far, we’re really only going to modify one thing, and that’s the Device ID. We’ll set this to “nb-test-device” (you’re probably noticing a theme at this point). The rest of the fields we’ll leave as is, but let’s point out that we’re going to use the symmetric key authentication type. This is the most straightforward to use and is a good choice for this example. In your production deployments, you might consider using a X.509 certificate instead for the added security. We’re also going to make sure that the device is able to connect to the Azure IoT Hub service by leaving that option enabled. Your wizard should look similar to ours, as shown below in Figure 18. When it does, go ahead and hit the “Save” button in the bottom left. Figure 18: IoT Device Settings This should take us back to the IoT Devices page shown above, except this time we’ll see our newly created device listed in the main window. Now’s a great time to go ahead and grab the connection string we’re going to need to allow our device to connect. To get this, you’re going to need to click on the device name itself, as shown in Figure 19. Figure 19: IoT Devices Listed This will take us to the specific device page. Here you’ll see several fields associated with the device. Specifically, we’re looking for one labeled, “Primary Connection String”. We’re going to hit the copy button, which looks like two pieces of paper overlapping, on the far right of the field and then paste this directly into our application. This string will look like a series of dots to keep it hidden (just like every other field on the page), but we’ve made it visible in Figure 20 so that you can see how it’s composed. Figure 20: The Unruly Connection String When you’ve copied this string, open the file src\post-record-data.cpp from the code base. In this file, you’ll find the variable connectionString defined at the top of the file. Replace the value of this string with what we’ve copied from the primary connection string so that it looks something like the following: const char connectionString[] = "HostName=nb-test-hub.azure-devices.net;DeviceId=nb-test-device;SharedAccessKey=VYdga4kR7fRsjpWXEioK7CbCDv5whU+Bb7GnvpJewDw="; With that, we’re ready to move on to creating our next service instance, the Event Hub. Creating an Event Hub To create an Event Hub, we’ll need to navigate back to the main Azure Services window. Once again, the service we’re looking for is nowhere to be found, so we will need to search for it. In the search bar at the top, type in the magic words, “event hub”, and select the option that’s displayed in the results, as shown in Figure 21. Figure 21: Navigate to Event Hubs Clicking on this will take us to the main Event Hubs panel. Of course, we won’t see anything listed here, but we will find another big blue button to click near the bottom middle of the screen labeled, “Create event hubs namespace”. Let’s go ahead and do that now. This will take us to the Event Hub creation wizard, as we see in Figure 22. Figure 22: Event Hub Namespace Settings Here, we have a couple of fields to change. We’ll start by selecting our previously created resource group. We’ll also determine a name for the  namespace using our patented formula and assign it a value of, “nb-test-namespace”. Finally we’ll pick a pricing tier. Since we’re only using one device, we’ll go with “Basic (1 Consumer group, 100 Brokered connections)”. At the time of this writing, the Features tab lets you select availability options. In this case, we’re fine with the default values. Since we’re also not really interested in setting up any tags, we’re going to go straight to “Review + create” by hitting the blue button at the bottom left. From here, we’ll simply review our choices, and hit the button labeled, “Create” at the bottom left of the screen. This will take us to the newly created event hub’s Overview page. When you first land here, it will say, “Deployment is in progress”, but will eventually tell you that your deployment is complete. When you see this message, click on the button labeled, “Go to resource”, as shown in Figure 23. Figure 23: Return to the Event Hub Dashboard This will take you to your Event Hub Namespace’s main panel. As you might have guessed, having an Event Hub Namespace is not the same as having an actual instance of an Event Hub. From this screen, we’re going to hit the option labeled “+ Event Hub” near the top of the screen, as shown in Figure 24. Figure 24: Create a New Event Hub Here we see another creation wizard, this time for the Event Hub itself. The only field for us to fill out here is the name. By this point, you probably don’t even need me to tell you what we’re going to put, but I will anyway: nb-test-hub. Once you’ve come up with your own original name, hit the “Create” button at the bottom left of the screen, as shown in Figure 25. Figure 25: Event Hub Settings This should return us back to the Event Hub Namespace page. If we scroll down to the bottom, we’ll see the Event Hub that we just created listed at the bottom of the screen. Just for the sake of completeness, we show this in Figure 26. Figure 26: The Newly Created Event Hub Now that our Event Hub is all set up, it’s time to create the piece that will actually send it the messages from our Azure IoT Hub. This piece is the Event Grid System Topic. Creating an Event Grid System Topic It’s time to make our way back to the main screen, and again search for a service in the search bar at the top of the page. This time, type in event grid system topic. This should bring up the Event Grid System Topics service, as shown in Figure 27. Figure 27: Navigating to Event Grid System Topics Clicking on this will bring us to the all page that looks all too familiar. There’s something to be said for consistency, right? By now you probably know what to do, but just in case, go ahead and click on that button labeled, “Create Event Grid system topics”. This will bring you to the screen show in Figure 28. You’ll notice that we have several things to select. We’re going to set the Topic Type to “Azure IoT Hub Accounts”, since this is where the events will be generated from. Fortunately, from here it’s pretty easy since there’s only one option for everything. We’ll go ahead and set the name as nb-test-topic. Like before, we’re going to pass on using tags, so from here we’ll just hit the “Review + create” button at the bottom left of the screen. Figure 28: Event Grid System Topic Settings This should take you to a page where you can review the Event Grid System Topic. When you’re satisfied with your choices, hit the blue “Create” button found in the bottom left. This will take us to the topic’s Overview page, where we will eventually see the message, “Your deployment is complete”. Let’s go ahead and hit the button labeled, “Go to resource”, as shown in Figure 29. Figure 29: Return to the Event Grid System Topic Here we see the main Event Grid System Topic panel. Finally, we need to create an Event Subscription that will trigger whenever our IoT Hub receives a message. To do this, hit the “+ Event Subscription” tab, as shown in Figure 30. Figure 30: Create an Event Subscription This brings us to the Create Event Subscription panel, which is a little more interesting than some of the others we’ve used thus far. We’ll start by providing a name, which will of course be nb-test-sub. We’ll leave the Event Schema set to its default value of, “Event Grid Schema”. Under the Event Types header, select the dropdown input labeled “Filter to Event Types” and make sure that “Device Telemetry” is selected. It should now say, “5 selected”. Under Endpoint Details, select the Endpoint Type of “Event Hubs”. This should open a menu on the right side that will let you choose the subscription, resource group, event hub namespace, and event hub that we created in the previous steps. When you’ve filled this out, hit the “Confirm Selection” button, followed by the “Create” button. The fields and their values are shown in Figure 31. Figure 31: Event Subscription Settings Once the subscription is created, we should see it in the list located at the bottom of the main Event Grid System Topic page, as shown in Figure 32. Figure 32: The Newly Created Event Subscription We now have all of the pieces in place that will be needed for our example application. Let’s move away from Azure for a moment to look at how to build and load the application onto our MODM7AE70. From there we’ll be able to test the connection and ensure we didn’t miss anything during our setup. Modifying, Building and Loading the Application With our Azure services up and running, it is time to turn our attention on getting the application built and loaded onto our MODM7AE70 module. The first thing that we’ll need to do is to get the example code. This can be found from NetBurner’s GitHub repo, here. You can either download it as a .zip file, or clone it to your machine. We’ll then use it to create a project in NetBurner’s custom IDE, NBEclipse. After we have it building, we’ll need to load the application to our device and make sure that it’s getting properly updated. Make a Project in NBEclipse To create a project in NBEclipse, first launch the program, which can be found in \NBEclipse. When you first launch it, you will be prompted to pick a workspace directory. This can be anywhere you like, and will be the location where your project files and source code are stored. We have detailed information on creating projects in NBEclipse that can be found here. However, we’ll go ahead and cover the basics to get you started on the right foot. To create a project, we’ll be using the Project Wizard. You can access this by going to File->New->Project, as shown in Figure 33. Figure 33: Creating a New Project This will open the wizard. The first thing it will ask you to choose is the wizard that you’d like to use. For this example, we will choose the “NetBurner Project”, as shown in figure 34. Figure 34: Select "NetBurner Project" The next screen will give us a few options to set, but the only thing we’re actually going to change will be the name. Sticking to our creative streak, we’re going to go with AzureExample. Figure 35: Assigning a Project Name You can click next, and then next again, leaving both the “Debug” and “Release” options checked. This will bring you to where you can select which module you’ll want to use. If you’ve installed your tools for multiple platforms, make sure to select MODM7AE70. Then, if you know your device’s IP address, you can type it in the appropriate field. Alternatively, you can hit the button labeled, “Search”, and pick it out of the list. Figure 36: Wrapping Up Project Creation If you’re not sure what your device’s IP address is and it’s not currently on the network you can just pass by this for now and add it later. If we were going to add any of the default initialization or components for our application, we would move on to the next screen. However, since we’re going to be importing an entire example, we can go ahead and hit the “Finish” button. The first thing you might notice is that the application tries to build right away. Of course it’s going to fail, seeing as how we don’t have any code yet. Let’s fix that now by importing our example code into our project. We can do this by right clicking on the project, and selecting “Import” from the options listed. This should display the window shown in the following image. Figure 37: Import Example Code Select “File System” here and then click, “Next”. This should bring up the following window. Figure 38: Import Code from the File System Click on the “Browse” button and select the folder that contains the source code. Make sure all of the files are included, and then hit the “Finish” button. You might be thinking that that’s all we need to do. Unfortunately, that’s not quite the case. Because we’re using Azure’s SDK, we need to make some additions to the directories that are included during compilation. Fortunately, this is pretty easy to do. Once again, you’re going to right click on your project, and select the last menu option that shows up, “Properties”. From the Properties window that is displayed, click on "C/C++ Build"->"Settings". This will change the inner window to that shown below. Figure 39: Include Required Azure SDK Libraries From the menu on the left side in this inner window select “GNU Compiler”->”Includes”. You’ll need to add the following entries to the “Include Paths” using the paper icon with the green plus sign on it: "${workspace_loc:/${ProjName}/src/azure-sdk/c-utility/inc}" "${workspace_loc:/${ProjName}/src/azure-sdk/iothub_client/inc}" "${workspace_loc:/${ProjName}/src/azure-sdk/deps/umock-c/inc}" "${workspace_loc:/${ProjName}/src/azure-sdk/deps/azure-macro-utils-c/inc}" "${workspace_loc:/${ProjName}/src/azure-sdk/deps/parson}" "${workspace_loc:/${ProjName}/src/azure-sdk/umqtt/inc}" "${workspace_loc:/${ProjName}/src/azure-sdk/c-utility/pal/generic}" "${workspace_loc:/${ProjName}/src/azure-sdk/uamqp/inc}" "${workspace_loc:/${ProjName}/src}" Now, do the same for the Include Paths listed in “GNU C++ Compiler”->”Includes”. With these set, your application should finally build correctly. If you didn’t do it above, there’s one last change that we need to make, which was mentioned previously. That’s to set the proper value to the variable connectionString. If you still need to do this, go ahead and do it now. This variable is located in src\post-record-data.cpp. You’ll know you’re build was successful if you see the following in the console window: Figure 40: Verify a Successful Build At long last, we’re ready to load our application. Load the Application If you already set the IP address during the project creation wizard, you will be able to load your application to your module by hitting the Run button in the upper right corner of NBEclipse. Figure 41: The Run Button If you didn’t set the IP address or you need to change it for some reason, you can set a new IP address for your project by right clicking on it, then selecting “Properties”. From the Properties window, choose “NetBurner Options”, and then set the IP address in the corresponding field, as shown below. Figure 42: NetBurner Project Options Once this project starts running, it will automatically try to connect to the service, which brings us to... Testing Now comes everyone’s favorite part… as long as it works. As we mentioned above, once your application is successfully loaded and the device boots, you’ll see it start to try and connect. If it’s able to, it will start printing out publishing messages. It should look something like this: Figure 43: Successful Connection on the NetBurner This will repeat over indefinitely, sending a new message every five seconds. To verify that our messages are getting received and properly transmitted, it’s time to head back to the Azure Portal and see if we notice anything coming in. To test the overall input, we’ll head straight to the Events Hub Instance that we created, nb-test-hub. This is located in the Events Hubs Namespace that we created, nb-test-namespace. From the main panel for nb-test-hub, scroll down until you see three graphs labeled “Requests”, “Message”, and “Throughput”. If the device is connected and the messages are getting routed properly, you will start to see data coming in on these graphs, and they will no longer be blank. If you don’t see anything right away, don’t panic. It can take a few minutes for this to start to reflect changes. Congratulations! You made it! Figure 44: Message Traffic Showing Up in the Event Hub Where to go from here? Well, that’s really up to you! There are a wealth of services that Azure provides which can retrieve this data and process it however you see fit. These services (and how to use them) are a bit beyond the scope of this tutorial, however. From here, we would suggest taking some time to review the extensive Azure documentation and see how its services can best be applied to your specific use case. Wrapping Up We hope you’ve found this tutorial useful. Stay tuned for the second article in the series, where we dig into the code running on the MODM7AE70, and show how you can modify it to fit your needs. We’ll also explore how to troubleshoot any issues that might have come up while trying to get everything running. If you’ve been able to use this tutorial in your project, please let us know! We love hearing how our devices are used in the real world, and would love to hear more about what you’re building. As always, if you have any thoughts or questions, please feel free to leave them below in the comments section. If you’d rather reach out to us directly, you email us at sales@netburner.com and we’ll be sure to respond to your request as quickly as possible. ### TLS 1.3: Faster, Simpler, More Secure "As consumers we get more demanding all the time. We want better quality. We want it faster. And cheaper. Plus, we want more choices. Whoever comes along that can satisfy all these 'wants' gets our business."- Price Pritchett Send Your Serial Data Securely SB800EX-JDDW-IR View Product Page Or, learn more about NetBurner Serial To Ethernet. Project management triangle – Pick any two: good, fast and cheap There’s an old joke passed around among technical employees… Perhaps you’ve heard it? Engineers in the trenches often appeal to the following formula, or to something like it, as a way of pushing back against unreasonable demands from management: “Sure thing, Boss. We can get your project done really fast, improve product quality, and get the whole job done for a lot less money. And, guess what? You get to pick any two.Which two would you like?” Introducing TLS 1.3 For years here at NetBurner, we’ve been talking about and offering Transport Layer Security (TLS), the successor to SSL (Secure Sockets Layer). In fact, we’ve written several articles on it. (If you’d like to review TLS basics, check out "Cover Your Data Assets with TLS"). You may also recall “Getting Back On The Horse” from a few months ago, our introduction to TLS session resumption. In that Learn Blog, we explained how TLS 1.2 facilitates reestablishing a connection between network devices that have been idle for a while without having to go through the entire security handshake all over again. In today's Learn Blog, we’re going to take a look at TLS 1.3, the latest version of the protocol. TLS 1.3 is an internet standard five years in the making. On August 10th, 2018, and accompanied by a certain amount of fanfare, the Internet Engineering Task Force (IETF)—the standards body that defines internet protocols—published the TLS 1.3 specification. You know that faster/better/cheaper joke? Surprisingly, if you substitute ‘simpler’ for ‘cheaper’ and ‘more secure’ for ‘higher quality’ in the above formula, TLS 1.3 offers a full triple advantage over TLS 1.2. TLS 1.3 For A Three-Way Improvement Over TLS 1.2 Today we’ll dive right into TLS 1.3, the relatively new kid on the block (defined in RFC 8466). We aren’t going to do a deep dive, but if you really can’t live without getting down into some nitty-gritty details, you can check out this article. Instead, well give you an overview by doing a straight-up comparison between TLS 1.3 and its predecessor, TLS 1.2 (defined in RFC 5246) which has been the security standard for almost a decade. TLS 1.3 Is Faster Who wouldn’t want faster? Faster is good. We like faster. But how does TLS 1.3 get there? One of the improvements that makes TLS 1.3 faster than TLS 1.2 is the way the initial handshake has been shortened. As illustrated in the diagram below, three exchanges between client and server—each typically 34 milliseconds long—have been removed from the connection protocol. This results in an average total time savings of over 100 milliseconds every time a connection is established. A side-by-side comparison. Source and Source But wait, there’s more! When a session is resumed, TLS 1.3 offers another time-saving feature called Zero Round Trip Time (0-RTT). What is 0-RTT? When you resume a session with a site you’ve previously visited, you can include data in the very first message sent to the server. This eliminates the need for a preliminary handshake. The time saving benefits should be obvious! TLS 1.3 Is Simpler Cutting down on the number of steps required for a TLS handshake, as we have just seen, has the pleasant side effect of simplifying the TLS protocol. Less protocol steps mean less code to implement, archive, and maintain, and less things to go wrong, misunderstand, and misconfigure. Besides a simplified handshake, more than a dozen crypto algorithms that were in TLS 1.2 have been stripped out of TLS 1.3. Weaker elliptic curves and hash functions have been removed, including: SHA-1RC4DES3DESAES-CBCMD5Some weaker Diffie-Hellman groupsIntentionally weakened export-grade ciphers Getting rid of this excess crypto-baggage streamlines LS 1.3 considerably and makes it more robust. TLS 1.3 Is More Secure At this point, you may be wondering why the above mentioned crypto algorithms were removed. Doesn’t having fewer options make a system less capable? Sometimes less is more. Over the lifetime of TLS 1.2, clever hackers have discovered vulnerabilities in many of the cryptographic algorithms embedded in TLS 1.2, or in the way the algorithms were being used within the TLS protocol. If you're curious, you can read about a couple of these attack vectors in this interesting article about Logjam and FREAK. As each of these kinds of flaws were discovered, white-hat hackers developed workarounds and patches as a means of mitigating the security holes. However, though successful, all too often these workarounds turned out to be confusing, and consequently, much too easily misconfigured. The simple solution—applied in TLS 1.3—was to remove all the at-risk crypto algorithms. As for any loss of capability, just think about it. Don’t you want to use the best available, most secure cryptographic options anyway? And The Winner Is… By now, the winner should be obvious: TLS 1.3 But does this mean the evolution of Transport Layer Security is over with and done? Of course not. Though it is now about two years since its formal introduction, TLS 1.3 is just beginning to come into widespread use. There are already some criticisms and concerns which are beyond the scope of this article. But hackers will no doubt continue to hack, and the white hats will surely continue to patch TLS and develop workarounds as each new threat arises. Should You Be Worried About Using TLS 1.2? Not really. As we mentioned above, the security issues in TLS 1.2 have been addressed by various workarounds and configuration measures. And more help is on the way... What’s Up With NetBurner and TLS 1.3? At the moment, NetBurner still only delivers and supports TLS 1.2. However, that is about to change. Although we’re not quite ready to pin down a precise release date, we are excited to share the news that version 1.3 is already up and running in-house, and we will soon be making TLS 1.3 available to our customers. And, as you know, we’ve already got you covered with a broad and capable assortment of ready-to-rock solutions. For an enjoyable virtual shopping trip for development kits, NTP servers, and a variety of serial to Ethernet servers, check out the products and solutions on the NetBurner website. You’ll find development kits for everything we sell, making it easy for your engineering team to fold our latest technology into your cutting edge project. NetBurner support is second to none, available by phone or by email. We’d love nothing more than to hear from you today! Feel free to leave a comment below, or email us directly at sales@netburner.com. ### Optimizing TCP Configurations: Throughput vs Response Speeds There are two competing configurations when it comes to a TCP connection: large data throughput, and fast interactive response time. Large data throughput settings maximize the amount of data sent in each packet, while fast interactive response time settings send packets as soon as data is available, even if it is only a single byte of information. The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. The default settings for TCP on your NetBurner platform configure the connection as a “medium” setting, providing good data throughput as well as fairly fast response time, which is fine for the vast majority of applications. However, if your application has specific needs in one direction or the other, you can adjust the settings with just a few function calls. It is important to note that TCP sockets are bidirectional, and the adjustments for maximizing transmit and receive are different and independent of each other. Buffers Buffers are a key component in network communications and their setup can be changed to favor throughput or response time. Before we discuss the buffer settings, though, let's take a look at what the buffers are and how they are used. The NetBurner TCP/IP system creates a pool of buffers that are used for network and serial communication. The default number of total buffers is 256. These buffers are used by the network stack to send and receive data. For example, when a network operation needs to send data it requests a buffer, writes the data that it wants to send to the buffer. When it is done with it the buffer is freed back to the pool.  Buffer Usage in a TCP Connection The size of each buffer is 1548  bytes. Subtracting the TCP header and some other options provides 1500 bytes of data payload per buffer. The section of the TCP header that is used to tell the other side of the connection how much receive room we have is 16-bits. This is called the window size, making the maximum window size 65536. Therefore, the maximum number of buffers allocated to a socket should be no more than 65536/1500 = 43. Any more than that will have little or no effect. Note that if an application has a problem which causes all buffers to be in use, the system will be unable to communicate until some are freed up. The number of free buffers can be determined at any time with the GetFreeCount() function in buffers.h. Receive Settings When packets are received by your NetBurner device, they go into the TCP receive system. Each packet has a sequence number associated with it.  Packets that are received in sequence/order are put in a receive buffer.  When your application reads from a TCP socket file descriptor, they are actually reading from the receive buffers associated with the TCP socket. The TCP system also tells the other side of the connection how much unused buffer space is available (window size). Our first adjustable parameter specifies how many buffers the receive system will use to accumulate data for the specified TCP socket: SetSocketRxBuffers(fd, n); Here, fd is the file descriptor of the socket, and n is the number of buffers which can range from the default value of 5, up to 43 as discussed in the TCP Buffers section. Note that throughout this document we will fd to describe the file descriptor for the TCP connection. This is the value returned from functions such as connect() or accept().We mentioned that packets in sequence are put into the receive buffer, but what about packets that are not received in sequence? The underlying IP network can be unpredictable: packets can be lost, received out of order, or even duplicated on the way to their destination by other network equipment. If we are expecting packet number 99 and instead receive packet number 101 what do we do?  The NetBurner TCP stack saves these out of order packets in buffers so the other side does not have to resend them. The question is, how much space should be set aside for these out of order packets? This brings us to our second TCP Receive performance setting: SetOutOfOrderBuffers( fd, max); This setting specifies the maximum number of buffers to allocate to store out of sequence packets. If an out of order packet cannot be stored, the sender will have to retransmit the packet. If you want to maximize receive performance on a lossy network, you may want to set this to a value 1 less than the value used in SetSocketRxBuffers(fd, n);. The default value is 5. Transmit Settings Sending TCP data has additional options to consider. The first decision to make is whether you want to maximize the data throughput or minimize latency. For data throughput, the system is most efficient when it sends full size frames with a 1500 byte payload (maximum size for an Ethernet frame). While this is best for sending bulk data, the consequence is latency for an interactive system, such as a Telnet session, which typically sends just 1 byte of data in a packet. NetBurner provides several individual settings that can be enabled and disabled, depending on your network considerations. These are listed below. TCP Configuration to Minimize latency Disable the NAGLE algorithm so every byte is sent when available: setsockoption(fd, SO_NONAGLE);   Turn on the TCP PUSH flag by clearing SO_NOPUSH. As mentioned earlier, when you write to a TCP socket, you are actually writing to a buffer. This allows for more efficient transfer when sending more than one maximum segment size (MSS). Enabling the PUSH flag tells the system to send the buffer immediately rather than waiting for additional data. clrsockoption(fd, SO_NOPUSH); These settings will reduce the bulk throughput, but ensure the most responsive interactive connection.  The default values are PUSH and NAGLE enabled. TCP Configuration to Maximize Bulk Data Throughput These settings cause the system to send maximum sized packets whenever possible. Enable the NAGLE algorithm so data can accumulate before sending: clrsockoption(fd, SO_NONAGLE);   Disable the PUSH option: setsockoption(fd, SO_NOPUSH); Then either just prior to or just after your last bulk data write, enable the PUSH option: clrsockoption(fd, SO_NOPUSH); Putting It All Together Now let's talk about the path through the system. When you call a write function on a TCP socket, the system writes the data requested into a TX buffer. You should always check the return value of a write function. If the TX buffer has less space than what you requested to write, the write return value will be a number lower than what you requested, and your application will need to handle that and call the write operation enough times to send all your data.Tip: If you do not want to track how much data is sent each time, you can use the writeall() function instead of write(). The downside to using writeall()is that it will take slightly longer for errors to propagate back to you, and your writing task will be asleep or pending until all the data has made it into the TX buffer. This brings us to specifying the number of TX buffers, which controls how much data can be written/buffered:SetSocketTxBuffers(fd, n); Note that n is the number of buffers, not the number of bytes.Once data is in the TX buffer,  the TCP system attempts to send it out to the other side.  Assuming the window on the other side says we are allowed to send a packet, the TCP system takes a packet worth of data off the TX buffer, packages it up, and sends it across the network.  It also keeps a copy of that packet in an unacknowledged buffers list. It will stay on this unacknowledged list until the other side of the TCP connection acknowledges receipt. It will retransmit this buffer automatically if it is lost. Controlling how big this list can get is our next TX tuning parameter: SetSocketUnackBuffers( fd, n); This default is 5. It would not make any sense to make it larger than the maximum window size of 65535, so values from 5 to 43 are appropriate. Real World Examples Lossy Networks Might Consume Substantial Networking Resources We have to remember that out in the real world TCP traffic can get messy. If an application is in an environment where devices get rebooted or power cycled frequently, crashes occur, or it is running on a lossy network (such as a satellite link) in which packets are lost, you may be using more resources than you think. If a TCP socket is left hanging by the client it was connected to, all those buffers will remain allocated until the socket is cleaned up. If a high percentage of packets are lost, it will take more time for retransmission to occur. In general, testing has shown that the maximum bulk data speeds on a LAN can be achieved with 20 buffers. For traffic that is routed over the Internet, a value of 40 provided the best result. Results will vary depending on the amount of network traffic, link speeds, and client response times. Remember, this is only one side of the connection; the other client settings are just as important. The tests mentioned were done on a NetBurner MOD54415 with a 4MB file transfer: On a 10/100 LAN, increasing the buffers to 20 provided a 34% speed increase, from .907 to .658 seconds. Increasing beyond that did not improve performance.On an Internet connection limited to 25M/25M, setting the buffers to 20 provided a 267% speed increase, from 5.66 to 2.12 seconds. Setting the buffers to 40 provided a 329% increase with a time of 1.72 seconds. Final Thoughts In conclusion, the system has a buffer pool of 256 buffers, and each socket is allocated 5 each of ACK, RX and TX, providing the best compromise of performance, response time and resource usage. You can customize each socket’s allocation using the SetSocket functions. If you do not achieve the expected performance, then a good place to start is by using the GetFreeCount() function to ensure you are not running out of buffers. We hope you found this article helpful. We'd love to hear any thoughts or questions you have in the comments below. If you'd rather talk to us directly, feel free to email us at sales@netburner.com. ### Customer Spotlight: NetBurner Enables MDI To Be In Two Places At Once Wouldn’t it be nice to have a teleportation system? To step through a convenient portal and be at your destination instantly? If you’ve ever had to go any distance on a customer service call, you may have entertained such a fantasy while waiting—wearily—in an airline terminal or bus station. Send Your Serial Data Securely SB800EX-JDDW-IR View Product Page Or, learn more about NetBurner Serial To Ethernet. Our last Customer Spotlight shared how a NetBurner system-on-module and development kit can quickly and easily provide the core technology that empowers a customer product. But that’s not the only way our customers benefit from NetBurner’s decades of product expertise. In today’s Customer Spotlight, we’ll tell you how a different customer employs another NetBurner product, the SB700 EX Secure Serial to Ethernet Server, to transcend time and space. Using NetBurner technology, MDI effectively enables their service technicians to be in two places at once (or three, or four, or even more). MDI: Metal Detectors, Inc. Metal Detectors, Inc. (MDI) is a family-owned designer and manufacturer of high-quality production line metal detectors for use in a wide variety of manufacturing industries. MDI, located in beautiful Eugene, Oregon, was started in 1965. It is now in the hands of the family’s 4th generation. Metal detectors made by MDI can be found in customer facilities all around the country, carefully situated either under or surrounding process conveyor belts and chutes. Sawmill - Source MDI’s principal customer base is the forest product industry. For example, in a sawmill, logs passing through the sawmill’s processing system may contain extraneous metal—nails, bolts, bands, fence wire, etc.—that could severely damage or dull saw blades, planers, or chippers downstream. Other industries also share the same problem; materials such as aggregates, plastics, textiles, or recyclables passing through a conveyor system may also contain pieces of metal that could damage expensive downstream customer processing equipment. MDI custom-designs and adjusts each metal detector to suit a specific customer process in order to protect the machinery in place after the metal detection point. The MDI Product Line The MDI product line includes metal detectors in several different formats. They have Surround Systems that completely encircle the flow of customer materials. They also produce Under Conveyor Systems that can be placed below the flow of material. Finally, they make Hand-Held Probes that are rugged, reliable, and simple to operate without a lot of complex adjustment needed. MDI also custom fabricates non-metallic conveyor sections for their customers’ systems. These strong and durable fiberglass components replace metallic sections of the conveyor that would otherwise interfere with detection, enabling the sensitive electromagnetic sensors in MDI’s metal detectors to “see” and locate metal in the materials passing along the conveyor. Once it has been detected, any customer material containing metal can be automatically marked and/or diverted for inspection. MDI components and accessories are modular and easy to service, replace, or upgrade. MDI Technology Is Mission Critical Detecting extraneous metal in industrial processes is without a doubt a mission-critical issue. Customers that use metal detectors rely heavily on their MDI equipment to keep production lines up and running. Locating the metal in a felled tree. Stray pieces of metal, whether nails, bolts, fence wire, spikes, stakes—you name it—can be the kiss of death for a production line. In a sawmill, industrial saw blades are very specialized and quite expensive. We’re talking the kind of expensive that means vendors typically won’t even list prices on their websites; you have to ask for a quote! Extraneous metal that is not detected and removed from the line can destroy an expensive sawmill blade. At the very least, it could require that the blade be removed and re-sharpened. As the old saying goes, “Time is money,” and line-down situations can be very costly for MDI customers. MDI: Dealing With Customer Service Challenges When first installed, MDI metal detectors are carefully tuned to be as sensitive as possible to unwanted metal in the material flow without false triggering. However, technology changes of any kind in the production operation—variable frequency motor drives, handheld radios, cell phones, and static interference at customer sites—at times may result in false triggering or other anomalies. These can abruptly require an unscheduled service call from MDI. Downtime Is Deadly Any sudden and unexpected customer downtime used to require wearying and expensive travel for MDI’s technical support staff. Sending out a technician from MDI’s home base, though sometimes necessary, is a costly and time-consuming proposition. Even more important than reducing the costs of dispatching an engineer on a cross-country mission, MDI wanted to reduce prohibitively costly operating time loss on their customers’ major production lines. NetBurner To The Rescue Searching for a bit of a miracle to enhance and accelerate their ability to respond to customer crises, MDI reasoned that if they could give their engineers remote access to equipment installed at their customers’ sites, they could save a lot of time and money on travel and at the same time provide customers an immediate solution that would reduce their down-time. The MDI View-Link Remote Diagnostic Module Using NetBurner’s SB700-EX Secure Serial to Ethernet Server, MDI was able to develop what they have called the View-Link Remote Diagnostic Module. They discovered that the SB700-EX comes out of the box ready to work. It can extending the reach of whichever standard serial protocol they might want to use (RS232, RS485, RS422) to MDI installed equipment anywhere in the world. MDI simply connected an SB700-EX to their metal detecting equipment in the field. Using the industry standard TCP protocol, diagnostic data from a serial port in the metal detector can be easily accessed by MDI service engineers without ever having to leave the home office. At the office end, MDI has a legacy application that connects to their field equipment using NetBurner’s Virtual COM Port software. Our customers receive this software for free with the purchase of every NetBurner Serial to Ethernet product. Recent global disruptions have made the MDI View-Link more important than ever. MDI reports substantial time savings as a result of no longer having to send engineers to board an airplane at the drop of a hat in order to deal with a line-down issue. One of MDI’s engineers recently told NetBurner this: “Usually I have to fly a few times a year around the US to be there. The 700 allows me to help anybody right away. They don’t have to wait, and metal detectors are vital to protecting process equipment.” Some Additional Nice Bonus Results But wait, there’s more! Being able to access their products right from the home office has enabled MDI to stay ahead of the maintenance and service curve. Rather than wait for a trouble report, they are now able to regularly and continuously monitor the stability and performance of their metal detectors in the field. NetBurner technology gives MDI real-time access to data from their remote equipment. As subtle changes in conditions or configuration occur at customer sites, MDI can now stay on top of the situation and fine-tune settings in order to keep detectors operating at peak efficiency. Program customization, patches, and upgrades can also now be remotely installed. Not only has NetBurner tech empowered MDI’s remote diagnostics, it has earned MDI some free ink as well. The MDI View-Link remote interface was recently featured both in an article and on the cover of the October, 2020 issue of Wood Bioenergy Magazine. In that article, you can read about some specific “wins” enabled by the new MDI View-Link. MDI is justifiably proud of the way that the SB700-EX has enabled newfound ways for them to improve customer support. Likewise, we’re proud to be a part of their solution. Could NetBurner Give Your Service Team an Edge? If you want to be profitable, you already have your customers’ best interests in mind. This is even more true in the light of current global business challenges. Customer driven companies must strive to become as rapidly responsive to their customers’ needs as possible. By engaging NetBurner’s SB700-EX technology, just like MDI, you can quickly and securely extend your product’s serial port anywhere in the world at a very modest cost. Imagine the advantage of having hands-on, internal product diagnostic data available to your techs before they ever have to step foot out of the door? Maybe your product already has a built-in diagnostic serial output. If not, adding it and incorporating a NetBurner Secure Serial to Ethernet product will be well worth your effort. You won’t regret investigating the possibility. Not only in terms of time and travel savings, but also because of the improvement in your customers’ satisfaction. Yes, the NetBurner SB700-EX can indeed make it possible for you to be in two places or more at once. NetBurner Has Your Back, With Products and Support Why not spend a few pleasant minutes right now, browsing the wide array of NetBurner products and solutions to be found on our website? With a little imagination, you’re sure to discover one or more NetBurner offerings that perfectly fit the product or service needs your company specializes in. Who knows? You might be surprised to discover a marriage made in heaven. You can be sure that NetBurner support will be there for you when you pick up the phone or contact us by email. We’re passionate about making sure our customers have the information and resources they need to succeed. Reach out to us at sales@netburner.com with your questions or concerns. Note: All illustrations licensed or courtesy of Metal Detectors, Inc.. ### Customer Spotlight: NetBurner’s MODM7AE70 Empowers Two New JPS Products Introduction At NetBurner, we love seeing our customers succeed. We also love being able to share their success with others. Today, we’re going to focus on one customer that has successfully incorporated a NetBurner product, the MODM7AE70, into their designs. Send Your Serial Data Securely SB800EX-JDDW-IR View Product Page Or, learn more about NetBurner Serial To Ethernet. Meet JPS Interoperability Solutions JPS Interoperability Solutions of Raleigh, North Carolina is a privately held telecom company whose specialty is bridging the gaps between disparate means of audio communication. JPS products enable many different kinds of audio communication systems to work together seamlessly. Their mission critical communications technologies are employed by public safety, government, military, and commercial organizations worldwide. JPS Interoperability Solutions In 1997, JPS introduced a design that is at the core of their interoperability products, ACU Intelligent Interconnect Technology. Since that time, JPS products have been deployed by police and fire departments, National Guard, political conventions, major sports leagues, highway patrol, the US Department of Justice, disaster relief organizations, and many other similar organizations. Because JPS products are standards based, they interface easily with modern radio and telephony systems. They can also share interoperable voice communications not only with one another, but also with products from other commercial vendors. The JPS Product Line The JPS product line includes a broad variety of devices that support Radio over Internet Protocol (RoIP), The Session Initiation (SIP) digital telephony protocol, Real Time Transport Protocol (RTP), Push To Talk (PTT) interfaces to the cellphone network, Public Switched Telephone Networks (PSTN), Bridging System Interface (BSI), and other compliant protocols. These products help to interconnect an amazingly broad variety of radios. Some examples are analog and digital telephones, cellular and satellite communications systems, dispatch consoles and other audio communication systems. Two Super New JPS Interoperability Products For a Product Spotlight this month, we are featuring two new JPS products; the NXU-2B – Radio over IP (RoIP) Gateway and the QMT-1B Quality Measurement and Transport modem. Both units are physically and functionally similar. Both connect to radio transceivers with an industry-standard four wire interface. Last but not least, both are based on NetBurner’s MODM7AE70 technology. The NXU-2B: Able to Leap Tall Buildings in a Single Bound Able to leap tall buildings... When radio communication networks are separated by large obstacles, they are unable to communicate directly with one another. This is because high-frequency radio waves travel in a straight line and are unable to penetrate solid objects. Mountain ranges and clusters of skyscrapers in large cities form effective barriers to portable radio communication systems. The NXU-2B solves that problem by bridging the gap between radio networks with a different, non-radio technology, namely the internet. It provides a gateway over existing IP network infrastructure between multiple radio communication systems that are unable to talk to one another directly using their own radio frequency technology. Radio networks that were formerly out of touch with one another, are thus enabled to interoperate as a single network. Overcoming Obstacles By using two or more JPS NXU-2B radio network extension devices, first responders and organizations of all types can extend the capabilities of their radio networks. This turns mountains into molehills, making signal-blocking city buildings effectively disappear. A pair of NXU-2B’s on opposite sides of any obstacle merge their attached radios into what appears on the network as a single, coordinated radio device. This bridges two or more radio coverage areas into a single interoperating system. Of course, the NXU-2B plays well within the JPS’s backbone ACU Intelligent Interconnect Technology, enabling the deployment of complete communication systems that merge radio, telephone, cellular, and other services in a seamless fashion. The NXU-2B A Little History The NXU-2B is an upgraded descendent of a product JPS created almost twenty years ago. The previous NXU-2 design was built using NetBurner’s first product, the CFV2-40 board, by wedding it with JPS’s proprietary Digital Signal Processor (DSP) board. JPS: Proven radio interoperability expertise The next NXU generation, the NXU-2A, came along a few years later. JPS licensed NetBurner’s CFV2-66 design and integrated it together with their DSP board design into a single-board device. As we all know, “Time and tide wait for no man.” Key components of the NXU-2A, such as its Texas Instruments DSP, were becoming harder to source. For this reason, and in an effort to reduce system costs, JPS set out in 2019 to design the latest generation, the NXU-2B. As with any engineering project, JPS encountered a few bumps in the road. Porting the DSP code from one DSP brand to another was no easy task. Additionally, there were a few typical issues with bugs and documentation. But, quoting JPS, “Fortunately NB support was available and timely, and I think we have a stable product.” It’s good to know that you can always count on NetBurner support in a pinch. The QMT-1B: More Powerful Than A Locomotive The JPS QMT-1B Quality Measurement and Transport Modem is a brilliant, specialized spin on the NXU-2B technology. It’s primary purpose is to act as a peripheral input device for the company’s SNV-12 Signal and Noise Voter Comparator. More Powerful Than A Locomotive Consider a system that has a central dispatch console communicating with one or more mobile radio transceivers. These remote transceivers might be in constant motion, in taxis, police cars, on trains, or even hand-held walkie-talkies. As the mobile units move around within their working area, any number of obstacles (buildings, mountains, tunnels, etc.) interfere with their signals. If multiple radio base stations are placed around the area, as the mobile units roam, at any given time they will be closest to one of those base station transceivers. Three of 36 possible QMT-1B's feeding audio to an SNV-12 Voter Comparator The SNV-12 Voter Comparator uses DSPs to compare the signals from all remote transceivers in the system and route the best signal back to the dispatch console. The voter comparator also has the ability to automatically route the console reply transmissions back to the base station closest to any particular mobile unit. Base station transceivers utilize an industry-standard four-wire audio interface. As such, older solutions to this problem required a separate, expensive leased telephone line for every remote transceiver connected to central dispatch. A Better Solution Now, thanks to JPS, a QMT-1B can digitize those four-wire connections, time-stamp the audio signals, and transfer them to central dispatch via network. A single private IP network can import as many as 36 remote QMT-1B radio transceiver signal inputs to the SNV-12. There, DSPs measure and compare receiver audio quality for fast and accurate determination of the best signal available. SNV-12 Voter Comparator used to unify a railroad radio communication network All the QMT-1B’s work together in conjunction with the SNV-12 Voter to measure signal quality and equalize the delay from the various sites, whether near to or far from the dispatch console, so that the transition from one site to another is seamless. Faster Than A Speeding Bullet Because of these timing and synchronization requirements, the IP network supporting QMT-1B must meet JPS specifications for throughput, packet loss, differential latency, and jitter. The NXU-2B is uses the public internet. However, these tighter network specifications are necessary in the case of QMT-1B/SNV-12 systems. This is to ensure that the incoming radio signals are being compared with one another at precisely the same time. Two New JPS Product Successes for a Win-Win NetBurner: JPS's Super Power NetBurner technology paved the way for both the NXU-2B and QMT-1B to admirably meet all of JPS’ original design goals. JPS was able to completely eliminate the “extra” TI DSP board from their earlier QMT-1 product. This resulted in significant cost savings, and JPS re-coded the original DSP functions in C. Digital computation of analog algorithms like vocoders, filtering, tone generation, and tone detection is now all executed directly by the powerful embedded Microchip® SAM E70 32-bit ARM® Cortex®-M7 processor at the heart of NetBurner’s MODM7AE70 System-on-Module technology. Talk about horsepower! A Few Words About NetBurner’s MODM7AE70 JPS could develop these superior products and bring them to market quickly because they built them on a firm foundation. NetBurner’s ARM® Cortex®-powered Ethernet System-on-Module MODM7AE70 is an IoT device platform containing everything needed to add secure, industrial-quality IoT, network control and monitoring to nearly any smart application or product design. You aren’t likely to find an ARM® Cortex-M7 based high-performance, embedded IoT device quite like this anywhere else. For a very low cost, this system-on-module (SOM) can become the basis of your secure, network enabled 10/100 Ethernet connected project. NetBurner’s MODM7AE70 System-On-ModuleYour company's next secret SuperPower? Your product roll-out won’t take forever, either. SSL/TLS, machine-to-machine (M2M) protocols, digital I/O, analog to digital (ADC) and digital to analog (DAC) conversion, USARTs and UARTs, I2C and SPI are already baked-in to this device with ready-to-rock firmware libraries. What’s Your Super Idea? If you happen to be faced with the need to create a new network-enabled product, or—like JPS—the need to upgrade an existing product, you won’t find a better foundation for your project than MODM7AE70. What's your super idea? You can eliminate proprietary, expensive hardware, and bring your product quickly to market by leveraging NetBurner’s ready-made and highly adaptable hardware and software infrastructure. For many products, this may be as simple as adding some I/O connectors and a stylized case with your logo. Your engineering efforts may be no more complicated than developing and testing an application that runs on a NetBurner module. NetBurner Can Make Your Product A Star Our products can help take the blood, sweat, and tears out of the network side of your product development. You can browse the broad array of NetBurner products and solutions on the NetBurner website. No doubt you’ll be able to find a network solution to fit your needs. Think NetBurner for World-Class Support Our MODM7AE70, libraries, tools, and support were key in the development and release of the JPS NXU-2B and SNV-12. Likewise, our engineering support team stands ready to give you a leg up on your product development. We’re on deck to guide you to the best possible solution for your internal projects. Why not contact us at  sales@netburner.com today? Note: All illustrations licensed or courtesy of JPS Interoperability Solutions. ### Getting Back On The Horse; TLS Session Resumption “There's an old expression about falling off a horse. You get back on and you ride that bad boy into town.”- Brock Lesnar One frustrating reality of the internet is that we live in an age filled with bad actors. These sneaky agents might be anyone; foreigners halfway around the world, corporate spies, or even a kid down the block with too much time on his hands. As a responsible developer or IT professional, you have little choice but to use TLS (Transport Layer Security) to secure connections between your IoT devices. However, initiating a TLS session involves a fair amount of back and forth protocol overhead. Send Your Serial Data Securely SB800EX-JDDW-IR View Product Page Or, learn more about NetBurner Serial To Ethernet. The good news is that you may not have to pay that price every time you connect; the TLS protocol provides a way to “get back on the horse,” and to resume an internet session that was created earlier. Get back on that horse! ~ Source Why Use TLS Session Resumption? Resuming a TLS session can be especially useful when it comes to embedded IoT systems. Resources (and processing speed) in IoT devices are often constrained, so every bit of efficiency you can scrape together will be well worth the effort. TLS Session Setup Overhead Let’s take a moment to review what it takes to actually establish an encrypted connection with SSL/TLS. Setting up a TLS session requires a rather involved series of handshake steps between your device and its host. A "simple" TLS 1.2 Session Handshake Sequence ~ Source Note: Our purpose today is not to do a deep dive into the details of how this negotiation works; however—if you’re incurably curious—while the rest of us gallop onward, you can check out a few side trails. We’ve considered some security issues (and how we’re tackling them) in recent articles like Peer Verification: Getting to the Root of the Matter and Introducing wolfSSL: Serious Updates to Our Security Suite. For the super-detail oriented, this fine interactive example of a TLS v1.2 connection can take you right down to the byte level of establishing a typical session. You could even dig into NetBurner’s NNDK 3.3 detailed software documentation. As you can see from the TLS v1.2 Handshake illustration, there is a good deal of protocol information, cipher selection, number crunching and “back-and-forth” traffic required to establish a TLS-secured session. When you consider the total amount of data sent back and forth, the calculations required by both client and server, and the fact that two complete round-trip exchanges must occur before any actual data can be sent, you can see that starting from scratch every time is costly, both in time and in compute power. Two Methods of TLS Session Resumption. They say two heads are better than one, and likewise, so are two different ways to approach resuming your TLS session. Two! Two! Two methods in one! The TLS v1.2 protocol provides two alternative methods of session resumption; Session IDs and Session Tickets. The official specification for Session IDs can be found in RFC 5246, and Session Tickets are defined in RFC 5077. Thankfully, NetBurner devices support both methods, either as clients or servers. You configure your device to be a client or a server by calling either SSL_accept() (in the case of a server) or SSL_connect() (to initiate a connection as a client). Don’t worry, we provide a plethora of examples for both clients and servers to get you started. Using Session IDs Session IDs provide one of two possible shortcuts to resuming a previous TLS session quickly and with minimal overhead. Session IDs are the original design used for resuming SSL sessions, and they are still used by TLS. The following is a quick overview of how they work. Let's assume the server supports session IDs and is prepared to offer this feature during a TLS connection. The server will put a non-zero value in the Session ID field of its ServerHello message. If the client wishes to be able to resume a previous session later, it will store this value and then insert it into the Session ID field of its ClientHello. When the server sees that particular session ID value, it checks to see if it still has the necessary information for the session saved in its session resumption cache. If it does, it can immediately resume the previous session. You might think of this as kind of like opening an account with your stable manager. It may take you a while to set up the account when you rent your first horse, but next time, all you have to do is flash your ID. They'll pull up your information in their system, and you’ll be back in the saddle again quickly. Just flash that ID. ~ Source Using TLS Session Tickets Session tickets are somewhat more complex, but they offer an important advantage. They shift the burden of remembering details of a prior session from the server to the client. As you might imagine, if your embedded system is acting as a server, it may not have the luxury of “deep pockets” in the memory department. Conserving memory is especially important if your embedded server has a lot of clients to deal with. Using session tickets is a slick trick that gets each client to handle its own portion of the session resumption memory requirements. Here’s how it’s done: The client lets the server know it supports tickets by sending an empty Session Ticket extension in its ClientHello message. If the server supports session tickets, it will encrypt all the session details and send that information back to the client as a Session Ticket extension to the final TLS handshake. Session ticket information includes the complete session state (the master secret negotiated between the client and the server and the cipher suite used). This state is protected by encrypting it with a key known only to the server. You’ve got a ticket to ride! ~ Source Provided that the client stores the ticket, it can later resume the TLS session by sending it back to the server. The server can then get all of the necessary information about the previous session from the ticket and restart the session. Think of it this way: Maybe you’ve stabled your horse overnight. Using a session ticket is kind of like turning in your claim-check at the stable so they’ll get you back on your horse quickly. They don't need to look you up in the system when you come back. Everything they need is right on your claim-check. What Happens if a Session Can’t Be Resumed? It’s important to note that every client must be prepared to go through a complete new session negotiation. When your client attempts to resume a session, it’s possible that the server response may be—in effect—“Heck with you, and the horse you rode in on!” REJECTED CONCEPT But, why might a server force a completely new session negotiation? Some servers may have a limited software implementation, and simply may not support one or both kinds of TLS session resumption. A server might have had a traffic overload since the last communication with the client, and its cache may no longer contain the session information pertaining to that ID. The most common reason of all, however, is that IDs and tickets simply expire (and let's be glad they do!). If a client tries to resume a session after its expiration, it will need to go through the negotiation process all over again. Session IDs vs Session Tickets: Pros and Cons Generally speaking, session tickets are preferred as they are more secure then their session ID counterparts. However, that's not always the only consideration that needs to be made (though we'd argue it is the most important). Session IDs hail back to SSL days and are the simplest, lowest overhead method from the client perspective. When clients are IoT devices with limited compute horsepower and not a lot of memory, it’s good to have a high capacity central server that can store lots of session ID data. However, if you have many IoT devices contacting a central server with limited resources, session tickets might be optimal, because each IoT device only needs enough memory to store one ticket from its last session. The server doesn’t need to remember session IDs with all their associated data from a whole stable of different devices. A Few Words About Session Security Just as you can only ride one horse for so long, good security comes with time constraints. Long session gaps can give bad actors time to hack into a session and cause trouble. This is why session IDs and session tickets both have security timeout settings that are dictated by the server. When an ID or a ticket expires, the server intentionally flushes cached session data and forces a complete new session handshake when the client initiates the next contact. Data protection Cyber Security Privacy Business Internet Technology Concept. Depending on your specific application, and how important the history of your network interaction may be, you may want to forego TLS session resumption altogether. If your IoT devices check in with a server on only an occasional basis, it may be both reasonable and preferable from a security standpoint to simply accept the overhead of setting up a new session each and every time. NetBurner Supports Both ID and Ticket Methods As we’ve written about recently, the latest NetBurner software releases have been rocking the security scene. The highly regarded wolfSSL SSL/TLS and SSH Security Suite is now included with all NetBurner development kits in the NetBurner 3.3 release at no additional charge, and will soon be available in NNDK 2.9.3 as well. With this latest software release, all of our products (except the MOD5213 and the SBL2e series) support both ID and Ticket based session resumption, and you don’t have to do anything special to make either method work. But wait! That's not all! While a specific release date has not yet been set, NetBurner expects to offer TLS 1.3 support in the near future. NetBurner Support: You’ve got it! Everyone needs a little hand-holding from time to time. If you really need to do something different or special (for example, only support certain TLS cipher suites), you can drop your comment or question below. If your need is more urgent, hit us up with an email: sales@netburner.com. We’ll go out of our way to answer your questions and hook you up with the right solution. ### Creating Dynamic Web Content with NNDK 3.x Introduction Having the ability to turn your embedded system into a small web server provides a substantial advantage when it comes to relaying information from your device to the outside world in a human accessible format. However, that advantage becomes next to useless if the content served is unable to change to reflect the data the embedded system is managing. Fortunately, all network-enabled NetBurner devices have the ability to serve and handle dynamic web content. This capability has gotten even better with our latest tools, NNDK 3.x. A Short HTTP Overview Before we dig into the world of dynamic web content, let's take a step back and look at the components involved in your typical web connection, as well as the protocol that makes it all tick. In every web connection, there are two acting parties: a web client, and a web server. A web server can be described as a TCP server that has the ability to control access to the system’s hosted files. For the purposes of this discussion, a “file” can refer to static or dynamically generated content. At a minimum, a web server is a Hypertext Transfer Protocol (HTTP) server that understands web addresses (URLs) and the HTTP protocol. This enables a client web browser to view the hosted files.  For example, when you typed in the URL for this article into your web browser (or clicked on a link somewhere), it requested a file from our web server using HTTP. The web server accepted the request, found the requested content, and sent it back to your web browser, again using HTTP. The two main types of web browser interaction are referred as GET and POST: A web browser issues an HTTP GET request to ask the web server to send a specific file. For example, when you go to a website the file index.html is typically retrieved with a GET request. A web browser issues an HTTP POST when it wants to send data to the web server. For example, when you fill in a web page form with your name and address and then click on submit, it uses a POST to send that to the web server. Static Content vs Dynamic Content Previously we mentioned that the content being served by a web server can be static or dynamic. What does that really mean, though? Static content refers to files that are stored on the web server. When a web browser request is received for a static file, the file is sent to the web browser along with some HTTP content such as a header containing information on the file type. Also sent are any resources that the file might use, such as images. This helps the web browser determine how to display the content. Static web pages can consist of a markup language such as HTML, or programming languages such as JavaScript. Dynamic content refers to content that, partially or in whole, is generated at the time of a request. A well know back-end (server-side) language is PHP. While large footprint server-side languages are great for large scale applications, in the embedded world, where a web server may have to run in much smaller memory environments on a single chip, a more efficient solution is required.    Dynamic Content on a NetBurner  The NetBurner platform can deliver both static and dynamic content. The majority of web server content will be delivered automatically with no additional programming. Web server content should be placed in a directory with the name html in your project. When you build an application, all HTML content will be processed automatically and will be available to web browser requests. This includes HTML, JavaScrpt, Java applets, images, etc. For dynamic content, a number of options are provided, which we will describe in greater detail below:  HTML tags for function callbacks A CPPCALL HTML tag in an HTML page will directly call the specified function in your application. The function receives a file descriptor to the session as a parameter, and can send any type of content to it. This looks like the following: <--CPPCALL YourCppFunction --> HTML tag for displaying an application variable A VARIABLE HTML tag in an HTML page that will display any variable from the application. This looks like the following: <--VARIABLE YourVariable --> Intercepting a web browser GET request An HTML GET callback function, CallBackFunctionPageHandler, that will be called when a corresponding HTML GET request is received. Processing a web browser POST An HTML POST callback function, HtmlPostVariableListCallback, that will be called when a corresponding HTML form POST is received. Dynamic HTML Tags To understand the concept of the dynamic content HTML tags mentioned above, it helps to think of the web page delivery as a serial stream to the web browser:  The web browser requests a web page from the web server  The web server starts sending the web page as a serial stream of data  When the web server detects a dynamic HTML tag (CPPCALL or VARIABLE ), instead of sending the tag, it takes the action as directed by the tag. For a CPPCALL tag, the specified function in the application is called. For example:void Foo(int socket, PCSTR pUrl)The function is provided the session socket and a pointer to the URL. Any content sent to the socket will appear to the web browser as the web page content it requested. The function can be as simple as reading the status of something in the system, or as complex as delivering HTML or JavaScript code. For a VARIABLE tag, the tag is replaced with the value of the specified variable. For example, the web page could display the system seconds since boot variable. A significant advantage of dynamic HTML tags is that they provide you with the flexibility to create most of the web page content by any means you wish. They dynamic portion is inserted where needed. That way formatting, CSS styling, images, etc. can all be done with the tools and languages you already know. VARIABLE Tag Example Below shows the C++ code, the HTML, and the web browser output for a very simple VARIABLE tag. C++ Code htmlvar.h #ifndef HTMLVARS_H_ #define HTMLVARS_H_ #include // For access to TimeTick extern int gIntVal; extern char gStrVal[]; #endif /*HTMLVARS_H_*/ main.cpp #include #include #include #include const char *AppName = "HTML Variable Tag Demo";int gIntVal = 1234;char gStrVal[] = "Hello World";/* * Function called from the CPPCALL tag. Display the URL on the web page */void Foo(int fd, PCSTR pUrl){ fdprintf(fd, "The URL value is: %s\r\n", pUrl);}/* * UserMain */void UserMain(void *pd){ init(); StartHttp(); WaitForActiveNetwork(); while (1) { OSTimeDly(TICKS_PER_SECOND); }} HTML Code

HTML Variable Example

Number of seconds since system boot:
Application integer value:
Application string value:
Browser Output Output from the HTML VARIABLE Tag CPPCALL Tag Example Below shows the C++ code, the HTML, and the web browser output for a very simple CPPCALL tag. C++ Code htmlvar.h #ifndef HTMLVARS_H_ #define HTMLVARS_H_ const char *FooWithParameters(int fd, int v); #endif /*HTMLVARS_H_*/ main.cpp #include #include #include #include const char *AppName = "HTML CPPCALL Example"; /* * Function called from the CPPCALL tag. Display the URL on the web page */ void Foo(int fd, PCSTR pUrl) { fdprintf(fd, "The URL value is: %s\r\n", pUrl); } /* * UserMain */ void UserMain(void *pd) { init(); StartHttp(); WaitForActiveNetwork(); while (1) { OSTimeDly(TICKS_PER_SECOND); } } HTML Code

HTML CPPCALL Example

Browser Output Output from the HTML CPPCALL Tag Overriding Browser HTTP GET Requests The third method for dynamic content is to have the application override a web browser HTTP GET request. This is accomplished by creating a HTTP GET callback function and page handler. For example, to override the HTTP GET request for a web page named MyPage.html, you would register a callback function such as callbackGetMyPage(): int callbackGetMyPage(int sock, HTTP_Request &pHttpRequest) { // Custom application code goes here } The HTTP_Request parameter is a reference to a structure containing detailed information of the request. Next, a page handler is created named getHandlerMyPage(): CallBackFunctionPageHandler getHandlerMyPage("MyPage.html", callbackGetMyPage, tGet, 0, false); You can override any web page or URL, whether a file of that name exists or not. In the example above, the callback function can do some pre-processing, then send a file named MyPage.html, or it can dynamically create content and send it to the web browser as MyPage.html. This mechanism can also be used to make decisions on which file to send. Let’s say there is a default file compiled into the system named index.html, but you also wish to have files stored on an external flash drive. The callback function could look first on the flash drive and deliver that file if it exists. If it does not exist, the file stored in the application could be sent as a default/fallback. A quick description of the page handler function parameters is given below. They are covered in greater detail in the examples, the documentation on creating a GET request handler, and the API documentation. The tGet parameter tells it to process a HTTP GET request. The 0 parameter specifies the access group has no password. For most web applications, this value will suffice. For more information, please see the documentation referenced above. The last parameter can be referred to as “beforeFiles”. If set to false, the file system will be checked first for the existence of the web page, and if found, the file will be sent instead of executing callback function. If set to true, the callback function will always be called. Processing HTTP POSTs  When data is entered into a web page form, a HTTP POST is used to send that data to the web server. Since each type of form an application provides is unique, the application must implement a POST handler to process the form data. Similar to the HTTP GET mechanism discussed previously, post handling consists of a callback function to process the form data, and an object of type HtmlPostVariableListCallback to identify the form name and assign the callback function. For example, to set the callback function for a form named MyForm you would declare the following object: HtmlPostVariableListCallback postForm1("MyForm", callbackPostForm1); The callback would then be defined with the following: void callbackPostForm1(int sock, PostEvents event, const char * pName, const char * pValue) { // Code to process posted form data } The callback function will be called once for each data field in the POST, with the name of the field being passed in as pName, and the value of the field being passed in as pValue. For more information on the specific parameters used in the callback function, please see our document on creating a form POST handler. When form data is posted, the callback function can process the data, then take any action you wish based on the results. It could simply store data, request specific data, report system status, control an electronic or mechanical device, etc. Where To Go Now With the basics of writing dynamic web content for your NetBurner based applications under your belt, you're well on your way to creating easy-to-use and informative web interfaces for your own devices. For more information, please see our online documentation. When you dive into your own projects, be sure to take a peak at our extensive set of examples. We have over a dozen that cover exactly how to implement concepts we've discussed here. If you have additional questions or comments, please reach out to us as sales@netburner.com. We here to help, and love hearing how our products are being used. ### Upgrading From a MOD52xx SOM to the ARM MODM7AE70 Why Upgrade? The first question any developer or engineer worth their salt is going to ask when evaluating whether or not to upgrade to a different platform is, "Why?" The NetBurner MOD52xx system on modules (SOMs) are still active products with no current plans for end-of-life. The 2.9.x revision tool chain has been a trusty partner for so long, so the question is a valid one! There are several benefits that your applications can take advantage when upgrading to the MODM7AE70. Let's take a minute to go through the list. Hardware Performance and Cost One of the biggest factors in deciding whether or not to upgrade to a new module will inevitably be cost. In many cases, upgrading to a newer module can often increase the cost of a design, and power consumption generally goes up when adding a faster processor with more peripherals. In both cases, the MODM7AE70 flies in the face of convention. When compared to the MOD52xx platforms, the MODM7AE70 benefits from the following: Lower SOM cost In some cases, as much as 40%.  Much higher performance In addition to overall performance, this can be very useful as encryption key sizes continue to get larger and affect negotiation time.  Hardware floating point math Lower power requirements Configuration and Application Updates  NetBurner's latest tools, NNDK 3.x, have added a host of new options to configure and update your devices. Gone are the days of relying on a platform dependent utility to get the job done. It is still a valid method, of course, but there are several new options to choose from. Here is the full rundown. The new IoT configuration system enables each SOM to handle its own configuration and code updates. There are many configuration options, all of which can be enabled/disabled and password protected based on your application requirement. Device discovery, configuration, and code updates are now platform independent and do not require any OS specific utilities. However, If you prefer a utility, they are available as well. Devices can be discovered by going to “discover.netburner.com”. For those that don't wish to use a public utility (or can't), we provide everything needed to setup a private server that can be used to serve the same functionality. Applications can be updated from any web browser, the NBUpdate utility, NBEclipse, WGET, and through the device’s serial port. Device configuration can now be done with a JSON object. These objects can be saved and uploaded through a web interface, making configuration in a production environment much easier and faster. Developers can easily create their own application specific configuration interface for branding or expansion. Development Tools  NBEclipse has been updated to use Eclipse 2022-03 Among other benefits, it allows for makefile generation for automated build systems.  Updated GCC compiler to 8.1 As one of several benefits, it utilizes all available processor cores to greatly reduce build times. Note that this version of GCC is noticeably more strict than the previous version we released. This may cause some previous "warnings" to be upgraded to "errors". System  Increased the number of RTOS tasks Default is 256, but can be increased as a configuration option.  Increased the number of TCP sockets Default is 256, but can be increased as a configuration option.  Upgrade Overview  Now that we know the reasons to upgrade, let us talk about how to go about doing it. In our customer beta tests, upgrades have taken from as little as an hour to as long as a few days. The time will depend on the complexity of the application, how many peripherals are utilized, and the structure of the application code itself. The goal of this document is to provide guidance to make this process as easy as possible. Upgrading from a Tools Release Prior to 2.8.0 In this document the term “2.x” refers to releases 2.8.0 and above. Release 2.7.7 was the last tools release for the IPv4 only stack. Please refer to the migration documents  for the single IPv4 stack to the dual IPv4/IPv6 stack for additional porting changes, such as the IPADDR type.  Hardware and Pin Comparison Our product lines were designed from the beginning with upgrading in mind. Mechanically, the MODM7AE70 is identical to the MOD5272, MOD5270, and MOD5282. On the MOD5234 and MOD5441X, the critical dimensions of the Ethernet jack, male header pins and mounting holes are identical. However, the tail end of the PCB (the end opposite the Ethernet jack), is slightly longer. If a MOD5234 is currently in your design, the MODM7AE70 will fit as well. We have created a pin comparison page  for the MOD52xx SOMs vs the MODM7AE70.  You should find that most, if not all the signals in your design are compatible. If you are using the external address and data bus, we recommend contacting support. Although the signals are the compatible, external bus hardware can vary in its implementation. If you are using the NANO54415, MO5441X, or SB800EX, you can easily upgrade to the 3.x tools. Upgrade Topics Device Discovery In previous versions of our tools, locating and configuring your device required the use of IPSetup. In 3.x, we’ve introduced several new ways to do this. If both your computer and the NetBurner device have Internet connectivity, open a web browser and go to the site discover.netburner.com. This will list all the NetBurner devices you have access to on your network. If you use this mechanism for your customers, you can create your own discovery server and use that address instead. For example, www.mydiscoveryserver.com. For more information on how to do this, please feel free to contact us.       Screenshot of discover.netburner.com   If you are connected directly to the NetBurner device and/or do not have Internet connectivity, use the LocalDiscover utility located in your nburnpcbin directory.       Screenshot of the LocalDiscover Utility   Lastly, although IPSetup is deprecated, you should still be able to use it to locate the device’s IP address, although it can no longer be used to configure the device. Device Configuration Once you have located your device, click on the Config link. Alternatively, if you already know the device's IP address, you can navigate to :20034 from any web browser. This will open a web page that enables you to view or modify the system settings. The screen shot below shows the default config server (you can customize it ) with the IPv4 section open. You can also configure parameters such as boot and IPv6. The App Data section is available for any data you wish to present from your application.       Screenshot of Device Configuration Page   NBEclipse The latest NBEclipse versions are very similar to those in the 2.x releases. However, for compatibility reasons some changes to the structure of a project were required.  In 2.x, the source files, HTML folder and build files were all in the project root folder, and the “release” folder contained the application image:       NBEclipse 2.x   New to 3.x is how the system library is handled. In 2.x, only one library existed for all projects, named netburner.a. This created an issue for customers who required library modifications that were different for each project. In 3.x we addressed this issue. Each project now has its own copy of the system library, named libnetburner.a, which is unique to that project. A 3.x NBEclipse project has the following format with respect to the project root folder: Source files are located in a folder named src. Web content is still located in a folder named html. In addition to the application image, the release folder now has 2 sub folders: nblibs and src. The nblibs folder contains the project’s compiled system library. The src folder contains the project’s compiled object files.       NBEclipse 3.x   Application Image File Format The 2.x tools, both with NBEclipse and command line, produced a Motorola S-Record .S19 file. In 3.x the file format has changed to a much smaller binary format with file extension .bin.  In the current 3.3 release, a ColdFire 5441x platform project will build both .bin and .s19. However, the default, which we recommend, is the .bin file. Application Differences: Include Files, Initialization and Basic Types In this section we will illustrate the differences in a simple network application. These are: The common header files to include The initialization sequence in UserMain() The web server initialization functions have changed from StartHTTP() and StartHTTPS() to StartHttp() and StartHttps() respectively       A Simple 2.x Application     An Equivalent 3.x Application It should also be noted that the location of the source files has changed. In 2.x, all system files were found in system and include. In 3.x, this has moved to nbrtossystem and nbrtosinclude, respectively.   Header Files The common 2.x header files such as: #include #include #include #include #include #include #include Are replaced with: #include // Replaces ucos.h specifically #include #include Initialization The 2.x initialization functions: InitializeStack(); GetDHCPAddressIfNecessary(); OSChangePrio(MAIN_PRIO); EnableAutoUpdate(); StartHTTP(); EnableTaskMonitor(); #ifndef _DEBUG EnableSmartTraps(); #endif #ifdef _DEBUG InitializeNetworkGDB_and_Wait(); #endif Are all replaced with: init(); Basic Variable Types The basic types have changed to be more descriptive. The changes are shown below for 2.x to 3.x: 2.x Data Type 3.x Data Type BYTE uint8_t PBYTE *uint8_t SHORT int16_t PSHORT *int16_t WORD uint16_t PWORD *uint16_t LONG int32_t PLONG *int32_t DWORD uint32_t PDWORD *uint32_t Please note that the type int is still valid and represents int32_t on current platforms. The NetBurner RTOS The 3.x NBRTOS is very similar to the 2.x RTOS with significant enhancements. These include dramatic performance improvements and significantly increasing the number of tasks. In general, RTOS features such as semaphores, mailboxes, critical sections, FIFOs, and queues are now C++ objects. Any code changes should be minor but will include changing the explicit functions calls to a call to the object’s member function. For example, to initialize a semaphore: For example, initializing a semaphore: OSSemInit(&MySemaphore, 0); becomes: MySemaphore.Init(); The library API documentation  provides a description of each member function and its optional/default parameter values. Also, in NBEclipse, as you type the name of the object, tips will appear showing all the member functions and their default parameters. The example below is located in the nburnexamplesRTOS folder In 2.x void UserMain( void *pd ) { InitializeStack(); GetDHCPAddressIfNecessary(); OSChangePrio(MAIN_PRIO); EnableAutoUpdate(); EnableTaskMonitor(); #ifndef _DEBUG EnableSmartTraps(); #endif #ifdef _DEBUG InitializeNetworkGDB_and_Wait(); #endif OSSemInit(&MySemaphore, 0); OSSimpleTaskCreatewName( MyTask, MAIN_PRIO + 1, "Semaphore"); while ( 1 ) { iprintf(">>> UserMain: Pending on Semaphore from MyTaskrn"); OSSemPend(&MySemaphore, 0); iprintf("<<< UserMain: Semaphore was posted from MyTask!rnrn"); } } In 3.x OS_SEM MySemaphore; void UserMain(void *pd) { init(); MySemaphore.Init(); OSSimpleTaskCreatewName(MyTask, MAIN_PRIO + 1, "Semaphore"); while (1) { iprintf(">>> UserMain: Pending on Semaphore from MyTaskrn"); MySemaphore.Pend(); iprintf("<<< UserMain: Semaphore was posted from MyTask!rnrn"); } } Handling IP Addresses The functionality of the IPADDR object is covered in detail in the NetBurner Programmers Guide IPv4/IPv6 dual stack section. However, we want to cover some of the formatting here since it can make your updated code much cleaner. The IPADDR type is based on two objects: IPADDR4 and IPADDR6. Whenever possible it is preferable to use the IPADDR type, which can hold either an IPv4 or IPv6 address. When using the IPADDR type, the correct member function will automatically be called, whether the underlying type is IPv4 or IPv6. For example, to set the value of an IP address you can use the SetFromAscii() member function: void UserMain(void * pd) { init(); WaitForActiveNetwork(TICKS_PER_SECOND * 5); StartHttp(); IPADDR myIPv4; IPADDR myIPv6; myIPv4.SetFromAscii("172.1.2.3"); myIPv6.SetFromAscii("fe80::203:f4ff:fe0b:8481"); iprintf("myIPv4: %Irn", myIPv4); iprintf("myIPv6: %Irn", myIPv6); iprintf("Application %s startedrn",AppName ); while (1) { OSTimeDly(TICKS_PER_SECOND); } } The corresponding output is: Primary network interface configured for DHCPMAC Address = 00:03:f4:0b:84:8fType "A" to abort bootmyIPv4: 172.1.2.3myIPv6: fe80::203:f4ff:fe0b:8481Application AppWiz started There are a few things to take note of from this example: The two variables, myIPv4 and myIPv6, are both of type IPADDR. The same member function name, SetFromAscii(), is used to set each type of address. This will set the IPADDR address type to either IPv4 or IPv6. For those interested, SetFromAscii4() or SetFromAscii6() will be called in the library code depending on the type of IP address provided. In fact, there will be a ‘4’ and ‘6’ version of nearly all IPADDR member functions. The printf() function to display the IP address uses the %I format specifier. More on that below. NetBurner IPADDR Format Specifiers The printf() functions have additional format specifiers to make it easier to display IP address information. These specifiers are applicable to all the printf() type functions, such as iprintf(), printf(), fdprintf(), sprintf(), etc. The added format specifiers are: %I Parameter is an IPADDR object, either IPv4 or IPv6 %hI Parameter is an IPADDR4 object, IPv4 Configuration/Interface IPADDR Objects When manipulating or displaying an IP address object, it is important to know whether it is an IPADDR, or an IPADDR4. There are some protocols which support only IPv4, and in those cases the object type is IPADDR4. In this case, functions are called explicitly with the ‘4’ version. For example, GetHostByName4(). The nburnexamplesShowInterfaces example is a great resource to examine for handling configuration record settings. For example, the IPv4 settings in the configuration record are of type IPADDR4, and helper functions such as InterfaceIP() are used to display their values. Checking for a NULL value, and Setting a NULL value In IPv4, the address could be considered a 32-bit unsigned integer, and settings or checking for a null/zero value was a comparison to 0. For an object the member functions SetNull() and IsNull() are used. Here are some examples for an IPADDR variable named myIpAddr: Set a null value: myIpAddr.SetNull(); Check for a null value: myIpAddr.IsNull(); You can also specify a null address as a static IPADDR::NullIP(). For example: DNSResult = GetHostByName( serverName, &serverIp, IPADDR::NullIP(), TICKS_PER_SECOND * 20 ); The null IP value tells the function to use a random source port number. Wrapping Up That's about it! Hopefully this guide provides you with a clear picture of the steps that will be required to update from a MOD52xx module to our newer module, the MODM7AE70. If you have any other questions or concerns about the upgrade, please feel free to contact us directly at sales@netburner.com, or leave us a comment below. ### Upgrading Your Projects With NNDK 3.3 The Latest Tools Are In Summer is officially here, and with it comes a brand new update to our tools, which we affectionately call NNDK 3.3. Unique, we know. Interested in learning more? Grab a nice cold beverage and settle in while we review what this new update has to bring. Prefer to skip the fluff and head straight to the goods? Our official release notes can be found on our support site here. The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. New Examples in NNDK 3.3 With this release, we really wanted to expand what we offer in terms of examples. Nothing screams new shiny toy like a brand new projects to dig into. In addition to several platform specific examples, which are listed down below, we have also added several general examples that will work for any platform. For instance, we've added a new onboard certificate generation example, which demonstrates how your devices can automatically generate self-signed certificates for encrypted communications. We've also added examples for all modules that cover various time functions, and another that shows how to use stack protection. New Examples? Yes please! New MOD5441X Examples Pulse Generator CounterPit TimerExternal Irq example that generates interrupts from a pinEffs SDHCCAN to SerialRTC On ChipDSPI to SerialDSPI Multiple DevicesExternal Irq 7I2C Address ScanRapid GPIORTC ExternalPicKit I2C Serial Demo New MODM7AE70 Examples GPIO example, a simple guide to utilizing GPIO on the MODM7External IRQ example to generate interrupts from a pinTimer Output timerTimer Capture timerCANI2CRTC External SSL/TLS Upgrade We're very proud to announce that we have integrated wolfSSL into our SSL/TLS library. This change re-implements some functionality we had previously lost in regard to session tickets. It also adds several new features that will make your applications easier to write and maintain, while at the same time enhancing their overall security. Finally, it allows us to lay the groundwork for future improvements. We've given this feature all the attention it deserves in a separate article here. Additional NNDK 3.3 Updates You might be asking, "The NNDK 3.3 release isn't all examples and security, is it?" Of course not! We've also added full support for underflow and overflow stack checking on our ARM and Coldfire devices, as well as a new I2C class. For those looking for more control on device shutdown, we've written new shutdown hooks, NBApproveShutdown(), and NBFaultNotify(). We've extended our NBString class's functionality by adding support for the find() method, which behaves just like the C++ Standard Library string method of the same name. Finally, we've included a Get_msec() that will tell you the milliseconds since the device started. As with all of our releases, we've also fixed a number of nagging bugs and issues. For a full list of these that are addressed in NNDK 3.3, as well as all of our additional and changes updates, please see the full release notes on our support site. Wrapping Up Haven't taken the plunge yet on a NetBurner development kit? It's a big decision, and we get it! You can find more information on our development kits here, including a detailed comparison between them. We always love to get feedback (good or bad), so if you have any questions, comments, or complaints, feel free to let us know in the comment section below, or email us directly at sales@netburner.com. ### Introducing wolfSSL: Serious Updates to Our Security Suite The Importance of Security At NetBurner, we pride ourselves on providing the hardware, software, and tools that enable engineers worldwide to accelerate their product design and development process. As the IoT and embedded systems industries continue to explode, an increasingly important aspect of the support and service we provide revolves around providing security libraries that you can use to keep your precious products and systems safe and secure. That is a responsibility that we take very seriously. In order to stay up to date with the latest ciphers and security protocols, we are proud to announce that we have incorporated wolfSSL as a standard offering in our NNDK tools. It is currently already available in our NNDK 3.3 tools, and we are presently migrating support to our NNDK 2.9.x tools. The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. As you can imagine, integrating a new SSL/TLS security library into an existing software suite is a significant undertaking. "Why," you might be asking, "would you do such a thing if what you have already works?" That is an excellent question, and we're glad you asked! Migrating from our previous security library to wolfSSL has allowed us to provide several significant benefits. These range from immediately improving our capabilities to laying the foundation for future updates. Let's take a moment to run through the list, shall we? SSL/TLS and SSH Security Suite Now Free with Development Kits We want to encourage good security practices when making design decisions, and a large part of that is making it as easy and accessible as possible for you to do so. To give you a boost in the right direction, we are now including the SSL/TLS and SSH Security Suite with all development kits at no extra cost. Starting with NNDK 3.3 and our soon-to-be-released NNDK 2.9.3, it will be installed automatically with our tools. For previous versions, contact sales for a key that can be used during the installation process to get access. Please note that this doesn't mean all platforms are able to support SSL/TLS and SSH. See our development kit comparison for details. Session Resumption with Session Tickets In our first homegrown implementation of SSL/TLS way back when, we implemented support for session tickets. Unfortunately, in moving to a third-party solution, we ended up losing that feature (though we retained support for session ids). With our move to wolfSSL, we have thankfully regained it, and are excited to deliver it to your waiting arms. It's also worth mentioning that session tickets are supported for both client and server applications. Regardless of which side of the connection your device happens to be sitting on, you'll be covered. Support for Server-Side Peer Verification We have long supported client-side peer verification in our SSL/TLS library. Up until this point, unfortunately, the server-side of the connection had been left out of the loop. We're happy to announce that with the migration to wolfSSL, that's all changed. Server side-peer verification is officially supported in NNDK 3.3, and will be as well in 2.9.3. Now regardless of their role in your design, your applications will know who they're talking to. Faster Key Generation for Onboard Certificate Generation As if having the ability to generate a self-signed certificate on your device wasn't enough, now it can happen even more quickly. Below we have a table comparison comparing times for both the MOD5441X and the MODM7AE70 for RSA and ECC. When it comes to ECC, the times are neck and neck, but when it comes to RSA keys, wolfSSL wins hands down. PlatformLibraryRSA 1024RSA 2048RSA 4096ECC (256)MOD5441XPrevious Library0:00:460:17:111:20:450:00:04WolfSSL0:00:290:05:021:18:110:00:06MODM7AE70Previous Library0:00:210:00:210:39:250:00:03WolfSSL0:00:140:01:180:23:190:00:04Key Generation Times in :: Easier To Work With Certificate Authority (CA) Lists Previously, due to the constraints of the library we were using, changes to the device's certificate authority list required a restart of the module before they would take effect. Now, wolfSSL gives us the flexibility to change a certificate authority list dynamically at runtime (though it will only take effect for new connections). We have added several new function calls to facilitate this feature: SSL_AddCertToClientCaList() // Adds a certificate to the client's CA listSSL_AddCertToServerCaList() // Adds a certificate to the server's CA listSSL_ClearClientCaList() // Clears all certificates for the client's CA listSSL_ClearServerCaList() // Clears all certificates for the server's CA list It is still possible to set them through calls to SSL_connect(). However, because they previously referenced objects that were tied to the underlying library directly, their signatures have been altered to use parameters that are library agnostic. Additionally, the following functions used to set the certificate authority lists were removed as they also relied on specific library objects that are no longer available. These are: SSL_SetClientCAList()SSL_SetServerCAList() Support for DER Encoded Certificates Previous versions of our library required that you store certificates and keys in PEM format. However, now you can additionally store them as DER encoded, which is a binary format. Laying Groundwork for Future Improvements By Unknown Author maybe: Charles Clyde Ebbets wolfSSL has a strong commitment to continually developing and testing its products. As security practices and needs evolve, wolfSSL is consistently at the forefront of integrating the newest supported ciphers and protocols, as well as planning for the future by laying the groundwork for anticipated improvements. Some of these are already available, and we plan to integrate them into our system soon. These include TLS v1.3 and DTLS, which provides encryption for the UDP protocol. Future changes we are exploring include the option for Federal Information Processing Standards (FIPS) validation, and a quantum-safe handshake (QSH) extension. You can find more information on these can on the wolfSSL website Wrapping Up We're extremely excited about the new changes to our Embedded IoT Security Suite and where we're going in the future. The importance of security will only increase in the IoT and embedded space as more and more of our work, life, and play are put online. NetBurner is here to ease that burden for you as you design and build your next network-enabled project. If you have any questions or thoughts about security or our updates, please feel free to leave a comment below, or email us directly at sales@netburner.com. ### How to Fix a Slow Network While Using a VPN Working Remote: The New Norm These days many people are working remotely. Over the past several months the numbers of individuals in the category has undoubtedly increased dramatically. Fortunately, by using a Virtual Private Network (VPN) connection to the workplace, we can still have access to things like file servers, databases, and instruments. There is a downside, however. Using a VPN can actually have a negative impact and slow down your overall network speed. If this is something you've noticed, fear not! We have an explanation and a solution. Read on to find out more. Send Your Serial Data Securely SB800EX-JDDW-IR View Product Page Or, learn more about NetBurner Serial To Ethernet. Your Typical VPN Setup For those currently using a VPN,  the network structure may look like the following: A Typical VPN Network Setup The diagram illustrates: An office network with a VPN capable routerThe office LAN subnet is 10.1.1.xYour PC desktop at work has an IP address of 10.1.1.100A home network with a LAN subnet of 192.168.1.xThe home laptop has an IP address of 192.168.1.115And of course, the Internet A VPN connection is initiated from the home laptop through the home router to the office VPN router. This enables the laptop to access the office LAN. You will notice the VPN connection has its own VPN office router IP address of 192.168.0.2. That is the IP address for the WAN side of the office router. However, as far as working on your laptop is concerned, you only have access to the office LAN subnet of 10.1.1.x. Where the Trouble Begins At this point every is working fine. From your laptop, you can access the office resources, remote into your PC, etc. When you open a web browser you can go anywhere you wish, just as you could before you established the office VPN connection. However, you may notice the network is running more slowly when the VPN is active. The reason for this is simple. Now all the network traffic is running through the office VPN connection. For example, let's say you want to watch some screaming goat videos on YouTube (who doesn't, right?). The request and information goes from your laptop at home, through the VPN to the office router, then back out to the Internet, and finally to YouTube. The reply back from YouTube follows the same path back. No wonder your network seems so slow. No One Likes a Slow Network If your office is in a very large company that has a dedicated connection with symmetric upload/download speeds at 1 GHz, then there may not be much of a speed issue (though there still may be a privacy issue). However, if your office is like most companies and has a significantly less expensive asymmetric service, the difference is significant. The table below shows typical speeds available to a business. All numbers are specified in Mbps. DownloadUpload2006001000102535Typical Business Network Speeds When you are at the office, most of the data transfer happens as a download. Because of this things are very fast. With your VPN connection active on your laptop, however, everything you download to your home laptop has to first be uploaded to you by your office VPN. This means that everything sent from the office over the VPN to your laptop has a maximum throughput of the office upload speed. Also consider that all remote users share this upload speed, so the speed you can achieve depends on how many people are using it. Routing Configurations Let's examine each of the following configurations: No VPNVPN connectedVPN connected with a static route To do this we can open a command prompt and use the route and tracert commands. The route command lets you look at (and modify) your network’s routing table, which describes the network immediately around your PC. Tracert is a command that lets you display the route and transit times of packets in a connection. For simplicity, the discussion below lists the IPv4 addresses, but when you run these utilities yourself you will also see the IPv6 values. No VPN In this configuration, the home laptop has no access to the office network, so all traffic goes through the home router, which has a gateway IP address of 192.168.1.1. Running route print produces two interfaces and shows the gateway IP address. A gateway value of On-link means that the client can connect directly, without routing. The table shows values for the PC’s IP address, loopback address, and multicast address. C:\Users\Bob>route print =========================================================================== Interface List 12...00 d8 61 ab 69 23 ......Realtek PCIe GbE Family Controller 1...........................Software Loopback Interface 1 =========================================================================== IPv4 Route Table =========================================================================== Active Routes: Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.115 25 127.0.0.0 255.0.0.0 On-link 127.0.0.1 331 127.0.0.1 255.255.255.255 On-link 127.0.0.1 331 127.255.255.255 255.255.255.255 On-link 127.0.0.1 331 192.168.1.0 255.255.255.0 On-link 192.168.1.115 281 192.168.1.115 255.255.255.255 On-link 192.168.1.115 281 192.168.1.255 255.255.255.255 On-link 192.168.1.115 281 224.0.0.0 240.0.0.0 On-link 127.0.0.1 331 224.0.0.0 240.0.0.0 On-link 192.168.1.115 281 255.255.255.255 255.255.255.255 On-link 127.0.0.1 331 255.255.255.255 255.255.255.255 On-link 192.168.1.115 281 =========================================================================== Persistent Routes: None Running tracert verifies the route goes through the home gateway at address 192.168.1.1: C:\Users\Bob>tracert www.yahoo.com Tracing route to new-fp-shed.wg1.b.yahoo.com [98.138.219.231] over a maximum of 30 hops: 1 <1 ms <1 ms <1 ms 192.168.1.1 2 9 ms 8 ms 16 ms 142.254.184.89 3 29 ms 42 ms 24 ms agg62.sndaca7801h.socal.rr.com [76.167.17.201] 4 12 ms 13 ms 17 ms agg23.sndhcaax01r.socal.rr.com [72.129.1.150] 5 27 ms 15 ms 31 ms 72.129.1.0 6 12 ms 15 ms 15 ms bu-ether26.lsancarc0yw-bcr00.tbone.rr.com [66.109.3.230] 7 20 ms 22 ms 12 ms 0.ae2.pr0.lax10.tbone.rr.com [66.109.6.133] 8 24 ms 16 ms 22 ms xe-0-0-33-1.par1.lax.yahoo.com [216.115.96.12] 9 21 ms 13 ms 12 ms UNKNOWN-216-115-102-X.yahoo.com [216.115.102.184] 10 21 ms 18 ms 20 ms et-7-1-0.pat2.sjc.yahoo.com [216.115.107.150] 11 45 ms 45 ms 44 ms ae-9.pat2.dnx.yahoo.com [216.115.96.113] 12 69 ms 61 ms 69 ms ae-5.pat2.nez.yahoo.com [216.115.96.70] 13 64 ms 78 ms 62 ms et-1-0-0.msr1.ne1.yahoo.com [216.115.105.29] 14 67 ms 67 ms 95 ms et-1-1-0.clr2-a-gdc.ne1.yahoo.com [98.138.97.67] 15 71 ms 63 ms 73 ms po255.bas1-1-flk.ne1.yahoo.com [98.138.0.97] 16 61 ms 62 ms 64 ms media-router-fp1.prod1.media.vip.ne1.yahoo.com [98.138.219.231] Trace complete. VPN With Default Routing Now we connect to the office VPN. By default, windows makes the VPN interface the default gateway instead of using the home router as the default gateway. The result is that all traffic outside the home LAN will go through the VPN gateway. Running route print shows the new VPN interface (number 28). There is now also an On-link route for the interface at 192.168.5.5 (the VPN interface IP address). C:\Users\Bob>route print =========================================================================== Interface List 12...00 d8 61 ab 69 23 ......Realtek PCIe GbE Family Controller 28...........................Office VPN 1...........................Software Loopback Interface 1 =========================================================================== IPv4 Route Table =========================================================================== Active Routes: Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.115 4250 0.0.0.0 0.0.0.0 On-link 192.168.5.5 26 99.1.155.12 255.255.255.255 192.168.1.1 192.168.1.115 4251 127.0.0.0 255.0.0.0 On-link 127.0.0.1 4556 127.0.0.1 255.255.255.255 On-link 127.0.0.1 4556 127.255.255.255 255.255.255.255 On-link 127.0.0.1 4556 192.168.1.0 255.255.255.0 On-link 192.168.1.115 4506 192.168.1.115 255.255.255.255 On-link 192.168.1.115 4506 192.168.1.255 255.255.255.255 On-link 192.168.1.115 4506 192.168.5.5 255.255.255.255 On-link 192.168.5.5 281 224.0.0.0 240.0.0.0 On-link 127.0.0.1 4556 224.0.0.0 240.0.0.0 On-link 192.168.1.115 4506 224.0.0.0 240.0.0.0 On-link 192.168.5.5 26 255.255.255.255 255.255.255.255 On-link 127.0.0.1 4556 255.255.255.255 255.255.255.255 On-link 192.168.1.115 4506 255.255.255.255 255.255.255.255 On-link 192.168.5.5 281 =========================================================================== Persistent Routes: None Running tracert verifies the route goes through the office VPN, which has a WAN address of 99.1.155.14: C:\Users\Tom>tracert www.yahoo.com Tracing route to new-fp-shed.wg1.b.yahoo.com [98.138.219.231] over a maximum of 30 hops: 1 * * * Request timed out. 2 * 23 ms * 99.1.155.14 3 23 ms 37 ms 31 ms 107-143-96-1.lightspeed.sndgca.sbcglobal.net [107.143.96.1] 4 26 ms 24 ms 32 ms 71.148.71.48 5 * * 34 ms 75.20.78.206 6 23 ms 23 ms 27 ms 12.83.70.181 7 29 ms 32 ms 28 ms ggr2.la2ca.ip.att.net [12.122.129.97] 8 29 ms 30 ms 30 ms las-bb1-link.telia.net [80.239.193.213] 9 38 ms 35 ms 41 ms sjo-b21-link.telia.net [62.115.116.40] 10 60 ms 60 ms 65 ms den-b1-link.telia.net [213.155.133.170] 11 80 ms 62 ms 60 ms yahoo-ic-314775-den-b1.c.telia.net [62.115.61.118] 12 73 ms 83 ms 70 ms ae-0.pat1.nez.yahoo.com [216.115.100.8] 13 76 ms 91 ms 77 ms et-19-1-0.msr2.ne1.yahoo.com [216.115.105.181] 14 76 ms 82 ms 69 ms et-1-0-0.clr2-a-gdc.ne1.yahoo.com [98.138.97.73] 15 86 ms 81 ms 79 ms po255.bas2-1-flk.ne1.yahoo.com [98.138.0.99] 16 73 ms 81 ms 79 ms media-router-fp1.prod1.media.vip.ne1.yahoo.com [98.138.219.231] Trace complete. VPN With the Addition of a Static Route If only there was a way to route just the office specific traffic to the VPN, and everything else through your home ISP service. That should solve our slow network woes.…  Luckily, there is!  To do this, we will use a static route. A static route is an entry in the routing table that is manually configured, as opposed to entries that are automatically determined. You can add a static route to your laptop so that only traffic specific to 10.1.1.x goes through the VPN. This is very simple to do, and you can make it temporary just to test it out. If you’re happy with it, make it permanent so it will still be there after a computer reboot. We will discuss how to create a static route in the next section, but for demonstration purposes we will show the routing table and trace route when a static route is added for the office LAN address range of 10.1.1.x. The route print command now shows an additional route for the 10.1.1.x office LAN categorized as On-link so our laptop can make a connection as if it were on our home LAN: C:\Users\Bob>route print =========================================================================== Interface List 12...00 d8 61 ab 69 23 ......Realtek PCIe GbE Family Controller 28...........................Office VPN 1...........................Software Loopback Interface 1 =========================================================================== IPv4 Route Table =========================================================================== Active Routes: Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.115 25 10.1.1.0 255.255.255.0 On-link 192.168.5.14 26 10.1.1.255 255.255.255.255 On-link 192.168.5.14 281 99.1.155.12 255.255.255.255 192.168.1.1 192.168.1.115 26 127.0.0.0 255.0.0.0 On-link 127.0.0.1 331 127.0.0.1 255.255.255.255 On-link 127.0.0.1 331 127.255.255.255 255.255.255.255 On-link 127.0.0.1 331 192.168.1.0 255.255.255.0 On-link 192.168.1.115 281 192.168.1.115 255.255.255.255 On-link 192.168.1.115 281 192.168.1.255 255.255.255.255 On-link 192.168.1.115 281 192.168.5.0 255.255.255.0 On-link 192.168.5.14 26 192.168.5.14 255.255.255.255 On-link 192.168.5.14 281 192.168.5.255 255.255.255.255 On-link 192.168.5.14 281 224.0.0.0 240.0.0.0 On-link 127.0.0.1 331 224.0.0.0 240.0.0.0 On-link 192.168.1.115 281 224.0.0.0 240.0.0.0 On-link 192.168.5.14 281 255.255.255.255 255.255.255.255 On-link 127.0.0.1 331 255.255.255.255 255.255.255.255 On-link 192.168.1.115 281 255.255.255.255 255.255.255.255 On-link 192.168.5.14 281 =========================================================================== Persistent Routes: None To verify we now have access to the office LAN, lets ping the router at 10.1.1.1: C:\Users\Bob>ping 10.1.1.1 Pinging 10.1.1.1 with 32 bytes of data: Reply from 10.1.1.1: bytes=32 time=20ms TTL=64 Reply from 10.1.1.1: bytes=32 time=20ms TTL=64 Reply from 10.1.1.1: bytes=32 time=18ms TTL=64 Reply from 10.1.1.1: bytes=32 time=20ms TTL=64 Ping statistics for 10.1.1.1: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milliseconds: Now let’s run tracert and compare the route to the VPN configuration without the static route: C:\Users\Bob>tracert www.yahoo.com Tracing route to new-fp-shed.wg1.b.yahoo.com [98.138.219.232] over a maximum of 30 hops: 1 <1 ms <1 ms <1 ms 192.168.1.1 2 16 ms 16 ms 12 ms 142.254.184.89 3 30 ms 24 ms 33 ms agg62.sndaca7801h.socal.rr.com [76.167.17.201] 4 14 ms 15 ms 23 ms agg23.sndhcaax01r.socal.rr.com [72.129.1.150] 5 17 ms 15 ms 23 ms 72.129.1.0 6 15 ms 15 ms 15 ms bu-ether16.lsancarc0yw-bcr00.tbone.rr.com [66.109.6.102] 7 23 ms 14 ms 13 ms 0.ae6.pr0.lax10.tbone.rr.com [66.109.9.24] 8 28 ms 15 ms 16 ms xe-0-0-33-1.par1.lax.yahoo.com [216.115.96.12] 9 15 ms 15 ms 17 ms UNKNOWN-216-115-102-X.yahoo.com [216.115.102.184] 10 19 ms 23 ms 21 ms et-7-1-0.pat2.sjc.yahoo.com [216.115.107.150] 11 56 ms 57 ms 48 ms ae-9.pat2.dnx.yahoo.com [216.115.96.113] 12 63 ms 96 ms 62 ms ae-5.pat2.nez.yahoo.com [216.115.96.70] 13 63 ms 73 ms 65 ms et-1-0-0.msr2.ne1.yahoo.com [216.115.105.183] 14 68 ms 70 ms 66 ms et-1-0-0.clr1-a-gdc.ne1.yahoo.com [98.138.97.69] 15 68 ms 79 ms 69 ms po254.bas1-1-flk.ne1.yahoo.com [98.138.0.85] 16 75 ms 70 ms 69 ms media-router-fp2.prod1.media.vip.ne1.yahoo.com [98.138.219.232] Trace complete. As you can see in the first few entries, instead of using the office VPN as the gateway, we are now using our home network router! Any replies to web page requests or file downloads will run at the speed of our home ISP, rather than be constrained by the upload speed of the office VPN. Creating a Static Route There are two main steps to enabling the static route to the office VPN: Modify the VPN interface on the laptop to disable it as the default gateway.Specify the office LAN IP address range for the static route. The result is that all office LAN traffic will go through the static route gateway, and all other traffic outside the home LAN will go through the home router gateway. Disable the VPN as the Default Gateway Stay with me here, the setting is deep down in the options. In the Windows Control Panel, go to the Network Connections settings, right click on your VPN, and select Properties: Finding the VPN Properties In the VPN Properties, select Internet Protocol Version 4, then click on the Properties button. Once in Version 4 properties, click on the Advanced button. Digging Further in IPv4 Properties Finally... What We've Been Looking For Finally, uncheck the “Use default gateway on remote network” checkbox. Then click "OK", and work your way back up. Add the Office LAN Static Route You will first need to open a command prompt window with Administrator privileges. To do that go to the Windows search box and type cmd. When you see the Command Prompt app, right click on it, and select “Run as administrator”. Open the Command Prompt as Administrator Once the command prompt opens, use the “route add” command to add the static route. In this example, the office LAN is 10.1.1.x and the mask is 255.255.255.0. We will add the route by interface number so if the gateway changes it will adjust, so we enter 0.0.0.0 for the gateway, and use “if 28” for the interface number. The entire command is: route add 10.1.1.0 mask 255.255.255.0 0.0.0.0 if 28 Note that we found the interface number from the “route print” command. If all goes well, you will be greeted with an optimistic, “OK!” Voila! At this point everything is in place. The traffic to the office LAN will route through the VPN, and all other traffic will route out the home LAN gateway. However, the route we just added is temporary, and if we reboot it will no longer exist. To make it permanent, use the -p option:  route add -p 10.1.1.0   255.255.255.0    0.0.0.0   if   28 In case you change your mind down the road, A route can be deleted with the route delete command: route delete 10.1.1.0 Summary Now that you know why your network slows down while using your office’s VPN and you have the solution to fix it, there is nothing standing in your way of watching high-resolution kitten videos on YouTube at full blast while you are hard at work. While it might have seemed mysterious at first, hopefully this explanation cleared the air as to what is really going on. Working from home can be a bit of an adjustment for you and your team, but at least slow network performance will no longer be part of the problem… well, bad network performance as a result of your VPN connection. If you live in the boonies and are trying to connect via dial-up, we have nothing for you. As always, we would love to hear your thoughts or any other tips and tricks you may have found. Please feel free to leave a comment below or drop us a line at sales@netburner.com. ### TCP vs UDP: Battle of the Protocols “The Internet is a giant international network of intelligent, informed computer enthusiasts, by which I mean, "people without lives." We don't care. We have each other.”Humorist Dave Barry Making Your “Net Work” for You... We’re sure it’s no surprise that many of our Learn Blog articles have already explored different aspects of internet protocols. You can rely on past articles with topics like peer verification and competing encryption algorithms as reference material. Here at NetBurner, we’re all about helping you cut through the fog to make the internet truly useful. In this article, we introduce and compare two of the most widely used internet protocols, TCP and UDP, in order to give you a leg up in understanding their similarities and differences. Send Your Serial Data Securely SB800EX-JDDW-IR View Product Page Or, learn more about NetBurner Serial To Ethernet. Alphabet Soup: The ABCs of TCP and UDP Let’s compare TCP and UDP. The TCP acronym stands for Transmission Control Protocol. You’ve probably seen it most often paired with IP, the Internet Protocol, as TCP/IP. It is arguably the most-used protocol among the many protocols classified as Internet Standards. The UDP acronym stands for User Datagram Protocol. While you’re more likely to see UDP mentioned on its own, it is occasionally referred to as UDP/IP. Both are Internet Standard network communication protocols. (Standards are clearly identified in the RFC Index as “Status: INTERNET STANDARD.” An RFC is a “Request For Comments,” the source of all de facto-standards maintained by the Internet Engineering Task Force (IETF), that define how the internet actually works. Both UDP and TCP were formalized in the early 1980’s with the publication of RFCs 768 (UDP) and 793 (TCP). Both TCP and UDP are potentially useful for IoT, the Internet of Things. So how do you choose between the two when you have to decide for your particular application? A Restaurant vs Cafeteria Simile In our ongoing effort to give you an intuitive understanding of important technologies, we’re going to use a simile to help compare and contrast TCP/IP and UDP. And, no, we did NOT say a ‘smile;’ we said—and meant—a ‘simile.’ Of course, you’ve gotta admit that NetBurner products and our Learn Blog articles do make you smile, right? In today’s simile, you’ll learn that TCP is like taking your date to a fancy restaurant, while UDP is more like grabbing a quick bite at the company cafeteria. TCP is Like Dining at a Fancy Restaurant When you take your date to Chez Posh, once you’ve made the reservation, you pretty much want the details for the rest of the evening to be someone else’s problem. TCP: An evening of fine dining You’re not in any particular hurry. You expect the restaurant staff to do all the work. They’ll recommend entrées to suit your taste. The Chez Posh staff attends to your every need, so you can focus completely on enjoying a pleasant conversation with your date. At the end of the evening, there’s nothing for you to clean up; you don’t have to clear the table or wash the dishes. You simply settle the check and take your date home. UDP is Closer to the Company Cafeteria You might think of UDP as more like chowing down at your company cafeteria. You’ve only got fifteen minutes before a meeting with the boss? Quick, hit the cafeteria, grab a tray, go to the buffet, select a dish or two, eat, and then get your tail to that meeting on time! UDP: A quick bite at the company cafeteria Nobody’s going to serve you, and you don’t expect them to. You know that you have to fend for yourself. You even have to clean up after yourself, placing your tray and dishes on the washer rack. But you don’t mind, because you can get in and out fast. Breaking it Down: Some Gritty Details We aren’t going to go deep today; that’s not our purpose. If you need them right now, you can get all the bit and byte level details from the links we provide throughout this article. We will, however, look at specifics of some of the most important operational differences between TCP and UDP so you can make an informed choice between them for any project you may be working on. A quick protocol comparison Connection vs Datagram TCP is connection oriented. In our fancy restaurant analogy, from the time you’re seated, your “connection” to the kitchen is managed by the wait staff, taking your orders in one direction and serving your requested food and drink in the other. Your multi-course “meal protocol” continues right up until you settle the check and walk out the door. Similarly, TCP establishes a durable connection between your application and an app running on a remote server. As long as the network is operating, it’s almost as if both client and server are in the same room. And your connection isn’t over until you close it. UDP, on the other hand, never “connects.” It simply issues a datagram (a single internet packet unassociated with any other, as defined in RFC 1594), after which it is done. UDP doesn’t know, or care, if that datagram ever gets to its destination. In the cafeteria analogy, it’s a bit like realizing you forgot the butter; you just go back and grab a pat or two, but it’s not part of some overall plan you made before you arrived. State vs Stateless Your dinner at Chez Posh is a well-planned, continuous series of events that take place in a well-defined order. It may start with drinks in the bar, and then progress through appetizers, your entrée, and end with dessert and coffee. You and your date expect good service, and your fancy waiter knows how to make it happen. Similarly, your app need not worry about details. TCP maintains, transitions through, and updates quite a few “states” during a session. A connection is ESTABLISHED. TCP exchanges packets in both directions between client and server. It tracks what’s happening until the connection is intentionally CLOSED by your application. But, at the cafeteria; who knows why you’re there? Maybe you just stopped by to put a twenty on your tab. Maybe you’re there to suck down some coffee while you read the latest Learn Blog article. The manager doesn’t have a clue that you’re on your way to a meeting, and he really doesn’t care. Likewise, with UDP, a datagram could be coming in or going out for any reason at all. The UDP software doesn’t know and doesn’t care; it’s all up to your application. Byte Stream vs Packets During a TCP connection, your application enjoys a steady stream of bytes in both directions, much as, once you and your date place your orders, you enjoy a steady supply of food and beverages. You don’t need to go back and forth to and from the kitchen. You don’t have to refill your own drinks. But in the cafeteria, you have to get up and get your own damn refill, or grab another slice of toast; there’s no waiter hovering nearby to do it for you. Similarly, if an app using UDP needs its data refreshed, it has to invoke UDP to send another datagram. UDP sends it and forgets it; the app has to keep track of the “meaning” of everything. Chicken or Egg? Data Order... At Chez Posh, the Deviled Eggs will always come before the Chicken Cordon Bleu; whereas, in the company cafeteria, you may just eat the Buffalo Chicken Wings before your Egg Custard dessert. In other words, data sequencing is important to TCP. TCP guarantees that data bytes arrive in the same order that your app sent them. On the other hand, UDP packets may show up in any order—if they show up at all. Reliable vs Lossy At that cafeteria, while rushing to your table, one of your three egg rolls rolls off the tray and bounces under a table… Do you stop to pick it up? Nope; you can’t be late for your meeting! UDP is a bit like that; raw speed is more important than getting every packet through. Your fancy waiter at Chez Posh ~ Source TCP, on the other hand, ensures that every data byte either makes it to the destination app or that both client and server are aware if it doesn’t. Much like TCP, your fancy waiter at Chez Posh makes sure that not a single item you ordered is left in the kitchen, or he apologizes with great sincerity if he discovers that the entrée you ordered is actually sold out. Error Free vs Corrupted When you take a seat on the mass-produced resin chair at the formica table in your tacky company cafeteria, you notice that you accidentally grabbed the macaroni instead of the potato salad. Damn! Oh, well, you’re not going back, but you aren’t going to eat that slop either. What happens to a UDP datagram when, for example, a CRC error occurs? It gets dumped, just like that (yecch!) macaroni salad you can’t stand. Your Chez Posh experience is totally different. Because your fancy waiter wants a healthy gratuity, you can be quite sure that every detail of your dinner will be très magnifique. Likewise, when the TCP protocol discovers a corrupted packet, it sends back a NAK, requesting a replacement packet. This may take a bit longer, but accurate delivery is ensured. Your app can be sure the byte stream is perfect. Handshake/Ack vs None TCP starts out with a ‘Syn - Syn/Ack - Ack’ handshake that establishes a connection: TCP connecting... The connection ends with a similar back and forth handshake that ultimately leaves both client and server in a “CLOSED” state. The “handshake” that begins your evening at Chez Posh starts with ‘Reservation - Hostess Seating - Waiter introduction:’ “I’m Jaques, and I’ll be your server tonight.” When the evening ends, your credit card going back and forth to settle the check is the “CLOSE” handshake. In contrast, UDP has no handshake; a datagram is issued to an address; that’s it. Likewise, at the cafeteria, it’s all on you. Show up, leave, eat, pay, handle things any way you like. The same goes for UDP; how and why you use it is all up to your application. Flow Control or Let ‘er Rip? Do you want your application to have to constantly check to see if the data channel is available? We didn’t think so. Of course, there are a couple of approaches to this; you could have someone else (TCP) check for you, or simply open the valve on your fire-hose (UDP) and let it blast! At Chez Posh, your waiter keeps a close eye on your dining progress, and won’t bring dessert until you’ve finished your entrée. Similarly, TCP automatically starts and stops data flow as the network, buffers, and connected devices are able to accommodate it. Is it time for dessert yet? ~ Source UDP, on the other hand, is like a fire hose… Open the valve, and blast away! The cafeteria equivalent of UDP might be like you operating the yogurt machine yourself… If that cute cafeteria worker distracts you, and you forget to turn off the spigot in time, some yogurt is bound to end up on the floor. Slow vs Fast For a lot of use cases, speed may be your most important consideration. Like the cafeteria option, UDP eliminates a lot of overhead. This allows you to cut to the chase and get things done quickly. Because UDP makes no assumptions about one-way vs two-way traffic, data sequence, error correction, etc., it can be blazing fast. TCP on the other hand is considerably slower. Just as you don’t have to worry about a thing during your relaxed evening out with your date, TCP handles all the nitty-gritty details that you may not want your application code to worry about. It’s an obvious trade-off. Your application has less to do, but TCP is substantially slower than UDP. Point to Point vs Multicast When you step up to the cafeteria salad bar, you aren’t alone. Several co-workers are right there alongside you, getting salad from the same place. UDP, like that salad bar, can dish out packets and have them routed to many destinations at once. This is called IP Multicast, and is covered in Internet Standard RFC 1112. In contrast, at Chez Posh, you and your date have an exclusive “foodie” connection with the chef, mediated by your professional waiter. Likewise, TCP maintains a one-on-one relationship between client and server from the time a connection is established until it is closed. Typical Use Cases Now that we’ve looked at many detailed differences between the two, let’s get down to brass tacks and pick one for the project at hand. In the final analysis, why might you choose TCP? Pick TCP for reliability. Go for TCP if you want to write a simple application. TCP is actually the transport layer already used in many higher-level protocols, some of which you use all the time. TCP is used by these popular protocols: Here are some major examples: Serving up a web page using HTTPSDownloading a file via FTPSending an email report anywhere using SMTPConnecting a service technician via TelnetM2M via DDSSensor data flow via MQTT Weighing the differences... ~ Source If your application invokes any of these protocols, you are already indirectly using TCP. Your applications can of course invoke TCP directly, establishing a reliable bidirectional (i.e. full duplex) byte stream between two endpoints. Alternatively, why might you choose UDP? UDP shines when it comes to speed, real-time apps, and custom-designed tasks. Like TCP, UDP is also used by many common higher-level internet protocols. UDP is used by these popular protocols: Examples of UDP-based protocols include: Resolving a domain name using DNSAutomating configuration of a local network with DHCPQuick and dirty data file transfer with TFTPNetwork management with SNMPInternet routing with RIPTelephony using VOIPM2M via DDSA Web of Things via CoAP (Constrained Application Protocol)Custom protocols; e.g. that monitor IoT sensors and control devices An Anemometer Used for Measuring the Speed and Direction of Wind You’ll want to pick UDP for audio and video. Go with UDP for real time applications. Use UDP for things that are repeatedly updated. Maybe you’re sending constantly changing weather data. Like Mark Twain said of New England weather: “If you don't like the weather in New England now, just wait a few minutes.” Other examples of transient data might include stock quotes, video streaming, and gaming apps. Is our simile slightly stretched? Perhaps just slightly… But we hope that, like a stand-up comic (see what we did there?) it’s been entertaining as well as educational. We also hope that we’ve supplied enough background for you to make an informed choice for your next network enabled project. TCP is like “dining in style,” as long as you’ve got the time. UDP is cafeteria style, but you can rockin’ get your task done fast. Now that you understand the difference, go forth and network! NetBurner Supports Both TCP and UDP Pick a device; (almost) any device. All NetBurner products (except non-networked MOD5213) support both TCP and UDP protocols, and so you can configure your NetBurner product according to your project needs. NetBurner Support: We’re Here for You Please leave us a comment or question below. You can reach us by email at sales@netburner.com. We really want to help you with your particular internet applications, and we’ve got a large stable of products to offer that will get you up and running fast. Other TCP and UDP Resources RFC Source Documents Request For Comments (RFC) Index — RFC IndexInternet Protocol (IP) — RFC: 791User Datagram Protocol (UDP) — RFC: 768Transmission Control Protocol (TCP) — RFC: 793 Protocols that use TCP and/or UDP Some IoT protocols — Internet of Things (IoT) Protocols and Connectivity Options: An OverviewCoAP for micros - CoAP Protocol Tutorial: Step by step guideComparing two M2M protocols — What’s The Difference Between DDS And AMQP? ### Don't Be the Weakest Link: Auto-Generated Self-Signed Certificates For Embedded and IoT Devices A New Way to Protect Your IoT and Embedded Devices The saying goes, "A chain is only as strong as its weakest link." Nowhere is this more fitting than in security, and believe us, nobody wants to be the weakest link. This is especially true when it comes to security for your embedded systems and the data they collect and transmit. Unfortunately, few instances of ensuring all of your bases are covered are as challenging (and daunting) as it is in the embedded and IoT world. In this article, we will discuss how NetBurner can help solve this problem for you by offering auto-generated self-signed certificates with literally a single line of code, but more on that later. The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. The Scale of IoT and Embedded Systems The number of connected devices continues to explode. If you do some research on the predicted number of IoT devices expected to be connected in the next few years, the results you'll find are pretty staggering. While there is a bit of variation (as is reasonable when it comes to predictions), you would be hard-pressed to find anything reliable that isn't well into the billions. For example, IoT World Today published an article earlier this year that suggested there would be around 41.6 billion devices connected by the year 2025. Now, many of these will be connected over different types of networks using different protocols. However, it's safe to assume that many of these will be connected protocols that take advantage of the SSL/TLS security protocol, such as our old friend TCP/IP. Of course, this presents some problems for those deploying hundreds or thousands of embedded devices. There's a good chance that some of your devices will act as a server, listening for systems to initiate a connection (I'm looking at you, IoT gateways). If this is the case, then each of those devices will need a certificate/key pair to use during the SSL/TLS handshake. Of course, the same requirements might be true for your clients as well. It's also possible the server you want your embedded systems to connect to enforces Client Authentication (and they really should). In this case, all of the devices trying to connect to it will need to offer up certificates of their own. What To Do? There are currently a couple of theories on how to handle certificates for a large number of embedded devices, and most of them to date range from poor to cringe-worthy. If you do some digging, you'll undoubtedly find many kindred souls who are out there trying to get a handle on this very problem. The Dream In an ideal, security-minded Utopian society, each device would have a personal certificate that was signed by an approved Certificate Authority (CA). However, going through this process for a single website is often a headache (not to mention potentially expensive), let along doing it for thousands of devices. Do you want to do this for 1000 devices? Us either. Closer to Reality A less ideal, though still, effective solution is to generate a self-signed certificate for each embedded system or device. Removing the CA from this process certainly speeds it up. The cost of course is being unable to validate ownership of the certificate. Even in this scenario, the problem remains that the number of certificates you might need to manage is overwhelming. There are some very nice tools and scripts that you can use to create self-signed certs. That said, in the end, you will still face the problem of uploading them to each of your devices. That's only fun for the first hundred modules or so. Fortunately, we have come up with a solution. While its suitability for a production environment will depend entirely on your specific circumstances, it will at least give you a "secure" foundation on which to build. With our NNDK 3.x toolset (and coming soon in 2.9.x), it is possible to build applications that will automatically generate self-signed certificates on the device at runtime. You no longer need to run scripts to generate a certificate signing request that will then be used to generate a certificate that you will then need to compile in or manually uploaded to your device. Whew… even typing it out is annoying. The whole process just got a whole lot simpler. How simple? Let's find out. The NetBurner Solution As mentioned above, to help you put your best foot forward when trying to tackle security for your embedded and IoT devices, NetBurner now offers the ability for onboard auto-generated self-signed certificates. What this really means is that with minimal effort (a single line of code, in fact), NetBurner modules running applications that function as a server can automatically generate a self-signed certificate. Auto-generated Self-Signed Certificates? Oh yeah! (Source: Giphy) We designed this feature to allow engineers to have maximum control over the certificates that are used by their devices. There are three primary use cases to consider here. For example, let's say that the module boots up and is instructed to start a secure web server (HTTPS), or listen for secure incoming connections. The following are the most common situations that would occur. The module will contain a manually loaded or compiled in certificate. This is the most common scenario. In this case, no certificate generation happens. The certificate that was loaded or compiled in will be used for all secure connections.The module will not contain any pre-loaded certificates. In this case, the module will realize it needs a certificate to accept secure connections. It will then generate a self-signed certificate on the spot. This will be used for all future connections. That is unless...The module initially didn't contain a certificate, but one was loaded at a later date. In this case, the certificate that was loaded manually would take over and be used for all connections. If this certificate were to be removed down the road for some reason, the auto-generated self-signed certificate would pick up the security sword and shield and soldier on. Technical Details For Auto-Generated Self-Signed Certificates We should take a moment to share a few things about this process. Certificates generated with this functionality are good for ten years. If the certificate should happen to expire, the module will detect it the next time the SSL server is initialized. It will then generate a new certificate automatically to replace it. These certificates live in non-volatile memory, which means that they will survive if the device is powered off. When generating the certificate, the random number generator will need to be properly seeded. The module does this by analyzing serial and network traffic. Pinging the device or visiting the device's config page from a browser will speed this process up. By default, the certificate is generated using ECC with SECP384R1. This can be changed to an RSA key by undefining ENABLE_ECCKEY_CREATE in \libraries\crypto\platform\(platform name)\user_settings.h, and then rebuilding your application. To specify what curve or RSA key length is used in certificate generation, define DEFAULT_KEY_TYPE as one of the values from SslKeyType_t. Usage Finally, to enable this feature, simply call EnableOnboardCertificateCreation() before you call init() in UserMain(), as shown in the code below. void UserMain(void *pd) { EnableOnboardCertificateCreation(); // Enable automatic certificate and key generation EnableSecureConfigServer(false); // Enable secure config server, used to verify cert generation init(); // Initialize network stack WaitForActiveNetwork(); iprintf("Application: %s\r\nNNDK Revision: %s\r\n", AppName, GetReleaseTag()); while (1) { OSTimeDly(TICKS_PER_SECOND*3); } } In the example above, you can see the call to EnableOnboardCertificateCreation() that allows for onboard certificate generation. Run underneath that is a call to EnableSecureConfigServer(false). This function allows us to view the device's configuration page over HTTPS. The false here only means that we aren't required to use HTTPS. In this case, though, that's how we will prove our certificate generation is actually working. After these two calls, the rest of the application is pretty basic. Auto-generated certificates are self-signed. Most browsers will be annoyed. To see this code in action, we are going to load it onto a device. After it has booted, open a browser and point it to https:/(device IP)/:20034. If you need to find your device's IP address, head to discover.netburner.com. Port 20034 will direct you to the device's configuration interface. Keep in mind that when you initially try to request the page, it might take a bit of time to get a response, depending on what kind of key the module is generating. Because it is a self-signed certificate, you will probably get a warning from your browser. It's safe (just this once!) to click through this to get to the configuration page. You can verify that you're accessing the secure page by checking out the certificate to the left of the URL (in most browsers). Wrapping Up Hopefully, seeing this new system has you feeling a bit better about the potential of tackling security in your IoT and embedded systems. We'd love to hear your thoughts or questions on certificate generation. We'd also love to hear any other ideas you might have about approaching security in your projects and designs. Feel free to leave a comment below, or email us directly at sales@netburner.com. ### The CAN Protocol: Of Course We CAN… Can You? “If you can dream it, you CAN do it.”- Walt Disney (emphasis added) Introducing the CAN Bus In previous Learn Blog articles, we’ve looked at several point-to-point serial protocols (RS485, RS422, RS232) and also compared the SPI and the I2C serial buses. Today we’ll hop on board yet another serial bus, the CAN bus. Of course, it’s almost as much fun coming up with puns about the CAN acronym as it was playing with a tin-can telephone when we were kids. Remember those? You take two tin cans, punch holes in the bottom, stretch a string tightly between them, and voilà! You have a can-to-can network! The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. The original CAN bus… - Source On a more serious note, we’re here to tell you about something incredibly useful and far more modern. The acronym actually stands for Controller Area Network, but even knowing what it stands for doesn’t tell us much about it. Let’s take a look at the history of this protocol in order to find out more. CAN Bus History The CAN bus was originally conceived of and optimized for transportation applications. Toward the end of the 20th century, existing automotive electronics used complex, point to point analog wiring. As sensors, devices, and subsystems proliferated, the complexity and sheer weight of wiring became unmanageable. CAN for transportation... - Image Source This led to a perceived need for a way to simplify interconnections and standardize automotive electronic devices. A bus and a protocol—fast enough to do the job, but more robust than existing networks, and able to function in electrically noisy environments—was desperately needed. The development of this technology began in 1983 at Robert Bosch GmbH. The results were released at an SAE conference in 1986. Semiconductor manufacturers began designing and producing compatible chips, and—starting in the early 1990s—automobile manufacturers began to use CAN technology in their vehicles. CAN System in a Car CAN isn't just for transportation anymore... Since then, the publication of CAN standards (see the ISO 11898-n series) and the use of the CAN bus for vehicle onboard diagnostics and other purposes has exploded worldwide. This protocol has also made its way into many industrial and medical applications. It is even being applied in building automation, elevators, and in more exotic applications like drones and prosthetic limbs. Some CAN Bus Basics The CAN bus boasts many subtleties and complexities, so in this article, we will be introducing it at a general, simplified level. Our goal is to give you the flavor of CAN, not necessarily a detailed explanation of how it works (although we will reveal some important details). Even so, because it is standardized and device and system manufacturers have already done a lot of the “heavy lifting” for you, you should (as an IoT implementer) be able to jump off from here and begin using it, if that is your goal. Why should that be your goal? Let's take a peek at some... Benefits The CAN bus has some really neat properties that make it very different, and in some ways more useful, than SPI and I2C. But what makes it a good choice for use in the rigorous environments common to transportation and industrial settings? Low node and system costCentral monitoring and control are possible, though not requiredRobust — resistant to electrical and electromagnetic noiseEfficient, thanks to support for priority without interruptionsFlexible — all nodes receive all traffic, enabling cooperative systems These general benefits of the CAN technology make it attractive and have led to its widespread use. Costs are reduced because of design standardization, mass production, and fewer interconnects. Systems with central controllers and monitors are possible because of how the protocol works. The CAN electrical definition protects against noise, and its protocol design offers noise detection and remediation. Designers can use the inherent CAN protocol to ensure that time-dependent events are handled without losing track of lower priority functions. Additionally, each node in the network has the flexibility to use or ignore any network data. Let’s take a look at some of the details of exactly how CAN works in order to provide us with all these benefits. Some Gritty Details A Simplified Pictorial Overview To help orient you to what’s coming up, here’s a simplified visual of a CAN bus network. CAN bus Overview This sketch illustrates a ‘classical’ high-speed CAN bus with seven nodes. Although not explicitly specified by the standards, the maximum number of nodes in a practical implementation is dependent on the bus and stub lengths, data rates, and the quality of the cabling and connectors in the physical layer. Digital Data CAN, of course, uses digital data to eliminate the long runs of analog circuitry that were typical in earlier automotive system designs. The bus makes this digitized data universally available to every node in the network, to be used as needed. Twisted Pair No, we’re not talking about a heavy metal rock group… But, as far as physical layers go, networks don’t get much simpler than this. A twisted pair (as used in this scenario) is actually two signal wires, CANH (‘H’ for High) and CANL (‘L’ for Low), twisted around each other, and attached to every node in the network. Although the ISO 11898-2 standard doesn’t explicitly require a twisted pair, using it is good practice and makes the network more reliable. ‘Twisted Pair’ In Concert - Source In addition to those two wires, each node needs power and ground. However, because vehicles typically use their metal chassis as a ground connection and often already have a power bus in place, nodes typically tap into power and ground at convenient local points. Of course, nodes also need to connect to whatever sensors, computers, and other devices they may be serving. Electrically-Based Noise Immunity CAN uses quasi-differential signaling on its two bus conductors. This simply means that when a node is transmitting a ‘zero’ on the bus, it drives a (nominally) five-volt potential between CANL and CANH, with CANH at the positive voltage level. This is called the dominant  bus state. When a node is sending a ‘one’ (or simply listening), termination resistors on the bus are allowed to return CANH and CANL to the same low level. This is called the recessive bus state. CAN Bus Voltages as defined by ISO 11898 - Source Note carefully that this is logically “upside down.” The dominant level—i.e., the presence of a voltage between CANH and CANL—signifies a LOGICAL ZERO (0). Likewise, the recessive level—i.e., the absence of voltage being driven on the bus—signifies a LOGICAL ONE (1). Fortunately, details at this level are all handled by the microcontrollers and hardware, so we don’t have to consciously fuss over them (other than when we’re trying to understand how CAN works). Use The Right Terminator! When designing a CAN bus system, be sure that you employ the right kind of terminator. To facilitate that, we are pleased to provide you with this informative illustration. Just to be clear, you want the 120 ohm terminator on the right… The most common, ‘Classical’ high-speed CAN bus (ISO 11898-2) uses only two 120 ohm termination resistors—one at each end of the bus—and operates at 1 Mbit/second. A second version—low speed, fault-tolerant CAN (ISO 11898-3)—has a termination resistor at each node, and operates at speeds up to 125 Kbps. Unfortunately, determining values for those terminators is a more involved process. It's described in painful detail on Pages 4-10 through 4-12 of, for example, National Instrument’s NI-CAN Hardware and Software Manual. Shifting Gears: A Third Transmission Speed! The newest CAN bus on the block is called CAN FD. Just beginning to come on the scene during the third decade of the 21st century, it boasts speeds of up to 8 Mbit/second, as well as larger data packets (64 bytes vs. 8 bytes) than its predecessors. Asynchronous, Peer-Level, Multi-Master Conversations Any node on the bus can initiate communication at any time. Because of this, any node can become the bus master, because all nodes operate as peers. You might think of this as somewhat akin to having a conversation at a cocktail party. You (a node) are standing among some number of other party-goers (other nodes), listening to the conversation. When you have something useful or important to say, you’re free to chime in. Maybe you’re responding to something someone else said. Maybe you have some new thoughts of your own to contribute to the conversation. Or, maybe, you’re in the mood to simply listen to and enjoy what everyone else is saying, filing it away in your memory for future reference. CAN; a little like a cocktail party - Source What you are doing quite naturally at the party is following an accepted protocol that enables the conversation to progress very easily, even in a noisy room. Talking in CAN: The Frame This might be a good time to describe a CAN bus message frame. When there’s a lull in the party conversation, and you have a tidbit of juicy gossip that you’re dying to share, you simply start talking. It’s just too good to hold back, so out with it! The CAN equivalent of a lull in the conversation is when no node is talking. The bus is idle, i.e., CANH and CANL are at the same recessive voltage level for a long time. You could think of this silence as an endless stream of ‘1’s on the bus. You probably don’t speak CAN… But, if you did, during that lull in the conversation, you might say something like this: A CAN Message Frame - Source Frame Fields You’d begin your ‘CANdid’ comment by suddenly “breaking the silence.” It makes perfect sense, then, that the SOF (Start of Frame) would be a single dominant, or ‘0’ bit, to begin the frame. The cocktail party equivalent might be for you to cough loudly to get everyone’s attention... Now, everybody is listening. But who the heck are you, anyway? Better identify yourself. “Hi! Can I introduce myself? I’m Canby Canfield from Canton, Canada.” The CAN-ID both identifies and prioritizes the node that is “talking” on the bus. After a few bits for housekeeping (RTR and Control), you finally get to the meat of the conversation—up to sixty-four bits of Data payload. “Can you believe the scandal? I hear that Candace contracted candida!” You’ve said your piece. Now, anyone who happens to care about Candace can chime in with their own comment. And don’t worry, we’ll get to the CRC, ACK, and EOF fields in a minute… By the way—at both the bit-timing level and the field level, CAN frames can actually be even more complicated than this (we told you this was complicated, right?). They might include some fancy (but essential) footwork design details like bit-stuffing, error frames, remote frames, overload frames, intermission, and inter-frame spacing. Does all this complexity make you feel like canning the whole thing? Once again, thank goodness, most of those hairy details are handled for you by the hardware and microcode of the CAN node transceiver. But what if it’s really noisy at the party? And how does the CAN bus handle errors? Protocol-Based Noise Immunity Continuing the cocktail party metaphor, if it’s noisy and you hear only part of the scuttlebutt, you can simply ask, “Would you please repeat that? I missed the good stuff!” Similarly, the CAN bus message format includes an ACK (Acknowledgement) field as well as a CRC (Cyclic Redundancy Check) field to facilitate message retries. These fields, together with higher-level system protocols, ensure that errors are detected, and important information is not lost. However, sometimes two people start talking at once. You know how to handle that at a party. However, what if two or more nodes start “talking” at the same time in a system? Do their outputs just collide on the bus? The answer is, of course not! That would be ridiculous. When a collision occurs on the bus, in order for it to continue working seamlessly, two things have to happen at once: synchronization and arbitration. Synchronization Synchronization actually happens constantly, whenever one node listens to another on the network. All nodes are—more or less—running at the same speed. However, there is no central master-clock. This means that at the bit-timing level, every node has to listen to and synchronize with the bit-timing of any node that is transmitting. Nodes do this by taking careful notice of transitions between the low voltage, recessive bus level, and the high, dominant bus level. They then adjust their own internal bit-timing to match that of the transmitting node. By doing this at every low-to-high transition, each node is able to maintain its synchronization with the node currently transmitting. Maintaining synchronization is another important reason for bit-stuffing. Arbitration: Who’s The Boss? When two party-goers start talking at once, because both are also listening, one typically yields and allows the other to continue. Similarly, on the bus, if two nodes begin transmitting a message at the same time, one will yield to the other. Here’s how: Every node on the CAN bus is assigned a Node ID that uniquely identifies that particular node on the network. The Node ID also sets the node’s priority level. The lower the ID number, the higher its network priority. This design convention, combined with the fact that the dominant level represents logical zero, enables nodes to easily determine who wins access to transmit on the network. Let’s look at a simplified example of how this works. For the sake of simplicity, we’re assuming Node IDs are only three bits long, and we aren’t showing every detail of the frame. First of all, all nodes are listening to the network all the time. This means that each node already knows if another node is in the middle of sending a network message frame. But how can it be sure if the node in question has just been reset? Even if a node has just been reset or hot-plugged into an active bus right in the middle of another node’s frame transmission, the CAN protocol saves the day. By relying on the frame definition, the node can distinguish between the EOF (End Of Frame) or a longer duration ‘bus idle’ condition. It does this by noting that the bus has been in the recessive state for at least eleven bit-times (i.e., the sum of CAN EOF and CAN Interframe Spacing). When Does it Matter? The only time arbitration becomes necessary is when two or more nodes randomly happen to begin a transmission at the same time. In this diagram, Node 1 (binary 001) and Node 2 (binary 010) start transmitting at the same time: A Simplified CAN Bus Arbitration Diagram: Node 001 Wins the Arbitration Here’s what happens next: Both nodes contending for the bus are, simultaneously, listening to the bus. This means they both see/hear each other’s dominant SOF bit, and both immediately begin synchronizing with one another. But each doesn’t (yet) know whether or not it is the highest priority. Next, they both transmit ‘0’s, the same first bit of their respective IDs. Both “hear” ‘0’s. But at the next bit, Node 1 transmits a ‘0’, while Node 2 transmits a ‘1’. Because the zero is dominant, that is what goes out on the bus. When Node 2 “hears” a ‘0’ instead of the ‘1’ it transmitted, it knows it has lost the arbitration, and it immediately stops transmitting (but it continues to listen, in case it needs to act on the message that Node 1 is sending). When Node IDs are assigned so that the most important, most often used nodes have the highest priorities, the CAN network bandwidth is utilized most efficiently. Topology and Bus Length CAN network topology is not constrained. Just like people standing around at a cocktail party, nodes can be anywhere in relation to one another, as long as they are connected to the same two wires. Practically speaking, however, the fewer nodes branching off in all directions and the shorter the bus, the less reflections occur, and the faster the system can run. Remarkably, the CAN bus can, in industrial settings, extend for an amazing 500 meters if transmission speed is constrained to 125 kbps, and even farther at lower data rates. But as the saying goes, “the devil is in the details.” The CiA (no, not that CIA, this one—the 'CAN in Automation' international users’ and manufacturers’ group) offers these recommendations for total bus and aggregate stub lengths. If you’re designing a complete CAN bus system, you will no doubt want to take specific topology and bus length details into account as described, for example, in this application note. So, Is CAN A Good Candidate for You? What does it all mean? In this article, we’ve really just scratched the surface of what a CAN bus network is and what it can do for you. Be sure to check the references and resources below if you want to expand your knowledge of this interesting protocol. If you’re creating devices for use in a vehicle, or in any noisy commercial environment, the CAN bus may be just your cup of tea. You can find a huge variety of ready-to-rock CAN network devices off the shelf, as well as microcontroller chipsets that you can design into your own CAN network node devices. If you want to remotely connect to existing CAN networks, NetBurner has exactly what you need to get started; check out the product links below. Maybe it’s time to jump in feet first and start experimenting. Sometimes, as the saying goes, “The proof of the pudding is in the eating.” Why not give CAN a try, and see for yourself? CAN we help you? You bet we CAN! Many NetBurner products support the CAN bus with the development kit. Here’s a list for your convenience: Multi-CAN Support SB800EX NANO54415 MOD5441XMODM7AE70 CAN Support MOD5282MOD5234MOD5213 CB34EX Put NetBurner Support On Speed Dial Our mission here at NetBurner is to help with your development efforts. If you have any thoughts or remaining curiosity about CAN, or if we can answer a question for you about any of our products, please let us know in the comments below, or drop us a note by email at sales@netburner.com. Some NetBurner CAN Resources NetBurner Support for the J1939 Standard — J1939 SolutionsNetBurner Support for CANopen — CANopen SolutionsRuntime Library Documentation — https://www.netburner.com/download/runtime-libraries/ Other CAN Resources CSS Electronics — CAN BUS Explained - A Simple Intro (2020)Wikipedia — CAN BusISO — International Organization for StandardizationAnalog Devices—Controller Area Network (CAN) Implementation GuideNational Instruments — Controller Area Network (CAN) OverviewMicrochip AN228 — A CAN Physical Layer DiscussionCiA (CAN in Automation) — CiA WebsiteWorcester Polytechnic Institute — Encoding and Physical Study of the CAN BUS Sensor Network Glossary CAN — Controller Area NetworkI2C — A board and system-level serial busOBD — On-Board DiagnosticsISO — International Organization for StandardizationECU — Electronic Control Unit, i.e. a node on the CAN busNode — An individual participant in a CAN networkCANH — The CAN network conductor that is actively driven to a HIGH voltage levelCANL — The undriven CAN network conductor that remains at a LOW voltage levelDominant — A high (Logical 0) differential level between CANH and CANLRecessive — A low (Logical 1) differential level between CANH and CANLTerminating resistor — The component used to bring the CAN bus back to a recessive levelProtocol — A set of rules that define sequences, timing, and format of data traffic on a networkArbitration — The process by which one node at a time gains control of the CAN busBit Stuffing — Adding extra bits in order to maintain synchronizationField — A defined portion of a CAN message frameFrame — One complete CAN message composed of multiple fieldsSOF — Start Of FrameCAN-ID — Field containing the unique CAN node identifier, including its priorityRTR — Remote Transmission Request field (See “Remote Frame”)Control — Field containing other subtle and at times confusing CAN bus detailsData — The most important CAN message fieldCRC — A Cyclic Redundancy Check checksumACK — Any and all nodes respond with a dominant bit if they have received a good messageEOF — End Of Frame, consisting of eight dominant bits ### Tracking Traps on the MODM7AE70 – Part 1 Have you ever found yourself writing an application that, at runtime, reboots seemingly at random? Maybe your application prints trap output—diagnostic messages that indicate system faults—to a serial port. It happens to the best of us. In this article, we will explain what to do with the trap output, and the workflow commonly used by the engineers here at NetBurner when tracking down the source of a trap. We will use practical examples run using our MODM7AE70 system on a module (SOM) powered by the Microchip SAM E70. The NetBurner MODM7AE70 and SBE70LC products use the Microchip SAME70 and SAMD20 processors to provide high performing and reliable ARM® embedded IoT capabilities for secure automation and industrial IoT applications. For a very low price point, this ARM® Cortex-M7 embedded system-on-module (SOM) solves the problem of securely network-enabling devices with 10/100 Ethernet, including those requiring SSL/TLS, auto certificate creation, industrial protocols, digital, analog, I2C, SPI, CAN, and much more. The products can also be used as an edge node microcontroller, edge processor or IoT gateway. Microchip® ARM® processors, combined with NetBurner’s acclaimed reliability and ease-of-use, provide a solution you can depend on. View Product Page Or, learn more about NetBurner IoT. What Is A Trap? A trap is an exception in the application that is caused by the execution of an illegal instruction. Some examples of an illegal instruction could be an attempt to read/write to an invalid memory address, or performing an arithmetic calculation that divides by zero. If an application attempts to execute an illegal instruction, it will reboot. Some Good News Luckily, NetBurner supports a feature called Smart Traps (link to PC tools docs) that prints trap information to the default serial port when a trap occurs. This information provides details on the call stacks of all your tasks, including the one that was running while the trap occurred. In most cases, this information will point you directly to the line of code that caused the trap. Smart Traps are provided for most NetBurner platforms, but in this article, we will be dealing specifically with the MODM7AE70. There is no performance hit in including this feature in your application. You may want to avoid using this feature if you’re using your serial ports to interface with peripherals. Otherwise, we recommend using this feature, particularly during development. Smart Traps won't slow you down! Smart Traps In Action Let’s take a look at how to use Smart Traps and dive into an example. Smart Traps can be enabled by including the smarttrap.h header file and by calling the function EnableSmartTraps() at the beginning of UserMain(). The following example demonstrates how to enable Smart Traps. It also shows a divide-by-zero trap. Make sure your NetBurner dev kit connected to the local network via ethernet cable, your computer installed with the NNDK tools, and the module connected to your computer via USB for both power and serial support. Step 1. New Project Set Up We’ll start with a clean project for this tutorial. Open NBEclipse IDE. Click File > New > Project. The New Project panel will open. Choose the “NetBurner Project” wizard > Next. The New NetBurner C/C++ Project panel will now display. Add a project name. Project Type should be “NetBurner C++ Executable Project” and Toolchains should be “NetBurner Toolchain” (both are selected by default). Click Next. In the Select Configurations panel accept the default options and Next. In NetBurner Project Options make sure you have the correct Target Platform selected. In this case the MODM7AE70. The IP address can be found in the NBEclipse “NBFind” panel or by using https://discover.netburner.com.  Leave the other fields empty and as shown in the figure below. In the NetBurner Project Content panel accept the default settings as shown in the figure below. Press Finish. This will initial the build process which may take several minutes. Step 2. Project Code You are now ready to copy and paste our code example. In the NBEclipse Project Explorer open the project’s src directory > open the main.cpp file. Delete all of the code from the default main.cpp and replace it with the code below. Save the file. #include #include #include #include #include const char * AppName="SmartTrap"; /* Can cause a divide-by-zero trap if the divisor is equal to zero */ uint32_t doDivide(uint32_t divisor) { return (TimeTick/divisor); // TimeTick represents the Ticks since the system has booted } /* This function is safe from a divide-by-zero trap since it checks for a zero value before dividing */ uint32_t doSafeDivide(uint32_t divisor) { if (divisor == 0) { return 0; } else { return (TimeTick/divisor); // TimeTick represents the Ticks since the system has booted } } void UserMain(void *pd) { init(); // Initialize network stack WaitForActiveNetwork(); EnableSmartTraps(); // Allows the system to print trap info to serial uint32_t myDivisor = 0; // Variable storing the divisor for division operations iprintf("Application: %srn", AppName); // Print application name to serial while (1) { iprintf("Press any key to proceed.rn"); getchar(); iprintf("doSafeDivide() returned: %lurn", (unsigned long)doSafeDivide(myDivisor) ); iprintf("Press any key to proceed.rn"); getchar(); iprintf("doDivide() returned : %lurn", (unsigned long)doDivide(myDivisor) ); // Trap occurs here } } Notice that the example has two functions that perform divide calculations. Those functions are doDivide() and doSafeDivide(). The doSafeDivide() function does not trap since it checks for a divisor equal to zero before performing the division. In contrast, the doDivide() function does not perform the check. When the application calls doDivide(), it will result in the following trap output. Step 3. Execute the Code and Generate SmartTrap Report After following the project set up and code implementation steps you are ready to run the project and generate the SmartTrap report. Your module needs to be connected to your development computer via USB for MTTTY serial readout to work. Click on the Run icon found in the top toolbar or from the top menu Run > Run. If Eclipse asks about Run Configuration, select NetBurner Application. The Eclipse Console should indicate that the application has been sent to your NetBurner device with a Program Success message. From the top menu select NetBurner > Mttty. This will open a serial interface to interact with and view the SmartTrap features. Set the COM Port to the option that makes sense (if only one device is connected to your computer then there will only be one option. You may disconnect your NetBurner’s USB cable and restart Mttty to see if there is a difference.) Set the Baud Rate to 115200. Press Connect. Press return/enter key when a cursor appears. Follow the prompts given within the white display area. There can be a few seconds of latency between prompts so be patient. The SmartTrap report will be produced within this window (see section below on how to read it). You will need to scroll up in the MTTTY window to read it. NOTE: you can adjust the font size of your MTTTY utility readouts to make it more readable. It's not pretty... but it can be helpful. There are three pieces of information that should be looked at (outlined in red in the figure above) – those are: The ”Faulted PC” address (found in the “Trap information” section) “The current running task” (found in the “RTOS information” section) The call stack for that task (in the “Task information” section) The task running while the trap occurred is Main#32 (that is a task priority of 0x32 in hex or 50 in decimal). Note that the Faulted PC value is also in the Main#32 call stack. Using this information, we can usually find which line of code caused the trap. This is done by using the addr2line tool. Step 4. Run the addr2line tool The addr2line tool (link to docs) converts the address of an instruction from your application’s .elf file into a line of code in your application’s source files. The .elf file is automatically generated during the build process, along with the application binary. It is VERY important that you use the .elf file that corresponds to the application that is running on your module. If you make even a small incremental change, it can change your .elf file drastically. Realizing the.elf file you’re drilling into doesn’t match what’s running on your module is only funny the first dozen times or so. To run the addr2line program for your MODM7AE70 (or other ARM based modules) follow these steps (for users of our older Coldfire platforms follow directions at the bottom of this section) : After successfully running the MTTTY steps, open a Terminal in NBEclipse IDE.1 In the terminal, change directory to the project directory. Enter the following command replacing “YourProjectElfFile.elf” with your actual ELF file name within your Release subdirectory. Also update with your hex value for the Fault PC value as we found in the previous MTTTY steps (replace 70019D92 with your value) …  C:/nburn/gcc/bin/arm-unknown-eabi-addr2line.exe -ifCe Release/YourProjectElfFile.elf 70019D92 The output in the terminal will look similar to below, where the relevant main.cpp line numbers are called out. $ C:/nburn/gcc/bin/arm-unknown-eabi-addr2line.exe -ifCe Release/SmartTrapsEx.elf 70023536 doDivide(unsigned long) C:UsersmyusernbworkspaceSmartTrapsExRelease/../src/main.cpp:12 UserMain(void*) C:UsersmyusernbworkspaceSmartTrapsExRelease/../src/main.cpp:49 And of course, looking at line 12 of main.cpp in the doDivide function, we see that it’s very possible to divide by zero on that line, especially when called from line 49. Note: If you’re developing on OS X or Linux, you can also use the addr2line command-line tool that’s available within the OS. The following snippet shows example usage by inputting the Faulted PC address from the trap above. The addr2line flags used in this example are some that we like using, but you can find more flags with their descriptions by using the command, arm-eabi-addr2line --help (note that for ColdFire based platforms, this command is m68k-elf-addr2line). > arm-eabi-addr2line -Cife obj/release/SmartTrap.elf 70019D92 doDivide(unsigned long) /SmartTrap/src/main.cpp:12 UserMain(void*) /SmartTrap/src/main.cpp:49 Something to note from the trap output is that the Faulted PC address is also in the Main#32 call stack. It is not uncommon for the call stack to have several addresses. In which case, it might be helpful to input all of those addresses in the addr2line tool. This allows you to get the full picture of what is going on, and can provide more insight as to what went wrong between function calls. Note: For our Coldfire based systems (not ARM), you can run the above process with the Winaddr2line tool instead simply by doing the following. Top menu > NetBurner > Select addr2line In Project ELF field browse for the correct .elf file for the project. Enter the hex code form the Fault PC line in the MTTTY step. Press Decode and read the result We’ll start with a clean project for this tutorial. Open NBEclipse IDE. Click File > New > Project. The New Project panel will open. Choose the “NetBurner Project” wizard > Next. The New NetBurner C/C++ Project panel will now display. Add a project name. Project Type should be “NetBurner C++ Executable Project” and Toolchains should be “NetBurner Toolchain” (both are selected by default). Click Next. In the Select Configurations panel accept the default options and Next. In NetBurner Project Options make sure you have the correct Target Platform selected. In this case the MODM7AE70. The IP address can be found in the NBEclipse “NBFind” panel or by using https://discover.netburner.com.  Leave the other fields empty and as shown in the figure below. In the NetBurner Project Content panel accept the default settings as shown in the figure below. Press Finish. This will initial the build process which may take several minutes. You are now ready to copy and paste our code example. In the NBEclipse Project Explorer open the project’s src directory > open the main.cpp file. Delete all of the code from the default main.cpp and replace it with the code below. Save the file. #include #include #include #include #include const char * AppName="SmartTrap"; /* Can cause a divide-by-zero trap if the divisor is equal to zero */ uint32_t doDivide(uint32_t divisor) { return (TimeTick/divisor); // TimeTick represents the Ticks since the system has booted } /* This function is safe from a divide-by-zero trap since it checks for a zero value before dividing */ uint32_t doSafeDivide(uint32_t divisor) { if (divisor == 0) { return 0; } else { return (TimeTick/divisor); // TimeTick represents the Ticks since the system has booted } } void UserMain(void *pd) { init(); // Initialize network stack WaitForActiveNetwork(); EnableSmartTraps(); // Allows the system to print trap info to serial uint32_t myDivisor = 0; // Variable storing the divisor for division operations iprintf("Application: %srn", AppName); // Print application name to serial while (1) { iprintf("Press any key to proceed.rn"); getchar(); iprintf("doSafeDivide() returned: %lurn", (unsigned long)doSafeDivide(myDivisor) ); iprintf("Press any key to proceed.rn"); getchar(); iprintf("doDivide() returned : %lurn", (unsigned long)doDivide(myDivisor) ); // Trap occurs here } } Notice that the example has two functions that perform divide calculations. Those functions are doDivide() and doSafeDivide(). The doSafeDivide() function does not trap since it checks for a divisor equal to zero before performing the division. In contrast, the doDivide() function does not perform the check. When the application calls doDivide(), it will result in the following trap output.After following the project set up and code implementation steps you are ready to run the project and generate the SmartTrap report. Your module needs to be connected to your development computer via USB for MTTTY serial readout to work. Click on the Run icon found in the top toolbar or from the top menu Run > Run. If Eclipse asks about Run Configuration, select NetBurner Application. The Eclipse Console should indicate that the application has been sent to your NetBurner device with a Program Success message. From the top menu select NetBurner > Mttty. This will open a serial interface to interact with and view the SmartTrap features. Set the COM Port to the option that makes sense (if only one device is connected to your computer then there will only be one option. You may disconnect your NetBurner's USB cable and restart Mttty to see if there is a difference.) Set the Baud Rate to 115200. Press Connect. Press return/enter key when a cursor appears. Follow the prompts given within the white display area. There can be a few seconds of latency between prompts so be patient. The SmartTrap report will be produced within this window (see section below on how to read it). You will need to scroll up in the MTTTY window to read it. NOTE: you can adjust the font size of your MTTTY utility readouts to make it more readable. It's not pretty... but it can be helpful. There are three pieces of information that should be looked at (outlined in red in the figure above) – those are: The ”Faulted PC” address (found in the “Trap information” section) “The current running task” (found in the “RTOS information” section) The call stack for that task (in the “Task information” section) The task running while the trap occurred is Main#32 (that is a task priority of 0x32 in hex or 50 in decimal). Note that the Faulted PC value is also in the Main#32 call stack. Using this information, we can usually find which line of code caused the trap. This is done by using the addr2line tool.The addr2line tool (link to docs) converts the address of an instruction from your application’s .elf file into a line of code in your application’s source files. The .elf file is automatically generated during the build process, along with the application binary. It is VERY important that you use the .elf file that corresponds to the application that is running on your module. If you make even a small incremental change, it can change your .elf file drastically. Realizing the.elf file you’re drilling into doesn’t match what’s running on your module is only funny the first dozen times or so. To run the addr2line program for your MODM7AE70 (or other ARM based modules) follow these steps (for users of our older Coldfire platforms follow directions at the bottom of this section) : After successfully running the MTTTY steps, open a Terminal in NBEclipse IDE.1 In the terminal, change directory to the project directory. Enter the following command replacing “YourProjectElfFile.elf” with your actual ELF file name within your Release subdirectory. Also update with your hex value for the Fault PC value as we found in the previous MTTTY steps (replace 70019D92 with your value) ...  C:/nburn/gcc/bin/arm-unknown-eabi-addr2line.exe -ifCe Release/YourProjectElfFile.elf 70019D92 The output in the terminal will look similar to below, where the relevant main.cpp line numbers are called out. $ C:/nburn/gcc/bin/arm-unknown-eabi-addr2line.exe -ifCe Release/SmartTrapsEx.elf 70023536 doDivide(unsigned long) C:UsersmyusernbworkspaceSmartTrapsExRelease/../src/main.cpp:12 UserMain(void*) C:UsersmyusernbworkspaceSmartTrapsExRelease/../src/main.cpp:49 And of course, looking at line 12 of main.cpp in the doDivide function, we see that it's very possible to divide by zero on that line, especially when called from line 49. Note: If you’re developing on OS X or Linux, you can also use the addr2line command-line tool that's available within the OS. The following snippet shows example usage by inputting the Faulted PC address from the trap above. The addr2line flags used in this example are some that we like using, but you can find more flags with their descriptions by using the command, arm-eabi-addr2line --help (note that for ColdFire based platforms, this command is m68k-elf-addr2line). > arm-eabi-addr2line -Cife obj/release/SmartTrap.elf 70019D92 doDivide(unsigned long) /SmartTrap/src/main.cpp:12 UserMain(void*) /SmartTrap/src/main.cpp:49 Something to note from the trap output is that the Faulted PC address is also in the Main#32 call stack. It is not uncommon for the call stack to have several addresses. In which case, it might be helpful to input all of those addresses in the addr2line tool. This allows you to get the full picture of what is going on, and can provide more insight as to what went wrong between function calls. Note: For our Coldfire based systems (not ARM), you can run the above process with the Winaddr2line tool instead simply by doing the following. Top menu > NetBurner > Select addr2line In Project ELF field browse for the correct .elf file for the project. Enter the hex code form the Fault PC line in the MTTTY step. Press Decode and read the result Wrapping Up This divide-by-zero trap example was a simple one to help explain the tools and techniques, but Smart Traps can be helpful in solving complex bugs. Some bugs we’ve solved with Smart Traps include race conditions in variables that are shared across tasks/interrupts, deadlocks in critical sections, and much more. Now that you know the trap hunting workflow used by the engineers here at NetBurner, I challenge you to fearlessly develop complex applications! In part two of this article, we explain a bit more about the trap output and register information. We also explore an example of debugging when you can't just run addr2line on the Faulted PC. As always, we love feedback. If you have any comments or thoughts, please feel free to drop them in the comments section below. Alternatively, you can mail us directly at sales@netburner.com. ### Peer Verification: Getting to the Root of the Matter “There are a thousand hacking at the branches of evil to one who is striking at the root.” - Henry David Thoreau Staying Safe on the Network There’s been a lot of talk lately about staying safe, and rightly so. But how can you keep your IoT devices safe on the internet? Indulge us for a minute, and imagine the following scene: You’ve just phoned your Uncle George who lives a thousand miles away. It’s been well over a year since you last spoke with him, so you’re looking forward to hearing his calming voice. The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. Finding the Root ~ Source: Felix Mittermeier “Hello, Uncle George?” “This is your nephew Jack. How are you and Aunt Bea doing these days?” A familiar voice responds: “Jack! It’s great to hear your voice, my boy! Your Aunt and I are just fine, absolutely spectacular, thank you. So, tell me, son, to what do I owe the elegant pleasure of your phone call this morning?” Sure enough, even though you can’t see him, you relish the sound of Uncle George’s resonant baritone. The combination of his Southern accent and over-the-top manners crossing the miles via your phone connection are a delight to your ears, and you have absolutely no doubt that it’s your dear Uncle George who picked up the phone. “It’s really nice to talk to you as well, Uncle George. I’m sorry it’s been so long! But a fellow named Tom Shaw contacted me, claiming he’s my third cousin? And that you told him we’d discount his stay at our bed and breakfast? I just want to be sure we’re not being scammed by some stranger.” The next thing you hear is your uncle’s booming laughter. “So that’s what this is about? Yes siree Bob, I did mention your fine bed and breakfast to Tom last time he and Sally were over for dinner. Sorry I forgot to tell you about them! Don’t worry, boy, I’ll text you a photo of your cousin.” “Thanks, Uncle George!” A few minutes later, you’re looking at a photo of Tom and Sally. You look forward to meeting them, and in fact you think you’ll probably comp their stay at your B&B and see if they’ll let you show them around town. It’s not every day you discover a long-lost cousin! What just happened? You have, in fact, just run through a peer verification protocol with your Uncle George. As a result, you now have a very high degree of confidence that Tom Shaw is who he says he is. In a recent Learn Blog article about network security, we looked at the differences between RSA and ECC encryption. Encryption is key for keeping your data secure from prying eyes. In this learn blog, we’ll take a look at how peer verification works across the internet. We'll also explain why you should use it, and how it compliments encryption for a more complete secure connection.  Finally, you’ll see how NetBurner’s serial to Ethernet applications and development libraries support peer verification. This can make it easy for your IoT devices to positively differentiate between friend and foe across the vast and sometimes dangerous world of internet connections. What is Peer Verification? In a nutshell, peer verification is a process by which two entities that want to establish a connection via the internet assure one another of their true identity. No matter which side of the communication you may be on, you want to be sure “the other guy” you’re talking to is really who he says he is. Why The Need to Verify Your Peers? Peer Verification - It's more important than you might think. For a moment, consider the nature of public key encryption. It’s true that only you can decode and read messages encoded with your public key. However, you have to remember that your public key is public. Anyone at all can find and use your key; after all, you’ve published it for that very purpose. The question then arises: how can you (i.e., your IoT device) be sure that the client or server that sent you a message is really who they claim to be? Sure, you’re using asymmetric encryption to communicate with “them” in code, but who is “them?” Knowing with certainty who you’re communicating with is essential because your IoT application needs to be sure that access to the data and commands it allows are all legitimate. It’s the age-old problem of interlopers; there are plenty of black-hat hackers out there, ready to gum up the works by taking over your internet transactions for their own nefarious purposes. Fortunately, there are standards that specify ways you can use encryption to identify friends and to reject foes. This prevents your IoT device from unknowingly talking to an enemy and is where peer verification comes into play. By first going through a handshake protocol designed for this very purpose, you can be very sure that you are talking to a client or server that you trust. The TLS Peer Verification Standard The most widely used internet standard for peer verification (and secure communication in general) is called TLS (Transport Layer Security). TLS defines a verification “handshake,” an initial back and forth conversation between any client and server to help them decide whether and how they are willing to talk to one another. Getting into every gory detail of TLS is beyond the scope of this article; you can check the references at the end if you want to dig deeper. For now, we’ll point out and focus on one particular step in that protocol that many have struggled with. At the very heart of the TLS protocol is the use of a trusted third party—an entity that both sides of the communication rely on to vouch for them. This third party is known as the Certificate Authority (CA). What is a Certificate Authority? Simply stated, a certificate authority is anyone in whom you—by your actions when establishing a connection—choose to trust to vouch for the identity of the entity you subsequently communicate with. Reputation, Reputation, Reputation In the real estate business, it’s been said that the three most important features of a property are location, location, location. When choosing a certificate authority, it is usually the authority’s reputation that matters the most. In almost all cases, this means that the certificate authority will be one chosen from a fairly short, widely known list of professional organizations. These organizations take great pains to verify the identity of websites and their internet domain owners. How Does a Certificate Authority Validate a Certificate? Any internet domain owner can submit an application to the certificate authority organization of their choice requesting them to sign their certificate. When the certificate authority receives an application requesting their signature, they then require the applicant to jump through various hoops to prove their identity. For example, they may ask the requester to place some unique, identifying string on a web page under the control of the domain in question. Other tests may be applied, such as phone calls or text messages sent to a phone number listed in the domain’s “whois” listing. Domain ownership verification steps for GoDaddy Only after the certificate authority has verified the source of the certificate application to its satisfaction will it respond to the request. It does this by cryptographically signing the certificate for the use of the applicant. Subsequently, until it expires, that certificate can provide a reasonable level of confidence in the identity of the certificate holder. In our lead story, you recognized Uncle George’s voice on the phone, and he sent you a photo of Tom for verification; but in the case of an internet certificate authority, you need some special cryptographic tools to help establish identity. The rest of this article is intended to walk you through finding and using the one vital piece of information you need from the certificate authority in order to perform peer verification. This piece of information is called the Root Certificate. Setting Up The Basics for Peer Verification As an IoT device implementer, your mission—should you decide to accept it—is to get to the root of the matter. But is this Mission Impossible? A key question that must be answered to enable peer verification is, “Where do I find a copy of the Certificate Authority’s root certificate?” Sometimes, even the simplest things can be hard to figure out without a little guidance. Take heart! You’re not the first engineer who has been left scratching his head over finding these certificates. Fortunately, finding the root certificate you need is actually a fairly simple manual process. The first thing you have to figure out is which Certificate Authority issued the peer’s TLS certificate. If you trust that authority, and if they have signed your peer’s certificate, then you’re golden. Identifying the Certificate Authority Finding out which Certificate Authority a web peer is using is a straightforward, manual process. For the purposes of this example, we’ll be finding the Certificate Authority for https://google.com by using the Google Chrome browser. We’ll then use that information in a handshake between our IoT device and Google to verify that it is, in fact, Google that we’re talking to. Start by opening up the URL in your web browser. There, right next to the google.com URL, you’ll see a small padlock. Hover your mouse over the padlock and click it. Once you’ve clicked on the padlock, you’ll be able to select “Certificate”: After clicking on “Certificate,” you’ll see a hierarchy of three certificates: This hierarchy is called a certificate chain or certification path. The entry at the top is the Root Certificate for the GlobalSign Certificate Authority. The root certificate has signed the two certificates listed under it. Now you know that GlobalSign is the Certificate Authority that vouches for https://google.com. You also know that the Chrome browser has been able to validate that it is in fact Google. If next you click on GlobalSign at the top, you’ll see the following additional details: Among those details in this example, it is the Organizational Unit—‘GlobalSign Root CA - R2’— that is the key bit of information you need. You’ll find this process to be very much the same with most widely used web browsers. Getting a Copy of the Root Certificate CURL is an internet source that can provide you with a collection of the most-referenced Certificate Authorities’ Root Certificates. These are distributed in a format (called PEM) that makes it easy for your IoT software to use. Go to this curl link: 'Extract CA Certs from Mozilla'. From the top link on the page labeled “cacert.pem”, download the most recent compilation of certificates contained in a file called, surprise, cacert.pem. If you download cacert.pem, you can edit it with any text editor and extract the root certificate(s) for the CA’s you need to use. Though unintelligible to mere humans, trust me: your TLS library will love it! Here's an example of the actual text in PEM format that you’ll feed to your IoT device’s peer verification firmware: GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- Validating the Certificate Assume for the moment that your IoT device wants to verify that it is communicating with the real Google website. Your device can use a copy of GlobalSign’s root certificate to verify that the trusted authority in fact issued the certificate your peer (Google) has presented you with. By the way, you can use this same procedure to discover the root certificate authority for whatever peer you may want your IoT device to communicate with. Ready to Rock? Let NetBurner Help Whether you’re using an off-the-shelf device server or building your own embedded IoT application using one of our development kits, NetBurner can help ensure that you’re talking to exactly who you think you are. While you could implement peer verification entirely on your own by following published standards, NetBurner products, software, documentation, and support can get you there a lot faster and easier. Why not let us help? Providing the Information The root certificate you found and extracted from the cacert.pem file for the Certificate Authority you want to use can be fed to the NetBurner SSL/TLS library in the text format extracted from the PEM file. You can either compile it into your code as a string, or store it in a file to be read into your IoT device at runtime. Already have a development kit? See the examples found in \examples\SSL\SslClientVerifyPeerBasic and \examples\SSL\SslClientVerifyPeerEffs to see how to approach these two methods, respectively. For NetBurner’s device servers and serial to Ethernet servers, the web interface provides a handy way to upload your Certificate Authority’s root certificates directly to the NetBurner device. For more information please see the HTTPS section of the Secure Serial Factory Application User’s Manual. As always, we love to hear what’s on your mind. If you have any additional questions or thoughts on peer verification, please let us know in the comments below. You can also email us directly at sales@netburner.com. Digging Deeper: Recommended Reading This article provides only a simple overview of what’s involved in peer verification. If you want a deeper understanding, you’ll want to gain a more comprehensive understanding of how TLS works. This is especially true if you’re implementing an actual peer verification handshake protocol for your IoT devices, Here’s a well-written article that presents a more thorough, but still simple (and quite amusing!) overview: A simple explanation of SSL/TLS And we can’t recommend this NetBurner document highly enough: SSL Programming Guide The resources listed below are also very helpful. Some NetBurner TLS Resources NNDK 3.2 Documentation: SSL Programming GuideLearn Blog Article: Comparing RSA and ECC EncryptionNetBurner SSL/TLS How Toe:  “Creating a Self-Signed SSL/TLS Certificate for Secure IoT Applications”SSL/TLS Basics: “Cover Your Data Assets with TLS”WebSockets for Real-Time Web and IoT Applications: Part 1, Part 2, Part 3 NetBurner Cipher Support: The Latest Ciphers June 2018 Other TLS Resources CURL Homepage: https://curl.haxx.se/Peer Verification RFC: “Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)”Acunetix’ comprehensive series of articles on TLS SecurityIBM Knowledge Center: Cryptographic security protocols: SSL and TLS Glossary SSL — A network Secure Socket Layer; uses encryption for securityTLS — Transport Layer Security, an upgrade for SSLPeer Verification — A method to positively identify and secure client-server communicationPublic key encryption — Asymmetric encryption used for peer verificationCertificate Authority — A trusted 3rd party that vouches for internet peersRoot Certificate — The published, verified signing key used by the Certificate AuthorityCertificate Chain or Certification Path — A list of certificates used to authenticate a peerPEM — File format used for checking root certificatesSSL — A network Secure Socket Layer; uses encryption for securityTLS — Transport Layer Security, an upgrade for SSL ### Comparing RSA and ECC Encryption “To keep your secret is wisdom; but to expect others to keep it is folly.” - Samuel Johnson Can you keep a secret? OK, the identity of this man may be a secret to those of us who didn’t care much for history or literature in high school, so I’ll let you in on it: Samuel Johnson was a famous eighteenth century English writer. While he didn't contribute to either the RSA or ECC algorithms, he was definitely on to something when it comes to ideals of security. The Secret's Out. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. Samuel Johnson - Source: Wikimedia And it’s no secret that, like Geoffrey Chaucer, he, too would be writing for the NetBurner Learn Blog were he still alive today. Secrets are undoubtedly important, and vital like never before in our modern world. Because modern network technology enables us to convey information, including monetary value, almost instantly world-wide, it inherently demands that we consider the need for privacy and security—and that means secrecy by encryption. Transmitting a headline to a Times Square marquee is one thing; swiftly conveying an important business contract to a colleague in Paris, or an invoice payment to a creditor, is an entirely different animal: security that is only available through the use of strong encryption is an absolute necessity. Times Square - Source: Aaron Sebastian Even in the case of the marquee, we need to prevent “bad actors” from injecting unwanted messages, right? As the Internet of Things continues to expand, the veritable explosion of IoT devices gives black-hat hackers an ever increasing number of possible access points to attack, making device security more crucial than ever before. Are your IoT devices practicing “safe connex?” As you might imagine, there can be some pretty heavy-duty math involved in the algorithms that give us strong encryption. We won’t be digging that deeply today, but if you love to work through obscure equations, you’ll find some enticing references at the end of this article. A Little History Prior to the last quarter of the 20th century, all cryptosystems were symmetrical; that is, the same key was used both to encrypt and decrypt messages. This meant that both the sender and receiver had to have that key in hand. Then in 1976, Whitfield Diffie and Martin Hellman introduced the novel concept of using mathematics to create an asymmetric encryption system. What does that mean? By analogy, some systems in the physical world work easily in one direction, but with much greater difficulty in the other. For example, lobster traps are easy for crustaceans to enter but hard for them to exit. One-way mirrors, check valves, and trapdoors are other common physical devices that operate easily in only one direction. Lobster Trap - Source: Public Domain Pictures One-Way Mirror - Source: Alex Iby Asymmetric (also known as public key) encryption systems are somewhat like these physical items. They use mathematical functions that are easy to compute in one direction but nearly impossible in the other. The result is that, with the right software tools, you can choose a very large random number—known only to you—and create an asymmetric key pair (called public and private keys), but publish only the public key. Anyone wishing to communicate with you can encrypt their message using your public key. However, because only you have the private key of the pair, only you can decrypt the message. Modern IoT devices begin their client/server communication sessions by exchanging their respective public keys. Once the client and server are in possession of one another’s respective public keys, all further interaction can then be safely secured by encryption. RSA Cryptography It took a second team of math geniuses, Ron Rivest, Adi Shamir, and Leonard Adleman, to come up with a practical formula to actually implement the concept. The RSA algorithm they introduced in 1977 is still in use today, and although there is no elegant proof that it is unbreakable, (so far) no one has as yet found a provable flaw. The general idea behind RSA is to start with a random number of substantial size, and then run it through the magic RSA math function that produces two related numbers (a secret, or private key and a public key). The public key is then used to encrypt messages that can only be decrypted using the private key. Elliptical Curve Cryptography (ECC) The next major development in asymmetric codes, known as Elliptic-curve cryptography, was introduced independently by two mathematicians (Neal Koblitz and Victor S. Miller—one from academia, and one from the military) in 1985. As the name implies, ECC is based on mathematical equations that describe ellipses. An Elliptic Curve - Source: Elliptic Curve point addition (ℝ) Like the RSA algorithm, the equations involved in ECC provide us with functions that have a very low “computational cost” in one direction, but require far more computation in the other direction. As an added benefit, the keys produced by this algorithm are significantly smaller than those produced by RSA for an equivalent level of security. Which To Choose: RSA or ECC? But what criteria can you use to choose either RSA or ECC for a particular application? And once you’ve made that binary choice, which of the several flavors of each is the right one for you? You could try darts, or maybe just flip a coin… But that may not impress the boss when he asks you for your rationale. Darts ~ Source: Ameer Basheer Comparing RSA and ECC Fortunately, there are some objective metrics and other indications that can help you decide which is best for your project. The most important one is probably the key size vs security level. For comparable levels of security, ECC keys are smaller than RSA keys and can be computed considerably faster. To give you a rough idea of how big a difference this is, a 256 bit ECC public key is said to provide security equivalent to a 3072 bit RSA public key. This can be a significant consideration if you are, for example, trying to create a low power, low cost system. It can also give you faster SSL handshaking and consequently faster web page loading. Table Source: Atmel On the other hand, although keys are much larger and computation is slower, RSA algorithms and code are reputed to be easier to understand; check out this one-page, simple RSA implementation. And there are other considerations. You’ve probably heard the saying “I’m from the government, and I’m here to help?” Some have expressed concern over whether certain elliptical curves were chosen in order to provide government agents with a “back door” means of decryption. In fact, it’s been reported that some versions of ECC almost certainly contain “back doors,” and others are suspect. If you have a healthy level of skepticism, this may result in your rejecting the curves promulgated by the National Institute of Standards and Technology (NIST) and the National Security Agency (NSA)… unless, of course, you are required to use them for a government funded project. There also may be patent issues surrounding the use of ECC. Although many have expired or are on the verge of expiration, you may want to at least review the literature and patent history. If not consider, consulting your legal team on the matter. What’s the good news? You’ll be happy to learn that NetBurner provides you with the encryption support you need to secure your IoT devices, regardless of your choice of RSA or ECC. Whether you’re remotely controlling a manufacturing line or building a device that lets a homemaker turn on the oven before leaving the office, you don’t want “bad actors” taking over or even merely disrupting that communication. In addition to providing a library that supports a wide range of ciphers, our latest NNDK tools release, 3.2, contains scripts to help you create a self-signed certificates and keys using either ECC and RSA (our next 2.x release will contain these as well). You can find a list of the encryption algorithms that NetBurner supports in—that’s right!—another handy NetBurner Learn Blog article: The Latest Ciphers June 2018 What’s that you say? The list of cipher names looks like an indecipherable foreign language? Not to worry, here’s a link to the secret decoder ring you need to translate most, if not all of those obscure strings of acronyms: Cipher suite definitions Final Thoughts Security will only become more important as both the number of connected devices in the world as well as the types of tasks they are used to complete increases. This is especially true in embedded systems, where computing power and available resources are usually constrained, yet the data that is generated and managed is often sensitive. Hopefully our overview of RSA and ECC was both interesting and provided some helpful information when considering which algorithms should be employed in your next project. As always, we love feedback, and are always interested in hearing your thoughts. Please feel free to leave a comment below, or contact us directly at sales@netburner.com. Digging Deeper: Some Interesting Links If what you’ve read so far about asymmetric encryption methods and encryption keys piques your interest, and you want to plunge into the deep end of the pool to learn more, here are some excellent references to help you: General Web Resources RSA Implementation in Python: Website An excellent 4-Part Series on ECC: Elliptic Curve Cryptography: a gentle introduction An Elliptic Curve Drawing Program: Website Plot Elliptic Curves over Finite Fields: Website Bitcoin and ECC: Elliptic Curve Digital Signature Algorithm ~ The Cryptography of Bitcoin Key Size Comparison: RSA vs ECC Comparison for Embedded Systems from Atmel Pros and Cons: Comparing ECC vs RSA from Linked In NetBurner Resources NetBurner's SSL Guide:  “Creating a Self-Signed SSL/TLS Certificate for Secure IoT Applications” NetBurner TLS: “Cover Your Data Assets with TLS” WebSockets for Real-Time Web and IoT Applications: Part 1, Part 2, Part 3 SSL Manual: NetBurner SSL Programming Guide NetBurner Cipher Support: The Latest Ciphers June 2018 Glossary Encryption — Converting plain text to cipher text to obscure the meaningSymmetric encryption — A cipher that uses the same key for both encoding and decodingAsymmetric encryption — A cipher that uses different keys for encoding and decodingPublic key encryption — A widely used form of asymmetric encryptionRSA — The first viable public key encryption systemECC — Elliptic-curve public key encryptionSSL — A network Secure Socket Layer; uses encryption for securityTLS — Transport Layer Security, an upgrade for SSL ### RTOS - It’s About Time! “Time and tide wait for no man.”Geoffrey Chaucer Our opening quote dates back to the middle ages—believe it or not, long before the inception of the educational and informative NetBurner Learn Blog. While there is some controversy about whether Chaucer is quoting from an earlier source, if he were still around, he would no doubt be writing for the Learn Blog. Perfect Timing. Try Our ARM® Embedded Dev Kit Today. View Product Page Or, learn more about NetBurner IoT. Geoffrey Chaucer, famous medieval poet (Source: Wikimedia) But what do time and tide have to do with operating systems? And would Chaucer have a clue as to what an operating system is? In this article, we cover some key differences between a real time operating system (RTOS) and some other varieties. In the process, we hope to help you realize why NetBurner’s Epic RTOS is the OS you never knew you wanted, until now. You of course know what an OS is; in fact, you’re almost certainly using some kind of operating system right now to read this article. Let’s start with a quick review anyway, to give us a basis for understanding what “Real Time” means when applied to an OS… What is an Operating System? Modern computers, regardless of make or model, are invariably extremely complex devices. Using them every day, we bask in the light of our high resolution color monitors. Doing so, we take our computers for granted. Rarely do we think about all of the pieces and parts that are lurking “under the hood.” Colorful OS - Source: Daniel Korpai A typical computer comprises an almost bewildering array of elements and devices. These all must work together in concert to provide the services of the system as a whole. Major compute elements may include the CPU (Central Processing Unit), high-speed cache memory, DRAM (Dynamic Random Access Memory), mass storage devices (HDD, SDD, DVD-ROM, etc.), network interface hardware, GPUs (Graphics Processing Units) and many other peripheral devices such as printers and plotters. Courtesy of your OS, your computer seems to be able to do several things at once. For example, when you start a print job, you can go right back to editing the next version of your file, or reading your email, or playing Breakout… all while you’re listening to the latest MP3 hit streaming in over the network. How is your computer able to do all these things at the same time? Behind the Magic: Tasks In reality, each of those operations, called “tasks,” is being sliced and diced by your OS. This is called “multitasking”. Your OS allocates a certain amount of time for each task to operate, and gives time to the next task—maybe while the first is waiting on an I/O, or maybe just because it’s the next task’s turn. It just seems like everything is happening at once. Computer System Components - Source: Davie Bicker Sophisticated operating systems make all of this possible, if not dead simple. OSs provide a scaffold, an underlying structure and interface definition. This enables computer users and the producers of computer hardware of all kinds to easily meet on common ground. Additionally, they provide a more or less standardized platform enabling software developers to create the amazing solutions to everyday problems that we have come to rely on. We expect our spreadsheets, CAD/CAM programs, and even our guilty pleasures—the fantastic space adventures and shoot-em-up games we love—to just be there and run as needed. And developers no longer need to worry about what kind of graphics card we’re using, or the details of how a specific monitor will display the text and graphics of a program’s output. They write for a generic interface standard, and the OS and device manufacturers take care of the rest. Some common operating systems If you’re at your desk, you’re probably using one of the “big four” OSs right now... Windows, macOS (formerly OS X), Linux, or Unix. If you’re reading this on your phone or tablet, it’s likely using one of these: Android, iOS, or maybePalm Os or Blackberry or some flavor of Windows… Software operating system company logos | graphic designed by Vexels Some of these OSs are more agile than others. Linux, as an example, is a relatively “light-weight” operating system—especially if you’re comparing it to that 300-pound gorilla, Windows 10. Sure, your PC may run faster and slicker on Linux. However, your embedded device may have requirements that Linux is just not capable of meeting. But are any of those systems truly suitable for IoT? More often than not, standard, consumer OSs try to be all things to all men. Their universal nature prevents them from dealing effectively with one of the most important elements that IoT devices are preoccupied with; namely, the focus of this article, time. One Drawback of Standard Operating Systems Don't be late! Time is of the essence... Like the appointment secretary in an office, operating systems must schedule a multitude of programs so as to make the best use of available time and resources. The secretary uses an appointment calendar, coordinating individual availability, lunch breaks, conference rooms, international time-zones, and so forth, to produce the best outcome for all involved. An OS may use one of several standard scheduling algorithms that have been devised for this purpose—First Come, First Served; Shortest-Job-Next; Multiple Level Queues, and etc. Perhaps the simplest, most commonly used approach is Round-Robin Scheduling. But typical operating systems aren’t overly concerned with priority (which task is more important). To be sure, their device drivers handle some time-dependent input and output in frequent, short bursts. However, at a higher level, task switching between programs typically occurs in a round-robin fashion that can be arbitrarily delayed. Programs have no guarantee of timeliness when running. In fact, you’ve probably experienced the frustration of a program temporarily “locking up” while you wait for your favorite OS to do some memory “garbage collection” or other essential housekeeping task. Like the White Rabbit that Alice encountered in Wonderland, your program may end up running late for a very important date. This is not cool! IoT devices have needs that simply can’t wait! Devices Need OSs, Too! Thank goodness, there is a class of operating system designed with time explicitly in mind. Now that the Internet of Things is the latest rage in embedded systems, companies everywhere are creating increasingly sophisticated network-connected devices. Perhaps you’re working on one now, or have an IoT device in the planning stages. As a developer, you don’t need or want to know every detail of the hardware your code is running on. But the time has come to think about the topic we began this article with: namely, time. “Real-world” devices often interface to time-dependent physical hardware, or to processes that must happen not only in a particular sequence, but also on a specific schedule. The RTOS, or Real Time Operating System, is specifically tailored to accommodate time in the real world. An RTOS can deal not only with wall-clock and calendar time intervals, but also with the far more stringent time requirements of things like elevators, automobiles, and aircraft. While your desktop OS tries to be everything to everybody, there are things a simpler—but better suited—RTOS can do much better. Anything You Can Do, I Can Do Better! https://youtu.be/WO23WBji_Z0?t=10 Can an RTOS really do “anything” better? Well, maybe not anything… But an RTOS can certainly do the things a typical Internet of Things device or embedded system needs better than desktop OSs. Included with every NetBurner IoT development kit, let’s take a look at the core features of NetBurner’s RTOS, the epitome of a superior Real Time Operating System. How is an RTOS Different? In an RTOS, time is of the essence. A good RTOS gives the programmer a set of tools that enable precise control over the scheduling of time-dependent tasks. Using them, of course, requires thoughtful design by the programmer—a subject worthy of plenty of study and practical experience. However, understanding the basics is fairly simple. Preemption Program tasks are preemptive, meaning that the highest priority task always runs—for as long as, and whenever it needs to. In NetBurner's RTOS, the number of available task priorities is defined as OS_MAX_PRIOS in the file ‘constants.h’. Priority values can range from OS_MAX_PRIOS-1 (the highest task number, which is the lowest priority) to 1, (the highest priority available). But, here is a key point that is very important to note: whenever a task has completed whatever actions may be important at that time, it must yield control so that lower priority tasks can run. A task gives up time by blocking (also called pending) on some condition or event. What does that mean? The task can use a function to ask the underlying RTOS to take over. This allows other tasks to run until some predefined condition is satisfied. This can be a simple time delay, or a complex combination of inputs, timing, and other contingencies. In NetBurner applications, this is often done with a call to OSTimeDly() or some other RTOS Blocking Function. A Real World Example Olympic Runners - Source: David Mark For example, suppose you’ve been asked to record runner times in the 100 meter dash at the upcoming Summer Olympics in Tokyo. You look at the record of past results, and see that timings for the dash are recorded in hundredths of a second. You know you’ll need several logically independent tasks to do the job: a very high speed clock task to track time elapsed since the starting gun; a camera task watching the finish line; a scoreboard task displaying the time for the crowd to watch; a network task transferring status and results to officials; a logging task to preserve the data for posterity; probably others you’ll figure out as you go along. The highest priority task in the timekeeping clock you create for the event will be a “tick” task that tracks real-time at least ten times faster (milliseconds). When it sees the millisecond clock tick over, it adds 1/1000 of a second to its millisecond count. Every 100 milliseconds, the task also increments the 1/10th second counter. It proceeds to do this for each digit in the timekeeping clock. That timekeeping task must be the highest priority, or the system could lose track of the elapsed time. However, once it completes its work, unless it blocks and yields time to the next most important task, the system won’t do its job! That task is the camera watching for each runner to cross the finish line. There is an overhead camera staring at the finish line. It can “see” each runner approaching, and then crossing the line. When that happens, the task takes the current value of the timekeeping clock, stores it in association with the runner’s name, and then pends to yield time for any lower priority tasks to run. For example, that scoreboard task, or that task that transmits status and results to a broadcast announcer. When all lower priority tasks have completed, the system “Idle Task” will run until another task “wakes up” and takes over. By the way, actual Olympic timing in our modern age is now recorded in microseconds. Shared Data Protection Multiple processes in a Real Time system often need to share data. More than one process may need to modify the data. If data access isn’t carefully controlled, it can become corrupted and the system operation will fail. An RTOS provides multiple mechanisms for ensuring that shared data is accessed and updated in a reliable manner. Let’s look at several of the NetBurner RTOS mechanisms that accomplish this, along with some examples of how they might be used in the real world. Semaphores The term “semaphore” from the Greek meaning “sign bearer,” came into use in the early days of railroads. Semaphores were used to signal locomotive engineers by means of easily seen mechanically operated flags. The flags warned the engineer of conditions ahead in order to prevent trains from colliding at a crossing. In a real-time IoT device, a Program Semaphore may be used to allow multiple tasks to update some data at the same time without corruption. For example, suppose that identical parts made by identical machines on opposite sides of a storage bin are being added to the bin. At the same time workers remove parts from the bin to fulfill orders. We want an accurate count of the total number of parts in the bin at all times. We also want to ensure that the bin doesn’t overflow. A semaphore can regulate access to the total parts count variable, allowing each machine to safely update the total in turn. They will account for parts removed, and turn the production machines on or off to prevent the bin from overflowing. How Semaphores Saved Snoopy Snoopy and Red Baron - Source: WildBrain, Ltd. Let’s have some fun and get a better understanding of semaphores... This time, you’re Snoopy, piloting a souped-up Sopwith Camel. “Curse you, Red Baron!” you shout, coming out of your Immelman turn right on your nemesis’ tail. You line him up in your crosshairs. As you’re about to squeeze the trigger on your Vickers machine guns, you hesitate… Did you implement the semaphores correctly? The guns are mounted on the fuselage, behind the prop. The last thing you need is hot lead shattering your propeller to splinters! Those rounds had better be precisely timed, perfectly coordinated with the position of the blades... But there’s no time to stress over the matter; you’ll find out soon enough. Trigger engaged, you see tracer rounds streaking toward the Fokker DR1. You pull back slightly on the stick. Just as your rounds begin piercing the fabric of his tail section, the Baron pulls into a steep climb and out of your sights. The good news, however, is that your prop is still spinning. It pulls you past him and out of range of his nasty guns. Better yet, none of your bullets hit your prop! The semaphores you established to synchronize the Vickers firing pin with the position of the prop blade must have done their job. Thankfully you won’t be spinning to earth! As that was the last of your ammunition, you continue forward. In your mirror, you see the Red Baron execute a hammerhead stall and head off into the sunset to fight another day. Meanwhile, you head back to your laptop to tweak your aiming software... In a similar fashion, RTOS semaphores are used to coordinate the operation of more than one task, enabling tasks to coordinate in time. OS Flags The NetBurner RTOS also facilitates the creation of bit-mapped flags. A semaphore can block on only a single event. Similar to a semaphore, a flag goes beyond a single event. This enables a task to set and act upon a collection of status bits that define a logical combination of multiple events. Queues and FIFOs A queue is a very useful mechanism that allows multiple independent tasks to both read from and write to a common data stream, without “stepping on” one another’s toes. In the NetBurner RTOS, the only difference between the two is that they handle different kinds of data; queues handle a fixed number of pointers to data, while FIFOs are linked lists of data structures. You could think of queues as somewhat like the sections of this marble maze where the marbles are forced to stay in line as they pass through… https://youtu.be/6pTpRop3aBE Marbles in a Queue - Source: YouTube Warning! Watch at your own risk: this video is so addictive, you may not be able to turn it off! Critical Sections Hey! If you’re going to be critical, go somewhere else! Just kidding; we love constructive feedback. But, in this context, “critical” means something your task must accomplish without interference. Sometimes a logical operation needs exclusive access to resources from start to finish. Under normal circumstances, those resources might be preempted by a higher priority task. By declaring a critical section at the beginning of the operation, a task can gain exclusive access to a resource until it is done using it. Cake Decorating - Source: Oliver Lechner Suppose for example you’ve built a cake decorating machine. You have one task assigned to inserting colored icing into the lettering syringe. You also have another task assigned to squeezing the icing out into letters and words. Do you want to be sure a word is completed, start to finish, all in the same color? Make that operation a critical section, and the color change won’t take place until the word is completed. Conclusion: An (R)TOSs-Up? NetBurner may have just the right RTOS for you… Or, just maybe, the project you’re looking at might need something more—or less—sophisticated. Ultimately, only you can make that determination, but NetBurner Learn Blog articles may help you figure it out. Arduino, NetBurner RTOS, and Raspberry Pi For example, in a previous Netburner Learn Blog article, we offer a detailed comparison of three significantly different approaches—Arduino, NetBurner, and Raspberry Pi—to IoT. Now that you “get” the basics of what an RTOS has to offer, if you’re trying to decide which way to go, that article may be just what you need to arrive at a good conclusion. NetBurner Support Our engineers are always eager to help, so please contact us with your questions, or feel free to leave comments below. Useful References Comparing RTOS to Infinite Loop Designs - NetBurnerNetBurner RTOS Documentation - Your reference resource for our RTOSArduino, NetBurner, and Raspberry Pi - Comparing three solutions Glossary OS or O/S — An Operating System manages a computer’s hardware and softwareReal-Time — The ability to deal with time-dependent eventsRTOS — Real-Time Operating SystemMultitasking — Multiple tasks can run without fixed hand-offsPreemptive — The highest priority task always runsSemaphore — A tool for preventing unwanted task interactionMailbox — A tool for inter-task communicationFIFO — A First In, First Out queue for dataPriority — The level of importance at which a task runsBlocking — Task suspension waiting for some event, such as an input or outputPending — Synonym for blockingRound-Robin — A popular method of scheduling tasks, one after another in a fixed sequenceIdle Task — A system task that runs when no other task is activeDRAM — Dynamic Random Access MemoryHDD — Hard Disk Drive, a kind of mass storage deviceSDD or SSDD — Solid State Disk Drive, like an HDD but faster, without moving partsDVD ROM — Digital Video Drive-Read Only Memory - an optical mass storage deviceGPU — Graphical Processing UnitIoT — The Internet of Things, namely, devices of all kinds connected to the network so they can provide information to and/or be controlled by remote applicationsIoT Device — Any internet-connected product, i.e. pretty much any “thing” with an on/off switch ### Time Zones and Daylight Savings: Getting it Right with Olson and POSIX Once again, clocks will "spring forward" on Sunday, March 8. What does that mean for your application? If your software requires accurate time, then setting a clock is not sufficient. An NTP Server may be used to ensure that your time is accurate, but NTP does not utilize time zones. All times broadcast on NTP are broadcast in Coordinated Universal Time (UTC). If the application requires local time, then it must be aware of both time zones and daylight savings. In the standard C/C++ time library, time zones and daylight savings are described in two separate standards, Olson and POSIX. Figure: Railway time, an early prototype to universal timezones. Olson Olson format utilizes a database that tracks each daylight savings change, be it by law, war, or even to reduce the mental strain on students studying for national exams. (A change that was reverted, but not before a rule was created to meet the change). Naturally, this database can get quite large. The North America database is well over 3000 lines, including meticulous comments on each change. This capability comes at a cost. Lookups must load and parse the database, which may lead to a performance penalty. Patches for the Olson database are released many times a year, as governments have a habit of modifying their time zone and daylight savings rules, often with little or no warning. The database is public-domain, and can be downloaded at IANA.org.# Olson database for Luxembourg marking the switch to Central European # Time (CET) after the Germans invaded in 1940 Zone Europe/Luxembourg 0:24:36 - LMT 1904 Jun 1:00 Lux CE%sT 1918 Nov 25 0:00 Lux WE%sT 1929 Oct 6 2:00s 0:00 Belgium WE%sT 1940 May 14 3:00 1:00 C-Eur WE%sT 1944 Sep 18 3:00 1:00 Belgium CE%sT 1977 1:00 EU CE%sT Posix POSIX format takes a different approach to managing time zones and daylight savings. Instead of maintaining a historical database, POSIX format explicitly defines time zone and daylight savings rules in a single string. Historical lookups are not supported. This approach offers a performance advantage, increasing lookup speed. For example, the POSIX string describing Eastern Standard Time (EST) and Eastern Daylight Time (EDT) is EST5EDT4,M3.2.0/01:00:00,M11.1.0/02:00:00.EST5 is the timezone name and offset from UTCEDT4 is the daylight savings timezone name and offset from UTC,M states how to parse the following. In this case, it will describe Month.Week.Day3.2.0 is the start of EDT. It is the third month, second week, first day (Sunday)/01:00:00 is the hour EDT starts,M states how to parse the following. In this case, it will describe Month.Week.Day11.1.0 shows the end of EDT. Is is the eleventh month, first week, first day (Sunday)/02:00:00 shows the hour EDT endsDaylight savings time does not always follow the template of "spring forward" one hour in March and "falling back" one hour in November. In the southern hemisphere, if observed, daylight savings time begins in the fall, opposite of the northern hemisphere. A few unique cases can be examined in POSIX format. Local Time and Your NetBurner As always, our goal at NetBurner is to help you get your applications up and running without having to worry about the details and minutia of every system, standard, and protocol available. To help get local time requirements under control in your programs, we've provided a function, tzsetchar(), that can be used to set the local time on your module using a POSIX formatted string. Using it would look something like this:tzsetchar("EST5EDT4,M3.2.0/01:00:00,M11.1.0/02:00:00");You see this in action in our NTP client example (available with our NNDK), where we show how to get the time from an NTP server, and then display the UTC and local times to a serial port. Conclusion That about wraps up this article. We hope that it has shed some light on the sometimes confusing world of time zone formats. As always, we'd love to hear your thoughts, experiences, and concerns when it comes to time zones and building robust embedded applications. Please feel free to drop something in the comments below, or email us directly. ### IPv4 vs. IPv6: Why the Fuss, and How We Can Help When packets get sent through networks, either privately on your home network or publicly on something like the world wide web, there are bits of information included so that various devices know where these packets should go. You can think of this information as the digital equivalent of an address label.Like address labels for your physical mail, the labels for your digital packets follow a predetermined format as well. Currently, there are two standards in use: IPv4 and IPv6. In this article, we will briefly cover where these standards come from and why there are two. We'll also look at what this means for you as you create and build using NetBurner. What is the Internet Protocol (IP)? Before we begin, let’s define some terms so that we can make sure we’re all on the same page.First, a protocol is simply a set of rules that governs how things should happen. For the purposes of this article, we care about what’s called the Internet Protocol (IP). This defines how connected devices “talk” to one another. It covers things like how data packets should be addressed (and therefore identified), how packets should be routed to get from Point A to Point B, and so on.Sometimes you’ll see the term TCP/IP or similar bandied about on the internet. IP determines how packets are addressed and transported. However, they can be handled in many different ways once they reach their destination. One of the protocols that governs this is TCP (hence TCP/IP), and less commonly UDP (UDP/IP). What are IP Addresses?​ Any device that connects to a network using the Internet Protocol (IP) for communication gets a unique identifier. This identifier is called the IP address. Ideally, each device gets a unique address so that you can tell one device from another. The IP address, as you can imagine, is used to make sure that data “addressed” to you gets delivered to you and data that is “addressed” to your neighbor goes to your neighbor (and not you). The IP address also provides information about the device’s location in the network. This helps determine the right path for data packets to take when being routed from Point A to Point B. IPv4 vs. IPv6 There are two types of IP addresses: IPv4 (whose name comes from the fact that its format was defined in the Internet Protocol version 4 document...very creative, we know) IPv6 (which was defined in *drumroll* Internet Protocol version 6), created to handle the problem of IPv4 not allowing a sufficient number of unique IP addresses When looking at IP addresses, you’re most likely familiar with IPv4. These are 32-bit numbers that look something like 172.168.32.1. IPv4 addresses feature four individual values and each value only allows eight bits. This means that such addresses can only range from 0.0.0.0 to 255.255.255.255. However, as the internet has exploded, the need for unique IP addresses now exceeds the number of addresses available. And that’s why we have IPv6. Since the mid-2000s, the deployment of IPv6 addresses has been ongoing. These addresses are 128-bit numbers that are slightly less readable to end-users: 2001:db8:0:1234:0:567:8:1. To take a look at how this impacts the packet structure, checkout the headers for IPv4 and IPv6. Reserved IP Addresses Not all of the IP addresses possible are available. There are a select few set aside for special purposes which you should be aware of. Its poor form to step on toes by attempting to assign and use an unavailable IPv4 or IPv6 address. Also, it just doesn't work. You’ll notice that a lot of the reserved addresses are “private” addresses. This means that they are used internally behind a router and aren’t a part of the public sphere. For example, the IPv4 addresses from 10.0.0.0 to 10.255.255.255 and from 192.168.0.0 to 192.168.255.255 are used only for local communications. In IPv6, the analogous address block is fc00::/7 (which begins with fc00:: and ends with fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff). What does all of this mean for you? As you can imagine, there are some compatibility issues when it comes to working with devices that expect IPv4 addresses and devices that expect IPv6 addresses. How does something expecting one type “talk” to one that expects the other type?First, you should know that there are two ways to “store” an IPv4 address so that it features an IPv6 structure (the latter of which is “seen” by the networking devices): Mapped Addresses Mapped addresses allow the utilization of IPv6 services across IPv4 infrastructure and rely on stateless address mappings between IPv4 and IPv6 to transmit IPv4 packets. In short, everybody involved knows that the packets are IPv4, but they have a corresponding (or “mapped” address) that allows the incompatible technologies to work together. In other words, IPv4 addresses are stored as mapped addresses. You can think of mapped addresses as a way to store an IPv4 address in an IPv6 object. Such addresses are never meant to be seen in its original IPv6 format when being translated over a network. This method creates what you could call a “dual-mode stack.” The devices in question should send IPv4 packets when communicating with an IPv4 device and send IPv6 packets when communicating with an IPv6 device. Translated Addresses IPv4-formatted addresses (e.g., a.b.c.d) are translated to :ffff:0:a.b.c.d, which refers to an IPv6-enabled node. Translated addresses are useful if you are working with an IPv6 host that does not have an IPv4 stack. These allow you to facilitate communication between the host and an IPv4 device by translating IPv4 addresses and packets to their IPv6 analogues. Reserved Address Blocks for Mapped and Translated Addresses Note that IPv6 features specific address blocks reserved to indicate both mapped and translated addresses. Purpose Address Block First Address Last Address IPv4 Mapped Addresses ::ffff:0:0/96 ::ffff:0.0.0.0 ::ffff:255.255.255.255 IPv6 Translated Addresses ::ffff:0:0:0/96 ::ffff:0:0.0.0.0 ::ffff:0:255.255.255.255 How NetBurner Handles IPv4 and IPv6 Interoperability NetBurner uses mapped addresses to make sure that it can handle both IPv4 and IPv6 addresses. This ensures that devices for either type can communicate with one another seamlessly. NetBurner, set to IPv6 mode, will operate identically to the NetBurner that’s been set to IPv4 mode when handling IPv4 traffic. That is, if all of the addresses you provide to NetBurner are formatted as IPv4 addresses, it will issue and send IPv4 packets. If any manipulations of the IP addresses are needed, NetBurner handles this with the included IPADDR class. For Users Migrating from an Older Version of the NetBurner Network Development Kit (NNDK) If you are using an older version of the NetBurner Network Development Kit (NNDK) and you plan to migrate to a more recent version, there are several considerations that you should be aware of: The internal storage of IPADDR has been expanded from 32 bits to 128 bits. If you have designed your own binary-formatted structures that contain IP addresses, you must change their declaration to be IPADDR4 for these structures to be backward compatible. NetBurner handles all standard IPv6 link and prefix discovery in the background. If you receive IPv6-formatted packets (UDP, TCP, and so on), the printout of the associated addresses may be larger than you expect. Be sure to account for this if your application interfaces and the like are expecting addresses to be of a certain size. Otherwise, you may find that the addresses aren’t displayed correctly. You can choose to send both TCP and UDP traffic to devices that have IPv6 addresses. Regardless of whether the IPv6 address comes from DNS or input text, NetBurner knows how to handle these packets. The TL;DR? Here are the code changes you will need to make: IPADDR is now a C++ object instead of typdefed (a basic type), so to check for a null IP address use ip.IsNull() and ip.NotNull() (and not ip == 0). In your structure definitions, change your use of IPADDR to IPADDR4 for full backward compatibility with regard to binary structures. You don’t have to configure ANYTHING in IPv6 land to use IPv6 or IPv4. It will just happen (this is the magic of NetBurner at its finest! ). Update any areas where you expect to input or output IP addresses to the user. This is so that it is capable of handling longer text strings. Wrapping Up IPv4 addresses are a familiar breed to most people, but there aren’t enough of these to go around. That’s why we have IPv6 addresses, a system that allows for a larger number of unique values. However, the adoption of IPv6 addresses hasn’t gone seamlessly. As a result, we have an environment where we use both IPv4 and IPv6 addresses. The two types can’t be used interchangeably, so if you are expecting to work with packets with both types of addresses, there are extra design concerns you need to think about. However, NetBurner has done some of the heavy lifting on your behalf when it comes to writing applications that can utilize both IPv4 and IPv6 addresses. As always, we'd love to hear any questions and comments you have on IPv4 vs IPv6. Please feel free to say something in the comments below or email us directly at sales@netburner.com. ### SPI - What It Is, How It Works, and What It Means For You “Time is nature's way of keeping everything from happening at once.” - Woody AllenPast articles in the NetBurner Learn Blog have introduced several serial protocols. Some of those protocols (RS232 and RS485 and RS422) are intended for communication via cables between systems across moderate distances. As you may know, NetBurner provides solutions for extending those point to point protocols to function between devices anywhere on the planet.We’ve also introduced you to the I2C protocol, intended for point to point serial communication among devices within a single system, usually on a single PCB or within the same box. In today’s blog, we’ll consider another “on-board” serial protocol, the Serial Peripheral Interface, or SPI. Woody Allen (Source: Wikimedia) Why use an on-board serial protocol? Our lead-in quote from Woody Allen offered his amusing insight into the underlying purpose of time. Similarly, serial hardware device interfaces like I2C and SPI have an underlying purpose; they offer the benefit of simpler hardware if you can afford more time to transfer data. Paraphrasing Woody, “Serial busses are an engineer’s choice when everything doesn’t have to happen at once.” When designing a complex hardware system, this often turns out to be a desirable tradeoff.Consider for example the circuit traces and logic chips that might be required to access a conventional four-megabyte memory. A memory that large requires 22 wires to specify a memory address, and eight or more wires to transfer the data, depending on word size. The system design may additionally require several clock and control lines, as well as buffer and bus latch devices for holding data as it is transferred between chips. Complex Memory Logic, circa 1975 - Source: WikimediaMicrocomputer systems developed in the last quarter of the 20th century, such as S-100, VME, and PCI, employ wide, parallel busses in order to accelerate processing. While this many-wire, multiple device complexity may be important to achieve high speed in a computer system, it is generally not necessary in a modern embedded IoT device. Using a serial bus (like I2C or SPI) can reduce the 30+ wires of our memory example to just a few. Simpler Large Memory SPI Schematic for this Embedded IoT PCB The History of SPI The SPI standard was created by Motorola in the mid 1980’s, not long after the I2C bus was invented by Philips. SPI rapidly became a de-facto standard. Because of its benefits and utility, it has been widely adopted by industry. And, although the closest thing to a formally published, agreed upon standards document is this out-of-print ‘SPI Block Guide’ datasheet from Motorola, SPI has been uniformly interpreted and implemented with only slight variations by many different companies. A large and still growing number of devices exist and are available for incorporation into IoT devices and other embedded systems. SPI Functional Overview The SPI specification is simple and very general. The protocol describes a very clear Master / Slave relationship among devices, transferring data via a simple shift register mechanism. An SPI System with a single slave The SPI master uses at least three output lines to control the bus: one for data (MOSI—Master Out Slave In), one to clock the data (SCK—Serial Clock), and one each to select the slave it wishes to interact with (*SEL—Slave Select). The slave device accepts master control and responds by putting data on its single output line (MISO—Master In Slave Out). Master and Slave form a circular shift registerThis diagram illustrates how an eight-bit transfer of data between a master and a single slave device works. Although the diagram pictures an eight-bit transfer, the SPI protocol doesn’t specify any particular number of bits. The transfer size is entirely up to the device implementation. The system designer must carefully read device spec sheets in order to understand and program for the number of bits being transferred in an SPI operation.In this example, once the *SEL has been asserted (i.e. pulled LOW) by the master device, the master will drive the clock and data lines like this: Clocking (Assumes device already selected. View of one byte worth of outgoing bits.)Notice that the master sets MOSI before SCK because data is transferred on the rising edge of SCK (dotted lines). Note also that because *SEL, MOSI, and SCK are completely under the master device’s control, they need not be “regular” (as illustrated in this diagram). In other words, the length of the clock pulses can be arbitrary. This makes it entirely possible to “bit-bang” an SPI master device, because the master governs the interface timing completely with the outgoing lines. An SPI System with multiple devices SPI systems can include an arbitrary number of Slave devices. However, each Slave device must have its own separate select line. Here’s a diagram illustrating how multiple Slaves may all be interconnected on the three common SPI Bus lines, but each must have its own *SEL line.In a multi-slave system like this, only one slave device at a time is selected by the master and actively in operation. The SPI Bus supports an arbitrary number of slave devices An alternate SPI configuration An alternate SPI Bus configuration: the Daisy ChainIn a less used, but definitely possible configuration, a system designer may choose to daisy chain SPI devices. Note that this only works if the devices and their specific operating protocols are designed with daisy chaining in mind.In a daisy chain configuration, data originates with the master device as usual, but is then shifted sequentially through all the slave devices. As illustrated here, all slaves are selected simultaneously, with each slave feeding data to the next slave in series, until data finally returns to the master device from the last slave’s MISO line.Because one *SEL line enables all slaves, daisy-chain wiring is a little simpler. The master also gains some insight into whether all devices are working, because data must pass through every slave in the chain before returning to the master. Of course, software on the master device must be aware of the length and purpose of the entire shift-chain and its associated slave devices. The devices themselves must be intended for this sort of SPI setup.For the curious, here is an application note with a detailed example showing three analog to digital converter (ADC) chips daisy-chained on a common SPI bus. The appnote explains that the design of the ADCs in this example incorporates particular characteristics supporting the daisy-chain configuration.For comparison, here is another application note explaining the operation of another manufacturer's motor controller chips daisy-chained on a common SPI bus. Once again, the chips in this example incorporate features to support daisy-chaining. An example of SPI device operation Here’s an example of how a real-world SPI device operates. The following timing diagram is taken from the datasheet for an SPI memory device. The operation depicted is a memory read.As always, the operation begins with the master asserting *SEL (here labeled *CS, or “NOT Chip Select.”) Read timing for a typical SPI memory device. Source: Atmel/MicrochipThe master then begins transferring data required by the device out via MOSI (here labeled simply SI). One bit of data is shifted out as the master asserts each SCK pulse.In this example, the master must transmit an eight-bit READ Opcode (0x03) followed by the sixteen-bit address of the desired memory content. Having received that information, the memory device then begins shifting data out on the MISO line (here labeled simply SO).If the master continues clocking the device, as many bytes of data as desired can be read out of the serial memory, one byte after another, without needing to re-issue a READ Opcode or further memory addresses. Spy vs Spy? No, I2C vs SPI Because the SPI bus is I2C’s major competitor, comparing and contrasting it with I2C should be a profitable exercise. Let’s see what happens when we pit SPI against I2C in three major categories: Hardware, Protocol, and Speed. Hardware Comparison I2C offers a simple hardware interface (only two wires!) that can access a very large number of devices. SPI, on the other hand, requires three common bus lines plus one additional dedicated select line for each device on the bus.The I2C bus is a tri-state bus. When none of the attached devices is using the bus, it “floats.” In other words, when the bus is not being used, it is held in a high-level (logic 1) state by weak pull-up resistors (typically 10K ohms). Spy vs Spy (Source: Mad Magazine)Because of that very high resistance, the bus is available and it is easy for any device on the bus to assert a ‘low’ signal. In most cases, devices generate ‘high’ signals by simply releasing their hold on the bus and allowing the pull-up resistors to pull the bus high (though there are some exceptions for higher-speed I2C devices).In contrast, SPI bus lines are actively driven both low and high. This hardware difference makes SPI bus level transitions sharper and less susceptible to interference from electrical noise. The SPI bus also consumes less power than I2C because it only draws current when data is being transferred.I2C wins this round in the wiring simplicity category, but SPI wins in the noise immunity and power consumption categories. Protocol Comparison As we’ve seen in our previous article, the I2C software protocol is rather complex. Having only two lines to work with, that protocol needs not only to carry data, but it also must specify which slave is being addressed. Furthermore, because any device on the bus can become a master, the protocol must allow for arbitration and bus acquisition. All this adds to complexity and takes time.SPI wins this round, because to address a particular device, it simply lowers the device select line. This simplicity also gives it an edge in our next category. Speed Comparison SPI bus is significantly faster than I2C. There are multiple reasons for this.I2C is inherently a half-duplex protocol, that is, data can only travel in one direction at a time. Because the I2C bus floats between messages, time must be allowed for the pull-up resistors to return the bus to a high level. Because all control is “in-band,” the I2C protocol has much more overhead than SPI. These three significant differences make I2C relatively much slower than SPI.Although I2C bus speed has been improved over the course of its existence, SPI wins the speed round hands-down. Variations On A Theme A detail of lesser importance, but one to be aware of, is that there are four “modes” that SPI can run in, labeled Mode 0, 1, 2, and 3. Many descriptions of the SPI protocol will try to “snow” you and make this seem complicated; it isn’t, really. These “modes” are simply alternate ways the clock can work. Variations in SPI Clock Polarity and Phase. Source: WikimediaThe clock can have one of two polarities (CPOL 0 or 1) and one of two phases (CPHA 0 or 1).A clock CPOL=0 means that the clock idles at 0. An SPI cycle is a pulse to a level of 1, with a rising and falling edge. A clock CPOL=1 means that the clock idles at 1. An SPI cycle is a pulse to a level of 0, with a falling edge followed by a rising edge. Note that, in both cases, there is a leading edge and a trailing edge of the clock pulse as it changes from its idle state to an active state and back again to the idle state for that polarity.When CPHA=0, data outputs are changed on the trailing edge of the clock and data is read on the leading edge. In contrast, when CPHA=1, data outputs are changed on the leading edge of the clock and data is read on the trailing edge.Like any binary options, two options (CPOL and CPHA) with two possible states each (1 or 0) result in four possible modes. SPI Mode 0 is by far the most commonly used mode, but don’t stress over this; just check your specific device datasheet(s) to find which mode the device is designed to operate in, and set up your software parameters to match. Proprietary Details Operating details differ on a device by device basis, depending largely on the manufacturer’s choices. We’ve seen one example in the READ Waveform of the Atmel/Microchip memory device. If you read that datasheet, you’ll discover other opcodes and sequences for WRITE and other operations specific to that device. Each datasheet for each particular device in your design should have those details available to you.As a system designer, getting an SPI system up and running will ultimately mean carefully studying the individual datasheets, and then writing or configuring your SPI software driver and debugging your code in a working system. NetBurner products, such as the MODM7AE70, typically give you a “leg up” in this regard by providing at least a baseline SPI driver to begin working with and examples that illustrate how it works. Conclusion: Deciding Between I2C and SPI So, how do you choose between these two busses? Sometimes it boils down to the particular chips you need for your design. You may only be able to find the device function you need in one or the other of these flavors.Be sure to carefully read the datasheets for devices you need, and consider the clock rates and power consumption. How fast does your design need to be? How many devices do you need in your overall system?Sometimes cost is a factor. Especially when you’re designing a high-volume product, a few cents difference in price between two otherwise comparable devices can amount to tens of thousands of dollars in mass production.However, you may not need to decide at all. There’s no reason your system can’t include both I2C and SPI devices. The only real cost of designing in both busses is maintaining two software drivers instead of just one.You now have the basic information you need to make informed decisions; go forth and design, and we wish you the best! As always, if you have any comments or questions, we'd love to hear your thoughts. Please feel free to speak up in the comments section below, or email us directly. Glossary I2C — “Inter-Integrated Circuit” or “I Squared C,” An In-System Serial ProtocolSPI — “Serial Peripheral Interface,” an In-System Serial ProtocolSCK — Serial ClockMOSI — Master Out Slave In - sometimes also simply ‘SI’MISO — Master In Slave Out - sometimes also simply ‘SO’*SEL — “NOT Select,” an SPI device select line*CS — “NOT Chip Select,” an alternate legend for *SELCPOL — SPI Clock Polarity (0 or 1)CPHA — SPI Clock Phase (0 or 1)SPI Mode — 0, 1, 2, or 3 - defined by combined states of CPOL and CPHAIoT — “Internet of Things,” i.e. small, network-connected embedded systemsTri-State — A signal that can be high, low, or floating De-Facto Standard — A widely accepted design standard that “just happened”Bit-Bang — Use software to execute a serial protocol, one hardware line at a time ### A Tale of Two Technologies: Web Development for Embedded Systems Engineers Are you an embedded systems engineer looking to get into web development? The fields of embedded systems development and web development have shared little overlap. However, all signs point to increasing convergence between the two.After all, embedded systems traditionally haven't been the easiest when it comes to user interaction. With the explosion of IoT devices and their ubiquity in every-day life, though, users are demanding better, more user-friendly interfaces. Oftentimes, this will be provided as a web interface or application hosted by the device itself.In this article, we're going to help grease the wheels for those looking to spruce up their embedded applications by shipping them with improved user experiences (sometimes even served up as webpages). We'll cover some web technologies that are frequently employed by web developers. We'll also briefly review some front-end frameworks that are well-suited for the constrained environments often encountered when developing for embedded systems and IoT devices. Finally, we'll take a look at some of the tools used by web developers when it's time to get into the weeds and figure out why your web application isn't behaving. Brace Yourself As with learning anything new, transitioning from old-school, hardcore embedded systems development to web development presents some hurdles that you'll have to face.First, embedded systems typically have constrained operating environments. This means that many of the technologies used to build modern, web-based applications are poor fits for devices that restrict processing power, memory, and available RAM.However, even if embedded systems provided unlimited resources, you're going to have to become comfortable moving away from the hardware. Web development is a fully realized technical field, complete with its own standards and ideologies. Diving in from the perspective of an embedded systems engineer is more involved than merely learning the latest JavaScript or CSS tricks.(The analogous challenge for a web developer getting into embedded systems would be to learn to work with a device that also acts as a web server. This is the case with just about any NetBurner device.)Ready to get started? Read on! Frameworks Web development frameworks are the tools and libraries that make it easier for you to code in a specific language or implement a particular application. The downside is that you start your app in the hole (at least when it comes to app size), and you haven't implemented anything yet.So, what's a developer to do?Enter lightweight frameworks. These allow you to leverage the power of a framework without increasing the bloat of your app. At least, not as much. There are definitely other tradeoffs that you need to consider, such as not as much built into the framework by default. However, such is life if you are looking for something both light and speedy.The following are some frameworks you might consider when developing web apps for embedded systems. Some are "normal" options that happen to be light enough that they're viable candidates for embedded systems. Others are specialty frameworks designed to work well on embedded systems from the get-go. EmbedJS EmbedJS is more of a plugin and less of a framework. That said, if you are looking for something simple to help you embed things like code, emojis, maps, media, services, or tweets, you should be considering EmbedJS. It only loads what is required, can be used for both server- and client-side purposes, and can be customized with just a few lines of code. EmbedJs provides ways to embed specific elements into a web interface. Flutter Flutter can be used to build interfaces for multiple platforms, including web pages. Created by Google, Flutter is an open-source UI toolkit to help you build apps for a variety of devices and platforms while using only one codebase. Google itself uses Flutter for some of the user experiences that ship with its Home Hub, and the company hopes to see it used more on embedded devices. Developers write Flutter apps in Dart (a language created by Google) but can then compile them to JavaScript. Responsive Responsive brands itself as the developers' framework. Its highlights include an emphasis on accessibility (e.g., each component and plugin is accessible to screen readers and keyboards). It also has built-in right-to-left support for those apps geared toward an international audience. Notably, it is built on top of Sass and jQuery. Despite all of these features, the combined output of Responsive's CSS and JavaScript is 20.3 KB after you've minified and zipped your files. ResponsiveBP's focus is on accessibility, and it is very reasonably sized for what it offers. Frameworks Available via CDN For those who want a more robust framework than the miniature ones listed, consider looking for those that can be served to users via a content delivery network (CDN). A CDN allows you to use these frameworks in your code without having to rely on the system resources to house these files. The catch with this option, obviously, is that the network on which you are working must be internet-connected. Nevertheless, internet connectivity opens up a lot of doors and you can use things like Twitter's Bootstrap, Facebook's React, or Google's Angular for the front-end of your webpages. MicroJS.com We want to be clear that MicroJS.com isn't a framework, but a way to find lightweight frameworks and libraries. MicroJS.com defines a micro-framework as one that contains no more than 5,000 lines of code and does one thing (and only one thing) well. The site maintains a list of rules that qualifying frameworks must abide by before they are included. If you are looking for assistance with specific tasks, consider searching through the MicroJS.com directory. MicroJS lets you search for specific functionality in bite size packages. Browser-Based Tools One of the most frequently used sets of tools during web development and debugging are those that are built into the web browser of your choice. Google ships the Chrome Developer Tools (currently the leader in terms of the number of users), while Mozilla offers the Firefox Developer Tools and the Web Developer extension. Rounding out the most frequently used options are Apple's Safari Developer Tools and Microsoft Internet Explorer's Web Edge Developer Toolbar How Developer Tools Can Help You To show how useful developer tools can be for you, let's take a closer look at what Chrome offers. Chrome Developer Tools comes standard, so all you have to do is launch it using one of the following methods:If you are looking at a web page, you can right-click on an element and click Inspect in the pop-up dialog that appearsPressing Command+Option+C (Mac) or Control+Shift+C (Windows, Linux, Chrome OS)Pressing Command+Option+J (Mac) or Control+Shift+J (Windows, Linux, Chrome OS) to open the Console panelIn general, your two most-frequently-used tabs during development and troubleshooting will likely be Elements and Console. The Elements tab allows you to view and modify the HTML and CSS used to generate the page. The Console tab allows you to review logs (or any output generated by your JavaScript code). You can also run JavaScript using the Console. Chrome's Developer Tools are a key resource when developing and debugging your web interfaces. So Many Tabs When getting started, you may find these tools to be a bit much. However, as your app grows and you need to optimize and improve it, these tabs contain incredibly useful features. We recommend reviewing the Chrome DevTools documentation for additional information. A brief overview of each tab is provided below:Sources: helps you run and debug your JavaScript code, as well as save changes made in DevTools, so they persist when you reload the pageNetwork: lets you view and debug network activityPerformance: shows how long it takes your app to load and its runtime performanceMemory: shows you memory usage so you can track down any memory leaksApplication: allows you to view the resources loaded, including databases, local/session storage, cookies, caches, and moreSecurity: provides information about mixed content issues, certificate issues, and moreAudits: allows you to run Lighthouse, which audits for things like performance, accessibility, SEO, and so onAdBlock: filters ads The Right Set of Developer Tools for You There are certainly variations in the features and functionality that get shipped with each set of browser-based development tools. However, you can expect, in general, the ability to access and inspect your source files, change and modify the files while examining the results of such changes in real time. These features are great for testing usability, accessibility, and the like.In the end, you probably have one that you know and love already. If not, the choice you make doesn't really matter since they all have most of the essential functionality you'd need. However, if you need help, Chrome and Firefox are the most popular options. Both have a robust digital community ready and willing to help if you get stuck or don't know how to do something. Other Helpful Tools and Techniques The following are some of our favorite tools and techniques for embedded development, web development, and some mixture of both. Postman Postman lets you send, receive and parse API requests. A fair amount of the work you do will likely involve calling an API and making sure that the hardware behaves a certain way based on the response of the API. Postman bills itself as a collaborative platform for API development. However, its bread-and-butter is storing API calls, making it easy to change them, allowing you to send them out, and receive and parse the responses. This is really what makes it helpful for you. With Postman, you can remove all of the noise involved with development and focus strictly on communicating with the APIs for your project. Minification Minification is the process of stripping out everything that doesn't affect processing from your code and, in some cases, renaming elements in the code to smaller values. There are few places where this is more important than a resource-constrained environment. For quick and/or simple jobs, Andrew Chilton offers tools for both CSS and JavaScript. For larger jobs, Smaller handles your HTML, CSS, and JavaScript files directly. Finally, we want to mention Dojo Toolkit, one of the most robust JavaScript development toolkits that also features minification tools. Minified code is great for browsers... but not so much fun to try and read. Visual Studio Code If you're not already using our homespun IDE, NBEclipse, Visual Studio Code is one of the most commonly-used IDEs around (and for good reason). It supports most major version control systems, includes robust debugging tools, syntax highlighting, intelligent code completion, snippets, and more. The most significant upside to Visual Studio Code, however, is its ability to be customized. For example, you can add extensions that support the workflow you plan to use. Wrapping Up There are substantial differences between the fields of embedded systems development and web development. However, the increasing ubiquity of technology like IoT devices means that such items must ship with better user interfaces that are easier to access. To that end, it is the responsibility of embedded systems engineers to keep up, adapting their skill set so that they're capable of working with all facets of today's embedded systems.In this article, we covered some of the most commonly used web development technologies, including frameworks that are well-suited for embedded systems. We also reviewed some aids for debugging, and other tools and techniques we find indispensable when developing for small systems.NetBurner's software stack includes a secure web server. This means all of your embedded designs that use NetBurner hardware can include a web-based user interface with a single line of code. We'd love to hear about any tools that you find particularly useful or any comments you might have on those discussed above. Feel free to reach out to use in the comments below, or directly at sales@netburner.com. ### Learn to use FPGAs: Rule the World Even if you're a casual observer, you'll no doubt agree that technology is advancing at a rapidly accelerating pace. Whether you're new to the tech scene or an old hand, you need to pay attention, read, and experiment in order to keep up.Here at NetBurner, we're excited about FPGAs, and we want to tell you how they might help you "own" whatever design project you may be facing.But first, a little background. Digital System Design: A “Black Box” Model Simplified “Black Box” View of a Digital System Design Think of a digital system as a "black box" that has inputs and outputs.Modern digital designs are synchronous, meaning that incoming signals are sampled and "frozen" at regular intervals (the system "clock rate"). This results in a regular capture of a snapshot of the system input state. The output signals also change in time with the clock.What happens in the middle of the black box is entirely up to the engineer's design goal (e.g., HDMI video, network protocols, cryptography, etc.) and the system speed requirements.Let's consider three possible ways to fill the box:Software/Firmware: This option is useful for prototypes and simpler products that don't need extreme speed.Discrete Component Hardware: This was the universal approach before FPGAs were invented.An FPGA Design: This modern option offers digital designers tremendous flexibility and simpler debugging. Software Inside the Box If you have a programming background, you know that a computer placed in the middle of the black-box model can theoretically perform any desired function.Inputs can be polled or responded to by means of interrupts, then processed, and appropriate outputs produced. The processor clock synchronizes everything in the system. A Software-Based System Design But a computer running a software program, or a microcontroller running firmware can only execute instructions sequentially. There are limits to how fast a sequential processor can respond to stimuli. If your design requires processing that a computer simply can't execute fast enough, a custom hardware solution is necessary. Discrete Hardware Inside Discrete Hardware System Design Transitioning from a software or firmware design to a hardware design can produce a substantially faster solution. Unlike the sequential operation of a software-based system, in a discrete hardware system, many functions occur in parallel. Concurrent operations mean greatly increased system speed.But hardware development can be messy. Inputs and outputs are captured in clocked memories known as flip-flops. Hardware in the middle comprises many more flip-flops and logic gates. Designs with a useful degree of complexity may contain hundreds or thousands of logic devices, and in some cases, millions.Integrated circuits, invented in the 1950s, made these logic devices available on small chips cut from large silicon wafers. The most common technology was Transistor/Transistor Logic (TTL), implementing logic gates and flip-flops in familiar, integrated circuit "bug" style packages.Even though these packages contained multiple logic devices, the number of packages in a complex design just kept growing. Standard TTL Logic Elements and a TTL Integrated Circuit Package In the 1970s and 80s, engineers designed digital hardware systems by lashing together dozens or hundreds of AND, OR, NAND, and XOR ICs. A typical engineering prototype was a rats nest of wires interconnecting flip-flops, logic gates, and memory devices. Tech comparison chart: Software v. Hardware v. FPGA v. ASIC Prototypes were often nightmarish kludges that demanded all too many late-night debugging sessions. Much time was lost, distinguishing between design flaws and bad connections.Houses may still be built piece by piece, a construction method known as "stick building." But the complexity of digital hardware has increased far beyond that of homebuilding, and there seems to be no end in sight. FPGA Hardware Inside A better approach was needed, so some of the brightest minds in the business came up with a generalized hardware design solution; the FPGA, or Field Programmable Gate Array.The FPGA, invented by Xilinx in 1985, is a Very Large Scale Integration (VLSI) silicon chip that replaces most of the hay-wired logic in the Discrete Hardware black box. Many of the I/O devices are fabricated on the FPGA chip itself. Far fewer packages need to be present on the system PCB. FPGA System Design An FPGA hardware design is created using software tools instead of myriad device packages, solder or wire-wrap, and copper traces. Designing hardware using an FPGA contrasts with the old discrete hardware method much as "factory-built" housing is superior to "stick-built."Originally purely digital, modern FPGAs offer some analog capabilities. With appropriate external signal translators, analog applications such as speech recognition and synthesis are also possible. What's Inside An FPGA? FPGAs contain generic logic elements capable of replacing all the functions previously performed by the plethora of chip packages in a discrete hardware design. These logic elements are arranged in regular arrays, interconnected via programmable switches and busses. An FPGA is a black box in its own right... Configurable Logic Blocks (CLBs) are the most ubiquitous FPGA logic element. They comprise flip-flops, small memories, and lookup tables (LUTs) that can be programmed to perform any needed logic operation.It's important to grasp what a powerful, completely general concept the CLB represents.Each LUT in a CLB can define the behavior of any logic gate (AND, OR, NOT, NAND, NOR, EXOR, and EXNOR) or combination of gates. The lookup table inputs serve as an address that indexes a unique location in the table. The data retrieved from that address becomes the output of the defined function. A Simple Lookup Table (LUT) Example In this simplified LUT example, an OR gate feeds one input of an AND gate, and the output (D) is a single bit reflecting the combined state of inputs A, B, and C. The combined logic function is defined simply by populating the table with 1s and 0s as needed.Practical LUTs have more inputs—typically 4 or 6—and a table (a memory) sufficient to contain patterns that represent the desired output of any logic function. Practical CLBs may contain multiple LUTs, memories, flip-flops, shift registers, and multiplexers. Additional FPGA Components Input/Output Blocks (IOBs) on the edges of the chip can be configured as inputs, outputs, or bi-directional bus elements. Options include the ability to connect pull-up or pull-down resistors and to tri-state peripheral pins (i.e., 1, 0, or "floating"). At power-up, IOB pins are tristate (floating) until the configuration is complete.Busses run throughout the chip, completing the FPGA device. These busses are analogous to the copper traces on a printed circuit board. However, their interconnections are defined by a configuration file. This accomplishes the designer's goals by connecting the functional blocks in a pattern that creates a working hardware system.Newer FPGAs may also include strategically located RAM Blocks, Multiplier Blocks, and Digital Clock Managers (DCMs). These distribute, delay, multiply, divide, and phase-shift clock signals.All FPGA blocks and interconnects are uniquely configured at system power-up. When the FPGA is reset, the first thing it does is load a custom configuration file from non-volatile memory. That file contains the IP, or intellectual property, created by the engineer designing the FPGA based system.Because the configuration is "soft," it is possible for a system to load different configurations that enable different system "personalities." Soft hardware also makes it easy to perform remote upgrades of products already in the field. FPGA Design Tools How do designers turn a hardware design concept into a working configuration file for use in an FPGA? There are three major means of defining an FPGA design; Schematic Capture, Hardware Definition Languages, and High-Level Synthesis. Schematic Capture If you come from a hardware background, you might choose the method traditionally used by hardware designers, known as schematic capture.Software tools are available that allow experienced hardware designers to create logic diagrams in a format they are already familiar with. These schematics are then compiled into configuration files to be loaded into an FPGA. A 4-bit ALU block in a page of a complex hierarchical schematic. (Source: Wikimedia) The image above is a gate-level schematic definition of a four-bit Arithmetic Logic Unit. Schematic capture tools often have ready-made function block definitions ready to import into an FPGA design. Hardware Definition Languages In contrast to schematic capture, Hardware Definition Languages (HDLs) are much more like programming languages.The two most widely used and well supported HDLs are VHDL and Verilog. These languages let designers literally "write hardware," very much like a programmer writes software. VHDL code to implement a signed adder. (Source: Wikimedia) HDL's look a lot like computer programming languages. They offer someone with a software background a comfortable means to begin designing with FPGAs. High-Level Synthesis More recently, development tools have become available that enable designers to compile C++ or Python code into FPGA designs. These toolsets, such as Xilinx Vivado® HLS and Vitis, can import a software function and compile it into FPGA hardware. However, they require additional skill and guidance from the designer in order to optimize the result. Even so, HLS tools are opening the door into hardware design for many software programmers. Might you soon be one of them? HDLs vs. Programming Languages Timing, sequencing, and synchronizing make all the difference.Programming general-purpose computers and microcontrollers require sequential thinking. Instructions are issued and executed one after another. This is true even when using a real-time, multitasking operating system (like NetBurner's uC/OS RTOS). Tasks are queued up and scheduled by priority or preemptive interrupt, one instruction at a time.A hardware design, on the other hand, can have multiple processes occurring simultaneously. To program hardware successfully, designers must consider the system clock and how to synchronize concurrent functions.Schematic capture tools deal with this issue using tried and true methods. However, HDL and HLS tools incorporate concepts that are foreign to most software programmers. They require the ability to describe both sequential and concurrent execution."Writing hardware" also necessitates more careful attention to the planning and efficient use of resources. Unlike computer memory, CLBs aren't allocated and deallocated during execution. FPGA Advantages and Limitations By now, it should be pretty obvious that the FPGA is a radical improvement over earlier haywire design methods. Hardware design no longer requires a technician to fabricate and debug manually. Gone (mostly) are the days of prototyping with solder or wire wrap; cantankerous prototypes have been replaced with programmable hardware. Debugging an FPGA design involves dealing with concepts and design flaws more than wiring errors or cold solder joints. Is FPGA Right For You? Though incredibly useful, the FPGA may not be the be-all and end-all in the realm of electronic design. While superior to "stick-built" electronics, there is another, faster kind of large scale integrated hardware, namely the Application Specific Integrated Circuit, or ASIC. Tech Comparison Chart: Software vs. Hardware vs. FPGA vs. ASIC ASICs are the current "state of the art" when it comes to implementing custom hardware functions. An ASIC is a custom design in silicon (or other I/C technology). It embodies a very specific system function, using the shortest routing and the most highly optimized wafer real estate possible. Additionally, it can be produced in high volumes at lower costs and made to operate at higher speeds than an FPGA.On the other end of the spectrum, designers can quickly prototype an embedded software system for early evaluation of a design. Though it may run too slowly for practical use, much can be learned from a simulation before committing to a far more costly solution.In between are the discrete hardware and FPGA options. Discrete hardware may still be used for simpler designs, and modern FPGAs are often fast and powerful enough to incorporate into production products.Designers must choose wisely among these options, based on a careful evaluation of the cost and benefits of the competing technologies. The Future of Hardware Design To a great extent, we are living in the future now. The major players in the FPGA world continue to innovate and advance rapidly. Hybrid FPGAs offer multiple optimized RISC processor cores, Digital Signal Processor (DSP) and Graphic Processing Unit (GPU) blocks. They can also offer other high-performance function blocks surrounded by the general-purpose CLBs and memories. The capabilities of the CLBs also continue to be enhanced.Though Moore's Law may be slowing slightly, the level of integration and the number of functions in a given space continue to advance rapidly. Silicon process geometries are getting smaller, and chips are becoming incredibly dense. Xilinx now offers FPGAs with some nine million logic cells, capable of supporting incredibly complex system designs.These extremely large FPGAs come at a substantial price. This has led to cooperatives that purchase FPGA systems and make them available for development purposes to their members. In some cases, they do this at no charge to developers willing to open-source their work. Wafer-Scale Integration A wafer-scale integrated system. (Source: Wikimedia) Some believe that Wafer-Scale Integration (WSI) is the next step along this arc of progress. In a wafer-scale, rather than using a fiberglass printed circuit board and soldering packaged IC's, a large number of package-less IC chip designs are fabricated directly on a single silicon wafer.Wafer Scale Integration has multiple benefits. Chips operate at lower voltages and thus run faster and cooler using less power. Because devices can be placed closer together, system speed increases dramatically, and assembly costs are reduced. New Functionality And Improving Development FPGA companies are beginning to create custom artificial intelligence (AI) function blocks such as inference engines and neural networks. Capabilities are being expanded with more and better I/O blocks, DAC/ADC peripherals, radio frequency (RF) devices, lower voltages, and power consumption, and—always—higher speeds.Development tools and environments will continue to improve and expand. Higher and higher level languages and design paradigms will be innovated. These advances in tools will open FPGA design to an ever-wider audience. I imagine we will eventually see Star Trek-like scenarios where anyone with a design idea will be able to say:"Computer: Build me an FPGA communicator device that will let me broadcast on the least-used subspace frequency in this sector."Within a matter of minutes, an FPGA-based, completely finished and ready to use subspace communicator will pop out of the nearest replicator. Getting Started with FPGAs If you decide to dive deeper into FPGAs, you can begin by following the links in this article to read more about their history and background. Many reasonably priced development kit options are available from major distributors like DigiKey and Mouser, and even from Amazon. The right kit and a little experimentation can give you hands-on experience with FPGA design and programming at a very reasonable cost.If you're simply curious about development software, you can download 'Lite' versions for free from Xilinx, Intel/Altera, and Lattice, the three largest FPGA manufacturers. Most development kits are bundled with access to sophisticated programming tools. Additionally, you may find Intel's free downloadable eBook, "FPGAs For Dummies", to be entertaining and useful. There are also growing numbers of open-source FPGA development tools. NetBurner's Own FPGA Offering At NetBurner, we recognize the importance of FPGAs. Our Network Product Kit combines the design of a finished product, the flexibility of a network module, and the power of the NetBurner development suite into a ready to use platform with a professional-grade enclosure and power supply. This kit, the PK70 EX, features an FPGA add-on board that will enable you to implement any desired custom interface. The user manual for the FPGA board walks you through setting up and beginning to use the FPGA with the Xilinx ISE Design Suite. Parting Words In order to take you on this adventure into FPGA-land, we've surveyed much of what's going on in the field today. We're more excited than ever about the prospects of using these amazing devices. If you learn to design with FPGAs, the world is your oyster; almost anything you can imagine, you can now begin to do. Here at NetBurner, we want to show the way by offering you world-class network system products and support. If you have plans for FPGAs in your upcoming designs, we'd love to hear more. Feel free to leave a comment below, or contact us directly at sales@netburner.com. ### The VLAN Survival Guide Over the past couple of decades, networking technology has exploded through society like a pack of Mentos shoved into a two-liter bottle of soda. As more and more devices enter the networked world, new ways of organizing and accessing these devices (or preventing their access) have been required to keep it manageable, secure, and running smoothly. One such technology is the Virtual Local Area Network or VLAN for short.If you head over to Cisco's website, you'll find that they have this to say about VLANs:A [Virtual Local Area Networking (VLAN)] is a group of end stations in a switched network that is logically segmented by function, project team, or application...VLANs have the same attributes as physical LANs, but you can group end stations even if they are not physically located on the same LAN segment.But... what does that even mean?In this article, we'll try to break down what a VLAN is, how they work, and that "gotchas" you should keep in mind when working with them. Implementing them in our own networking stack was an incredible (and somewhat painful) learning experience for us all. We stubbed our toes in a several different ways. This was especially true when it came to testing and debugging, and we'd love to take the opportunity to share some of what we've learned with you. What is VLAN? A local area network (LAN) is a group of devices that are connected based on the fact that they're located in the same place (such as a single floor of an office building). Once you've got these devices connected (or networked) together, they can share an Internet connection, connect to communal printers, share files with each other, and so on.As you can probably guess from its name, a virtual local area network is similar to a LAN. What's the difference? Well, a VLAN allows you to connect devices, even though they aren't in the same physical location. Conversely, you can also create what looks like distinct networks when you have devices and resources that are located near each other. An essential component of a VLAN is that computers or devices which are not a part of the network are unable to communicate with one another. For Example... Let's say a small company needs to provide internet access for its accounting, legal, and marketing/sales departments. These departments must be isolated from one another for security and privacy (and possibly even performance) reasons. To that end, the company's network administrator might create individual VLANs for each department.In this case, those in accounting might have access to the internet and can share printers and files with others in accounting. That said, they cannot share resources with those in legal or marketing/sales. This is true even if individuals from accounting legal are sitting in desks that are right next to one another. The physical location of the devices themselves doesn't matter. How Does It Work? When you have a physical network that you need divided, you end up with what are called broadcast domains. If you don't opt to set up virtual local area networks, then you will need to have switches and infrastructure for each individual broadcast domain. That's a lot of equipment that costs a lot of money, not to mention the time and resources it takes to set up and maintain this stuff.However, if you opt for VLANs (you'd need one for each domain), you can use one switch that routes network traffic to the appropriate VLAN. Each virtual local area network is identified by what's called a VLAN ID. So, traffic addressed to VLAN 1 will be accessible to the VLAN 1 ports on the switch, but not any of the ports that are assigned a different VLAN ID.You'll also be tagging each port on your switches with one of the following: tagged, untagged, or excluded. With tagged ports, the switch will add the VLAN ID to the header of any packets it sends. Conversely, untagged ports do not do this, and they will potentially remove any VLAN ID in packets that come through. Excluded ports are those that never send packets with VLAN IDs.Additionally, your network card might allow you to specify a VLAN ID for that specific network interface directly from your computer. One instance where this is helpful is if your switch doesn't support VLAN tags, or if you need a port to support multiple VLAN IDs. Such switches may simply pass the packets through as-is. In this case, your network interface will check the packets to ensure that they belong to the correct virtual local area network.Pro Tip Be careful that the VLAN ID you're using matches the port to which you're connected, or you may be in for some marathon troubleshooting sessions.Pro Tip Be careful that the VLAN ID you're using matches the port to which you're connected, or you may be in for some marathon troubleshooting sessions. What's in a VLAN Packet? While there are several packet formats when it comes to network traffic, if you're working over Ethernet, a VLAN packet typically contains the following: The destination MAC address - 6 Bytes The source MAC address - 6 Bytes The packet type (in this case, it's VLAN: 0x8100) - 2 Bytes The VLAN tag - 4 Bytes User Data Dest MAC Source MAC Type VLAN Tag User Data 6 bytes 6 bytes 2 bytes 4 bytes varies The VLAN tag contains the user's priority for the packet, a canonical format identifier (CFI), the ID of the VLAN to which the packet belongs, and the Ethernet type/length.PriorityCFIIDEthernet Type3 bits1 bit12 bits16 bits(Confused by this jargon? See WireShark for additional details!) Reserved VLAN IDs Unfortunately, you can't just use any old number for your ID. Instead, you are limited to a 12-bit field using hexadecimal values that are not reserved. Luckily, the only two that are reserved are 0x000 and 0xFFF, which means you have 4,094 options available. For additional information on see IEEE 802.1Q-2005. When You Might Find VLAN Helpful There are a lot of reasons why you might set up a VLAN, including:Providing logical groups with resources (like the office scenario we mentioned previously)Setting up a guest network so that you can separate such traffic from internal trafficIsolate devices and users who require lots of bandwidth (e.g., cameras that are continuously streaming feeds, sales and marketing folks who make a lot of VoIP calls)However, there are many ways to introduce the logical separation required for the situations we've mentioned above. So more specifically, what are the benefits of implementing such use cases? Well, VLANs are helpful for:Improving Performance: Isolated traffic means that you'll see better performance, especially if you isolate high-resource users from everyone else.Improving Security: Legal cannot spy on accounting and vice versa.Simplifying Network Administration: Logically isolating groups (e.g., based on department) allows you to enforce access policies and the like at a group level.Troubleshooting*: Your administrators will find it easier to fix something if the problem is isolated to a smaller area (e.g., the guest network).* This will be true unless the issue is with the VLAN itself, in which case... see below. The Trouble with VLANs There are several upsides to using a VLAN, but there are some downsides to this type of network infrastructure, as well. Some of the ones that you should be aware of include: Overcomplexity Just because you can create a VLAN doesn't mean that you should. For example, should you really put each office printer on its own VLAN without any other compelling reasons? Complexity can be difficult to manage once you've introduced it. Because of this, make sure you have a compelling reason to do so before you start divvying out those VLAN IDs. You might think that creating a VLAN requires just a few commands. However, if you're implementing network where this technology could be beneficial, you're going to need a bit of planning before execution. Mystery Packets You're probably able to tell the difference between your VLANs and your LANs. However, the tools you use for debugging and troubleshooting might not be able to do so. This means that debugging network communications might be problematic when working with VLANs. For example, network interfaces will often strip VLAN specific information out of a packet before passing it to the application. If you use network sniffers/packet analyzers such as Wireshark (like we do), you will be unable to see that data in your captures. Some specific network interfaces provide a workaround by allowing you to set promiscuous mode. This allows the full packages, tags, and all, to be passed along. However, identifying this issue from the get-go can be difficult. Even once it's identified, there's still no guarantee that your network card will play nicely and give you what you're looking for.  Virtualization It can be harder to get your VLANs functioning correctly with things like virtual machines and switches (i.e., Hyper-V options) than you'd think. This is ironic and can be genuinely infuriating, as every party involved is virtual. Unfortunately, this isn't an area where we can get prescriptive. Just know that you might be in for some trial and error with regards to settings for your VLAN and virtual switch, as well as the virtual machine itself. Security (or Not) One of the biggest reasons for using a VLAN is to introduce security. There are caveats to this, however. For example, L2 traffic (which consists of packets sent to specific switch ports) can cross between LANs in particular cases. This means there's a connection between two access ports in VLANs or potentially malicious changes to VLANs. The best practice to keep this from happening is to shut down any switch ports that aren't in use. Additionally, tag all traffic for easy identification and take full advantage of port security features. Conclusion Virtual local area networks (VLANs) are powerful, but there are a lot of nuances to consider when setting them up. In addition to evaluating whether this is the right choice for you and your network, you'll need to make sure that your equipment is VLAN compatible. To that end, NetBurner's Systems-on-Modules and IoT Development Kits provide built-in support for VLAN in their networking stack. This lets you get your IoT projects going with ease, regardless of the network you're operating in.As always, thank you for joining us in our discussion of VLANs. If you have any comments, questions, or VLAN horror stories of your own, please feel free to share in the comments below. Additionally, you can email us directly at sales@netburner.com. ### The RS-485 and RS-422 Standard Protocols Last week we reviewed the RS-232 standard protocol. We laughed, we cried. Overall, it was a pretty good time. Even though it is well established, used extensively, and has been around for literally decades, RS-232 isn't the only protocol in the serial communications jungle. We would be remiss to leave out it's younger, though at this point, still mature siblings RS-485 and RS-422. In this article, we're going to rectify that and give a rundown of each. Parallel Communication vs. Serial Communication Let's start with some background. Wired communication protocols can be parallel or serial. Parallel communication uses multiple wires to transmit several bits of data at once. Serial protocols, on the other hand, use between one and four wires to send a single bit at a time in a continuous stream. It is clearly faster to send many bits of data simultaneously than to stream them one by one.Nevertheless, there are several reasons why one may prefer a more straightforward, albeit slower, mode of communication. For one, microprocessors are often unable to accommodate the number of input/output lines needed for parallel protocols. When they do, the added complexity can be troublesome to work through. Additionally, using serial protocols saves space and money on the materials used in a design. Several of the more common communication interfaces, such as USB, are serial. Synchronous vs. Asynchronous Serial Communication Serial communications can be synchronous or asynchronous. With a synchronous interface, sending or receiving data is timed to signals from a clock shared between the devices. This allows for faster and more reliable data rates at the cost of an additional line.Asynchronous protocols do not use a shared clock and instead agree on the speed of data transmission (baud rate) ahead of time. Most serial protocols that take advantage of asynchronous communication have methods to signal the beginning and end of a data transfer. The lack of a shared clock signal means one less pin to worry about (this is always a win in the embedded systems world), and will reduce overall EMI.One significant component of getting an effective protocol in place is hardware. More specifically, the buses used can determine the speed and maximum distance for a reliable signal. Both RS-422 and RS-485 are interface standards that are commonly used in serial ports. Because they are both asynchronous protocols, these standards dictate that the timing of signals and their electrical attributes be specified in the implementation. Full-Duplex vs. Half-Duplex Before we jump into the details of RS-422 and RS-485, there are two terms that we should cover. These are full-duplex and half-duplex, and no, we're not talking about cozy housing options here. In the serial communications world, full-duplex means that data can be sent and received at the same time. This requires that the interface has separate lines for both receiving and transmitting data.Half-duplex, on the other hand, uses the same line for reception and transmission. As a result, data can only travel in one direction at a time. RS-485 can be configured to run in full-duplex or half-duplex mode, while RS-422 is full-duplex only. RS-422 RS-422 uses a twisted pair differential signal (more on this below) for receiving and transmitting data. It runs in full-duplex mode, with each transmission direction using two wires apiece. Putting on our math hats, this means that it requires a total of four wires. It is regularly used in a point to point (two devices talking to each other similar to your standard RS-232 connection) or multi-drop topology. When set up in the latter configuration, it can connect one driver with up to ten receivers on a single bus, often through a daisy chain. RS-485 Like RS-422, RS-485 also uses a twisted pair differential signal for receiving and transmitting data. However, this is most commonly done over a single twisted pair, which requires (as you probably guessed) two wires. The RS-485 standard was created to handle the problem of allowing several devices to talk to each other, and accordingly, it supports a multi-point topology. It can manage up to 32 devices, and the use of repeaters can increase this number to 256. This standard allows a reliable signal to persist under a higher load, which makes it a popular interface for industrial applications, including a variety of automation systems.RS-485 can run in full-duplex mode and when it does, it essentially becomes RS-422. In fact, you can often take hardware utilizing RS-485 and successfully drop it into an RS-422 setup. However, the reverse is not true, as RS-422 cannot operate in half-duplex mode, and therefore is unable to support multi-point topologies. How RS-422 and RS-485 Compare to RS-232 RS-232 is the standard used for your every day, though slightly dated, computer port. A standard RS-232 nine-pin connector port is commonly known as a DB9. As we covered previously, its layout consists of five pins over four (nine total). Going from left to right, the functions of each pin are as follows:Data Carrier Detect (DCD)Received Data (RXD)Transmit Data (TXD)Data Terminal Ready (DTR)Ground (GND)Data Set Ready (DSR)Request to Send (RTS)Clear to Send (CTS)Ring Indicator (RI) Male DB9 Connector Not all of these pins are necessarily used. Alternatively, some COM connectors use 25-pin ports, but this is less common.While RS-422 and RS-485 also frequently use a DB9 connector, the pinouts will vary depending on the device and the manufacturer. You will need to check the documentation to find how a specific device is wired. A terminal block or other connector may be used for some devices, as these standards do not define a particular type of connector. An RS-485 pinout will also vary depending on whether it's a two-wire or four-wire connection.RS-232 works in a fundamentally different way from RS-422 and RS-485. It transmits data digitally, with 0 and 1 corresponding to positive and negative voltage ranges, respectively. The other two standards use a differential signal based on the potential voltage difference between two conductors on the same line. Differential signaling results in less noise and a clearer signal. Comparing Device Connectivity In terms of functionality, one significant difference is that RS-422 and RS-485 allow the connection of multiple devices (though in notably different ways, please see the above descriptions), potentially increasing their number with repeaters. RS-232 is a point-to-point standard, though it does support limited multi-drop capability. Printers and monitors are the traditional examples of hardware that is often connected via an RS-232 port. Comparing Distance One of the most notable differences is the maximum transmission distance, which is only 15 meters for RS-232 as compared to up to 1,200 meters for the other two standards. In practice, using a cable over the maximum distance for RS-232 almost always yields poor results. In fact, it is a common practice to take data traveling over RS-232 and converting it to RS-422 or RS-485 to increase the viable travel distance, then turning it back to RS-232 on the other end. Comparing Valid Distance One final, though important, point of comparison is data speed. RS-422 and RS-485 have a maximum data transmission rate of up to 10 Mbps (megabits per second). RS-232, on the other hand, supports up to 920 kbps (kilobits per second). With all three standards, using the maximum distance will decrease transmission speed; however, as mentioned above, this maximum is much shorter for RS-232 than for the other two. Serial Data in a Networked World RS-422 and RS-485 are exceptionally popular choices in automation and industrial applications. In today's increasingly networked world, especially with IoT exploding all around us, the need to take data from devices that can only communicate through traditional serial protocols and making it available to the cloud or a network is increasing rapidly. NetBurner offers a variety of ready to use, off the shelf products to handle just this sort of problem. Come for our selection of serial to Ethernet converters, and stay for the full range of networking support from our seasoned professionals.That about wraps up our introduction to RS-422 and RS-485. As always, thanks for joining us! If you have any questions or comments, please feel free to drop them down below, or reach out to us directly at sales@netburner.com. ### Alternate Ways of Securing Your NANO54415 Securing the NANO54415: It's Easier Than You Think It has come to our attention that some industrial users have reservations regarding the spring retention clips that are used to secure the NANO54415 system on module. Their hesitation springs (see what I did there?) from doubts that the retention clips are sufficient to retain the units out in the field. While we have personally used them in a rocket that experienced 5+ G recovery shocks with no reliability issues, we're not ones to ignore the concerns of our customers.As an alternative to mounting the NANO54415 with the spring retention clips, it's possible to use the mounting holes located on the end of the module with standoffs and screws. Below, we have a mechanical drawing of the NANO54415 with the mounting holes laid out. NANO54415 Mechanical Drawing With Mounting Holes The mating connector for the card edge signals will be identical to the one used for the spring clip method, so nothing will need to be changed there. The part number for this component is Molex part number 0679101002 (DigiKey part number WM3471CT-ND).Each mounting hole will require a 1.6 mm (0.062") spacer to separate the NANO54415 from the PCB. It will also need a screw to hold it all together. The largest screw that will fit through the mounting holes is 2.5mm (#2-56). The Nitty-Gritty Details Side View of the NANO54415 Screw Mounting Top View of the NANO54415 Screw Mounting This can be accomplished in several ways:A long #2-56 screw is placed through the bottom of the mounting PCB. Next, a standoff is used to separate the NANO54415 from the PCB. Finally, a long #2-56 nut is used on the top to secure the module. This is shown in the images above.Similar to the first option, however, instead of using a standoff as a spacer, you can use a #2-56 nut, which is 0.062" thick.Use a swage type threaded standoff for the spacer and a screw, such as DigiKey part number 36-4860-ND.Use a threaded standoff that will be soldered to the mounting PCB. For example, DigiKey part number 732-7068-2-ND is the correct height and is threaded for a 2.5x45 mm screw.Though we have been delighted with the results of the spring retaining clip, we realize that this method of securing your NANO54415 might not be everyone's cup of tea. If this happens to be you, we hope that you find one of the above methods helpful in your next embedded system or IoT design. As always, we love hearing feedback from our customers. If you have any comments or questions about the NANO54415 or how to secure it in your own design, give us a shout in the comments below or email us directly at sales@netburner.com. ### IoT Fight Night: AWS IoT Core vs Google Cloud IoT Core An IoT Cloud Service Comparison If you’re looking for an easy way to get your Internet of Things (IoT) projects set up, consider partnering with a premier IoT Cloud service. Two of the big kahunas right now are AWS’s IoT Core and Google’s Cloud IoT Core. These platforms do the heavy lifting, offering the end-to-end features that help you run your applications. This allows you to focus less on things like infrastructure and more on developing product features.Most IoT platforms include features like authentication and authorization, device management, and robust data analytics. This should be expected, as IoT and data analytics go hand-in-hand as the data such devices gather are immensely useful and informative. But how do you choose the right fit for your project? What are the differences that matter to you?You could opt for the tried and true coin toss method. However, before you resort to this level of entertaining, though haphazard, decision making, we suggest taking a gander through the sections below. In them, we will look at the IoT Core offerings from Amazon Web Services and Google Cloud. We will compare how they are similar, how they are different, and which option would be best for your project. AWS IoT Core You probably know what Amazon Web Services (AWS) is, and its IoT Core offering is one of the most robust platforms available today. In short, IoT Core is a managed cloud service that allows you to connect devices, both to each other and with the other bountiful cloud services offered by Amazon.AWS IoT Core supports the HTTP, WebSockets, and/or MQTT protocols. It even goes so far as to offer an MQTT test client to help you verify that your devices are publishing the appropriate messages on topics. No matter which protocol you use, all communications are secured using TLS. You can integrate your IoT devices with the other services offered by AWS to gather, process, analyze, and act on the data that the connected devices generate. You can also track and communicate with devices, even if they’re not connected at that moment.AWS offers a free, low throughput tier that allows you to try out its features. Pricing is dependent on your use of connectivity, messaging, device state and metadata storage, and the Rules Engine for message transformation and routing. There are no minimum fees or mandatory service usage. AWS offers a calculator (aka fancy Excel Spreadsheet) to help you estimate the cost of your usage.When it comes to development flexibility, AWS offers IoT SDKs in Android, Arduino Yún, Embedded C, C++, iOS, Java, JavaScript, and Python. We provide a tutorial on connecting our MODM7AE70 IoT development kit to AWS using MQTT, as well as a corresponding code review, which may be of interest as you review the platform. Google Cloud IoT Core Google Cloud IoT Core is also a fully managed service that you can use to connect your various IoT devices. If used with the other services offered by Google Cloud, you have an end-to-end IoT solution. You can gather, process, analyze, and visualize the data your devices generate.Google Cloud IoT currently supports the use of HTTP and MQTT protocols and requires TLS encryption for messages sent via MQTT.Pricing for Cloud IoT Core usage is based on the amount of data exchanged. You can test out the service using the free tier, which supports a maximum of 250 MB per month. After that, the amount you pay per MB of usage depends on your total data volume; the more you consume, the cheaper your per-MB cost is. Prices begin at $0.0045 per MB.To help you get started, Google offers samples written in a variety of languages. Depending on what you are looking for specifically, you’ll find examples written in C, C#, Go, Java, Node.js, PHP, Python, or Ruby. A Comparison of AWS vs. Google At a glance, the IoT platforms offered by AWS and Google look to be pretty similar, making it difficult to choose between the two. In the end, the best choice for you depends on your comfort with complexity and the specific features you need for your project. For example, AWS is slightly more challenging to secure for those new to the process, while Google offers better data integration. However, Google doesn’t support the WebSockets protocol.Authentication and Authorization: Google Cloud IoT Core supports authentication via public/private key pairs and JSON Web Tokens. These are ways your devices can “prove” that they’re allowed to work with your platform. AWS, on the other hand, offers a slightly more complex custom authorizers scheme where you can authenticate devices and authorize operations using the strategies of your choice.Communication Protocols: Both Google and AWS support the use of HTTP and MQTT protocols, but AWS also supports WebSockets for asynchronous communication. All require communications to be secured using TLS.Data Analytics: Google offers out-of-the-box tools, including integration with Google Big for data analytics and a variety of machine learning services (e.g., Cloud Dataflow, BigQuery, and more). AWS, on the other hand, only collects the data and offers basic data management (e.g., filtering and transforming it before routing it elsewhere). Further processing requires the use of another service, such as AWS’ IoT Analytics Service.Device Management:AWS, which is device type and OS agnostic, allows both individual and bulk device registrations, as well as individual permissions management, monitoring, and troubleshooting. Google, on the other hand, allows coarse-grained device configuration and management for registered devices.SDKs: AWS offers a more significant number of fully-developed SDKs in a variety of languages. Google offers just one end-to-end sample with numerous other samples for individual tasks. It should also be mentioned that not all samples are available in all languages. For example, HTTP client samples are only available in Java, Node.js, and Python. And the Verdict Is.... Well, really the verdict will be up to you. Partnering with a cloud-based IoT platform is a way to outsource a tremendous amount of the burden you would otherwise have to account for. This lets you focus on what makes your project stand out: user features. Both Google and AWS offer two top-notch options that you should consider for your next project.Ready to get started with your first IoT Project? NetBurner’s ARM Embedded Development Kit for IoT has everything you need to get up and running with your next IoT application. We also provide a working example for AWS IoT Core (support for Google Cloud IoT Core is on the way). ### MODM7AE70 Dev Kit Quick Start Guide - Video 2 In this second quick start video, we get rolling with the MODM7AE70 development kit. We start with examining the carrier board, the MOD-DEV-70CR, and continue with powering our device up and finding it on the network. Related Links Local Discovery Tool: https://www.netburner.com/download/discover-netburner-local-tool-nndk-3-x/ NetBurner 3.x Documentation: https://www.netburner.com/NBDocs/Developer/html/index.html Part 1 Video Tutorial here.Watch directly from YouTube here. https://www.youtube.com/watch?v=z40zpnaUrfY ### All About the RS-232 Serial Communication Protocol What Is RS-232 Serial Communication Protocol and What Does It Do? It may come as a shock to some of you youngsters, but the RS-232 serial protocol was once all the rage. In fact, it was the most widely used communication standard in the world at one point. Today, it is pretty easy to work with computers without ever seeing this connector. That doesn't mean that it's become completely obsolete, however!Given that you are reading an article about the RS-232 serial communication protocol, you likely have recently come into contact with it. For instance, perhaps you found an alien cable or port and have no idea what it is. Or maybe you have used RS-232 before but want to learn a little more about it. In either case, read on to learn what RS-232 serial communication is, how it works, and its benefits and drawbacks. The Basics of RS-232 Serial Communication First introduced in 1960, RS-232 is a standard for serial data communication between devices. Despite the “RS” standing for "Recommended Standard", the specifications of RS-232 are relatively flexible and have been repeatedly updated over the past several decades. For example, the protocol can use either a 25-pin or 9-pin D sub connector. Because of this, two devices using the same standard may not be immediately compatible because they have different physical connectors.RS-232 communicates data one bit at a time (in series), unlike a parallel interface that sends multiple bits simultaneously. The key benefit of this is that serial communication is less complicated and requires fewer wires.Historically, the RS-232 Serial Communication Protocol was commonly used for personal computing devices such as printers, projectors, modems, point of sale devices, and more. Today, many of these applications have switched to USB or wireless connections. However, RS-232 is still used heavily in automation, servers, networking, industrial communications, and many other applications. Just What Is That Connector Doing, Anyway? There are two connector sizes used for RS-232: DB9 and DB25. In both cases, RS-232 connects a Data Terminal Equipment end (DTE, the transmitter) to a Data Communication Equipment end (DCE, the receiver).The 9 pin connector seems to be a little more common these days, so let's take a peek at exactly how these pins are used. The table below shows the description and abbreviation for each pin. The column labeled "I/O" specifies the data direction from the male connector.NumberNameAbvI/ODescriptionPin 1Data Carrier DetectDCDInputThe DCE is connected to the line.Pin 2Receive DataRXDInputThis transmits data from the DCE end to the DTE end.Pin 3Transmit DataTXDOutputThis transmits data from the DTE end to the DCE end.Pin 4Data Terminal Equipment ReadyDTROutputThe DTE end is ready for transmission.Pin 5Signal GroundGND This carries the ground signal.Pin 6Data Communication Equipment ReadyDSRInputThe DCE end is ready for transmission.Pin 7Request To SendRTSOutputThe DTE end requests the DCE to prepare for transmission.Pin 8Clear To SendCTSInputThe DCE end gives the DTE the go-ahead.Pin 9Ring IndicatorRIInputThis transmits an incoming ring signal to the DCE.Looking straight at the male connector, pins one through five are in order from left to right on the top row, and pins six through nine are left to right on the bottom row. In the female connector, they are arranged the same except that they are right to left. Male DB9 Connector Female DB9 Connector The Nitty Gritty It can sometimes be helpful, or at least interesting, to delve into some of the more nitty-gritty details. For those with curious minds, here are some specifics that are taken into account when the data is actually being transmitted across the wire.Data Frame: A data frame is a transmission of data that begins with a start bit and ends with a stop bit. This is necessary because of the asynchronous nature of RS-232 serial communication. Because Data transmission can start at any moment, the receiver needs some way of knowing when a transmission starts and when it ends. The data frame defines this explicitly.Start Bit: The start bit is identified by the space-line level (a 0 in binary). The line is in mark state (a 1 in binary) when idle. Therefore, the start bit is easy to identify.Data Bits: Data bits are pretty straightforward. They are the bits of data of the actual communication along RS-232.Parity Bits: An additional bit can be added to a data word for error-detection purposes. The receiver can compare the parity bit value against the calculated value of the data.Stop Bits: The stop bit isn’t an actual bit per se, but a minimum period of idle time following transmission. When that minimum idle time can be paired with a start bit, the receiver knows it has received a full data frame.Baud Rate: Baud rate is the data transmission speed of a serial line. Both the transmitter and the receiver must be on the same baud rate. It is measured in bits per second.Full-Duplex vs. Half-Duplex: Serial interfaces like RS-232 can be either full-duplex or half-duplex. In full-duplex setups, both devices can transmit data simultaneously, while in half-duplex, they must take turns.Data Frame: A data frame is a transmission of data that begins with a start bit and ends with a stop bit. This is necessary because of the asynchronous nature of RS-232 serial communication. Because Data transmission can start at any moment, the receiver needs some way of knowing when a transmission starts and when it ends. The data frame defines this explicitly.Start Bit: The start bit is identified by the space-line level (a 0 in binary). The line is in mark state (a 1 in binary) when idle. Therefore, the start bit is easy to identify.Data Bits: Data bits are pretty straightforward. They are the bits of data of the actual communication along RS-232.Parity Bits: An additional bit can be added to a data word for error-detection purposes. The receiver can compare the parity bit value against the calculated value of the data.Stop Bits: The stop bit isn’t an actual bit per se, but a minimum period of idle time following transmission. When that minimum idle time can be paired with a start bit, the receiver knows it has received a full data frame.Baud Rate: Baud rate is the data transmission speed of a serial line. Both the transmitter and the receiver must be on the same baud rate. It is measured in bits per second.Full-Duplex vs. Half-Duplex: Serial interfaces like RS-232 can be either full-duplex or half-duplex. In full-duplex setups, both devices can transmit data simultaneously, while in half-duplex, they must take turns. Advantages of RS-232 Serial Communication Protocol RS-232 is remarkable for its simplicity and low cost. It is used by many legacy devices and is favorable in many point-to-point applications when no further complexity is needed, such as in industrial control equipment.Unlike USB, the most common modern alternative, maximum RS-232 cable lengths are dependent upon capacitance. However, a standard rule of thumb is that cables of up to 15 meters (50 feet) are generally supported. USB can support 3 to 5 meters (about 10 to 17 feet). RS-232 also handles noise better than many other protocols.Finally, converters such as RS-232 to Ethernet are relatively low cost compared to similar equipment for other protocols. This makes RS-232 relatively adaptable. Disadvantages of RS-232 Serial Communication Protocol The RS-232 protocol isn’t perfect, however. For starters, it has a slower baud rate, especially over long distances, and needs to use higher voltages. More significantly for everyday use, it is just less practical to set up than USB, especially for casual computer users.From a more technical perspective, the protocol is only appropriate for system-to-system communication in the single-master-single-slave configuration. Any communication with multiple chips or sensors on one end or with a more complex configuration will not be supported by RS-232. Using RS-232 on Your Network Despite being replaced by USB and other protocols in many situations, RS-232 is still heavily used today. In many applications and use cases, it can be helpful (or even necessary) to connect serial devices to networks using an RS-232 to Ethernet converter, also called a device server.NetBurner’s line of Serial to Ethernet modules is perfect for this use. They are easy to set up, robust, and offer helpful features such as custom baud rates, SSL/TLS support, and can be fully customized with development kits. Check them out today. ### MODM7AE70 Dev Kit Quick Start Guide - Video 1 Get up and running with NetBurner's MODM7AE70 development kit. In this first video, we take a look at what's included in the development kit, as well as how to access, download, and install the NNDK tools you can use to build your next IoT or embedded systems application. Find out more about the MODM7AE70 development kit on our site. You can also find the text version through our online documentation here. https://www.youtube.com/watch?v=lSoovTcnHBo ### NetBurner's NBEclipse: Top 10 Tips and Tricks Introduction Hello, fellow NetBurnians! As many of you know, one of the many tools that we provide to our users is a fully customized and Eclipse-based integrated development environment, or IDE for short. Whether you're knee-deep in IoT development with the MODM7AE70 or writing the guts of an autonomous vehicle with the NANO54415, our IDE is a great way to write, debug, and deploy your applications. We've affectionately dubbed this little gem NBEclipse, and have a host of information for it in our official online documentation, here. It covers everything from project setup to debugging and is a great place to start getting your feet wet. IoT Dev Kit Featured in this Article View Product Page Or, learn more about NetBurner IoT. That said, there's always a few little tips and tricks that don't quite make it into the official guides. Today, we're going to share some of our favorites with you. Please note that these tips apply to our latest tools, NNDK 3.x. Several of these tips come directly from an updated version of Eclipse that we are using with our newest toolset, which is Eclipse 2018-12. Okay, enough with the delays. Let's jump in. Our Top 10 List 1) Dark Theme We've all been begging for it (at least, I have), and now we have it. NBEcplise now natively supports a dark theme. To enable it, from the top toolbar, go to "Window → Preferences". In the preferences window that opens, select "General → Appearance" and choose the desired theme from the drop-down that appears on the right.   Dark Mode!!! 2) Change the Eclipse CDT Build Console Text Color If you jumped on the first tip and changed your NBEclipse to use a dark theme, you might notice that the build console text is exceptionally challenging to read. This is because, unfortunately, the theme does not change the Eclipse CDT (C/C++ Development Tooling) console text color, which remains black. Since we like to see what our build messages are trying to tell us, we're going to want to fix that. To do so, once again open up the preferences window by clicking on "Window → Preferences" from the top toolbar. From here, click on "C/C++ → Build → Console" and change the "Output text color" value on the window on the right. 3) Show Line Numbers There are few things as annoying as seeing an error message popup in your build window with an associated line number and not being able to tell at a glance where that line is in your code. To remedy this, pop open the NBEclipse preferences by navigating to "Window → Preferences". In the preferences window, head to "General → Editors → Text Editors". This option will open a long list of available options that you can customize on the right side. About halfway down the screen, as of this writing, is the option, "Show line numbers". Checking this box will add line numbers down the left side of your text editor window. Enabling Line Numbers Pro tip: You can also choose to insert spaces for tabs from this window. Another popular choice by many a developer. 4) Open discover.netburner.com from inside NBEclipse Many of you are familiar with our service to locate local NetBurner devices running applications built with NNDK 3.x. For those of you that might not be aware, you can open a browser, go to discover.netburner.com, and see all of the devices on your network. This behavior is, of course, configurable, but it is the default mode of operation for MODM7AE70s when they are shipped and for any module when initially upgraded to 3.x. This service is convenient when you're trying to figure out what the IP address of your device is after it initially boots up. To open discover.netburner.com from NBEclipse, navigate to the "Help" button on the top toolbar. Then choose "Discover NetBurner Devices" from the available options. Discover Local Devices 5) Add or Change a Hotkey For many that come from other IDEs, not having your favorite hotkey can be an infuriating experience. It is infuriating, don't deny it. Anyway, to add your own set of hotkeys, head back to the preferences window by selecting, "Window → Preferences". In the window that opens, select, "General → Keys". Customize Your Hotkeys On the right side of the window, you can set your custom key bindings by typing the general function of what you are trying to do in the text bar at the top. For example, "Open file". With luck, this will filter down the available options enough for you to find what you are looking for. To set the key binding, click inside the box labeled "Binding" and then type in the key combination you want to use. Any conflicts will be brought politely to your attention in the little window on the bottom right labeled, "Conflicts". When you're satisfied, hit "Apply and Close", and give those new hotkeys a spin! 6) Change IP Associated with Project When you're in the throes of embedded development, there will undoubtedly be a time when you will need to switch out modules. Other times, you might need to change the type of device you are using altogether. When this is the case, you will still want to keep that "program and debug your device at the push of a button" functionality that we're famous for. Fortunately, with NBEclipse, this is easy to do. To change the IP address or type of module associated with your project, right-click on the project name in the project explorer window from the main application and select "Properties". From the project properties window that shows up, select "NetBurner Options" on the right side. From here, you will be able to choose the platform you want to build the project for and associate a new IP address. You can try to locate a specific device by selecting the "Search…" button. If you choose one of the modules that are listed, its IP address will automatically populate the field for you. 7) Overload System Files Occasionally you will want to make changes to your system files for a specific project that you don't want to apply to any of your other projects. With the newest version of NBEclipse, it's easy to let each project have its particular version of the system libraries. To take advantage of this feature, simply drop the modified versions of the system files into the "overload" directory with the same directory structure the corresponding system files have from the install directory. For example, if you wanted to modify "predef.h", a common requirement, you would copy that file into "overload → nbrtos → include → predef.h". The "overload" directory is created automatically for every NetBurner project. For more information, see the "README.txt" file found in the "overload" directory. 8) Auto-Format Few things can rankle the ire of developers or instigate inhouse battles faster than issues of code formatting and whitespace. Now, you might be fortunate enough to have a coding standard that individuals actually adhere to. Even then, you may run into situations where you're trying to import or go through code that just doesn't fit with the way you like to see your digital world. NBEclipse is here to help. Not only will it format code as you're writing it, but it can also apply it retroactively to a file. The most helpful feature here is that you can define the formatting guidelines yourself, or import a predefined formatting style as a ".xml" file. Changing Formatting Options For example, if you were a big fan of Google's coding style for C++, you would go to their style guide GitHub repo and download "eclipse-cpp-google-style.xml". Then, from NBEclipse, you would go to "Window-Preferences". From the preferences window, you would go to, "C/C++ → Code Style → Formatter". On the right side of the window, select the "Import" button, locate your saved ".xml" file, and hit "Open". In the main preferences window, hit "Apply" or "Apply and Close", and your new formatting settings will be ready to roll. To format a file that is already open, select "Source" from the top toolbar in NBEclipse, and then select "Format". It will ask you if you want to apply formatting to the entire open file, or just to the current line of code your cursor is on. Make your choice, hit "OK", and watch the magic before your eyes. 9) Change (and Reset) Perspective NBEclipse has the nice feature of having multiple perspectives, or window layouts, that you are free to use, depending on the task at hand. We provide a default that is helpful when doing everyday development work. It includes a build console window, NBFind, a project explorer, an outline window, and of course, the text editor. When you start to debug an application, you have the option of switching into a Debug perspective. This perspective allows you to monitor the tasks running on your device, set and modify breakpoints, as well as a host of other handy functions. There is also the option of customizing any given perspective. You can move and resize windows, open new ones, close them (in my case, usually on accident and at the worst possible moment), pull them out of the main application window, etc. The options and flexibility are pretty impressive. While the perspectives themselves are incredibly beneficial, switching between them or resetting them back to their original state isn't always obvious. To do this, select "Window → Perspective" from the top toolbar. This will open a small submenu that will let you reset or save the perspective you are currently using, or change to a new one altogether. The options are fairly obvious, except for picking a new perspective that isn't already listed. To do this choose "Open perspective → Other…" from the submenu described above. It will show a list of available perspectives. What you see will depend on what plugins you have installed, but you should always have the NetBurner and Debug perspectives available. Speaking of plugins (you caught that, right?)... 10) Install Plugins Sometimes it's nice to save the best for last, and today that's exactly what we've done. In NBEclipse 3.x, it's possible to install other Eclipse plugins. Now, we can't go so far as to guarantee that every plugin will work as intended. NBEcplise is heavily modified, after all. However, of the few we've tested so far, the results have been good. The only way to know for sure is to give it a go and install one of your favorites.  We'll show you how to do this with two of ours: a) An Integrated Git Pluginb) A Terminal Plugin We use Git here at NetBurner for both our public repositories as well for managing our internal codebase. Being able to look at file histories and check-ins from inside NBEclipse is a feature that brought a tear to at least one developer's eye. Well, it didn't go quite that far, but needless to say, we were quite thrilled. The terminal plugin is incredibly useful for sending and receiving serial data to your NetBurner module or initiating an SSH or Telnet session to your device. It can also act as a command terminal for your local computer, or as a Git bash terminal. We should mention that it isn't entirely a full MTTTY replacement. We have yet to find another serial terminal that lets you upload a file over a serial port. That said, it's an incredibly useful extension that we're sure will find its way into many an NBEclipse environment over the months to come. How to Install To incorporate these little rays of sunshine into your own development experience, head to "Help → Install New Software..." from the top toolbar in the main application window. This option will bring up the install window. From here, we need to add the location where the plugins can be found on the web. We will be using: http://download.eclipse.org/releases/2018-12 Installing a Plugin Note that this link is specific to the version of Eclipse we are using, which is Eclipse 2018-12. Add the above URL to the text field labeled "Work with:" and hit "Add", then supply a reference name for the URL in the dialogue box that pops up. We are going to choose "Official Eclipse" and then hit the button labeled "Add". After a minute or two, you will see that the center area in the install window populates with a list of different items. All the Plugins!! To find the Git plugin, open the entry titled "Collaboration", and select the option listed as "Git integration for Eclipse". For the terminal plugin, open "General Purpose Tools", and then select "TM Terminal" and "TM Terminal Serial Connector Extensions". It will ask you to accept a license agreement and then a certificate. After you agree to these (you pretty much have to if you want to use the plugins), it will proceed to install the plugins and prompt you for a restart. Git Integration for Eclipse Plugin We'll dive more deeply into the Git plugin in a future article. However, to get you started, you will want to switch to the Git perspective. From here, you can set up a new repo or add an existing one. If you're not entirely sure how to get to the Git perspective, see item 9 above. Once the repo is ready to go, you will be able to access Git options, such as file history, from any perspective by left-clicking on your projects and resources. The Git Perspective TM Terminal Plugin To open a terminal, select the little blue terminal icon at the top of the NBEclipse window, just below the toolbar. A small window will pop up, asking you to choose your terminal type. Once you do, select, "OK". Depending on the type chosen, you'll need to specify a few other options. For example, in the image below you can see the serial choices available. Serial Settings for the Terminal Plugin That's a Wrap Thanks for hanging in there with us and checking out our NBEclipse top 10 tips and tricks list. Hopefully, you will find these both helpful in your development and enjoyable to use. If you have any tips or tricks of your own that you like to use, or have other plugins that you've been able to incorporate with NBEclipse, please let us know in the comments below! ### IoT and Smart Cities The term “Smart Cities” is nearly mainstream. However, whether you live in an international tech hub or not, most people don’t really have a clue as to what’s going on that is all that smart. In this IoT Industry Spotlight we’re going to look through the window dressings and peer into the inner works of the modern day smart city. We’ll discuss how IoT facilitates these advancements, and then point out some innovations and insights. So buckle up for this incredible journey through the industry that is the Smart City.   What Makes a Smart City? Try Our ARM® Embedded IoT Dev Kit View Product Page Or, learn more about NetBurner IoT. At the core of smart cities is a commitment by a local government to improve the city’s quality of life, economic viability, and it’s sustainability. Smart cities are urban areas where infrastructure and daily operations are monitored through a distributed network of sensor technologies (aka. IoT sensors or edge-nodes). These nodes connect to an information management system via the internet. [ 1 ] They provide real-world data to better automate and respond to conditions on the streets, to improve municipal services, and to predict and prevent failures or hazards. If you take a look at the list of the World’s Top Smart Cities, it’s clear that the criteria are varied and that the assessments are complex and somewhat subjective. [ 2 , 3 ]  But here’s the catch: everything is still under development, so it’s hard to say any city is a full-blown smart city just yet!   Smart City scoring systems reflect the complexity and subjectivity of assessment. Above shows a sample scorecard for the city of London, ranked #1. published by Eden Strategy Institute and ONG & ONG Pte Ltd. [ 4 ] Why Build Smart Cities? It’s difficult to understand if the growing wave in smart cities is a response to a practical need or just an obsession with digitizing everything in our world. Is this trend just greenwashing, a utopian dream, a waste of money, or is it a practical solution to a real need?  Smart cities aim to better integrate, regulate, optimize, and control the city’s impact on communities and the natural environment. Motives and implementations vary but typically focus on improving sustainability, efficiency, reliability, safety, and quality of services in relation to public operations, amenities and assets. For many cities, however, smart cities are a means to unlock the potential for economic growth. [ 5 ] Urban management is a tricky, bureaucratic, and costly business. City governments are responsible for an incredibly diverse set of responsibilities. These include public relations, strategic development, daily operations, and to some extent, socioeconomic happiness. A city is trusted to provide and manage essential services such as clean water, sewage treatment, waste collection, schools, hospitals, traffic control, transportation, roads, ports, libraries, parks, policing and public safety, and the list goes on. The work is inherently complex, difficult to deliver, highly siloed (managed vertically rather than holistically) and thus even harder to scale. [ 6 ] The Big Picture on Why Smarter Cities Matter It’s a simple fact that populations in urban are soaring. According to a variety of sources, today's urban societies of 4.22 billion people account for over 50% of the world’s 7.63 billion population. By 2050, that figure will increase by 50% to 6.6 billion out of a global head-count of 9.77 billion, for approximately ⅔ of the world’s population. [ 7 ]  With today’s cities already under considerable stress, keeping pace with this growth rate is a major global predicament. Compound that with the increasing challenges of sustainability, public health, safety, social justice and climate change and you have an even more significant problem. It is becoming apparent that IoT and smart cities are among the most formidable solutions that city governments can implement. Smart cities attempt to affect and improve a number of areas to deliver a better experience for residents, businesses, visitors, and the environment. A city’s infrastructure, modes of transportation, communication systems, public spaces, and services serve as the substrate for transformations and improvement. The Deloitte smart city framework shown in the figure below provides a visualization of the interaction of constituents, domains, infrastructure, and goals of a smart city. [ 8 ]   Deloitte’s smart city framework depicts the complex interactions within the smart city. Source : Deloitte What Kind of Tech Goes into a Smart City? Smart cities are highly complex ecosystems. The leaders in the field are finding ways to analyze and layer data from a multitude of sources to better understand and manage operations. IoT is undoubtedly one of the primary ingredients, but leading implementations work to leverage that and more. Here are some of those other elements that make up this rich and complex recipe. IoT Sensors and Actuators - IoT sensors (a sensor connected to the internet) collect real-time data such as traffic conditions or storm water flow rates. IoT actuating systems (e.g., a relay or indicator connected to the internet) can dynamically control traffic lights or flood gates based on IoT sensor readings and other data. IoT sensors and actuators are diverse and can perform a number of functions. Big Data Analytics and Artificial Intelligence(AI) - Analyzing massive data sets (much of it from IoT nodes) and using statistical and artificial intelligence models can help predict and optimize city operations and infrastructure. AI is used to drive real-time automation and decision making. Data sources such as climate and weather forecasts, stock or commodity prices, or holiday schedules inform intelligent and dynamic control of the smart city. IoT Edge Computing - Localized computing at the edge is used to streamline data and provide low latency data analysis and system control. Cloud Computing - Virtual infrastructure used to store data, execute business logic, and serve user interfaces over the web. Blockchain - Increasingly considered for procedures requiring a chain of custody, asset tracking, supply chain management, regulatory compliance, and payment processing. Drones and Robots - Autonomous vehicles can carry imaging payloads used to map conditions and identify problems. They can also be used to automate daily operational tasks. Social Media and Personal Devices - Individual and institutional social media accounts and personal devices can be used as a data source and a means of conveying emergency alerts, public service announcements, and advisories. Geospatial Data - GPS is used to track vehicles, city assets, and even employees to increase operational responsiveness and efficiency. Satellite mapping and geographic information systems (GIS) are combined with data analytics to optimize traffic flows, development planning, or to understand social or environmental issues better. Wireless Connectivity - 4G/5G and Low Power WAN are critical to cost-effective deployments of thousands of IoT nodes. And that’s just the start! The Impact of Smart Cities Smart cities embrace a new paradigm where government moves away from unilateral management. Taking its place is greater collaboration between agencies, municipalities, businesses, citizens, and other stakeholders to better tackle current and future urban challenges and opportunities. To a large extent, this is due to improved data collection and digital connectivity. According to Deloitte, it all boils down to smart cities’ focus on improving people’s quality of life, environmental sustainability, and local economic competitiveness to attract talent. [ 9 ] Perhaps one of the most intriguing impacts that a smart city has is to allow a diverse set of stakeholders to gauge the issues it faces based on real data. This collective understanding allows for better, more informed decision making, smarter solutions, innovation, and community collaboration towards urban needs and problems.  Implementation Challenges Just like most industries implementing IoT and other smart solutions, there obstacles and areas for careful implementation. However, in the realm of smart cities the challenge might be more significant. Complexity Smart cities encounter issues with security, hardware and software interoperability and compatibility, system adaptability, data connectivity, and scalability. Getting all of these spot-on requires extensive understanding and coordination with numerous internal systems, 3rd party systems, partners, institutions, and agencies. If we approach smart cities’ complexity from an IoT-only standpoint, there are already hundreds of products out there. These do various things like measure leaks, clock-in and out employees, open doors, control HVAC or lighting, etc. Each device may have different protocols, interfaces, and security standards, making integration and interoperability a massive feat.  Smart cities aim to integrate these publicly and privately owned devices to make better decisions on how to operate and develop the city. This a major reason why public-private partnerships are central to the smart city strategy -- in part so that vendors understand the best ways to design and build their products.  Data Privacy and Security Smart cities will require greater access to data from the streets, offices, factories, ports, schools, and even personal devices to optimize city operations. This level of access introduces serious issues concerning malevolent threats of cyber-terrorism, data privacy and security, data ownership, regulation, and compliance. Smart cities may be the largest and most complex of the industries dealing with these challenges. New ways to firewall, anonymize, authorize, track, and secure private data and devices will need continuous innovation. Budding technologies, like blockchain and quantum computing, may be part of the solution. Funding According to IoT-Analytics Research, funding is considered the most significant major barrier to the realization of a smart city.[ 10 ] Scaled IoT architectures bear a high cost in implementation, capital equipment, and overhead. It takes a solid strategy and execution to chip away at the various projects and facets which create a holistic smart city that delivers tangible value. Public-private partnerships and collaboration are perhaps the greatest tools to define requirements and fund implementation. Politics and Bureaucracy City politics and siloed municipal bureaucracies make implementing smart cities a major social task. There must be a clear business case and value proposition combined with demand from the public and private sectors to spur progress and investment. Furthermore, the practice of hoarding data and programs in siloed offices conflicts with the implementation of a working smart city. Aside from funding this may be the most difficult challenge area. Future-Proof Design Smart design is critical for a smart city. Security and future-proofing must be built into the architecture. Keeping up with the latest technologies and vulnerabilities is essential, as is a way to “easily” integrate improvements and updates. As with any scaled IoT solution, remote upkeep and maintenance of the network’s firmware, software and protocols is a must. Finally, selecting suitable sensors that can collect reliable and accurate data in the required environmental conditions is critical. Standards The scope of a smart city is so much larger than just about any other smart industry. Because of geography, specific constraints, and requirements, smart city implementations vary greatly. This complexity has also slowed the process of design standardization. Currently, standards are just being released. Examples are ISO 37112 and ISO 37120, but they only provide guidance on the indicators for a smart city. [ 11 ] While just the beginning, it’s certainly a good start! Application Areas Smart cities are a systems of systems... of systems. We’ll cover some of the major application areas which are industries unto themselves. Environmental Health and Public Safety  Smart cities offer an improved capacity to report emergencies, hazards, and other conditions that impact people’s health and safety. Data can be shared with commercial mobile applications and telecom providers to better inform people. Our emergency report systems, 911 and 311, which allow citizens to report emergencies, hazards and non-life threatening events, are being integrated with IoT and communication networks. Doing so will enable them to alert the appropriate first responders and dynamically reroute traffic or control particular safety systems. This also reduces strain on the human resources required to deal with life-threatening emergencies. Cities like San Jose, California and Boston, Massachusetts are some of the cities leading the way.[ 12 , 13 ] Using an IoT system, gas and water pipes can be monitoring to detect leaks, blockages or other faults. The data collected by IoT sensors can also be used for preventative maintenance to reduce the cost and severity of repairs proactively. This provides benefits in safety, public health, operational costs, and sustainability. Water and air quality can be actively monitored in a multitude of indoor and outdoor locations with IoT to improve the environment and public health of a city. IoT-based monitoring will also be important to understand problem areas, track progress, and determine if goals are being reached. Smart buildings Perhaps buildings define the urban landscape more than anything else. They house people, businesses, hospitals, shops, transportation hubs, factories, schools, public infrastructure, you name it! There are smart technology niches for just about any building out there.  Automating their functions and tying them in to a smart city using IoT is a significant component of the smart city strategy. The design space in a building can cover a variety of systems, often including heating and cooling, fire and security, electric and gas metering, and lighting. Smart buildings allow for more efficient, reduced carbon footprint cities. They collect real-time data to make better daily operational and policy-level decisions. Honeywell and Nest are big players in this space.  Smart Utilities Efficiently and safely providing reliable gas, electric, and water is essential to the success of a city and its people. The implementation of IoT smart utility meters in buildings, for example, allows electric utilities to get real-time load measurements and thus prevent costly brown-outs with dynamic load-balancing. Future HVAC systems may someday accept smart city commands to temporarily reduce power draw in order to keep a city online during peak periods of demand. Smart buildings and the IoT devices within them can be used to reduce greenhouse gas emissions and save building owners money. Companies, such as Smartmeterq, manufacture IoT smart meters. The increase of rooftop solar and smart meters has allowed for microgrids to supplement utility-scale power generation. Smart meters provide utility operators with real time data that allows them to reduce power generation with gas or coal when conditions are right. This reduction saves money and lowers emissions. Smart Street Lights   Street lights consume up to 40% of the city's public electricity budget. Upgrading to smart street lights is considered a low-risk, high-return project for the emerging smart city. This is perhaps one of the more developed niches in the industry, with a multitude of industrial solutions providers like Itron, Tvilight and Intellilight.  Smart street lights use sensors to detect ambient light and vehicle or pedestrian motion and then turn on or off as needed. These lights become IoT when they connect to a central management system. The system will be able to analyze data better and more effectively control individual lights or groups of lights depending on activity and strategy. According to Itron, smart street lights provide a city with up to a 50% savings on electricity! [ 14 ] Smart Mobility and Transport  Getting people and materials rapidly and reliably from point-to-point directly impacts the quality of life, the productivity of businesses, and the environment. We are seeing electric vehicle offerings, smart mobility, and ride-sharing applications beginning to have a prominent role in society. When integrated with an overall smart city and it’s existing transportation system, these can reduce traffic, pollution and save money. Smart transportation allows public transportation routes to dynamically adjust based on demand, capacity, and traffic conditions. IoT is critical for the monitoring and control of this interconnected system. Roads, bridges, railways, and ports are vital components of what makes cities work. IoT is used to monitor the health and usage of these arteries. Sensor data can be used to detect damage before catastrophic failure. They can also monitor traffic, accidents or hazards and provide early alerts for commuters and first responders.  Smart traffic control allows for traffic lights to adjust dynamically based on real-time conditions. Road signs can even dynamically update with detours or advisories. Companies, like Ericsson, are currently working on smart traffic control solutions. Smart Parking Parking a car is never fun or easy in most cities. Smart parking systems are being used to monitor the available capacity of parking lots and locate spots for drivers on the road. This allows drivers to quickly find and reserve a spot and get to their destination faster, and thus save gas, reduce emissions and ease traffic congestion.  IoT plays an important part in detecting empty spots and sharing that information with applications and management systems. The technology also allows parking lot owners to sell their service more easily, so it's a win-win. There are several smart parking companies like Parkify and Smart Parking Ltd., which currently provide solutions ready for use in smart cities. Final Tips and Thoughts to the IoT Innovator It’s becoming clear that providing for security, protocol flexibility, and APIs to better integrate with the evolving smart city ecosystem is a winning strategy. Smart cities represent a fascinating vertically integrated market and are perhaps one of the biggest opportunities out there. As mentioned earlier, with an ever-growing world population and over 70% of people living in urban areas by 2050, there is an urgent need for solutions to make living in cities sustainable and enjoyable. It seems safe to say that smart cities are not just another excuse to sell microchips and cloud services. They have a legitimate and somewhat lofty ambition to put people and the environment at the center of how and why cities work. While we haven’t been able to deem this a utopian dream just yet, there seems to be an incredible potential to provide real value. As a bunch of embedded engineers and enthusiasts, we’re just pumped knowing that IoT is one of the major enablers of this exciting new world! We’d love to hear from you, especially if you are lucky enough to live in one of the leading smart cities around the world.  A Few Interesting Links NetBurner’s IoT in Industry Spotlight Series Smart Cities Benchmarking Tool and Smart Cities Interactive E-book by ESI Thought Lab Understanding Smart Cities: An Integrative Framework from 45th Hawaii International Conference on System Sciences Overview of Smart City Tech Areas by IoT-Analytics ### AWS IoT with MQTT: A Code Review In a previous article, we walked through a step by step process of how to get started with Amazon’s AWS IoT Core managed cloud service. To do this, we used the lightweight MQTT messaging protocol and a NetBurner development kit as the IoT device. While we covered all of the base requirements from start to finish, we also glossed over an awful lot concerning the actual application running on the NetBurner module. In this article, we're going to revisit the program, crack it open, and take a peek at how it ticks. This walk-through will give you the jump-start you need to design even more robust applications around these core functions. Read more about the IoT Core Cloud Service here IoT Dev Kit Featured in this Article View Product Page Or, learn more about NetBurner IoT. First, we're going to look at the functionality of the overall application. Next, we are going to review the source code and get a feel for where everything lives. Finally, we will get up close and personal with the individual bits that do the dirty work. We’ve included a substantial part of the application in the article below, but if you want the truly immersive experience, you can find the GitHub repo for the project here. Program Overview Our application is very straight forward, and implements four distinct pieces of functionality: Initial setup Publish an MQTT message ever 5 seconds Subscribe to an MQTT topic to receive incoming messages Provide a web interface to view the last message sent and received We expect the messages to be published and received in the JSON format and use the ParsedJsonDataSet class extensively in processing the MQTT payload data. Source Code Review Figure 1: The Project Files Our project contains several source files, the AWS SDK, and an html folder that includes the index.html we use in our web interface. In this article, we will concern ourselves mostly with the six .cpp files directly in the src folder (shown above in Figure 1), their associated header files, and a configuration header file. The following is a brief description of each of these: main.cpp - This is the starting point of the application. It defines the application name, AWS IoT Core Base, and provides the entry point for our program with UserMain(). More on this bit later. post-record-data.cpp - This file contains the functions that initialize the AWS SDK, and handles processing both incoming and outgoing MQTT messages. network_netburner.cpp - This file contains the functions that are required to implement the networking interface for the AWS SDK API and ties it to our networking stack. These are all exclusively related to the TLS network connection. timer_netburner.cpp - This file contains additional functions that are required by the AWS IoT Core MQTT client, and are related to the timer functionality that is used to manage the MQTT connections. record-data.cpp - This contains a small function that serializes the JSON data used in the MQTT messages. html-control.cpp - This file contains two functions used to build the HTML page that displays the most recently sent and received MQTT messages, as shown below. aws_iot_config.h - This file has all of the config constant values that we need to connect to our service and publish/receive messages. As mentioned in the previous article, you will want to change both AWS_IOT_MQTT_HOST and AWS_IOT_MQTT_CLIENT_ID to values that are specific to your account and environment. Figure 2: Web interface displaying last received and sent message Initial Setup Let's turn our attention to the entry point of our application, UserMain(), found in main.cpp. Inside UserMain(), you will see calls to the following functions, more or less in the given order, before we hit our main while() loop: init() - This function sets up the network stack for the application, starts the configuration server, gives UserMain() the correct task priority, and sets up a few debug details. If you happen to forget this in your application, you will know very quickly. StartHttp() - This kick-starts the webserver on the device. It couldn’t be easier. InitializeAWSSDK() - This does pretty much exactly what you would expect. It sets up the AWS SDK and takes care of the initial MQTT setup. We’ll dive into this a bit more below. After everything is initialized, we will enter our main while loop, where you will see the following bit of code:   while (1)     {         // Post our record data         PostRecordData(); // Wait 5 seconds before doing it again         OSTimeDly(TICKS_PER_SECOND * 5);     } In true embedded systems fashion, we will continue to run our while() loop indefinitely. Every five seconds we will make a call to PostRecordData(), which will post a message to our subscribed MQTT topic, defined as gTopicNameSend in post-record-data.cpp. Initializing the AWS IoT Core SDK for MQTT As mentioned above, initializing the AWS SDK for IoT Core services takes place in InitializeAWSSDK(), found in post-record-data.cpp. bool InitializeAWSSDK() {     IoT_Error_t rc = FAILURE;     IoT_Client_Init_Params mqttInitParams = iotClientInitParamsDefault;     IoT_Client_Connect_Params connectParams = iotClientConnectParamsDefault;     iprintf("nAWS IoT SDK Version %d.%d.%d-%sn", VERSION_MAJOR, VERSION_MINOR,     VERSION_PATCH, VERSION_TAG);     // Set required MQTT parameters     mqttInitParams.enableAutoReconnect = false;     mqttInitParams.pHostURL = AWS_IOT_MQTT_HOST;     mqttInitParams.port = AWS_IOT_MQTT_PORT;     mqttInitParams.pRootCALocation = "";     mqttInitParams.pDeviceCertLocation = (char *) certificate;     mqttInitParams.pDevicePrivateKeyLocation = (char *) privatekey;     mqttInitParams.mqttCommandTimeout_ms = 30000;     mqttInitParams.tlsHandshakeTimeout_ms = 10000;     mqttInitParams.isSSLHostnameVerify = true;     mqttInitParams.disconnectHandler = nullptr;     mqttInitParams.disconnectHandlerData = nullptr;     rc = aws_iot_mqtt_init(&client, &mqttInitParams);     if (SUCCESS != rc)     {         iprintf("aws_iot_mqtt_init returned error : %d ", rc);         return false;     }     connectParams.keepAliveIntervalInSec = 600;     connectParams.isCleanSession = true;     connectParams.MQTTVersion = MQTT_3_1_1;     connectParams.pClientID = AWS_IOT_MQTT_CLIENT_ID;     connectParams.clientIDLen = (uint16_t) strlen(AWS_IOT_MQTT_CLIENT_ID);     connectParams.isWillMsgPresent = false;     iprintf("Connecting...n");     rc = aws_iot_mqtt_connect(&client, &connectParams);     if (SUCCESS != rc)     {         iprintf("Error(%d) connecting to %s:%dn", rc, mqttInitParams.pHostURL, mqttInitParams.port);         return false;     }     rc = aws_iot_mqtt_autoreconnect_set_status(&client, true);     if (SUCCESS != rc)     {         iprintf("Unable to set Auto Reconnect to true - %dn", rc);         return false;     }     iprintf("Subscribing to topic: %s, %dn", gTopicNameRec, strlen(gTopicNameRec));     rc = aws_iot_mqtt_subscribe(&client, (char *) gTopicNameRec, strlen(gTopicNameRec), QOS1, IoTSubscribeCallbackHandler, nullptr);     if (SUCCESS != rc)     {         iprintf("Error subscribing : %dn", rc);         return false;     }     return true; } Near the top of the function, you will see the parameters getting set for the call to aws_iot_mqtt_init(). You should be okay with sticking to the values we’ve provided. However, for the exceptionally curious, you can find out more about each one from the official AWS API documentation, here. Assuming the MQTT initialization function is successful, we will then set up our connection parameters and pass them into the function, aws_iot_mqtt_connet(). As you might guess, establishes a connection to the AWS IoT Core service. Again, you should be okay with the values we set, but you can find more information on what these represent here. If we’re able to successfully set up a connection, we follow it up with a call to aws_iot_mqtt_autoreconnect_set_status() which includes a parameter of true. This will make sure that we automatically reconnect if our connection fails for some reason. Finally, we subscribe to our topic with a call to aws_iot_mqtt_subscribe(). The topic that we will subscribe to is gTopicNameRec, which is defined at the top of post-record-data.cpp. We also pass a pointer to the function that is called when we receive a message, IoTSubscribeCallbackHandler(). Publishing MQTT Data Now that we’ve established a connection to the AWS IoT Core service, we are ready to start publishing messages using the MQTT protocol. As we mentioned before, we will post a new message once every five seconds from our UserMain() function with a call to PostRecordData(), which is defined in post-record-data.cpp. void PostRecordData() {     char buffer[200] = { 0 };     CreateOutMessage(gJsonOut);     gJsonOut.PrintObjectToBuffer(buffer, 199, false);     IoT_Publish_Message_Params paramsQOS1;     paramsQOS1.qos = QOS1;     paramsQOS1.payload = (void *) buffer;     paramsQOS1.payloadLen = strlen(buffer);     paramsQOS1.isRetained = 0;     IoT_Error_t rc = aws_iot_mqtt_publish(&client, gTopicNameSend, strlen(gTopicNameSend), ¶msQOS1);     if (SUCCESS != rc)     {         iprintf("Error publishing : %dn", rc);     }     else     {         iprintf("Publish success:rn");         gJsonOut.PrintObject(true);         iprintf("rn");     } } The first thing you’ll notice we do is call CreateOutMessage(). This builds our MQTT payload and stores it in gJsonOut, which is a ParsedJsonDataSet object. We save this globally so that it can be referenced and displayed via a webpage served up by our module. The contents of the record are a timestamp of when the message was created and a static id that is incremented whenever the function is called. The record is defined by the class PostRecord and is serialized into gJsonOut along with the device id, AWS_IOT_MQTT_CLIENT_ID. With our payload correctly structured, we dump it into a buffer before setting up our IoT publish parameters. Receiving MQTT Messages As mentioned before, our call to aws_iot_mqtt_subscribe() during our initial setup subscribed us to the topic, gTopicNameRec. One of the parameters to that function, IoTSubscribeCallbackHandler, provided the handler to the function that will be used to process incoming messages. void IoTSubscribeCallbackHandler(AWS_IoT_Client *pClient, char *topicName, uint16_t topicNameLen, IoT_Publish_Message_Params *params, void *pData) {     iprintf("Received Message:rn");     ParsedJsonDataSet jsonIn = ParsedJsonDataSet((char *) params->payload, (int) params->payloadLen);     jsonIn.PrintObject(true);     iprintf("rn");     jsonIn.PrintObjectToBuffer( recJson, 256, true); } We know what the signature of the function should be because Amazon is kind enough to give us a pretty good breakdown in their API documentation. The function itself is very short, as we simply take the payload data from the MQTT message, and use it to construct a ParsedJsonDataSet object. We then stash the contents of that object into a buffer so that we can serve it up on the webpage and show what the last message received was. The Web Interface We’ve taken advantage of NetBurner’s ability to generate dynamic web content to display the most recently received and published MQTT messages. To do this, we defined two functions in html-control.cpp that will print the data to the webpage before it served to the requesting browser from the device. These are PrintOutData() and PrintInData(). Specially formatted comments in index.html trigger these functions, and they have the structure, . This makes it very easy to display any sort of application-level data through the web interface. We have extensive documentation on this system and include several fully functional examples with our NNDK. Implementing the AWS SDK Dependencies Of course, there has to be a way for the AWS SDK to tie into the NetBurner platforms and networking stack. There are two interfaces provided by the SDK that we use here: the network interface and the timer interface. As mentioned above, the functions for these interfaces are defined in network_netburner.cpp and timer_netburner.cpp respectively. The network interface provides all of the TLS functionality for initiating and closing secure connections, as well as reading and writing data over those connections. The timer interface provides the timeout functionality required to keep the MQTT connections alive and kicking. The functions for both of these interfaces were required before we could connect to the AWS IoT Core service and start sending and receiving MQTT messages. If you followed the instructions in the previous article on generating and compiling the certificate and private key, there shouldn’t be any need to modify the functions implemented here. That said, feel free to dig in and let us know if you have any specific questions or comments. Closing We’ve provided a solid foundation here, but this is truly just the beginning of where this particular project can go. In the coming months, we will start to explore incorporating other AWS services into our IoT application. Don’t wait for that before you jump into your own projects, though! We’d love to hear what you’re up to, and how you’re using Amazon’s AWS IoT Core service or our development kits. Feel free to email us directly at sales@netburner.com or leave a comment below. Also, if you want to learn more about IoT architectures and better understand how IoT devices, protocols, and cloud services all work together, click on through to our article on just that! Cover photo credit: Pawel Czerwinski ### IoT and the New Agricultural Revolution We take it for granted, but agriculture is literally central to life and has been since the dawn of civilization. It began as a supplement to a hunter-gatherer lifestyle with the cultivation of ancient wild grains, fruits, and vegetables. Today, farming provides nearly all of our plant-based foods, in addition to meat, dairy, eggs, oils and biofuels, medicines, and natural fibers, like cotton. The industry is often misunderstood as old fashioned and irrelevant. However, today’s smart farming and ag-tech innovations are at the forefront of many bold innovations to help feed, clothe, and supply an ever-growing world population under the pressure of climate change. In this article we’ll look at several of the benefits of IoT and “smart farming” within the agricultural industry. Try Our ARM® Embedded IoT Dev Kit View Product Page Or, learn more about NetBurner IoT. A Grave Problem and an Epic Opportunity There are 7.6 BILLION people on Earth with 9.1 billion expected by 2050. According to studies from the United Nations and other sources, to adequately feed that population, food production must increase between 25% and 70%! [ 1,2,3,4 ] Even at the 25% growth level, the challenge is immense, but that’s not all...  We’re already experiencing a considerable food deficit. A 2019 report from the World Food Programme states that there were “821 million chronically undernourished people in the world last year, up from 811 the previous year. One in nine people in the world now faces hunger.” [ 5 ] It is feared that farms, facing the effects of climate change and land degradation, will not be able to meet this vital and staggering demand.  Climate Change Speaking of climate change, agriculture is both a victim and an offender here. Floods, droughts, heavy storms, sea-level rise, and climate unpredictability are just bad news for farming. It’s ironic that agriculture just so happens to be one of the leading sources of greenhouse gases, including methane, nitrogen oxides, and carbon dioxide. Agriculture (“Ag”) and related land use accounts for greater than 10% of global greenhouse gas emissions. [ 6 ]  Excessive Waste Massive quantities of food and agricultural waste are also pandemic. According to the Food and Agriculture Organization of the United Nations, “Roughly one third of the food produced in the world for human consumption every year — approximately 1.3 billion tonnes — gets lost or wasted.”[ 7 ] This does not account for other wastes such as cattle feed, manure, silage, or fertilizer leachate.  Throughout the process, from irrigation to harvesting to processing and retailing, there is considerable room for the industry to decrease the amount of wasted output which, in turn, can reduce emissions and improve the profitability of operations.  Agriculture’s Tech Make Over To address these significant problems, a new Agricultural Revolution is afoot with IoT-enabled Smart Farms central to the strategy. [ 8 ] It’s a true paradigm shift when you appreciate that agriculture is at the very bottom of the list in terms of major industries which have adopted digital technology. [ 9,10 ] With ag’s massive farms and labor-constrained operations, it just seems like digitization and automation are a perfect fit. Benefits of Agricultural IoT According to Harriet Sumnall at ABI Research, “The reasons for adopting IoT in agriculture are universal – cost reduction, improved productivity, and better profit margins – but the specific prompts in terms of readiness to adopt can be more pragmatic and localised.”[ 11 ] For the farm, the promise of IoT-enabled smart farms is for higher revenue and more predictable cash flow. For society, this hopefully leads to a better supply of food, with less price volatility, waste, and pollution. Here are some generalized benefits:  Increased and higher-quality yields Prediction of output and planned harvest, sale, and distribution (risk reduction) Cost and labor management  Waste reduction and management Improved land-use management [ 12 ] Resource management - smart irrigation, fertilizer, and pesticide application Detailed weather and micro-climate monitoring and prediction Food traceability and supply chain logistics Preventative equipment maintenance and occupational safety IoT in Ag-Tech Today’s availability of low-cost and effective sensors, embedded systems, low-power wireless communications, distributed power, and robotic technologies allow for increasingly economical integration at the agricultural-scale. In an industry faced with growing demand, inefficiencies, and massive challenges, it’s safe to say that this is ag’s time to get smart with IoT. IoT is an important element in all of these agricultural-technology (“ag-tech") areas: Farm management information systems - Specialized software applications that collect, store, organize, visualize, process, analyze, and disseminate farm related data and business logic. This could be thought of as the application layer in an IoT architecture. They are frequently provided as Software as a Service (SaaS) platforms. Precision agriculture - A newer farm management practice that works to optimize crop or livestock yields and profitability while minimizing environmental impact by using aerial, remote or distributed sensing to collect spatial and temporal farm data. Data is then collected and analyzed to support an intelligent and holistic Decision Support Systems (DSS). This supports anything from targeted watering, fertilizer usage, harvesting, land and waste management, and crop storage. [ 13 ] Automation- Seen as crucial to the future of meeting demand, especially in labor constrained countries such as the US. Artificial Intelligence (AI) - Combined with data analytics, AI helps farmers aggregate and analyze massive data sets to identify problems areas, predict yields, and optimize operations. Autonomous vehicles, robotics and drones - Assists in the monitoring of crops and livestock and supports resource application. Can be especially useful in labor constrained or hazardous operations. Sensors and Actuators - These IoT edge nodes are crucial for the real-time collection of crop data and the automated metering and application of resources such as feed or irrigation. Embedded Networking and Edge Processing - Allows for the connection of edge sensors and actuators to an integrated IoT architecture. Edge Processing allows for certain data to be analyzed in situ to reduce latency and processing from the cloud. Wireless Communications - Smart farming is dependent on numerous distributed IoT edge nodes. Low power, low-cost wireless technologies like Lora, SigFox, and 5G make this feasible. Cloud Computing - Serves to aggregate the "big data" produced by agricultural edge sensors and 3rd party data sources such as weather service data or dam flow rates. Applications are often written that process, analyze, visualize, optimize and automate farm operations. Some of the Downsides to IoT Ag-Tech No Silver Bullet It’s not as simple as it sounds, really. Farming is on a global scale, driven by thousands of years of interpersonal, geographic, political, cultural and regional influences. These differences mean that there is absolutely no one-size-fits-all Smart Farm or IoT solution. Thankfully, IoT is extremely flexible and scalable, thus making it well suited to the challenge of agricultural diversity. Data Privacy and Ownership As with just about anything in IoT, data privacy and security is an issue. In farming, a major concern is with the unauthorized sharing of a farmers’ crop data in a way that violates their privacy or uses the data for profit without express permission. As with many industries, this is a growing concern. Best practices on how to deal with it are continuously evolving and are subject to location specific regulations. [ 14 ] Furthermore, since farm production is very much tied to financial markets and national security, it is wise to encrypt and secure the smart farm from surveillance and sabotage. Applications Due to the global scale and diversity in farming practices, it’s fair to say that there are too many applications to cover. We’ll address some of the general application areas and then provide a few specific use cases. Cattle Monitoring and Automation According to Dairy Global, “By 2024, over 2 million farms and 36 million cattle will be connected.  For livestock, it is about collecting data relating to the health of the animals, including birthing activities, as well as knowledge of their whereabouts.” [ 15 ]  The desire to optimize mating and feeding is also in demand within the industry.  Precision milking is one of the subsets of smart dairy farming that attempts to optimize daily milking routines. Waste management (e.g., manure collection and distribution) is another area that can be improved with IoT. Many of these capabilities are supported by IoT, global positioning systems (GPS), radio-frequency identification (RFID), image recognition, cloud computing, and automated feeding systems. Afimilk and Allflex (an Antellieq company) each provide farms with an integrated IoT Cloud architecture, hardware and SaaS management information system to monitor and optimize livestock feeding, health and breeding. NoFence uses smart animal collars to enable geofencing. The collars provide a mild electrical “stimulus” that promotes the animal to stay within the desired pasture. The tool helps manage overgrazing. When combined with other IoT and geographic information systems (GIS), it can also support improved productivity, land management, and regenerative agriculture. Lely provides robotic cattle feeding and milking equipment that can be integrated with a smart farm management information system. Dairy cattle are feed using a Lely feeding robot, which can be integrated with IoT. Photo credit: maxpixel.net Livestock with RFID tag can be tracked through an smart farming, IoT architecture. Photo credit: Wikimedia Crop Monitoring and Automation Crops can run the gamut from food crops, animal feed, biofuels, and industrial lubricants to those growing fibers like cotton. There are several drivers for the introduction of connectivity and the IoT to better monitor and manage croplands. IoT allows for precision farming by measuring localized soil conditions and nutrient levels, pH, moisture, localized microclimates, weather, and many other useful indicators of crop health.  This detailed IoT-sensor data can then be used to better time cropland preparation, planting and harvesting. Precision agriculture can be used to apply resources, such as  irrigation, fertilizers, herbicides or pesticides, more sparingly and to the specific areas that require resources in real-time. IoT goes even further by improving the efficiency around crop storage, distribution, and waste management. Here are a few examples of innovations in this area: FarmMobile provides a software platform for farmers to aggregate and analyze IoT data to inform more productive, precise and sustainable farming. American Robotics and SkyCision are two companies that offer IoT-drone platforms to monitor and optimize operations and crop planning.  Drones are commonly used to map crops and detect areas undergoing crop stress. Edge computing and AI enhances the detection capabilities. Skyx and DJI make precision pesticide-spraying drones that are deployed to the precise crop areas that require chemical application. This reduces the need for crop-wide chemical applications.  Sensoterra and Smartfield are two companies that make smart farming sensors to measure anything from soil moisture to crop canopy temperature. Using IoT, resources such as water can be targeted to areas that need it most. Photo credit: Jose Gonzalez DJI Agriculture Plant Protection Drone UAV can be integrated into a smart farm IoT architecture. Photo credit: Maxpixel.net Forestry Monitoring Forests may not be edible, but many forests around the world are planted and managed for lumber or paper production. In essence, many forests are wood farms. They also provide a valuable medium-term sink for carbon dioxide.  As we showed in one of our more recent blog posts, drones with hyper-spectral imaging are becoming more common in monitoring these natural assets Distributed sensors are used to monitor weather, soil conditions, water, and other indicators of forest health. The data can be used to measure growth rates and to predict yields, future cut dates, and to optimize plantings. Aquaculture Monitoring Agriculture is not just for the land-lovers. The aquaculture industry is an interesting sector within the ag industry. On-shore and off-shore production of fish has become big business. These seafood farms have many challenges and can benefit from reducing waste and improving efficiency. IoT is being used to monitor water conditions like temperature, pH, and ammonia to provide healthier growing conditions and more efficient harvesting times. The Yield is an IoT Ag-Tech company that began with work in aquaculture farming to improve the yield and quality in the oyster farming industry. By using IoT to measure microclimates, weather systems, salinity, water temperature, and other environmental conditions, the seeding and harvesting of oyster beds was optimized. Since then, the company has expanded into all types of agriculture. IoT is even used in aquaculture. Photo credit: Wikimedia Smart Greenhouses and Vertical Farming Greenhouses are a technology that have been around for a while, but the latest generation is something out of utopian fiction. These smart greenhouses provide automated watering, temperature control, lighting, feeding, air circulation, pesticide application, and even robotic harvesting. Innovations in hydroponic and aeroponic irrigation with specialized LED lighting now permit vertically stacked, highly intensified indoor farms that grow in the absence of all sunlight. The industry fits a niche by growing produce in urban centers or in geographies that have short growing seasons. The benefit is that high-quality food can be produced year-round, under less than ideal growing conditions, and with hungry consumers only miles away. Resources and growing conditions can also be strictly monitored and regulated. Aerofarms - One of the leaders in the field of indoor smart vertical farming and aeroponics. The company claims their approach uses “95% less water than field farming and 40% less than hydroponics”, and that seed can grow “in half the time as a traditional field farmer, leading to 390 times more productivity per square foot than a commercial field farm.”  [ 16 ] Researchers at Wageningen University & Research (WUR) in the Netherlands, in coordination with local Dutch agtech startup and experimental farms are considered leaders in smart farming, sustainable indoor and vertical farms, and precision agriculture.[ 17 ] IoT enables vertical farms. Photo credit: USDS Food Packaging and Supply Chain Logistics After the farmers pull in the harvest, there is still a lot of work that goes into processing, packaging, and delivering produce to your local stores. Depending on where you live and from where your food comes, we may well be talking about logistics over a global scale. It doesn't get easier when you add the need to deliver fresh, safe to eat, marketable products to the right location at the right times. You can see how this portion of the supply chain is particularly prone to food waste and inefficiencies. IoT, in conjunction with management information systems and decision support systems, can help distributors to operate and manage inventory more efficiently while better supporting compliance with trade and food safety regulations. For example, smart packaging technologies, such as RFID location, temperature and time measurement sensors, are being used to not only track produce through the supply chain but also to guarantee freshness, appropriate transport conditions, and traceability. [ 18 ] Preventative Maintenance and Safety If you’ve been reading our series on IoT in Industry, preventative maintenance may be the most universal benefit across the verticals. By reading sensors installed on assets over time, IoT enables the maintenance and repair of costly machinery and equipment before failure. It allows farmers to plan for maintenance when it’s least disruptive and prevents equipment-related issues from arising during production, harvesting, or whenever it is needed most. Not only does this prevent more catastrophic failures and accidents, but it also mitigates equipment related risks associated with farm output and sustainability. Beekeeping This application caught our eye, and with all the buzz on colony collapse disorder as of late, it seemed poignant. The honey farming industry is vital not only for the sweet stuff we all love but also as a way of pollinating other important crops. IoT is “beeing” used to help beekeepers mind the health of their hives and brood and to monitor honey production. Broodminder provides a low cost IoT hive monitoring solution. It tracks hive temperature and hive weight to help beekeepers understand the health and output of their bees better. [ 19 ] Farm On! Agriculture is one of the most decisive innovations of human civilization. It is always being remade and improved upon to feed our future. Today’s innovations, including IoT in the smart farm, are an exciting and timely adaptation with much promise. We hope you enjoyed this spotlight on IoT in Agriculture. Please comment or contact us if you have questions, comments or suggestions. Check out all of the articles in our IoT Industry Spotlight series! Cover photo credits: John Fielding - Crop Circles near Hedenham https://creativecommons.org/licenses/by/2.0/ ### IoT in Industry: Spotlight on Renewable Electric Power Access to electricity has become essential. Not only does the “juice” make most of our widgets work, it is the conduit for our communications, ideas and data. It is plain to see why electricity goes by its other name, “power.”  The unrelenting demand for cheap power has left most of us at risk of an over-dependence on carbon and pollution-intensive fossil fuels. Today’s renewable electric power industry is a vanguard in global efforts to reduce greenhouse gas emissions and mitigate climate change. The latest advancements in material science and engineering, remade through the Internet of Things, are leading us into a cleaner and smarter energy economy.  First, let’s review the remarkable history behind renewable energy, specifically the generation of electrical power. After that, we'll explore how the Internet of Things (IoT) is playing an increasingly significant role in supercharging the industry.  HISTORY OF RENEWABLE ENERGY Don't have time to catch up on remarkable history of renewable electric power? You can just skip to the IoT related stuff here -- but you're missing out. THE FIRST INDUSTRIAL REVOLUTION There is nothing new about renewable energy. Renewable wind and water energy have been harnessed through the ages: to sail the seas, to spin grist mills and to drive mechanical pumps. Before that, renewable woody biomass burned in the kilns, hearths and homes for millennia. The story that is modern Renewable Electric Energy is one of science-legend.  During the First Industrial Revolution (circa 1760 - 1820), iconic names like Franklin, Galvani, Hertz, Ohm, Volta, and Ampère set off to develop a fundamental scientific understanding of electrical phenomena. Concurrently, developments in hydraulics, steam engines, chemistry, iron refining and precision machine tools and instruments combined to assist in the electrification of our world. [ 1 ] THE INDUSTRIALISTS’ DILEMMA One of the “best sellers” during the First Industrial Revolution was commercially manufactured cloth and textiles using new machines which, at first, were mechanically powered by waterwheels and windmills. Unfortunately, factory output was directly tied to fluctuations in wind speed and river flow rates. Furthermore, there was also no way to effectively store surplus wind or water power to use in times of reduced supply. There was a tangible economic impact to the inconsistent and unpredictable supply of renewable mechanical energy. STEAM AND COAL Industrialists found that they could lift these production-limiting natural constraints by shifting away from traditional renewable energy and embracing the new steam engines powered with coal. Energy-dense coal proved to be an optimal fuel and was often cheaper and more abundant than renewable wood. [ 2 ] Coal-burning steam engines soon proved to be powerful and commercially effective and, thus, provided the capability to run factories 24/7/365, free from the whims of nature. In 1802 the steam engine struck again! This time mounted on wheels and two metal rails, steam locomotives gave Industrialists even greater freedom to ship mass volumes of coal and products long distances. [ 3 ] This enabled them to locate operations beyond the big waterfalls, rivers, and windy coasts. So began worldwide adoption of fossil fuels as a means of industrial power and mobility.   FARADAY Perhaps the biggest contributions to the genesis of modern Renewable Electric Power involved Michael Faraday and his work on electromagnetism and electrochemistry. In the 1820’s, Faraday was credited with the development of the first working electric motor, which ran off early chemical batteries.  Later, in the 1830’s, Faraday kicked the doors open with the invention of the first electric generators. These hand-cranked, disk-shaped, homopolar devices successfully demonstrated electric generation via mechanical and electromagnetic interactions. Hats off to Faraday for discovering a way to convert mechanical work into electric power! Figure. The first working electric generator designed and built by Michael Faraday. Source: Wikipedia Commons THE BECQUEREL EFFECT Turning motion into electricity is an important advancement, but what about turning sunlight into power like the photovoltaic (PV) solar panels we see everywhere today? To a large extent, we can thank physicist Edmond Becquerel who, in 1839, observed the photovoltaic effect. Using an aqueous electrochemical cell, Becquerel was able to generate voltage and current “when two plates of platinum or gold immersed in an acid, neutral, or alkaline solution are exposed in an uneven way to solar radiation.” [ 4 ] Certainly a significant discovery, but in hindsight, one that took much more time than Faraday’s generator to become commercially viable. SCARCITY CONCERNS Prior to the Second Industrial Revolution, somewhere around the 1860's to 1870's, society’s now-entrenched dependence on industrial fossil fuel-burning steam engines spurred a popular debate and fears on the possibility of fuel scarcity. An academic and renewables inventor of the era wrote: “The time will arrive when the industry of Europe will cease to find those natural resources, so necessary for it. Petroleum springs and coal mines are not inexhaustible but are rapidly diminishing in many places. Will man, then, return to the power of water and wind? Or will he emigrate where the most powerful source of heat sends its rays to all? History will show what will come.” [ 5 ] Professor Augustin Mouchot 1873 THE SECOND INDUSTRIAL REVOLUTION In the early 1880’s, at the start of the Second Industrial Revolution, the world's first commercial electric power plant was completed. Hydroelectric power plants, situated on powerful rivers, were the first type of commercially available electric power and their popularity grew rapidly. [ 6 ] Of similar concept and design, the first wind-electric turbines came along in 1887. The invention of the light bulb, circa 1880, expanded demand for electricity beyond the factories and into the public spaces and homes of the industrial era world. Ironically, the fossil fuel scarcity feared in the mid 19th century never transpired. Soon commercial coal-fired electric generators, beginning in 1882 with London’s Edison Electric Light Station, could satiate rampantly growing demand. Coal-burning power plants, like their ancestors the steam engines, were free from many of the constraints of natural cycles and location. Fossil fuel’s energy density, plentiful supply, and portability was difficult to resist.  One final note on this period. In 1884, an obscure inventor by the name of Charles Fritts successful built and tested solid state photovoltaic solar cells using gold and selenium. [ 7 ] He reached a 1% efficiency (the percentage of the incident solar energy converted to electrical wattage) but it was not nearly as efficient, cost effective or powerful as the generators and turbines of the day. It would take over a century through advancements in silicon p-n junction technologies (which gave us the transistor leading to modern day digital computing and IoT) and incremental cost reductions before solar PV would be commercially viable. [ 8 ] BACK TO THE FUTURE Nearly 150 years later the world has changed and much has shifted our needs and hopes away from fossil fuel solutions and back again to renewable energy alternatives. Massive concerns over fossil fuel induced Climate Change and energy security are remaking the renewable electric power industry. Today’s industry is far more competitive and provides much hope. Despite their sluggish rise, renewables are positioned to be an increasingly credible solution to our clean energy and energy security needs, yet the lion’s share of world capacity is still from fossil fuels. Renewables account for a little less than 10% of the world's electric production. That’s pretty meager, however, according to a BloombergNEF study, “Wind and solar [will] make up almost 50% of world electricity in 2050” and will take market share primarily from coal. [ 9 ] Compare that kind of growth to the historic levels, shown in the figures below, and you can really visualize a sea change. Figures: Global energy consumption by type since the year 1800. Modern renewables account for approximately 10% of our current global consumption. Left, shows consumption over time versus annual power consumed in TWh. Right, shows a relative plot using percent of global consumption rather than power. Source: Our World in Data BENEFITS OF RENEWABLE ELECTRIC POWER COST Cost is king. The growing demand and advancements in technology, including IoT, continue to improve efficiency and supply while reducing the unit cost of clean renewable solar and wind electricity. Hydroelectric and geothermal for the most are too capital intensive and, in many cases, also destructive to local cultures and habitats. Solar and wind options, for the most part, have risen to the top. Cost is a big reason why. Currently, solar and wind are on average cheaper than oil and nearing the cost of natural gas per unit of electricity. Coal remains the lowest cost per unit energy but with large environmental impacts. [ 10 ] According to a 2017 International Renewable Energy Agency (IRENA) report, on-shore wind and solar PV projects are regularly delivering power for $0.04 per kWh and are on track for $0.03 per kWh by 2020. [ 11 , 12 ] Additionally, the capital expense of new plants must also be considered in deliverable cost to consumers. According to a 2017 study from Lazard, it is currently cheaper to build a new solar or wind plant than to build new coal or nuclear plants. [ 13 ] This makes institutional investment in this industry even more appealing. CARBON EMISSIONS Perhaps most importantly, modern commercial renewables crank out power with much lower Carbon Equivalent (CE) emissions than the big three fossils -- oil, gas, and coal. [ 14 ] Roughly 25% of all global greenhouse emissions come from the production of electricity and heat. Transportation accounts for another 14%. [ 15 ] Renewable Electric Power, combined with the latest electric vehicle technology, is providing the tools to significantly reduce our greenhouse gas emissions. Figure. Global sources of greenhouse gases by sector. Source: EPA / IPCC SCALABILITY A limitation with coal and natural gas fired electric power plants is that they require large economies of scale for viability. They are most effective and efficient when centralized, built large, and located close to a supply of coal or a pipeline. This is an area where wind and especially PV solar power shines.  Residential to utility scale, there is a broad spectrum at which renewable systems can be effective. Furthermore, capacity can be incrementally increased by adding new panels or turbines with far greater flexibility and lower cost than fossil plants. Finally, there is minimal infrastructure and no supply lines, smoke stacks, spills or pipeline ruptures to worry about.  WHERE IOT MEETS THE RENEWABLES So finally, how does the relatively new Internet of Things Industry compliment the Renewable Energy Industry?  DISTRIBUTED YET CENTRALIZED  Solar and wind renewable assets are found almost anywhere from rooftops, to empty lots, desert buttes, rural fields and shorelines. Such a heavily distributed topology can be costly and difficult to manage, secure, maintain and optimize. Perhaps IoT’s greatest value is to enable centralized monitoring and management of massively distributed and remote networks of things. It’s a perfect dovetail with renewable electric power, a match made in heaven.  IoT with low-cost and low-power, wide-area communication technologies, such as 5G or LoRa, are leading the way for the next generation of massively distributed IoT networks. IoT allows for centralized monitoring and control of an otherwise distributed, decentralized network. This is enabling a holistic approach, where big data analytics and AI can be used to better manage and predict system behavior and performance all from a centralized back office. AUTOMATED SITE MONITORING AND CONTROL As with almost any production facility, renewable energy requires site safety, security and equipment monitoring and control. When facilities are scattered about massive geographies this is a difficult job. Many sites have minimal onsite human resources making IoT assisted operations and reliable automation vital. IoT can help automate processes and detect and respond to faults and accidents in real-time while alerting a centralized command center. PREDICTIVE MAINTENANCE IoT benefits renewable production by enabling predictive equipment maintenance and safety. Take wind farms for example; monitoring ambient weather conditions like wind speed in tandem with turbine vibration, torque, and bearing temperatures is now used in the prediction of wind turbine failure. [ 16 ] Proactively catching these issues to avoid any unwelcome surprises is vital to ensure reliable and safe operations that allow renewal energy options to be competitive in the market. [ 17 ] BALANCING THE LOAD ON A SMART GRID When renewable electric is integrated with the power grid it can be used to supply and balance the load on the grid. Load balancing prevents outages and even serious system failures from occurring. IoT supports efficient load balancing by collecting accurate performance and capacity data of fielded renewable electric utilities. This data helps grid operators better predict and respond to real-time production to ensure that the grid capacity is optimized despite naturally fluctuating renewable supplies.  WEATHER MONITORING A particular idiosyncrasy of most renewable electric power sources is that their output is dependent on weather, climate and periodic cycles. These fluctuating localized weather conditions impact output with varying levels of predictability. Using distributed IoT, weather monitoring stations enable far more precise observations which can be used to troubleshoot failures, call in maintenance or to predict output. This intelligence is critical in utilizing renewables within the larger grid for load balancing. It also supports maintenance, troubleshooting, and performance assessments.  One interesting example is in the active control of the pitch, or angle, of the wind turbine blades. Using precise weather observations, on-blade sensor readings and actuators, IoT-enabled pitch control allows the turbine to dynamically maintain maximum power output while ensuring safe operating speeds. [ 18 ] SOLAR TRACKING Solar panels can be mounted to motion control devices and dynamically steered for an optimal orientation to the sun throughout the day. IoT integrates the data from the solar tracking light sensors and the solar panels themselves to responsively, and precisely, adjust individual panels in solar installations. Automated solar tracking allows most solar energy installations to be much more efficient than fixed panels when averaged out of a year. SMALL SCALE GRID-TIE-IN On a much smaller scale, yet highly distributed, are the residential and small commercial grid-tied PV solar installations. These are beginning to become common and may play an important part in our energy security. There is vast potential when using IoT enabled small scale PV in conjunction with smart meters. Even when owners of grid-tie-in systems are out of the house, their rooftops are able to contribute excess power to the grid which, in turn, could then power the air conditioning in their workplace! IoT also allows for accurate billing for these grid-tied customers, who earn credits for excess power supplied to the grid. IoT has not only made it easy for homeowners to check their home’s rooftop power output from anywhere in the world, but it has also made it possible to dramatically expand the geographic distribution of power generation. The combination of grid-tie-in and smart metering enables grid controllers and utilities to accurately account for distributed energy sources and better forecast holistic supply and demand.  SUPPORT FOR POWER PURCHASE AGREEMENTS (PPAs) Homes and businesses wishing to install renewable solar or wind on their property may find the capital investment and cost of maintenance of these systems a barrier to entry. There are a multitude of companies who offer equipment, installation, management and maintenance of small scale systems for no cost. The catch with the PPA is that you get the benefit of renewable energy at an agreed cost from the provider without the hassle or upfront cost. IoT allows the provider to discreetly monitor system health, better maintain the hardware, project revenue, and accurately bill the customer for energy used. SOME USE CASES Vestas Wind Energy designs their mass wind turbines with dynamic input from IoT deployed with the current customers’ turbine installations. IoT enables engineers with a feedback loop to address flaws and better optimize future products. [ 19 ]Schneider Electric with the Lagos Solar Project in Nigeria helps to keep schools and clinics that were once strictly powered with unreliable and polluting diesel generators, powered with solar electric power. The integration of IoT and Microsoft Azure IoT allows for the monitoring and maintenance of the generators and the ability to balance power production with solar loads and daily usage. [ 20 ]BBOXX in the UK provides solar installations about the world. They have found that IoT installed at their locations allows for easy remote monitoring not only to ensure quality of service but to more rapidly and accurately bill customers for the power used. [ 21 ]Sirus Solar uses NetBurner turnkey Serial to Ethernet servers to provide solar monitoring and control from the internet for solar powered cellular infrastructure in highly remote and rugged locations. Read our article on their product. IS THIS THE END? The pursuit of clean, affordable, limitless power may be civilization's most important and existential endeavor. Significant long-term investment in renewable energy is essential to energy security and is our greatest tool against global climate change. There are numerous industries, such as steel and concrete, that will continue to require fossil fuels as part of their industrial processes. Aspirations to explore space and develop the Moon and Mars will require massive supplies of energy-dense fossil fuels for propellant. A renewable energy economy allows us to conserve our finite resources for where they are most needed. We have covered a lot, from the history of renewable electricity to IoT in the future of the Renewable Energy Industry, and there’s so much more to cover... concentrated solar, bioenergy, nuclear, smart grids and buildings, and industrial scale batteries. Thanks for hanging in there! If we missed anything, or if there is anything you would like to share, please comment below. ### NetBurner In The Field: UAV-Hyperspectral Imager for Ecological Monitoring At NetBurner, we love to see what people are building with our products. What’s even better is when we get permission to showcase those inspiring innovations, products and systems. If you get fired up about airborne drones, embedded computing, remote sensing, environmental research, and geo-rectified aerial 3D mapping all rolled into one, then this article, and the referenced paper, are well worth the read. The National Research Council of Canada (NRC) has partnered with the Applied Remote Sensing Lab at McGill University in Montreal to develop a UAV-based hyperspectral imaging system to allow for remote ecological monitoring. As if we didn’t think this project was awesome enough already, this system was made even better after we found that it incorporates the NetBurner MOD54415 System on Module. We thought it would be worth sharing how one of our customers is using our products in the field. Figure 1: The system comprises of a DJI M600Pro Hexacopter, the micro compact airborne spectrographic imager (μCASI), the IMU/GPS unit (which incorporates a MOD54415), among other subsystems. The μCASI and IMU/GPS are mounted on the hexacopter’s gimbal to maximize system stability and minimize image distortion. Hyperspectral imaging is the process of capturing and processing information from across a continuous broad swath of frequencies in the electromagnetic (EM) spectrum – the sensors used are capable of detecting EM radiation at frequencies beyond that of visible light, and into the infrared (IR) and ultraviolet (UV) ranges. The μCASI (short for micro Compact Airborne Spectrographic Imager) used in this research is capable of detecting 288 discrete spectral bands from 401-996 nanometers. That spans from the deep blue edge between the visible light band and the near ultraviolet band, through visible light and into the near-IR (NIR) band, also known as shortwave infrared (SWIR), regions of the electromagnetic spectrum. UAV-Hyperspectral remote imaging is becoming more common in vegetation studies and can be used to provide detailed information on plant chemical and structural characteristics. This information is useful for determining plant species richness, studying invasive species, plant health, and can even be used to identify plant species. Figure 2. Ultra-high spatial resolution geocorrected hyperspectral images of the three study sites from the UAV-μCASI system. The objective of this specific research study is to complement airborne hyperspectral research for environmental applications as well as to advance the understanding of UAV-hyperspectral systems as an alternative to satellite and in situ measurements (field spectroscopy). UAV mounted hyperspectral imaging systems are in their early stages. These systems are still expensive and face many challenges, including battery performance (or flight duration) and the geocorrection of the imagery. With the growing popularity of turn-key UAV-hyperspectral systems on the market, this research demonstrates the basic requirements and technical challenges for these systems to be fully operational. Figure 3: Schematic of the IMU/GPS unit (also referenced as the IGDR, or IMU-GNSS Data Recorder, in the research paper). The “SBC”, or Single Board Computer, is a NetBurner MOD54415. The system developed uses a NetBurner MOD54415 (Single Board Computer or “SBC” as labeled in the diagram) to communicate with the GPS and IMU. Several metrics from the ADIS16490 IMU and Novatel OEM719 GPS (like pitch, roll, yaw, position, and velocity) are sampled, timestamped, and stored onto the microSD card of the MOD54415 in real-time.  The MOD54415 is also tasked with sending GPS information via Ethernet to the μCASI, which is then used in real-time to determine its location relative to a user-defined geofence. After a flight is complete, the IMU and GPS data are retrieved from the microSD card via the Ethernet port for further analysis and compared against IMU/GPS data retrieved from the DJI M600Pro. There are a lot more cool tidbits! Using the data produced by the system with further video imaging, 3D surfaces could be reconstructed for additional visualizations.  Using SfM-MVS workflow (Structure from Motion and Multi-View Stereo, respectively) the paper describes how 3D point clouds and a digital surface model (DSM) of the study areas were rendered as 3D geo-rectified orthomosaic maps. The figure below shows one of the locations from their ecological studies captured using a DJI Inspire 2 UAV with an X5S camera system, as described in the full research paper. It’s well worth the read. Figure 4. A subset of the 3D point cloud from a flight path through Cowichan Garry Oak Preserve. The interactive version of the point cloud can be viewed here: http://bit.ly/CGOP-MD.” Here at NetBurner, we love to see the amazing things our customers and community of innovators are up to. We hope you enjoyed this showcase. Please comment below and contact us if you want us to feature your project or if you need help getting it off the ground! Original research article and figure attributions: https://www.mdpi.com/2504-446X/3/1/12 Under the CC BY4 license, the material can be freely used (no journal copyright) (https://creativecommons.org/licenses/by/4.0/deed.ast ). Cover photo credit: instagram.com/boontohhgraphy ### How to Connect Your Embedded System to AWS IoT Core with MQTT In this tutorial, we are going to show you exactly how to get started with the AWS IoT Core service by using it to connect to an IoT embedded system. Specifically, we are going to connect to our newest product, the ARM®-Powered MODM7AE70 system on module development kit using the MQTT protocol. This will be implemented using NetBurner’s core libraries, a small (and slightly modified) subset of the AWS C-based SDK, NBEclipse (our Eclipse based IDE), and of course, the AWS IoT Core service itself. The project, which includes all of the files needed to get started, can be found in our AWS IoT Core MQTT repo here (more on this in a bit).Read more about the IoT Core Cloud Service here. IoT Dev Kit Featured in this Article View Product Page Or, learn more about NetBurner IoT. To avoid getting lost in the weeds and to keep any possible confusion at bay, We are going to keep the application in this example extremely simple. The MODM7AE70 will listen for incoming messages and periodically send them out using the ever popular MQTT protocol. These messages will be viewable from a serial terminal connected to the device as they are received and sent. Additionally, the last message sent and received will be viewable through a webpage that is hosted directly from the NetBurner device. All of our network enabled devices can act as a web server over both HTTP and HTTPS with minimal effort. The functionality of our application will be tested by using an MQTT client that is available through the AWS IoT Core service console. The rest of this article will be split into three bite-sized chunks. First, we will set up the AWS IoT Core service and use it to register your device. Next, we will look at the changes that need to be made to the application in order to get it to play nicely with the AWS IoT Core service, as well as how to build the project and load it onto your device. Finally, we will show you how to test that the connection is successful and let you bask in the glory of all your… glory. Let’s get to it. Prerequisites and Assumptions As a prerequisite, we should mention that this project was built for NetBurner 3.x, which is the latest version of our tools and libraries. This supports NetBurner’s MOD54415, the MOD54417, the NANO54415, the SB800EX, and the aforementioned MODM7AE70. Porting this project back to earlier versions of our tools is certainly possible, but it won’t be quite as straightforward as we have laid out here. We will assume that before beginning, you have the latest version of our tools (NNDK 3.x) downloaded and installed, and that your is module up and connected to your network. We are also going to assume that you have downloaded or cloned the source code from the repo, here. If you’re unfamiliar with using GitHub, you can either download the repository in a .zip file, or clone it using the steps listed here. Regardless of whether you clone it or extract the contents of the .zip file to your computer, you should end up with a folder containing two subfolders named src and html. These folders contain the code for the application. The folder containing them will be the root folder for our application. For us, this folder will be AwsIotCoreMqttBase, and it will be used as a point of reference throughout the remainder of the tutorial. Finally, we recommend having a way to view the serial data coming directly from your module via the development board. There are two easy ways to do this. First, if you have the USB to micro-USB cable that came with your development kit, you can set the jumper configuration on your development board so that it both sends serial output to and receives power from the micro-USB jack. Alternatively, you can set the jumpers on the development board to use the DB9 port (UART0) for serial output. Please see the "Quick Start Guide" that came with your development board for further information on how to configure the jumpers on your board. If you don’t happen to have a serial port on your computer (many don’t these days) and are missing your USB to micro-USB cable, you can use a USB to serial adapter to get the job done. This of course assumes you have a USB port. Setting Up AWS IoT Core Before setting up an AWS IoT “thing”, as they are affectionately termed, you will need to create an AWS management console account. The account itself is free (though service pricing varies, check out this link for specifics regarding IoT Core), and will open the gateway for a ton of different AWS cloud services. If you haven’t done this already, you can take care of that here. Go ahead, we’ll wait. Now that you have officially joined the club, go ahead and log into your account if you haven’t already. As a side note, we are going to use our root account to avoid running into permissions issues during the course of the tutorial. If you want to do this the way AWS recommends, you will have to create a secondary user account that you will then need to give the required IoT Core permissions to through IAM. After you log in, you should be greeted with the “AWS Management Console” page, shown in Figure 1.   Figure 1: AWS Management Console From here you will want to navigate to the IoT Core service. You can do that by using the “Find Services” search field on the page, as we have done above, or clicking on the “Services” dropdown menu found in the top banner of the page.   Figure 2: IoT Landing Screen From here, you will hit the AWS IoT landing screen, as shown in Figure 2, above. There’s some great info here, and we encourage everyone to take a look around when they can. We’re on a mission, though, so we’re going to bypass this and get straight to adding a device. Click on the “Get Started” button, and you should see a welcome screen as shown below in Figure 3.   Figure 3: IoT Core Welcome Screen Before we can register our device as a “thing”, we need to setup a “policy” for it. This policy will be assigned to our “thing” during the registration process, and will grant it the permissions needed to access the MQTT topics that we will use to send and receive messages. From the left hand menu, select “Secure”, and then the submenu of “Policies”, as shown below in Figure 4. This should take you to the console displayed, which notifies us that we don’t currently have any policies.   Figure 4: Creating a Policy Click on the button labeled, “Create a policy”, which will take you to the screen shown below in Figure 5.    Figure 5: Initial Policy Creation Screen From the policy creation page, we will add the statements that will dictate what our connected devices are allowed to do. We assign our policy the name “NBTutorial”, and add four statements with the information listed below. Notice that when you type in the action, the field labeled “Resource ARN” will be automatically populated. Check “Allow” under the “Effect” field, and replace the last portion of each Resource ARN that reads, “replaceWithA”, with an asterisk (*). When finished, you should have the following statements: Action Resource ARN iot:Connect arn:aws:iot:(your region):(your account #):client/* iot:Publish arn:aws:iot:(your region):(your account #):topic/* iot:Receive arn:aws:iot:(your region):(your account #):topic/* iot:Subscribe arn:aws:iot:(your region):(your account #):topicfilter/* Table above provides some guidance on how to configure the AWS IoT Core policies to work for you.     Figure 6: Finished AWS IoT Core Policy Please note that in a production environment, you will want to be a lot more selective with your policy creation (e.g., don’t use an asterisk at the end of a Resource ARN). We are keeping it very straightforward here to get the ball rolling, but we by no means endorse these sorts of cavalier policy settings in a live production environment. When they have been entered, click “Create”. Now it’s time to register our “thing”.   Figure 7: Register a Thing on AWS IoT Core Back at the main menu on the left pane, click on the “Manage” menu option, and then the “Things” submenu. Amazon kindly reminds us that we don’t actually have any “things” yet, so let’s take care of that now by clicking on the button labeled, “Register a thing”, as we see in Figure 7, above. This will take us to a window that allows us to register a single “thing”, or multiple “things”. For this tutorial, we are going to stick to one, so go ahead and click on the button labeled, “Create a single thing”. This should bring us to the screen shown in Figure 8, where we will get to provide the details of our device.   Figure 8: Add Your IoT Device The only thing we are going to add here is the “Name”, which we will set to “NBTutorial”. Hit “Next”, and you will be taken to a screen where you can select how to associate your “thing” with the certificates that will be used to authenticate it with the AWS IoT Core service. We are going to let Amazon do the dirty work for us here, so go ahead and click the button at the top labeled, “Create certificate”.  As of this writing, using their certificate creation process is recommended way to go and after running through all of the steps in this tutorial, we could see why. When the certificate has been generated, you will be taken to a screen similar to that shown in Figure 9, below.  Short Aside: After hitting “Next”, you might instead get the following message: “We are provisioning a Device Gateway endpoint for your account. It may take a few minutes for the endpoint to be ready, after which you can connect devices to AWS IoT, publish/subscribe to topics, and access device shadows.” In this case, navigate back to the dashboard and click “Manage”, followed by the submenu item “Things” in the left pane. You should see your registered “NBTutorial” thing waiting for you there. Click on it, followed by the “Security” menu item that will be listed on the left side of the screen. Finally, click the button labeled “Create Certificate” to move on.   Figure 9: Certificate Created! We need to do a few things here before we can proceed. First, we will want to download the certificate and the private key. We actually recommend downloading all three (the certificate file and the public and private key files) and tucking them away someplace safe, but you only need the certificate and the private key to have your device connect using our application. For now, we are going to put them in the root directory of the project, AwsIotCoreMqttBase. After you have these moved appropriately, click the button labeled, “Activate”. Last but not least, we are going to attach the policy that we created earlier to our device. Click the button labeled, “Attach a policy”. This will advance you to a screen that will let you attach any of the policies you have created previously to the certificate, as we see in Figure 10 below.    Figure 10: Attach A Policy Because we’ve only created the one, that’s all we should see. Click on the checkbox next to it in order to select it, and then hit the final button, “Register Thing” or “Done” (depending on if you were able to complete the registration all the way through in one go or not). Success! If all went according to plan, you should be taken back to a list of your currently active “things”, which includes the one we just created, as shown in Figure 11.   Figure 11: Huzzah! Successfully added a Thing with AWS IoT Core Modifying, Building, and Loading the Application At this point we are going to step away from AWS, and focus on getting the application up and running on your device.  Compile the Certificate and Private Key Remember the certificate and private key we created previously? It’s time to whip those bad boys out, because we are going to compile them directly into our application. Before we can do that, we need to turn them into something the device can actually understand. On a command-line terminal, navigate to the folder where you tucked those files away (AwsIotCoreMqttBase for us) and run the command: compfile privatekey PRIVATE_KEY_LEN privatekey.cpp Substitute with the name of the private key file you downloaded previously. This file usually has the format -private.pem.key. If you run into problems running compfile, make sure that the directory where all of NetBurner’s tools are installed is on your path. This is typically nburnpcbin. Running the command above creates the file privatekey.cpp, which contains the entire contents of the private key stored in the form of an array. The length of this array is also stored in the file as the constant, PRIVATE_KEY_LEN. Next, do the same for the certificate with the following command: compfile certificate CERTIFICATE_LEN certificate.cpp Substitute with the file you downloaded in the previous section that contains the certificate. This file usually has the format -certificate.pem.crt. Similar to the command above, it generates the file certificate.cpp, which defines an array that holds the certificate data as well as the length of that array, which is stored in the variable CERTIFICATE_LEN. If this all worked out, you will now see the two new C++ source files, privatekey.cpp and certificate.cpp, in our root directory, AwsIotCoreMqttBase, each with a size greater than 0. If not, you may need to repeat the above steps and do a bit of troubleshooting. At this point, let’s go ahead and move the new files to our AwsIotCoreMqttBasesrc directory, which will save us a step down the road with our NBEclipse project. Speaking of which, let’s go ahead and move on to that now. Make a Project in NBEclipse NBEclipse is NetBurner’s Eclipse based IDE that provides everything needed to develop, build, and deploy an application to your NetBurner device. It can be found in the NNDK install directory (nburn by default) under the subfolder, NBEclipse. Go ahead and launch that application now, and feel free to accept the default directory for your workspace when the dialogue shows up. Detailed information on creating a project and developing your application in NBEclipse can be found in our documentation, here. We will go ahead and give a brief overview, however, to get you started as quickly as possible. We are going to use the Project Wizard to get us started and will create our project so that it actually points to our root folder, AwsIotCoreMqttBase, which will prevent us from having to import any code. To do this, navigate to File->New->Project from the toolbar at the top of the window, as shown in Figure 12.   Figure 12: Create a New Project in NBEclipse IDE This should open up the New Project Wizard, as shown in Figure 13.   Figure 13: The New Project Wizard Make sure that “NetBurner Project” is selected under the “NetBurner” option, and hit “Next”. This should bring you to the window shown below in Figure 14.   Figure 14: Naming Your Project Typically, the only thing we do here is give the project a name and move on. However, in this instance we are also going to uncheck the box labeled, “Use default location”, and hit the  “Browse” button to navigate to the folder where you have cloned the repo. For us, this was AwsIotCoreMqttBase. Make sure that in the window labeled “Toolchains”, the “NetBurner Toolchain” is listed and selected. Hitting “Next” from this window will take us to where we can select which configurations we would like to build. We want to be able to run the application in both “Debug” and “Release” mode, so leave the options checked, and hit “Next” again. On the next window, shown in Figure 15, we are able to specify which platform we would like to build this application for. We are going to select the MODM7AE70. If you are using one of our other platforms select it accordingly. If your device is already plugged in and connected to your network, you can go ahead and find it’s IP address by hitting the button labeled, “Search”, and then selecting it from the list that pops up on your screen.   Figure 15: Selecting Your Device If your device isn’t connected, you can pass on this field for now, and just hit the “Next” button. The next window shows some basic components that can be automatically added to the application, but since we are using the code from the folder in the repo, we can skip all of these and just hit “Finish”. With this complete, you should see your project created and listed in the “Project Explorer” tab on the left side of NBEclipse. You might notice that your project automatically starts to build from the console output in the bottom right. If we did everything correctly with our project setup and remembered to move certificate.cpp and privatekey.cpp to AwsIotCoreMqttBasesrc, then it should build successfully. You will know you’re ready to rock if you see the following at the bottom of your NBEclipse console window:   Figure 16: Another Milestone Reached If, instead, you see an error, ensure that the src folder listed in your project is mapped properly to AwsIotCoreMqttBasesrc by verifying that all of the source files show up in your “Project Explorer” tab under the src folder. Also double check that both the certificate and private key file generated in the earlier section are listed as well. Make a Few Changes To get our device to successfully connect to the AWS IoT Core service, we will need to make a few changes to the aws_iot_config.h file in our source code. Open this file from your project’s src folder in NBEclipse. At the top of this file, two macros are defined which will need to be modified. These are AWS_IOT_MQTT_HOST and AWS_IOT_MQTT_CLIENT_ID. AWS_IOT_MQTT_HOST: This is the endpoint that we will need to connect to and authenticate with. To find this value, go to your AWS IoT Core management console, click “Manage” followed by the submenu item, “Things”, in the left pane, and then click on your “NBTutorial” registered “thing”. On the left side of the main window, you will find a list of menu options. Of these, click on “Interact”, which should bring you to a page that looks similar to the one in Figure 17.   Figure 17: “Thing” Details The value that we are looking for is the obnoxiously long one listed under the “HTTPS” heading. Copy and paste that value in place of the text, , in your aws_iot_config.h file. AWS_IOT_MQTT_CLIENT_ID: This is a unique client ID for your device and should be unique for each device connecting to this endpoint. We chose to be boring and used our MAC address, but you can feel free to come up with something as creative and interesting as you like (as long as it’s unique). If you’d like to use your MAC address as well, you can find it at the bottom of the barcode sticker on your module, or by visiting https://discover.netburner.com. Whatever you choose, copy that value over the text, , in your aws_iot_config.h file. When you save your NBEclipse project, it should again automatically build the project and show a “Build Finished” message as mentioned earlier. If not, you can manually trigger the build by choosing Project->Build Project from the NBEclipse menu. Load Your Application At this point, we are ready to load our application on the device. You should be able to automatically set up a run configuration from the top menu of the IDE by selecting Run->Run As->As Neturner Application. Please see our documentation for more details on run configurations. You can add your device’s IP address to the project if for some reason your device wasn’t associated with the project during the creation process. Do this by right clicking on the project in the “Project Explorer” tab, and selecting the “Properties” option at the very bottom of the list. From there, select “NetBurner Options” from the list on the left hand side of the window that shows up, and then type in your devices IP address in the appropriate field under the “Device Options” section, as shown in Figure 18 below. Again, you can find your device IP via: https://discover.netburner.com/.   Figure 18: Assigning an IP address to your project Optional (and Recommended) Step: You can monitor the serial output of your application through a MTTTY terminal when the program has been successfully loaded. Do this by connecting your development board directly to your computer. Depending on your board's jumper configuration, this will be done through the UART0 DB9 port or through the micro USB jack, as explained in the "Prerequisites and Assumptions" section above. If all goes well, after some initial initialization and connection information, you should see the “Publish Success” messages periodically scroll by, as is shown in Figure 19 below:   Figure 19: Successful Messages Published Testing Now comes the moment you’ve been waiting for. It’s time to send and receive messages to the AWS IoT Core service using the MQTT protocol with your NetBurner module. For this next set of steps, we are going to need to head back over to the AWS IoT Core management console. This time, however, we are going to select “Test” from the left hand menu, which should take you to a console similar to that shown in Figure 20.   Figure 20: MQTT Test In our self proclaimed genius, we have cleverly named the MQTT topic being used to post from the NetBurner module to AWS as, “NBTutorial/ToAws”. Go ahead and enter this (without the quotes) in the “Subscription topic” field, and hit the button labeled “Subscribe to topic”.  If all goes well and your device is running, you should see MQTT messages start to show up in the bottom portion of the window, as we see in Figure 21. If not, go back and look at the “Optional (and Recommended) Step” above, and verify that your device is properly initializing the AWS SDK in the serial terminal. Also verify that port 8883 isn’t block on your firewall, as this is the default port for MQTT and restricting it will prevent your NetBurner device from being able to communicate with AWS. Finally, verify that the Resource ARNs in the policy we created above all properly end in the (*).   Figure 21: Testing NetBurner Device Publishes Next we want to see if our device has successfully subscribed to a channel. In the same AWS console click on the link, “Publish to a topic”, located on the secondary left menu under the heading, “Subscriptions”. The bottom portion of the console where we saw the NetBurner device’s messages coming in should be replaced by a small box titled, “Publish”. It should contain a text field for the topic, as well as a text field for the message to send, and finally a button labeled, “Publish to topic”. This can be seen below in Figure 22.   Figure 22: Testing Subscribe on the NetBurner Device For this topic, enter, “NBTutorial/ToNb”. This is important as it is the topic that our application is looking to receive messages on. You can leave the message as the default value which is “Hello from AWS IoT console,” or you can modify to fit your fancy. Notice, though, that it follows a JSON format.  Go ahead and hit that magic button on the side (“Publish to topic”) when these fields have been filled out. If you happen to be connected directly to your device through UART0, look for your message to show up in the serial terminal as we’ve outlined it below in Figure 23.   Figure 23: The Sweet Taste of Victory . Test it out with NetBurner's MTTTY serial utility. You can also view the very last message that was sent and received on the device from a web browser if you’re not a fan of serial terminals or don’t have a serial to USB adapter. To do this, open your browser of choice and enter your device’s IP address in the URL bar at the top. Again you can the IP address using the URL, https://discover.netburner.com/. Putting this IP address in your browser will direct you to a simple webpage hosted from the NetBurner module that displays the most recent messages sent and received, as shown in Figure 24 below.   Figure 24: Better Looking Victory . Test everything out with discover.netburner.com With this last step complete, our tutorial comes to a close. That said, it’s only fair to point out that we have glossed over an awful lot to get to this point.  Next, read our code review article to understand the inner workings of this application. Getting your devices connected to the AWS IoT Core service is really only the beginning. From here, you will be able to take advantage of the myriad of services that AWS provides. We will cover how to get started with some of these as well in future tutorials (not so subtle hint, our next one starts with “Elas”, and ends with “tic Beanstalk”). If you have any questions about incorporating an embedded system into your cloud service, or would like more information about our platforms, please feel free to reach out to us at sales@netburner.com. Please comment if you run into any issues or have other questions. ### IoT in Industry: Spotlight on Oil & Gas Welcome to our second article on IoT in Industry.  If you want to start from the beginning of our series, take a look at our spotlight on Smart Manufacturing. This time we’ll cover the ways in which IoT is making a big impact on the titanic Oil and Gas Industry. Traditional, significant and controversial, this component of the Energy Sector is experiencing heavy pressure to become cleaner, greener, and more efficient. Smart Oil and Gas, enabled in-part by IoT, may just play a critical role in enabling all of that. Whether or not you love the idea, Oil and Gas (O&G) makes much of our world go ‘round. Most of us have come to depend on the instant availability of oil and gas products. Like so many things, it doesn’t just end up in your kitchen stove or car magically. This brings us to ask, what problems or needs in this industry might IoT satiate? Where can IoT realize value? What’s on the current leading edge? Try Our ARM® Embedded IoT Dev Kit View Product Page Or, learn more about NetBurner IoT. Integral to modern life The Oil and Gas Industry is everywhere. Many significant industries, such as renewable energy production, smart grids, public utilities, manufacturing, and shipping and transportation (all of which we’ll detail in future Spotlights). This industry imparts far reaching and extreme impacts globally. Reining in the scope in a bit, we’ll focus on the following major O&G application areas: Refineries Well-heads Pipelines Storage and Shipping Off-shore Rigs Massive geography and scale The scale of gas and oil extraction and delivery is immense. High volumes of raw and refined product are distributed over global infrastructures. The industry spans from resource extraction, to delivery through pipelines, to refineries and logistics. They ultimately reach end-points such as filling stations, home furnaces, utilities and factories. Imagine operating a complex production facility that is physically located over 2,500 linear miles (~4,000 km) and over a dozen countries. The Druzhba or “Friendship” Pipeline is exactly that, and it runs from Eastern Russia to Central Europe. It is one of the world's longest operational oil pipelines. [ 1 ] The pipeline supports numerous supply and delivery branches, extraction wells, integrated refineries, pumping stations, oil tanker terminals, and storage facilities. At least seven operators manage the pipeline over a vast Eurasian geopolitical landscape. [ 2 ] Now that’s a lot to juggle! Figure showing the extent and complexity of the Friendship Pipeline. [ ibid. 2 ] The industry has a mix of legacy and new equipment that literally keeps everything flowing. With this level of complexity it doesn’t take a genius to see that IoT can play a critical role in safety, preventative maintenance, efficiency, environmental protection, security, supply management and reliability. Take those goals and apply IoT powered solutions over the span of the entire Oil and Gas industry, and you have hundreds, if not thousands, of addressable pipelines and related infrastructure in the market. The opportunity is HUGE! [ 3 , 4 , 5 ]   Economic Impact To drive that home in dollars and cents, according to a June 2019 BIS Research market report, “Global IoT in oil and gas market is expected to reach $39.40 billion by 2023, rising at a CAGR of 24.17% from 2018 to 2023.” [ 6 ]  Figure showing the extent and complexity of the US natural gas pipeline infrastructure. [ibid. 4 ] According to experts, the behemoth O&G industry stands a significant global benefit from IoT upgrades, but it's not without challenges. Complex geopolitical drivers, partnerships, jurisdictions, and environmental regulations all play against each other. Price volatility, macroeconomics and a herculean task of producing and moving massive volumes of product globally. [ 7 ]  Demand is also very regional, so a great deal of intelligent logistics and timing is required. Transition to Smart Oil and Gas Due to the scale and maturity of the O&G industry, there is a large inventory of deployed legacy equipment that has yet to be IoT upgraded. The downtime, cost, risks and effort involved with transitioning these assets to IoT are not trivial. Equipment is oftentimes owned and operated by differing interests through varying jurisdictions along the geographically diverse supply-chain. Furthermore, depending on regional data privacy laws, the sharing of certain field sensor data with an overarching cloud business application may further complicate implementation. It's clear that a one-size-fits-all approach will not work here. O&G assets are often in remote or even off the grid locations, in which case upgrading to IoT requires establishing a reliable connection to the internet. Advancements in wireless RF technologies such as 5G and Low Power Wide Area Networks (LPWAN) like Lora integrated with IoT are making this cost-effective and feasible. Rugged industrial-rated products, like NetBurner’s ARM®-Powered System on Module, that easily convert legacy sensors and assets to securely connected IoT devices are also critical for this transition. Localized O&G infrastructures frequently operate with legacy PLCs (programmable logic controllers) and MCMs (machine condition monitoring) that read and control in-situ sensors and instrumentation. These types of systems also tend to communicate via serial with RS-232 or RS-485. [ 8 ] The industry can quickly convert this to a capable IoT device by using products such as NetBurner’s O&G proven, industrial-rated, turnkey Serial to Ethernet devices and get important data to the cloud. Going Greener with IoT We all know there is significant CO2, greenhouse gases and other pollutants produced by the combustion of fossil fuels like oil and gas. There is also a very high environmental impact associated with O&G production and delivery. This includes elements such as powering the machinery and pumps, oil or gas leaks, as well as clear inefficiencies such as flaring off unneeded natural gas at the refinery.  As reported by the Stanford University News “...in 2015, nearly 9,000 oilfields in 90 countries produced greenhouse gases equivalent to 1.7 Gigatons of carbon dioxide – roughly 5 percent of all emissions from fuel combustion that year. [ 9 ] Here’s some low hanging fruit with massive potential. According a May 2019 Forbes article, the O&G industry’s massive fleets of legacy pumps along the production line are only 10% efficient. And here’s the kicker... they also consume approximately 10% of the world's electricity production! [ 10 ] Can IoT help us out here? You betcha! Oil field data is often inaccessible over the internet. [ 11 ] This hinders the potential CO2e (CO2 equivalent) reduction benefits from optimizing pump cycling or performing informed maintenance. It adds up over the entire geographic network of pumps. For example, with IoT we can better monitor numerous distributed smart pumps and determine if a particular unit is running hot, is producing excess noise, or has low flow all from the back office. We can then ask operations to repair it so as to bring it back to full capacity. Hopefully you can see how IoT can identify problems sooner. When multiplied over numerous pumps, it is possible to significantly reduce emissions or leaks while increasing productivity and reliability.   Safer and more reliable with IoT and data analytics Fleets of operational O&G legacy equipment are capable of logging sensor data, but in over 50% of those systems the data is not connected to the internet! [ 12 ] For example, a single oil rig may have its own safety and control PLC (Programmable Logic Controller) and stored sensor data, but it cannot be shared or easily analyzed and compared with measurements from other rigs and oil fields. What a waste!  IoT coupled with data analytics is pivotal. Forbes’ quote of Tor Jakob Ramsøy of Arundo Analytics says it all: “If the O&G sector can capitalize on the insights it already has into operations on the ground, and consolidate the knowledge that exists at each site into a collective data analytics platform, the sector, and the planet, could be much better off.” Just imagine the value towards site safety and reliability alone if we could better perform proactive improvements and predictive maintenance across such a vast system and data set! According to OSHA, from 2013 to 2017, 489 oil and gas extraction workers were killed in the USA [ 13 ]. Whether the cause is human error, faulty equipment, or geological conditions, IoT has an important role to play proactively, in real-time and retrospectively. In many cases, the same monitoring that supports safety systems can also be used to enable predictive maintenance, which can further prevent accidents related to equipment failure and decrease operational downtime. Reducing business risk The benefits of IoT technology won’t just support the giants in the O&G industry. The advent of improved O&G exploration and extraction techniques has yielded drastic increases to reserves and supply. Following the teachings of macroeconomic theory, the market has shown a corresponding slump in the price per barrel of crude oil or unit of natural gas. While cheap oil and gas is great for consumers, it introduces great risk, especially for smaller producers who currently experience small profit margins. Cash constrained, these interests could find they don’t have the resources to ride out the industries’ frequent tragedies, delays and costs ranging from work-site accidents, to equipment failures to spills and leaks. The implementation of Smart Oil and Gas infrastructures has potential to improve sustainability and regulatory compliance in tandem with operational optimizations and efficiencies that improve overall value. IoT in Oil and Gas Use Case Take a look at a few interesting use cases in the real world O&G industry: In Nigeria, the world’s 13th largest producer of oil, Shell Oil has recently implemented a Digital Oilfield (DOF) or a “Smart Field” with IoT. Now engineers and analysts have significant improvements in their ability to monitor and control distributed well-heads and pipelines in real time from anywhere in the world. The company undertook a strategic retrofit with highly improved connectivity of field sensor data, optimized communications methodologies, cloud storage and analytical software. According to one Shell senior engineer, “You can make decisions or solve problems in a day, whereas before they might have taken a week and have slowed production down.” [ 14 ]  Shell’s investment in the project has more than paid off with one report showing a $1MM return on $87K in IoT investment. [ 15 ] Circling back to our discussion on pumps used in O&G exploration and production, Texas based Apache Corp. has recently invested in IoT and data analytics. They can now better monitor their submersible pumps, improve their performance and presumably reduce CO2 emissions. Furthermore, they can now use the data to better predict oil field performance which helps them to better prioritize and manage extraction. [ Ibid 15 ] Enbridge, TransCanada, and PG&E are working together with advanced multimodal sensor fusion to see, feel, hear and smell hydrocarbon leaks over massive pipeline infrastructure. Sensor data, which is obtained from inside and outside the pipeline, is also used to prevent leaks or failures. Here again the benefit is manifold with improved environmental and safety performance as well as production efficiency and profitability. [ 16 ] If you’d like to add a favorite example or use case relating to IoT in Oil and Gas please comment below. Next time we’ll cover the other end of the energy sector with a Spotlight on renewable energy and smart grids. Cover photo credit: Donald Giannatti ### IoT in Industry: Spotlight on Smart Manufacturing This is the first in a series of articles which will review the top industries that are adopting the Internet of Things (IoT) and shed some light on how they use IoT to improve their work, increase efficiency, pollute less or improve the bottom-line. We welcome you to comment below and share how you have found value in implementing IoT in your industry, products, workflow, safety, controls or processes. IoT in Industry Embedded IoT solutions are sweeping the world with surprising veracity and growth. Is this all just a craze to connect everything to the internet or is there real value being generated and realized? According to McKinsey Global Institute, analysis of a cohort of 150 leading IoT applications shows potential to deliver a total economic impact of “$3.9 to $11.1 trillion per year in 2025”! [1] Contrast that to forecasts of $1 trillion in direct IoT spending by 2025 and it’s easy to deduce IoTs net value! [2, 3] IoT builds value in a number of ways depending on the sector and specific use case. Generally, it provides industries with solutions to improve: logistics, asset tracking, production processes, service response times, safety, traffic management, proactive maintenance and a myriad of other value propositions. Furthermore, IoT can provide industries with data that enhances monitoring and situational awareness. This in turn yields actionable intelligence, which can be used to optimize and improve their environmental and institutional sustainability. In certain markets, IoT allows for operational efficiencies that can yield greater profits, enhanced reliability and quality of service, reduced CO2 emissions, and energy savings. Challenges Perhaps a double edged sword, the Internet of Things paradigm is remarkably flexible. Because it can take advantage of a wide variety of protocols, modes of communication and processing between software and hardware nodes, and can be organized into a variety of different architectures and topologies, it is highly adaptable to a broad array of applications, industries, and geographic distributions. This underscores the significant challenges the market will continue to encounter with interoperability, scaling, and maintenance. Add in data privacy, security requirements , and best practices over a global set of jurisdictions and business models, and the plot thickens considerably. Transitioning As of the time of this article, most industries are still in the very early stages of a transition to IoT. For some businesses and institutions, the transition may be very modest, slow or incremental. For others, such as the Manufacturing and Transportation sectors, the benefits of developing an IoT strategy including a concerted retrofitting of assets and infrastructure may have a very compelling business case. Transitioning and integrating IoT on the industrial scale is truly a significant and complex undertaking, and is by no means standardized. In cases where new smart factories or facilities are built, it makes a lot of sense to equip the production floor with a new generation of smart devices and components ready to interact with the internet. However in most cases, existing legacy assets are perfectly functional, but may not be IoT enabled. In this scenario, it seems wasteful and risky to decommission an otherwise valuable and working asset if all it needs is a modest upgrade for monitoring and control over the Internet. NetBurner has over 20 years specializing in low-cost turnkey products to instantly modernize these legacy assets. Additionally, it is possible to rapidly build and deploy cutting-edge IoT products and systems with our robust embedded systems on modules and development tools.   Smart Manufacturing In almost any list of the leading industries in IoT, you will find that Manufacturing places in the upper tiers of those sectors responsible for growth in global IoT market value. Smart manufacturing might just be the top-dog of the “Industry 4.0” pack with some forecasts showing market value of $548.14 billion by 2024 [4-0]. Whether we are talking about factories making the widgets and products we all love or industrial plants producing essential refined materials and commodities the addition of IoT is revolutionary. Smart manufacturing is being introduced to streamline and automate manufacturing, improve asset tracking, and proactively maintain equipment so as to boost operational efficiencies and increase the safety of workplaces and facilities. Many of the benefits we see in smart manufacturing also extend to other industries, such as energy and transportation which we'll cover later in this series. Value Proposition In the realm of smart manufacturing and Industrial IoT (IIoT), physical machinery including everything from robots through conveyor belts and sensors are connected to a network where they can be controlled and monitored remotely. A wide array of sensor data such as temperature, vibration, or humidity can be aggregated and analyzed holistically to regulate operations even on a distributed, global scale. Not just for moment-by-moment automation and control, these data are also being used to plot trends and predict enhancements to processes, find bottlenecks or troubleshoot failures. Furthermore, with the appropriate connected sensors, certain equipment can be monitored for health and proactively repaired before failures or unplanned downtime occur. [4] A report by Accenture states that IoT has the potential to save up to 12% in schedule repair costs and reduce overall maintenance costs by 30% thus resulting 70% fewer equipment breakdowns. [5] Talk about an enticing value proposition for IoT! Leveraging Data Using additional 3rd party data sources, such as local weather data or shipping and logistics schedules and customer ordering systems, smart manufacturing can further enhance production efficiency and allow for optimized process timing and staging, maintenance, and inventory management. Artificial Intelligence (AI) or machine learning can also be used to dynamically tune production based on sensor data and business logic. IoT’s convergence with the latest in big data analytics and AI is likely to benefit manufacturing and many other industries by making them more agile, transparent, optimized and proactive. [6] IoT may be even more disruptive and beneficial for manufacturing operations that incorporate supplies from a distributed or global network where accurately predicting inputs and outputs can yield greater return on investment. The ramping and speed of manufacturing can be dynamically adjusted based on data and sensor readings along the production line or within the supply-chain. An integrated smart manufacturing infrastructure gives greater visibility of the end-to-end process and with greater responsiveness than strictly human-in-the-loop reporting systems. Safety Another vital and very typical application in smart manufacturing is the use of IoT to improve the safety of workers and assets. Sensors measuring work areas for noxious or explosive gases, smoke or fire, noise, or open safety locks and access points can be monitored and measured for critical threshold conditions. System level software reads these inputs frequently and is programmed to turn on or off a section of an automated production line, trigger alarms, lockout systems or to deploy other safety measures. Health checks and audits of safety systems can also be performed more systematically, and in many cases, remotely. Weather data can even be factored in to support a proactive and controlled shutdown sequence before a major natural event reaches some element of operations. The Big Picture Traditional PLC (Programmable Logic Controllers) and SCADA (Supervisory Control And Data Acquisition) systems have been widely used for process control and safety for decades, but tend to be localized and oftentimes are not connected to the Internet. In the Smart Manufacturing IoT paradigm, those systems are just a part of a more holistic IoT framework. Cloud, Fog and Edge computing will also play a pivotal role, particularly in larger-scale and distributed operations, not only in controlling and optimizing production and safety systems but also in measuring KPIs and realizing business-specific objectives. Smart Manufacturing Examples Here’s a couple interesting examples in Smart Manufacturing: For production level quality control (QC) LG Electronics has decided to employ and IoT edge computing solution to reduce throughput and increase accuracy which is a double win. Due to their QC process using high frame rate video for quality measurements it was not viable to use a cloud processing solution. By using edge processing in their IoT architecture they were able to decrease latency and manpower while significantly increasing process fault detection from 50% to 99.9%. The overall impact yielded a savings of $20 million per year! [7]Airbus, a giant in aerospace, has used IoT for smart manufacturing in a number of ways. One element that differentiates them is their very complex assemblies which depend on high numbers of skilled human labor assisted by robots. IoT helps workers to align thousands of specs, procedures, assemblies and specialized tools. Airbus, as an example, uses IoT to allow workers to scan a section of a aircraft work surface with a tablet and then uses image recognition to identify the bolt hole, calls out the specified tool or robot to use, provides the build of materials, torque or other application procedures. [8]The cyber-physical road warriors at Tesla are combining IoT with “digital twins” for each car. Using the multitude of real-time vehicle sensors factories can better monitor for faults and defects in finished products. In addition to providing preventative maintenance alerts for car owners, this data allows factories to dynamically optimize the production lines to fix those issues for the subsequent builds and to improve product designs moving forward. [9] Until Next Time... That’s all for our first IoT in Industry Spotlight. Next time we’ll take a look at the Energy sector and cover oil and gas, smart grids, and renewable energy. If you have anything to add from your experience in how IoT adds value to the smart manufacturing industry please comment below! Cover photo: @skyestudios ### Part III: WebSockets for Real-Time Web and IoT Applications - WebSockets Secure (WSS) In this third part of our WebSocket tutorial series, we will be building upon the real-time dashboard example that was described in the previous articles – now adding a critical Transport Layer Security (TLS) to protect the low-latency communication from our embedded WebSockets Secure application. If you missed the first two articles, it’s best to start from the beginning to catch up and find out how WebSockets can help you create a web-based dashboard to control your hardware and display your sensor data in real-time. In this day and age, everything online should be encrypted. Now that the TLS Security Suite is included for free with NNDK 3.0 or later, it’s never been easier to encrypt your data. For that reason, we will demonstrate how to implement WebSocket Secure (WSS) using NNDK 3.0. Try Our ARM® Embedded IoT Dev Kit View Product Page Or, learn more about NetBurner IoT. Adding TLS (commonly known as SSL) is the first step to prevent man-in-the-middle (MITM) and eavesdropping attacks. This is because using TLS ensures three features that allow for secure communication. At a very high level, those features are: 1.     Authentication: TLS uses certificates and certificate authorities to authenticate the identity of the client before establishing a connection. This gives you peace of mind by knowing that you’re communicating with whom you want to be communicating with. 2.     Privacy: TLS encrypts data before transmission so that the data is private between the client and the server. This prevents anyone from being able to see your unencrypted data while in transit. 3.     Integrity: TLS uses hash functions and ciphers to ensure that data was not altered while in transit. Check out our article for an overview of TLS if you want to learn more and our tutorial on how to use it for other NetBurner applications. To demonstrate how to use WSS, we will modify the real-time dashboard example developed in the prior installments of this series. The full source code can be found in our public GitHub repository here. It’s fairly straight forward. The modifications are as follows: Step 1: Add certificate and key generation to the makefile (bold red text indicates those sections specifically addressing SSL certificate creation): NAME = SecureDIPSwitches CPP_SRC += src/main.cpp src/SimpleAD.cpp CPP_SRC += src/key.cpp src/cert.cpp src/htmldata.cpp CREATEDTARGS += src/key.cpp src/cert.cpp src/htmldata.cpp src/htmldata.cpp : $(wildcard html/*.*) comphtml html -osrc/htmldata.cpp device.crt: device.key device.key: CA.crt openssl genrsa -out device.key 1024 openssl req -new -config ssl_cert_config.txt -key device.key -out device.csr openssl x509 -req -days 3650 -in device.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out device.crt CA.key: openssl genrsa -out CA.key 1024 CA.crt: CA.key openssl genrsa -out CA.key 1024 openssl req -new -config ssl_cert_config.txt -key CA.key -x509 -days 3650 -out CA.crt src/key.cpp: device.key compfile device.key comp_key comp_key_len $@ src/cert.cpp: device.crt compfile device.crt comp_cert comp_cert_len $@ include $(NNDK_ROOT)/make/boilerplate.mk This configuration will generate a 1k RSA key and a self-signed certificate that is good for 10 years. The makefile references the file ssl_cert_config.txt to configure the certificate parameters. If you’re curious as to how that is configured, this file can be found along with the source code in our public repo. For a deeper explanation on how self-signed certificates are generated, take a look at our article on this topic here. The certificate and key are then translated into a format that will be compiled directly into the application as cert.cpp and key.cpp, respectively. Finally, they are listed with the other source files that comprise the application. Step 2: In UserMain, found in main.cpp, modify the StartHttp() function to StartHttps() to start a secure web server:    StartHttps(); Step 3: In the javascript source, script.js, modify the WebSocket connection to use the “wss” protocol: ws = new WebSocket("wss://" + window.location.hostname + "/INDEX.HTML"); That’s it! For the most part, we had to add an “s” to a couple lines of code to use the secure variations of certain functions, and generate a certificate and key. Accessing the web-based dashboard using WebSocket Secure is the same as accessing the webpage with normal WebSockets. Simply go to the webpage of your NetBurner device using the “https://” URL protocol prefix. One difference you will notice when using a self-signed certificate, is that you will need to tell your browser it is okay to trust the self-signed cert that your NetBurner’s web server is providing. In Firefox and most browsers, it will look like this: You will need to click “Advanced” and “Proceed" or something similar depending on the browser and version you are using. The reason you’re seeing this warning is because, for the sake of creating an easy to demonstrate secure web server example (not to mention free), we generate a no-cost self-signed certificate (Disclaimer: We do not recommend using self-signed certificates for production level code!). Your web browser is warning you that the self-signed certificate cannot be trusted because it has not been verified by a trusted Certificate Authority supported by your web browser. Beyond that, the webpage and WebSocket connection work like they did previously. If you try to sniff data using a packet analyzer application, like Wireshark, you shouldn’t see unencrypted (human readable) WebSocket data in transit. Now you can rest assured knowing your WebSocket data is protected! Useful Links: Cover Your Data Assets with TLS - NetBurner Creating a Self-Signed Security Certificate for IoT Applications - NetBurner Secure WebSockets standards - IETF.org GitHub repository for this project ### Autonomous Navigation Using a NetBurner SOM This is the second half of our article "Circles of Concern: A Robotics Spin". If you haven't had a chance to read up on how to get started with designing autonomous navigation using a NetBurner embedded system on module be sure to take it from the top. Part 3: Mapping, Profiling, Simulation Now that I had sufficient sensor data, I needed to consolidate the unwieldy amount of LiDAR data into a more navigable format. The simplest and most well-studied navigation algorithms in the literature rely on simplifying the environment around a robot into either line segments or a discretized grid of occupancy probability (i.e., how likely it is that a cell has an object in it). I attempted to map the environment in both of these fashions in a manner that consumed as little processing power as possible. For line segments, I took an array of length 360, representing what the car sees at each degree and found segments by “cutting” the array at zeros. I recursively used a simple line fitting algorithm to find the segments and split them at the datapoint point farthest from the fitted line if the point-to-line distance was greater than a specified threshold. Rather than performing least-squares fitting during this segmentation process, I simply used the line formed by the endpoints to save processing power. Segments of a single point were turned into “circles.” For the occupancy grid, I constructed a 2D array of size 128x128, where each cell represents the probability of occupancy of a .25 m2 area. Grids like these are generally updated using Bayes’ theorem, which defines the new probability of X given the previous probability of X and new sensor data. This becomes simpler when we think in terms of the “odds” of an event, that is, the probability of X divided by the probability of NOT X. For example, we might initialize the grid with 1:2 odds. That is, it is half as likely that there’s something in a cell as not. If we have a LiDAR reading of 3 m straight in front of the car, we can update the respective cell by multiplying it by 3:1. By doing that, we are claiming that it’s now 3 times as likely that there’s something in that cell. We say that our “Bayes’ Factor” is 3. The new odds that there’s something in that cell is 3:2. For my implementation, I needed to consider that my position accumulated error over time and that the environment could change rapidly. If I went to coordinate (2,0) initially, drove around, and came back to the “same coordinate,” the environment would likely look different. Because of this, I wanted to ignore old information after a point. To implement this, along with reducing computation, I restricted the cells to the set of integers 0 to 10, which represented the relative probability that a given cell was occupied. I added to or subtracted from cells as an estimate of Bayes’ theorem rather than using multiplication, which would have been more computationally demanding. This results in a finite state machine (FSM) that guesses whether a given cell is occupied. FSM that determines whether a given cell in a discrete 2D map is occupied. A ‘1’ is a LiDAR reading “landing” in a particular cell and a ‘0’ is no LiDAR reading landing in the cell. This implementation balances the use of new and old LiDAR information and is cheap computationally. I observed that all mapping would fail after a certain amount of time and guessed that I was reaching the limit of the NANO’s processing power. Thorough profiling and optimization was key to solving this problem. Read more about this in my article, “Intro to Profiling and Optimization.” As the project grew more complex, I soon realized that printing out the car’s state would no longer be sufficient. In order to see the results of mapping algorithms or do any sort of debugging on navigation algorithms, I would need to evaluate the car’s decisions in the context of the car’s position, rapidly changing raw sensor readings, and processed maps. The easiest way to do this was to log variables in real-time and later visualize the car’s motion and vision. In 2017, Paul created a modular and robust logging system that logs any C data type in binary (for speed) in flash memory. This log is designed to be transferred to a computer for post-processing via FTP. A command line tool then converts the binary data into a CSV file. Read more about how you can use this system in your own project in the article, “Real-time Data Logging For Embedded Systems and IoT”. Logged Data Example I wrote a MATLAB script LidarVisualization.m that took the logged data as vectors and created an animation of the car’s motion, plotting the car’s position and orientation on a 2D coordinate system. It draws green lines for visualizing lidar readings and lines for visualizing the map created by segmenting and fitting those lidar readings. Another script OccGridVisualization.m visualized the occupancy grid with a grayscale pixel grid, where a black pixel indicates maximum cell occupancy probability (there’s something there!) and a white pixel indicated the minimum (there’s nothing there). ATLAB Visualization of motion, objects and heading MATLAB Visualization of objects and walls These visualization tools helped me debug various issues with the mapping algorithms, such as a failure to appropriately convert between frames of reference and a segmentation failure after 15 seconds of continuous mapping. All in all, my mapping algorithms were moderately effective, but needed a significant amount of fine-tuning and testing. I ended up deciding that simultaneous mapping and navigation would take up too much of the NANO’s processing power, and that this approach was not necessary for the NetBurner AVC. I ended my work on mapping and attempted to navigate by using raw LiDAR readings instead of consolidating LiDAR readings into a list of segments or an occupancy grid. Part 4: Navigation I moved to developing a toolbox of various navigation methods that could later be used interchangeably. First, I implemented basic proportional control waypoint navigation, which involved multiple reference frames, some trigonometry, and proportionality constant tuning. This worked perfectly in the absence of external magnetic fields that interfered with the IMU. Next, I implemented a wall following algorithm that also relied on proportional control, but where the offset error used in the algorithm was the change in the measured wall distance divided by the distance traveled. This worked perfectly for maintaining distance to a wall, but it was difficult to tune the parameters to gradually steer toward or away from a wall. Next, I worked on editing the waypoint navigation to avoid obstacles. I attempted to write an artificial potential field algorithm. Artificial potential field algorithms are inspired by physics: a particle will feel attractive or repulsive forces that are inversely proportional to the square of distance from other particles. That is, a particle will follow a path that minimizes a gain in potential energy. For example, imagine a very spherical boulder tumbling down the Grand Canyon. Unless the boulder gets stuck in a huge hole (a “potential well”), it is likely to eventually continue rolling downward until it reaches the lowest point of the canyon. I wrote an algorithm to simulate this phenomenon. It summed 360 “forces” on the car, each of which had magnitude 1/(LiDAR reading2) and direction opposite that of the LiDAR reading. It then added a constant force in the direction of the goal point. Unfortunately, I could not get it to work well and saw erratic and unpredictable behavior in testing. It relied on a very fast update rate to adjust direction as it approached obstacles, so I guessed that it might be having performance issues, as I saw with the mapping approach detailed above. The algorithm gave the NANO an extra 1000 multiplications, 1000 int-to-float conversions, 1000 divisions, and 2000 additions every second. It was easy to blame problems on things out of my control, but I later realized that the computations were nothing compared to the NANO’s ample overhead, with 385 million MIPS assembly instructions per second (MCF5441x ColdFire Microprocessor Data Sheet, pg. 4). I don’t really know what caused the problems, because I no longer had time for significant debugging, and I needed to be OK with that. I went back to the basics. The task was to navigate from point A to point B given the car’s position and orientation and an array of 360 LiDAR readings (integers giving the distance in cm to a reflective surface), where each element in the array held the most recent reading at the respective angle in degrees. First, I had the car brake and stop when the LiDAR reading directly in front of the car was below a threshold. This worked surprisingly well, so I expanded it to look at multiple LiDAR readings around this reading, which also worked well. To move onto actively avoiding obstacles, I started with a greedy algorithm that adjusted the previously calculated desired heading to the nearest free heading, that is, the nearest direction where no obstacle was seen. This also worked surprisingly well. In tests, the car would often graze the corners of boxes. However, this left the car with a limited field of vision. I needed the car to plan a successful route even through a complex web of obstacles. To do this, the car needed to find a wide range of “free path” LiDAR measurements at closer distances and a narrow range of “free path” LiDAR measurements at father distances. Solving this problem was best accomplished by making “closer distances” and “father distances” discrete distance blocks, or “Circles of Concern.” In “The 7 Habits of Highly Effective People,” which has nothing to do with autonomous navigation but is a great read for interpersonal growth, Stephen Covey discusses the concepts of “First Things First” and “Circles of Concern.” This served as the inspiration for my obstacle avoidance algorithm, which first assesses the “concern level” of obstacles. We construct several circles of concern, varying from very close to very far. If there’s an object obstructing the desired path very close by, we consider that and nothing else- it’s our immediate concern. Otherwise, we’ll consider obstructions further out. Then, we take the desired direction and find the nearest free arc of size that will fit the car. “Circles of Concern” obstacle avoidance algorithm . The car’s speed is decreased and steering sensitivity increased for more immediate levels of concern. For the most immediate levels of concern or failure to find a free arc, the car will reverse to provide some space for its limited turning radius or to allow it to try a different path. This ended up being the winning algorithm. It wasn’t perfect- switching between forward and reverse made position tracking less accurate and it was not guaranteed to choose the best path. However, the car quickly reached the end goal the vast majority of the time with little computation, relying on only raw LiDAR measurements. This makes the algorithm useful for racing applications, emergency swerving maneuvers, and other real-time “sense and navigate” applications. https://youtu.be/AK8OFUOuboU A short video shows how this worked out on our test “track” at NetBurner HQ in San Diego. At NetBurner, we love to see all of the amazing applications and products one can make with our embedded platforms. Our ongoing project with the Autonomous Vehicle Challenge really highlights the capabilities of NetBurner SOM’s in complex, real-time, low-power applications. As always, comment below with questions or reports on your work in this area. If you use any of the code please tell us how it works out for you. Cover photo credit: Long Beach Comic Expo 2012 - K.I.T.T. from Knight Rider Author The Conmunity - Pop Culture Geek from Los Angeles, CA, USA ### Blockchain for IoT Join us for the second half of our article on Blockchain for IoT. If this is all new to you, fret not part one is just a click away. Why Does IoT care? Let's talk about why this matters and in context to IoT, rather than the nebulous world of crypto-currency trading. Increasingly, IoT is being used for mission critical infrastructure, personal health monitoring, public voting systems, asset tracking and emergency response by monitoring, informing and controlling systems with impact in the physical world. It is clear that any breach in the trustworthiness of the data stored or transferred through these systems is of great concern and has potentially grave consequences. On a less scary end of the spectrum, IoT is also being used to increase service and efficiency, so having reliable and auditable data can be vital towards business-related efforts to optimize a supply chain or industrial process. Blockchain technology can provide a consistent method to allow for trust and traceability over IoT networks and can better enable the sharing of resources over associated groups and interests. As IoT becomes a requirement in certain industries, rather than “a nice to have”, expectations and regulations (e.g. GDPR) to rigorously secure and monitor IoT network data seems likely to increase. In almost all cases, there is a person, business, or entity that is laying claim to the legal ownership or guardianship of the data. Adding this element of ownership identity really opens up Pandora’s box and makes blockchain’s capabilities particularly interesting. The Impact of Identity Management. Increasingly, the concepts around blockchain involve discourse on the “identity management” of people, businesses, devices and property. For blockchain and IoT to gain value over conventional methods, one must factor in the identity and property management requirements with which our smart contracts, properties, resources and cryptocurrencies interact. Using this vision as a roadmap, IoT will necessitate systems that not only protect and track IoT telemetry, application and control data but also uniformly interface with property and identity management records and authentication systems. Blockchain technology is a feasible solution to this conundrum, where its inherent immutability shows considerable value. One of the leading efforts to standardize identity management is underway and is called the ERC-725 Ethereum Identity Standard. Sharing Resources. A final important area to touch upon is the idea of a sharing economy for IoT. Blockchain has really accelerated this term and concept, but what does IoT have to do with a sharing economy? If we abstract this out a bit, we can see that IoT has resources such as network bandwidth which must be carefully balanced to ensure a minimum Quality of Service (QoS) for all connected devices. In this case, bandwidth is the shared resource. Other examples of shared resources include: system time, data storage, file stores, gateway sockets, processing, and others. Blockchain can be leveraged to facilitate allocations or allowances of shared resources. When interacting with 3rd parties, they may be capable of sharing or even charging a fee for your IoT network resources or telemetry data. Blockchain with smart contracts offers a method by which to share, trade or sell these resources dynamically, securely and with speed. A Use Case - Safety Inspections. To get a more concrete idea of how this all fits together, let's examine a short use case. Your business requires an annual inspection by a professionally trained and certified inspector to certify that the factory is safe and compliant. The inspector is hired to officially “file” or lodge records of inspection dates, warnings or citations attached your business. The records must be authentic, transparent, and auditable and ideally should be immutable so as to prevent fraud. The inspector may be required to attach proof of their own identity and professional certification as well. Logic placed within the smart contract used for the job will test that the certification is valid and the person performing the inspection matches the certification. The data, which is decentralized, can also be accessed by 3rd-party auditors whenever or wherever they like. Let’s take this a step further. The calibrated tools and standards that the inspector claims to use during the inspection should be noted in the record and checked as currently valid. Those objects should also have their own identity record on the blockchain to support their claim of accuracy and authenticity. Certainly, some of this data can be stored on a local network or even a private or permissioned fork of a brand-name blockchain [3]. However, in many cases, such as serving professional licenses from one party and certified NIST standards from another, a publicly distributed, decentralized database would allow for auditable information to be used from almost anywhere in the world. In theory, blockchain technology allows this heterogeneous and diverse mix of information to securely live on a blockchain and to be safely used dynamically as needed. What’s even better is that the smart contracts themselves provide the conditional logic to attach and release identities, records, access and legally binding promises. You can see how this workflow can be used in numerous applications from equipment calibration and maintenance to financial auditing. The insurance companies alone will have a field day! Blockchain for IoT Application Areas If you are wondering what additional IoT application areas might get folded into the mix, here are a few others: IoT data security / Prevent malicious data manipulation or man in the middle attacksLogistics and transportation of goodsProperty Ownership ManagementTrack build of materials and componentsCalibration and maintenance of equipmentCertified Supply Authenticity (genuine parts, fair traded etc.)Public Voting SystemsShared Mobility, Resources or FacilitiesSmart CitiesConnected HealthQuality Control and AssuranceFog Computing Problems with Blockchain and IoT The reality is that it is not all blue sky and clear sailing. There are still many considerable issues being worked on to make blockchain a simple and viable solution both in the general sense, as well as within the context of IoT. Let’s cover a few of those hurdles. For one, blockchain is not a low latency protocol and currently is criticized for its slow rate of transactions per second. This presents issues towards implementing large and scalable networks of IoT devices requiring high data rates with blockchain technology. This might even be a legitimate “show-stopper” for IoT systems that require real-time monitoring and control, where a slow data rate is truly problematic. There are also power and processing requirements associated with adding data to a blockchain. Resource-constrained IoT systems will certainly hit a wall here as well. Blockchain has so far proven to be a very power-hungry beast, which is a frequent sticking point for high scale, distributed IoT networks. Another area of concern includes interoperability with legacy systems, 3rd-party data sources and even gaining access to data on other blockchains. Implementing a blockchain for IoT is still far from trivial and practices are barely standardized; thus there is a high barrier to entry. For most users, the technology is still just too young to bet the farm on. [4] Massive data sets are pretty standard in IoT networks and the use of a blockchain as a database is not well suited, latency-issues aside. For example, its distributed nature is not compatible with SQL-type databases. [5] That said, there are a variety of projects working to provide noSQL or other adjunct database solutions for blockchain. Projects like IOTA have come along with new IoT-specialized blockchains or blockchain-like technologies to tackle many of these issues. Considering that the world volume of IoT devices is expected to exceed 70 billion devices by 2025, it seems likely that these issues will get more attention and research. [6] The Way Forward One can see that the topic is dense and that we could only provide the fundamentals around blockchain technology and its application to IoT. Clearly, there is massive potential, excitement, and hype around the technology, and for good reason. While there are some really interesting projects working to bring IoT/blockchain frameworks to the forefront, it is currently too early to say what will take off and if the promises of blockchain and decentralization will come to fruition. We’d love to hear what projects you are following, considering or implementing as well as your feeling about blockchain for IoT. Additional reading and references: NetBurner-Bitcoin IoT Project Postscape’s Blockchain-IoT Dapps and platforms index Reuters visual guide to understanding Blockchain NIST Definition of Blockchain Different Blockchain Consensus Methods Fog Computing, IoT and Blockchain IBM article on IoT and Blockchain ERC-725 Alliance - Etherium Identity Standard Guide to Scripting for Blockchain About nodes and how to run your own Bitcoin node Public vs Private Blockchain ### IoT, meet Blockchain. Blockchain, meet IoT. IoT and blockchain are two very hot industries that, until recently, seemed rather discrete and unrelated. Since the dawn of IoT 1.0, it has been a running joke that you can make just about anything into an IoT gizmo (think smart air freshener) and that trend is still moving along! Similarly, the blockchain industry is rapidly growing with a mission to “blockchain-ify” and find practical applications for the nascent technology. It seems very likely that an integrated application of the two technologies has potential to beget something useful beyond a few laughs. In this article, we’ll give a bit of background and a glimpse at some practical ways that the combination of IoT and blockchain make sense. We’ll also point out why you might want to keep this topic on your radar. If, however, you are simply craving a hands on tutorial using blockchain and IoT, you can try out our #NetBurnerIoT project integrated with Bitcoin here. There are those who argue, especially in the economics world, that blockchain is a dead-end path. This road block has yet to be hit despite many bumps in the road. To a great extent, blockchain’s existential crisis is based in a lack of solid adoption and application, rather than the soundness of the technology. Massive claims aside, it is safe to say that it is still gelling, has some very sound and revolutionary concepts, clear potential (including in IoT) and has a growing community of brilliant people who are continuously improving it. We’re among other leading companies like IBM and SAP who feel that pursuing a hybrid of IoT and blockchain may have considerable benefits for a variety of applications. In a time when people, finance, data, goods and services are globalized and decentralized, a technology like blockchain may be very well-suited to efficiently facilitate and regulate these economies of scale.   Blockchain Primer Since this is an IoT-centric blog post, we’ll assume we can skip over why IoT and embedded systems are awesome and just detail blockchain for a bit. Let’s start with the biggest brand in blockchain technology - Bitcoin, right? The bitcoin cryptocurrency is one of the most successful implementations of a blockchain since the illusive Satoshi Nakamoto published his intrepid 2008 white paper explaining the concept. We’ll use bitcoin as an example through much of this article. Since then, a myriad of other coins, like Ethereum, have come about and some really smart decentralized applications (Dapps) the likes of Crypto Kitties and Origin Protocol have thus evolved. Put in perspective, however, we’re still just at the first few hours after the proverbial big bang moment, so expect a lot more to come. →If IoT is built on embedded networking and computing, then blockchain is built on immutable distributed ledgers.← At the core of the blockchain technology is a way to have open, distributed, immutable (unchanging) and secure data ledgers. In fact, blockchain is actually just a type of Distributed Ledger Technology (DLT), which essentially serves as trustworthy records and chains of custody. They include methods to package, track, and encrypt all sorts of data over a decentralized network. Blockchain began as an immutable DLT with a record of ownership, past and present, of cryptocurrency coins. But currency is just the beginning! Structure. The “block” elements in bitcoin, for example, each contain an average of 1 MB of data containing up to 500 or so typical transactions or discrete records [1]. They are added to the blockchain chronologically. You can think of the “chain” as the cryptographic glue securely holding blocks together on the blockchain. A typical transaction, such as trading bitcoin (BTC) between two parties, or at the very least two bitcoin addresses, would record some basic data such as the quantity of bitcoin, fees, the seller’s bitcoin “wallet” address and the buyer’s bitcoin wallet address. The addresses in this case are public cryptography keys. You can see a sample transaction here, which includes  those public keys. Consensus. The next phase is that an open pool of “miners” engage in solving an encryption puzzle, also known as a “consensus problem”. The first miner to solve that puzzle wins a bitcoin prize as well as the work of packaging up all 500 or so records into a block which is then appended to the chain, chronologically. This represents the most common type of consensus algorithm known as the “proof-of-work” method. We won’t go too much further into the evolving consensus methods but it is interesting stuff. Here’s a useful article if you want to know more. The consensus group of miners work as a “democratic body” to provide a majority agreement on the integrity and authenticity of the new block before its addition to the chain. As part of the consensus function and to protect the integrity and immutability of the blockchain, individual blocks each have starting and ending encrypted hash codes (aka “hashes”). A new block must have a starting hash that matches the ending hash of the preceding block on the chain in order to be appended to the blockchain. Here lies one of the keys to how blockchain upholds immutability and security of data. The figure below shows the high-level process of adding records and blocks to the chain. Multiple discrete transactions or other data records are bundled into a new block. The block is appended chronologically to the blockchain. Blockchain Nodes. Want to be a miner or just run a copy on your extra computer? You can run a live copy of a real blockchain “node”, like Bitcoin, for free (if you can spare a computer with at least 200-300 GB of storage plus resources) and to do so without even having to be a miner. As described by Chris Gundy in the coinoffering.com blog, “In its most straightforward form, a node is simply a computer that connects to the bitcoin network. In order to be classified as a full node, the computer needs to actively verify the rules set out in bitcoin.” Most public blockchains welcome and literally need random users to run blockchain “nodes” to make the system work. This really enables a ledger system that can be decentralized, openly distributed, monitored and preserved.[2] Ultimately, the power of blockchain lies in the immutability of the data ledger coupled with decentralization. This is a core value of the technology. It seems pretty clear how this is important in terms of the transfer of ownership. For example, you need the things that you purchase to always be on record as being your rightful property until you sell it, trade for it, or give it away. Anything less amounts to robbery or fraud! With immutability this capability becomes more determinitistic. Furthermore, you may also need on-demand, 24/7 access to that property regardless of an outage to a particular server on the network. Decentralization accommodates this important requirement by having multiple identical copies of the blockchain, and with it your ownership record, distributed around the world. Smart Contracts and Dapps. A newer and very exciting element of some blockchain implementations is that they allow for “smart contracts” to be stored, executed, and documented over the blockchain. Smart contracts make use of the ability of a blockchain to store and execute code on a given node, which allows for infinite possibilities involving business and application logic. The Ethereum blockchain is a leading force in the use of smart contracts, which help functionalize and apply blockchain technology to real world conditions and needs. Such applications are called “Dapps” or Decentralized Applications. Part II Preview Part II of this article will provide detail on why this all makes sense for many industries and IoT-related use cases and applications. A review of some of the problems and challenges associated with blockchain and IoT will also be included. Finally, we'll give an outlook for the IoT integrated with blockchain. Come back next month! Additional reading and references: NetBurner-Bitcoin IoT Project Postscape’s Blockchain-IoT Dapps and platforms index Reuters visual guide to understanding Blockchain NIST Definition of Blockchain Different Blockchain Consensus Methods Fog Computing, IoT and Blockchain IBM article on IoT and Blockchain ERC-725 Alliance - Etherium Identity Standard Guide to Coding and Scripting for Blockchain About Bitcoin nodes and how to run your own Public vs Private Blockchain ### Circles of Concern: A Robotics Spin Developing a 1/7-scale Autonomous Race Car In this article, I will discuss the engineering process behind developing a 1/7-scale autonomous race car from a NetBurner microcontroller, a multitude of sensors, and a hobby-grade chassis. I explain how I overcame challenges faced while interfacing low-level hardware, and then discuss my thought process while working on mapping the car’s environment for high-speed autonomous navigation and visualizing the results. Finally, I present my novel obstacle avoidance algorithm, dubbed “Circles of Concern.” This algorithm minimizes computation, which is useful for emergency swerving or racing applications. All code is available on GitHub for reference. Part 1: Intro Thanks to the wonderful internship program at NetBurner, I had the opportunity to continue Paul Breeds’s autonomous vehicle  project this past summer. Last year, the car suffered a soul crushing defeat at the 2017 SparkFun Autonomous Vehicle Challenge when, on its way to victory, it suddenly stopped inches from the finish line. I sought to research the practical implementation of autonomous navigation algorithms that could be used on a NetBurner module. I started by taking Paul’s vehicle platform and hardware, featuring a NetBurner NANO54415 system on module, with some minor alterations, and began to rewrite much of the code. Last year’s article took you through the “trials and tribulations” of the experience and focused on the end product. This article will focus more on the engineering process for hobbyists who want to get started with autonomous navigation. Because of the scope of this project, which involves both low-level microcontroller programming and high-level algorithms, this article may also be helpful for hardware engineers who want to take advantage of computer science research on autonomous navigation or software engineers who want to learn more about low-level interfacing. Race car chassis with controlled by a Netburner System on Module. Sensors include LiDAR and IMU. Part 2: Interfacing Sensors and Other Components The first thing I learned was that large engineering projects can only be tackled by breaking them down both horizontally and vertically. At first, I attempted to alter Paul’s code (written for a different version of NetBurner’s development tools) and integrate the RC signal, steering, and throttle to drive the car around. When it didn’t work, I felt overwhelmed. Upon a suggestion from a senior engineer, I established several smaller goals: spin the wheels for one second without input, alternate the steering between left and right without input, and print out values received from the controller. This was much more manageable. The RC receiver transmits raw DSM2 data over serial, which dsm2.cpp decodes. The servo and Mamba X Electronic Speed Controller (ESC) take pulse-width modulation (PWM) signals that consist of pulses between 1 to 2 ms long. The code in servodrive.cpp produces these two PWM signals using the output function on two of the NANO’s four direct memory access (DMA) timers. The ESC has a safety mechanism where it only arms itself after seeing several pulses representing a zero throttle value (in this case, pulses 1.5 ms long). One bug I ran into was the result of not transmitting a zero throttle as the ESC turned on. After some debugging, however, I was left with a working RC car prepared for hacking. At this point, I set up serial communication with an LCD breakout board (LCD.cpp), used the NANO’s Analog to Digital converter to read switch values (main.cpp), and set up an interrupt pin to read ticks on the motor’s encoder (Odometer.cpp). Each of these tasks was a matter of a few lines of code, thanks to NetBurner’s excellent runtime library. Getting information on the car’s orientation was more difficult, however. This information was a critical component to the odometer in tracking the car’s (X,Y) position. Of course, we could have used GPS for this position data but since the Autonomous Vehicle Challenge docks points for GPS usage. I attempted to interface the MPU9250 Inertial Measurement Unit (IMU) to get absolute heading (i.e., the direction the car is pointing relative to the North Pole). I soon realized this involved a complex procedure that involved I2C communication, testing, calibration, raw data transfer, and filter updates. Rather than taking two weeks to fully understand the complexities of the procedure and writing something from scratch, I ported some open-source Arduino code to NetBurner’s platform. The mainly required changing the necessary I2C functions to NetBurner equivalents, and delays to OSTimeDly() or a HiResTimer delay. I added a Programmable Interrupt Timer (PIT) to update the filter at a specified rate, a zeroHeading() function, and a boot settings function to save calibrations in flash memory. I defined “heading” as the angle counterclockwise from the X-axis, which points due east to zero. Defining this global coordinate system early-on minimized future confusion when I had to juggle several coordinate reference frames. For more details on the IMU code, see my article “Interfacing the MPU9250 IMU for Absolute Orientation Data”, which links to a cleaner, standalone repository that is helpful for starting your own IMU project on a NetBurner module. Lastly, I needed vision. The RPLIDAR A2 mounted on top of the chassis claimed to be very fast and precise, with 4000 samples per second (4kHz) and up to ±.5 mm precision. Getting data from it, though, was not trivial. Despite the simple serial communication, the RPLIDAR communicated using a complex data packet system. I ran into a serious bug where the quantity and speed of incoming data was overflowing the NANO’s serial buffer. This was hard to pinpoint, but easy to solve by reading the data at a predictable rate using PIT timers.. At each interval,   all of the available data in the buffer was read and sent to a processing function (SpinningLidar.cpp). The RPLIDAR was effective in gathering an appropriate amount of vision data for this non-life-threatening autonomous navigation application. However, the RPLIDAR only had about 4m range outdoors. The LIDAR-Lite rangefinders mounted on the sides produced a PWM signal that was measured using the input function of the DMA timers (LidarPWM.cpp). Although the precision wasn’t as good, the 40 m range of the LIDAR-Lites proved crucial for following the parallel walls spaced 16 m apart in the Autonomous Vehicle Competition. As the project grew more complex, different tasks needed to be performed at various time intervals and priorities. A single control loop in a single process was no longer the best solution for task management. Fortunately, NetBurner’s Real-Time Operating System (RTOS) provided easy-to-use task management features, from priority task-switching to semaphores to hardware interrupts. To be continued... Read on for part II of the article where we cover the in's and out's of the navigation techniques including the "Circles of Concern" algorithms and how the various approaches fared. At NetBurner, we love to see all of the amazing applications and products one can make with our embedded platforms. Our ongoing project with the Autonomous Vehicle Challenge really highlights the capabilities of NetBurner SOM’s in complex, real-time, low-power applications. As always, comment below with questions or reports on your work in this area. If you use any of the code please tell us how it works out for you. Cover photo credit: https://unsplash.com/@travelnow_or_crylater ### Vulnerable Designs and Implementations with MQTT and CoAP M2M Protocols Since their humble origins in industrial automation, machine to machine (M2M) protocols have served as the common tongue used by machines to communicate with each other over networks and the internet. This allows, for example, the conveyance of telemetry data from sensors and commands to actuators, and therefore plays a critical role in today’s IoT. The importance of security with regard to data being transmitted over the internet is well documented, and has unfortunately been demonstrated time and time again with numerous high profile breaches and hacks. This same importance can be applied to data that is transmitted with M2M protocols, regardless of the infrastructure used to transmit the data. A December 2018 TrendMicro Research paper, “The Fragility of Industrial IoT’s Data BackBone: Security and Privacy Issues in MQTT and CoAP Protocols,” put the issue of M2M security vulnerabilities into clear focus. Due to its important yet lengthy content, we felt that in this article we’d sum up the paper’s key themes and suggestions. Try Our ARM® Embedded IoT Dev Kit View Product Page Or, learn more about NetBurner IoT. Message Queuing Telemetry Transport (MQTT) and Constrained Application Protocol (CoAP) are two of the leading M2M protocols. Both are very easy to use, adaptable and lightweight protocols suitable for effectively connecting a large array of devices over the internet. They are designed for constrained resource use cases (e.g. low power, high latency, limited bandwidth). IHS Markit, Inc. forecasts that the IoT market will grow from an installed base of 15.4 billion devices in 2015, to 30.7 billion devices in 2020, and 75.4 billion in 2025! [1] That doesn’t even include PCs or mobile phones. It is also expected that a large percentage of these IoT devices will use MQTT or CoAP. Just like any platform or protocol growing in mass popularity, vulnerabilities are discovered, oftentimes by malevolent actors, and abused. It’s a rapidly evolving space which makes it  easy for even the most conscientious design teams and institutions to be outpaced in their understanding and management of M2M protocol patches, 3rd party library bugs, vulnerabilities and implementation flaws. Therefore, it should be no surprise that IoT devices using these popular M2M protocols are increasingly juicy attack surfaces for black-hat hackers and criminals today, and will be for years to come. If you want to learn more on using MQTT, check out our prior article, “MQTT: The Go-To Protocol for Distributed IoT and Tutorial”. We’ll work on getting an article out on CoAP soon. Later in this article, we’ll go through a brief technical background for each of the protocols as well. Risk Overview There are entire infrastructures and sectors that are common targets of M2M related cyber-threats; potentially putting individuals, businesses, communities, cities and even nations at risk. Manufacturing, defense, aviation, marine, aerospace, healthcare, public administration, energy, building automation, transportation, and agriculture are a few of the sectors that have been vulnerable to some degree. [2] According to TrendMicro Research, “MQTT and CoAP are found in a variety of IoT and IIoT products (and services), from control and analytics dashboards to the connectivity data plane, all the way down to the firmware running on the field sensors or protocol gateways.” They thereby present a very broad attack surface over the IoT architecture for M2M related vulnerabilities. To make matters worse, M2M 3rd Party library and protocol updates can make keeping up with changes a very challenging feat. That sounds pretty scary, right? Well, this article isn’t trying to scare you away from using these great protocols, rather, we hope to encourage awareness and safer usage. Attack Motives, Methods and Types It’s important to understand the methods and types of attacks when working with these protocols to prevent and mitigate potential data leaks and hacks. Here are the general areas identified in by TrendMicro, which in some cases, work in tandem with or overlap one another. Reconnaissance - Prospecting for personal, technology and business data is widespread, and M2M end-points can leak bits of valuable information. This information is used to prepare for active targeted attacks to the network, business or individuals. Reconnaissance can be passive (eg. sniffing publicly exposed networks) or active (eg. gain access via compromised credentials). Espionage - Almost every major sector has some exposure to espionage: industrial, corporate, political, or international. The attack surface for espionage is growing as rapidly as the Internet of Things. The research from TrendMicro shows that “with simple keyword-based searches, an attacker can elicit business-relevant data that includes, for instance, the location and identifying information of assets and personnel, the technology used by a given company, and business-to-business relations, including the exchanged communication.” Anything from a connected 3D printer to an industrial manufacturing process can be spied on through this sort of M2M espionage. Attacks can be used to spy on competitors, steal data and information. Targeted attacks - Utilizing information gained via reconnaissance orchestrated and targeted offensive attacks are often the next goal. Targeted attacks can be used for a variety of motives and can involve a number of more specific attack types or methods. TrendMicro was able to “show that the [M2M protocol]  technology has design, implementation, and deployment security issues that can facilitate the job of a motivated hacker looking to launch a targeted attack.” They also demonstrate “that current M2M technology can be abused to take control of endpoints or force them in a DoS state”. 2 In other words, an IoT network can be rendered useless. The attack can happen at the client or on the broker or server. Some common M2M IoT attacks include methods to cripple, steal from or further penetrate networks: [3] Disrupt network via Denial of Service (DoS) attack Reflective Denial of Service (DoS) Regular expression DoS Distributed Denial of Service (DDoS) DNS Amplification attack Command and Control Server Attack - eg. Botnets. Usually a group of malware infected computers that come under coordinated control. Used for a variety of attacks like DDoS, spam, poisoning of telemetry data or data and identity theft Installing malware to gain command, steal data, or further infect network Man-in-the-middle (MitM) and Spoofing attack Social Engineering Attack (eg. Phishing for credentials or redirect to malware infected site) Lateral movement - This refers to a spreading of a successfully executed targeted attack to additional assets in a network, and may be enabled through malware. [4] According to TrendMicro, “By abusing specific functionality, an attacker can use M2M technology to maintain persistent access to a target via software upgrades or to perform lateral movement, including against other targets.” Infiltration through the cloud and through the supply chain can occur. They also demonstrated “how an attacker can abuse a by-design protocol feature to implement amplification attacks... in... about 17 to 22 percent of the IPv4 autonomous systems on the internet”. [2] Vulnerable M2M Applications TrendMicro separates M2M applications into four broad groups to better depict how threats may unfold. All top level bullets are quoted from the paper: [2] Telemetry and notifications refer to a passive use of M2M protocols to transmit data or messages. Here, security risks arise when such data is sensitive from a privacy perspective, or when it triggers automation rules. Tainted data and commands can have far reaching effects on a variety of efforts including research, energy distribution and manufacturing. Anything from user information to a device make, model and location can be exposed. There are many negative outcomes that might come as a result of a bad actor gaining access to detailed IoT telemetry data. Leaked records can add up to massive data sets. Depending on the victim and perpetrator, some of these violations could be enormous and have severe consequences. Examples include: Leaking groupware messaging apps Leaking Healthcare monitors and asset trackers Leaking Smart Farming telemetry Node configuration and management regards the active use of M2M protocols to set up, configure, and manage endpoints. Here, security risks arise because an attacker could take control of a machine during its configuration phase, for instance. Manipulation of a device’s configuration can be especially problematic as they can be set up to run in ways which aren’t necessarily wrong or incorrect, but that leave gaping holes in the device’s security, making them more vulnerable to other types of attacks. These kinds of issues can also be especially difficult to detect. Node configuration and management is an important element to modern IoT architectures. As IoT scales towards IIoT and smart city-type applications the ability to remotely maintain the IoT end-point or gateway (e.g. update firmware) becomes a matter of logistical sustainability. Command queuing refers to an active use of M2M protocols to send direct commands to physical machines. Here, security and safety risks arise because an attacker could subvert such commands and affect the physical environment. Actuators, indicators and relays can be switched by hackers. Combined with telemetry poisoning, a victim may be completely unaware until significant damage or loss becomes plainly evident. Over-the-air upgrades, which are the most critical, refer to the active use of M2M protocols as a transport layer to ship software upgrades to endpoints. Here, the security risk comes from the fact that an attacker could intercept such upgrades to take complete and persistent control of an endpoint. The potential impact of issues related to this category of applications will only grow as more and more IoT devices are deployed to the field, where these kinds of upgrades become necessary. Summary of Recommendations In a nutshell, TrendMicro Research  recommends the following at a high-level (top level bullets are quoted directly from the report): Implement proper policies to remove unnecessary M2M services. Run periodic checks using internet-wide scan services or tools to ensure that none of the sensitive company data is inadvertently leaked through public IoT services. Design tests to ensure that less-secure development environments are not migrated to production. Utilize IoT and network scanners as part of functional security testing. See the tools and resources list below. Analyze and periodically audit your network traffic using a tool like Wireshark. Make sure you understand your data flow patterns and what normal data should look like. Learn to identify and inspect unencrypted communications, open ports, and headers that maybe give away too much information. Understand the data you are exposing to the public. Implement a vulnerability management workflow or other means to secure the supply chain. Understand your architecture, from large and enterprise-grade software down to the small, embedded devices, which may be neglected and running outdated firmware. Understand which 3rd party IoT products, libraries and bespoke internal engineering are used and how those could lead to vulnerability.   Be safe by incorporating practices on the control and migration of development environments to production. Make a policy to use and test for end-to-end encryption (eg. SSL/TLS). See the tools and resources list below. Stay up to date with the standards in this space because this technology is evolving rapidly. And as always, train colleagues, co-workers and employees on safe practices to avoid phishing or social engineered attack. Also, implement strong password policies, utilize end-to-end data encryption and multi-factor authentication whenever practicable, perform checks, tests and audits during development and for deployments. Know what unsecured data, if any, is broadcast over the internet and keep up to date! Finally, consider professional cybersecurity consulting services or pro tools to perform more in depth penetration testing. See the tools and resources list below. More Detail on the Vulnerabilities TrendMicro’s recent research and evidence that shows MQTT brokers handing out sensitive data to any curious soul or attacker. Experts have been able to identify threats associated with both the underlying protocols and developer implementation patterns. So it’s good to be aware of both angles. Here’s a list of some of these more detailed vulnerabilities: MQTT MQTT Payload Remaining Length (CVE-2018-17614) MQTT Unicode Handling in Topic Strings (CVE-2017-7653) Mosquitto MQTT broker by IBM if outdated may be vulnerable Disallowed Characters MQTT URI-Style Topic Validation (CVE-2018-11615) Regular expression denial of service (ReDoS) See other MQTT vulnerabilities in NIST database CoAP CoAP Amplification IP Address Spoofing on UDP See other CoAP vulnerabilities in NIST database Tools and Resources We thought we’d add this section as an additional resource to begin your own testing. If you don’t have the capability to hire a professional here are some ways to get started with securing your M2M and IoT networks: National Vulnerability Database - NIST - Public database of known cyber-vulnerabilities. Search by protocol or keyword. NIST Cybersecurity Framework NIST Creating a Patch and Vulnerability Management Program MQTT Links MQTT Community: https://mqtt.org/faq Oasis MQTT Technical Committee - Specifying body for latest MQTT protocols Report Bugs or Vulnerabilities: https://www.zerodayinitiative.com/ MQTT Specification CoAP Links CoAP core specification RFC 7252 Links to other CoAP specifications CoAP community Testing, Scanning and Monitoring Tools: IoT-network search and scan https://iotscanner.bullguard.com/search https://www.shodan.io/ https://censys.io/ https://ivre.rocks/ https://www.thingful.net/ https://www.binaryedge.io/ https://subgraph.com/vega/ https://www.zoomeye.org/ https://www.incapsula.com/mirai-scanner/ https://www.metasploit.com/ Gibson Research Corps old school yet effective free port scanner tool. Scan your network for open ports en masse or individually. MQTT typically uses port 1883 or 8883. TrendMicro’s own home network device scanner Check your public DNS with https://www.dnsleaktest.com/ Monitor network traffic with the Wireshark downloadable tool Testing tutorials: Test Home Network Security How to secure your router Rate your cybersecurity risk Penetration Test with Wireshark MQTT and CoAP Technology Summary To better understand the risks, vulnerabilities, and threats, it pays to get a better understanding of the protocols and how they work. The details of which are deep and worth reading up on. MQTT MQTT, Message Queuing Telemetry Transport, is a very simple and lightweight messaging protocol. It was developed for devices with constrained resources to communicate with optimal performance over less than optimal networks that might be suffering from  low-bandwidth, high-latency or that are just plain unreliable. [5] It sits on top of TCP and utilizes a publish/subscribe model with subscribing “clients” and data “brokers” playing middleman. [5] The model works like a newswire distribution service, where a "broker" like AP or Reuters allows reporters to "publish" reports to their wire service. Meanwhile, while listening newsrooms that have "subscribed" to that wire are able to receive news feeds through the broker. According to the MQTT FAQ, the protocol’s “design principles are to minimize network bandwidth and device resource requirements, whilst also attempting to ensure reliability and some degree of assurance of delivery.” It also states that these principles make the protocol ideal for the latest generation of M2M systems, IoT, and “mobile applications where bandwidth and battery power are at a premium”. It is a fairly mature protocol that has been around since 1999, and is still evolving to better meet the needs for security, low power and latency. MQTT works via TCP/IP over port 1883 with IANA while TCP/IP port 8883 is registered for using MQTT over SSL. [6]   Notional diagram of the MQTT protocol's publisher/subscriber/broker model. Here’s a post and tutorial of ours on MQTT for IoT. Also check out www.mqtt.org and OASIS, the organization leading the charge on the latest protocol updates for MQTT. CoAP Constrained Application Protocol (CoAP) is a younger and yet-to-be-officially-standardized “proto-protocol”, if you will. According to the official website, it is “designed for machine-to-machine (M2M) applications such as smart energy and building automation”. [7]  From Wikipedia, “CoAP is also being used via other mechanisms, such as SMS on mobile communication networks”. [8] It is designed for power or network constrained devices over the internet or network, but utilizes User Datagram Protocol (UDP) rather than TCP. [9]  According to the Eclipse Foundation, “CoAP packets are much smaller than HTTP TCP flows. Bitfields and mappings from strings to integers are used extensively to save space. Packets are simple to generate and can be parsed in place without consuming extra RAM in constrained devices.” [5] There is no mechanism to support QoS to ensure packets were received. CoAP follows a client/server model and is interoperable with HTTP and a RESTful API and software design paradigm.[5] Because it’s based on UDP, CoAP does not require the client to keep a connection open to a server, which is considered a benefit in many use cases.   According to TrendMicro Research, “a client can send one CoAP packet to a server. Each request has a few options, with the most important one being the Uniform Resource Identifier (URI), which indicates the “path” to the requested resource — much like Uniform Resource Locators (URLs) for websites. Note that a node could be both server and client at the same time, implementing a point-to-point, full-duplex data layer.” [2]   Notional CoAP architecture utilizing both CoAP and HTTPS with a REST API. Note the flexible topologies. Here, the CoAP client nodes sit within the constrained environment. Orange arrows are CoAP connections and yellow are HTTPS (as an example). MQTT vs. CoAP TrendMicro provides an excellent comparison of the two protocols in their paper: “CoAP is much more lightweight than MQTT, in terms of both operational requirements (i.e., no broker setup is needed) and memory and network overhead (i.e., UDP does not require keeping a connection open, and messages are much smaller in size). Thus, it meets the requirements of low-power IoT nodes: It minimizes the transmission cost and does not impose an always-on connection. For its part, MQTT is thus preferred over CoAP for mission-critical M2M: It allows the enforcement of quality of service and ensures message delivery. On the other hand, CoAP is preferred over MQTT in gathering telemetry data transmitted from transient, low-power nodes like tiny field sensors. An extreme application use case for CoAP is satellite communication: The European Space Agency’s Advanced Research in Telecommunications Systems (ARTES) program has recently kick-started a research project on M2M communication in satellite networks (where latency can be very high), and CoAP is unsurprisingly listed among the chosen protocols.” [2] References: http://www.steves-internet-guide.com/iot-messaging-protocols/ https://www2.deloitte.com/content/dam/Deloitte/sg/Documents/risk/sea-risk-cyber-101-july2017.pdf https://dzone.com/articles/which-are-the-iot-messaging-protocols https://www.eclipse.org/community/eclipse_newsletter/2014/february/article2.php https://www.electronicdesign.com/iot/understanding-protocols-behind-internet-things http://docs.oasis-open.org/mqtt/disallowed-chars/v1.0/cn01/disallowed-Chars-v1.0-cn01.pdf https://diyprojects.io/8-online-mqtt-brokers-iot-connected-objects-cloud/#.XG12i-j7RPZ https://www.beyondsecurity.com/blog/security-testing-the-internet-of-things-iot https://www.networkworld.com/article/3112620/security/top-tools-for-preventing-data-leaks.html#slide1 https://www.networkworld.com/article/2859568/internet-of-things/7-devices-that-make-your-data-vulnerable.html#slide1 https://www.networkworld.com/article/3112671/security/review-top-tools-for-preventing-data-leaks.html https://blog.netwrix.com/2018/05/15/top-10-most-common-types-of-cyber-attacks/ ### Real-Time Data Logging for Embedded Systems and IoT - Tutorial Overview Data logging abounds in the world of embedded systems. Between the burgeoning field of IoT and the broader spectrum of embedded devices as a whole, the use cases where logging is useful, if not downright necessary, are as numerous as the devices in the cloud. Whether you’re trying to track variations in sensor data for data acquisition (DAQ), evaluate system resources, or simply debug your latest killer application, if you’re a developer at any level, chances are high that you’ve needed to track changing data at some point. In this article, we review an example that showcases a modular, efficient real-time data logging system designed to run on a NANO54415, though it can be easily ported to other NetBurner modules. The example uses the data logging system to instantiate a logging object with some dummy values which are modified over time. These values are then written to a log file which is stored in volatile flash memory (deleted when you turn off the module) and can be transmitted to a computer via FTP. As written, the data logging system writes out integers or floating-point values of various sizes in their raw binary encoding. Unless you happen to be Neo staring into the Matrix, this sort of raw data is rarely useful. However, logging data in this format can provide a substantial benefit as it minimizes the runtime computational power usage of your device. To turn the resulting mess into something your typical engineer can make sense of, a separate command-line tool, Read, parses the data and can expose it in several different ways. This small, handy utility provides a host of useful functionality when trying to dig into the overwhelming dataset typical of most log files. In addition to reviewing the code in the example and explaining the usage of the logging system, we will cover how to use Read to get exactly what you’re looking for from your logged data, and how to turn it into a format you can easily use: a CSV file. Both the Read application and the example code used throughout this article can be found on our GitHub repo. Note: One precaution with this example is to ensure the log file size, defined by LOG_SIZE in the source code, will be smaller than the amount of available flash memory on your board. For systems that need to log an exceptional amount of information or want to safeguard the logged data against power-outages, this example can be modified to write the log data to an SD card using the EFFS-FAT system library that is included with the NNDK (NetBurner Network Development Kit). The Code Our Example Let’s take a moment to get an overview of the code and see exactly what’s going on here. The example has two core components, which correspond to the different source files. These are: main.cpp:  This contains the definition of our logging object, as well as the entry point of our application, UserMain(). In UserMain(), we manipulate our logged values once per second, update the object, and send the data on its way. introspect.cpp/h: This is where the family of Introspection classes are declared and defined, as well as the loggable data types. It drives the magic that enables us to create the logging objects and have them generate output. We won’t dive too far into the mechanics of how the logging works behind the scenes, other than to show you the how to use the objects and some additional useful functions that are available. To get started, let’s dive into main.cpp to see what’s going on and show how it can be tailored to suit your particular needs. After the standard included header files, application name, and defining the task priority for FTP, you will run into the following macro: LOGFILEINFO   // Logs the version of this file Including this snippet at the top of any file in your project will allow you to spit out that file’s last build time with the Read utility. This can be incredibly useful when trying to remember the last time a particular piece of a project was modified. Immediately under that, we see the following chunk of code: // Our logging objectSTART_INTRO_OBJ(MainLogObject, "Log")public: int_element m_time{"time"}; float_element m_floatElem{"FloatElement"}; uint16_element m_intElem{"IntElement"}; char GetCharElem(){ return m_charElem; } void SetCharElem(char c) { m_charElem = c; }private: char_element m_charElem{ "CharElement" };END_INTRO_OBJ;MainLogObject mainLog; The macro START_INTO_OBJ indicates the beginning of our logging object. It is called with two parameters, the first being the name of the class that will be created by the macro during preprocessing, and the second being the value that will be displayed in the generated log file. What follows is the class definition. As you might notice, it follows the same structure and syntax as any other C++ class, as this is exactly what it will become when the code is compiled. You might notice that the member variables are of types that end in “_element”. These types are defined in introspect.h and are the only types that can currently be logged. At the end of our class definition, we place the trailing macro, END_INTRO_OBJ. Finally, we declare our global logging object, mainLog, as an instance of the logging class that we just defined, MainLogObject. extern "C" void UserMain(void *pd){    // Basic network initialization    init();    int secs = 0;        // FTP Server for Log Transmission    InitLogFtp(FTP_PRIO);    // Start Logging    bLog = true;    LogFileVersions();    while (1)    {        printf("Updating Main\n");        // Update data values that will get logged for 20 seconds       if (secs++ > 20)       { bLog = false;        }        else        {            printf("Logging at %d secs\n", secs);        }        mainLog.m_time = secs;        mainLog.m_floatElem = mainLog.m_floatElem / 2;        mainLog.m_intElem = mainLog.m_intElem * 2;        mainLog.SetCharElem(mainLog.GetCharElem() + 1);        mainLog.Log(); }    OSTimeDly(TICKS_PER_SECOND);   // Update main every second} After our class definition comes the meat of our file and the entry point of our application, UserMain(). All NetBurner applications use this function as an entry point, and the first thing that all applications need to do is set get their ducks in a row by calling init(). We won’t get into the details here, but this function does things like set up your stack, get an IP address through DHCP (if needed), etc. We now define the variable that will be used to track time in this example. The NetBurner system libraries have more precise timers available, but for our use case in this demonstration, a simple integer will suffice. The call to InitLogFtp() starts the FTP task that will be used to access the log file. We will give a bit more detail on how to get to that beautiful pile of data below. The next bit of code is where our actual use of the logger begins. To indicate that we want to start actually logging data, we need to set the boolean, bLog, to true. This will allow calls to Log() from our object to write out the data. If Log() is called when bLog is set to false, the function will simply return. Having this toggle is incredibly useful for systems that are resource constrained, as it allows you to use conditional logic to dictate precisely when your logging takes place. More on this in a bit. The function, LogFileVersions(), will output the last build data for files that have the LOGFILEINFO macro entered at the top. Finally, we start our main application loop. For this example, we are only going to log data for 20 seconds. If we have gone through our loop more than 20 times, we set bLog to false, which will prevent any future calls to our logging functions from doing anything. You might be thinking it would be just as easy to stick the logging object, bLog, itself in the if() statement. You would be right. However, for applications where the logging is widely distributed throughout the code base, having a single value that can be used to toggle logging on and off can save a lot of time and energy. Below our check is where we modify the values of the object itself, which is exactly the same way you would modify the private or public member variables of any other class in C++. After the elements have been updated, we make our call to Log(), which, assuming bLog is set to true, writes the data to our log file. One point to note is that if we happen to write enough data that we run out of space, the logging system will simply wrap around to the beginning of the log file and overwrite what was previously there. No need to worry about the system failing, but it’s a good idea to have a sense of how much you are writing versus how much space you have to put it. Again, using bLog is an excellent way to help regulate this. Finally, we have the delay at the bottom of our while loop that allows other tasks to run and ensures we are logging data at the intervals we want to. Additional Functions In addition to the functions LogFileVersions(), InitLogFtp(), and IntrospecObject::Log() that were covered above in our example, there are a few other handy functions provided by introspect.h that should not be overlooked. Below is the list and a short description of each: void LogMessage(const char *cp, bool force = false) - Writes a message directly to the log file. The first parameter, cp, is the message to write, and the second parameter, force, is whether or not the message should be written if the value of the global variable bLog is false. void LogEvent(bool force = false) - Marks a single event in the logging stream. The parameter force dictates whether or not the event should be written if the value of the global variable bLog is false. int GetLogPercent() - Returns what percentage of the current log space is used. int GetLogSize() - Returns the current log size. void LogAppRecords() - Logs the configuration system’s app data section (NNDK 3.0 only, comment out for 2.x). void IntrospecObject::LogStructure() - This class function logs the structure of the logging object. It is automatically run the first time Log() is called on any object. Getting to the Log File After the application is up and running, the log file can be easily accessed by pointing an FTP client, such as WinSCP, at the device. The following session options should be set when trying to connect:  File Protocol: FTP Encryption: No encryption Port Number: 21 Host Name: The IP address of your device User Name: Anything Password: Anything If you are using version 3.x of our NNDK, you can find the IP address of your device by going to discover.netburner.com and looking at the entries. If you only have one running on your local network, it should be the only one listed. If there are several, then you will need to reference the MAC number (listed on a white sticker on your module), to determine which one is yours. For earlier versions of our NNDK (2.x and prior) you will want to use our IPSetup tool, which can be freely downloaded from our site. The default port for unencrypted FTP is 21. With these values filled out, you should be able to connect to your device and see a file named Log.bin. This will be the file that contains all of your data, and is what will be used with the Read application in the steps below. Download it to your PC, and proceed to the next section. Security Considerations By default, any username and password entered should allow you to access the device. Needless to say, in a production environment you may want to be a bit less cavalier. The same can be said for the encryption type, which for simplicity we opted not to use in our example. In a real world scenario, we highly recommend using an encrypted connection, which is fully supported by our NNDK. Using Read Once the application is up and running, and you have downloaded your log file, you will be ready to dive in with the Read utility to figure out exactly what treasures are buried in the data. It is a command line tool that will be run from the command prompt, and is included as a part of the repository with the example code. To get a feel for all of the options available with the tool, type read -? into the command prompt. You should see the following list: Usage is: read fileOptions:-A emit All-L list names-C count elements-D make CSV file-V verbose diagnostic-M show messages-E show events-H hold last valid value-Ooptionsfile   list of data fields to display in same format as list To get started, it might be a good idea to see what data elements are present in the log file. While our example is fairly simple, I’ve seen how one of our engineers used this in his autonomous car when preparing for the AVC race, and trust me, it got heavy in a hurry. To pop the lid off of this data dump and peer inside, use the -L option. When used in our example, the following is displayed: > read -L Log.binReading from Log.binmessagesMainLogObject.CharElementMainLogObject.IntElementMainLogObject.FloatElementMainLogObject.time From this, we see our object’s elements listed by the names we gave them in our example from the previous section. We also see a category, messages, which contains the build information of our files due to including the macro, LOGFILEINFO. To get more info on this, we can use the -M flag and see the following: Reading from Log.binMsg[Source src/main.cpp build on Feb 27 2019 at 17:35:16.]Msg[Source src/introspec.cpp build on Feb 27 2019 at 17:32:37.]I If you just want to see a list of all the data, you would use the -V flag, and see something like the following (but with more entries): > read Log.bin -VReading from Log.binMainLogObject:[time:+1FloatElement:0.000000IntElement:0CharElement:+1]MainLogObject:[time:+2FloatElement:0.000000IntElement:0CharElement:+2]... This isn’t much better than just watching it scroll by on a serial terminal, however, and certainly isn’t the highlight of this example. What we really want to do is select which attributes to look at and put it in a format that is easy to digest. Fortunately, Read is able to write out selected attributes to a .csv file. To accomplish this feat, we first need to tell the utility which attributes we are interested in. We will output all of the options into a text file and designate which ones we want to peruse. At the command prompt, type read -L Log.bin > attrList. Open the file attrList in an editor, and you should see the same list of attributes that we saw previously. Go ahead and add the word “emit” after the elements you want saved to the .csv file. Values that aren’t marked this way will appear as if they aren’t changing. This is not true for messages, which will get displayed anyway. For this article, we will look at everything but the messages (which we removed manually from the top of attrList in the editor), so the file now looks like the following: MainLogObject.CharElement emitMainLogObject.IntElement emitMainLogObject.FloatElement emitMainLogObject.time emit To generate the .csv file, we will run read –O attrList –D Log.bin > Log.csv. When we open up Log.csv to verify our results, we get the following: "MainLogObject.CharElement","MainLogObject.IntElement","MainLogObject.FloatElement","MainLogObject.time"+1,1,1.000000,+1+2,3,1.500000,+2+3,7,1.750000,+3+4,15,1.875000,+4+5,31,1.937500,+5+6,63,1.968750,+6+7,127,1.984375,+7+8,255,1.992188,+8+9,511,1.996094,+9+10,1023,1.998047,+10+11,2047,1.999023,+11+12,4095,1.999512,+12+13,8191,1.999756,+13+14,16383,1.999878,+14+15,32767,1.999939,+15+16,65535,1.999969,+16+17,65535,1.999985,+17+18,65535,1.999992,+18+19,65535,1.999996,+19            Here we can see that the first row provides the names of the values. Following this are rows of our data, with each entry corresponding with a call to Log() on our logging object. With that, our data logging journey is at an end. That said, we would love to hear how you put this to use. If you have any questions, comments, or stories, please let us know in the comments below, or directly at sales@netburner.com. ### Architectures in the IoT Civilization Innovation can be messy. The past few years have been a windfall towards the validation and massive growth of the IoT tech sector and it’s about time we took a look at some architectural themes that have risen to the top. In support of healthy industry growth, there have been parallel efforts towards the standardization of particular protocols, security practices and even system architectures. However, considering the multitude of bits and pieces that make up the IoT stack, it is a real challenge to know where to start and how to “future-proof” your particular system architecture. And if you are looking for one take away just remember that...→There is no single unified IoT architecture that is agreed on← There are essentially three major types of IoT architectural contexts: application specific, open platform and Network as a Service (NaaS). This article summarizes the leading trends in end-to-end, open platform IoT architectures where scalability and interoperability are major driving factors. In alignment with the NetBurner philosophy, a viewpoint is taken that a modular and interoperable approach to IoT architectures can help reduce risk and time to market, while at the same time increasing innovation. Therefore, the article also leans away from architectures which risk dependencies on proprietary protocols or NaaS architectures, also known as “vendor lock-in”. Try Our ARM® Embedded IoT Dev Kit View Product Page Or, learn more about NetBurner IoT. IoT Architecture Basics So what are we looking for in an “end-to-end” or complete IoT architecture anyway? Here are some important requirements [1] [2] : Concurrent Data Collection - support for collection, analysis and control from a large number of sensors or actuators Efficient Data Handling - minimize raw data and maximize actionable information Connectivity and Communications - provide network connectivity and flexible, robust protocols support between sensors/actuators and the cloud Scalable - scale individual elements in the system using the same architecture Security - end to end encryption and monitoring Availability and Quality of Service - minimal latencies and fault tolerant Modular, Flexible and Platform-independent - each layer should allow for features, hardware or cloud infrastructure to be sourced from different suppliers Open Standards and Interoperable - communication between the layers should be based on open standards to ensure interoperability Device Management - enable automated/remote device management and updates Defined APIs - each layer should have defined APIs that allow for easy integration with existing applications and integration with other IoT solutions Common Architectures: While we can’t cover all of the possibilities and permutations, the following group of architectures should give you a greater understanding of the core design considerations and typical primary functional layers in an end-to-end IoT stack. Three Layer (Tier) IoT Architecture While there are myriad bits that build a complete end-to-end IoT architecture, this architecture simplifies it down to three fundamental building blocks [3] : Perception layer - Sensors, actuators and edge devices that interact with the environment Network Layer - Discovers, connects and translates devices over a network and in coordination with the application layer Application Layer - Data processing and storage with specialized services and functionality for users The fundamental Three Layer IoT Architecture Devices make up a physical or perceptual IoT layer and typically include sensors, actuators and other smart devices. One might call these the “Things” in the Internet of Things. Devices, in turn, interface and communicate to the cloud via wire or localized Radio Frequency (RF) networks. This is typically done through gateways. Oftentimes IoT devices are said to be at the “edge” of the IoT network and are referred to as “edge nodes”. When selecting a device, it is important to consider requirements for specific I/O protocols and potential latency, wired or RF interfaces, power, ruggedness and the device’s overall sensitivity. It is critical to determine how much device flexibility your architecture should have. Many newer devices are IoT ready right out of the box (e.g. are sold with low power bluetooth or are Ethernet enabled). However, most sensors, actuators and legacy devices still interface via conventional “pre-IoT” methods such as analog or serial connections. It is common practice to connect one or more of these conventional devices to microcontrollers, systems on modules (SOMs) or single-board computers (SBCs) with the necessary peripherals (e.g. Arduino, NetBurner, or Raspberry Pi). At a minimum, such collectors provide network connectivity between the edge nodes and a master gateway. In some instances they may be capable of being configured as a gateway as well. IoT Gateways are an important middleman element that serves as the messenger and translator between the cloud and clusters of smart devices. They are physical devices or software programs that typically run from the field in close proximity to the edge sensors and other devices. Large IoT systems might use a multitude of gateways to serve high volumes of edge nodes. They can provide a range of functionality, but most importantly they normalize, connect and transfer data between the physical device layer and the cloud. In fact, all data moving between the cloud and the physical device layer goes through a gateway. IoT gateways are sometimes called “intelligent gateways” or “control tiers”. [4] Today, gateways also support additional computing and peripheral functionality such as telemetry, multiple protocol translation, artificial intelligence, pre-processing and filtering massive raw sensor data sets, provisioning and device management. It is becoming common practice to implement data encryption and security monitoring on the intelligent gateway so as to prevent malicious man-in-the-middle attacks against otherwise vulnerable IoT systems. NetBurner devices can be used as robust IoT Gateways, as well as IoT Device Collectors, as mentioned above. Certain gateways offer an operating system that is specialized for use in embedded and IoT systems along with optimized low-level support for different hardware interfaces, such as NetBurner’s SOMs with our custom Real Time Operating System (RTOS) and interface libraries. Managing memory, I/O, timing and interface is not a trivial task. According to Google Cloud, "Generally these abstractions are not easy to use directly, and frequently the OS does not provide abstractions for the wide range of sensor and actuator modules you might encounter in building IoT solutions."[5] Libraries are typically available based on standard protocols. Oftentimes, the most optimized libraries will be part of commercially available development kits and SDKs (as is the case with NetBurner for a multitude of protocols and hardware types). The Cloud is the application layer. It communicates with the gateway, typically over wired or cellular internet. The “Cloud” might be anything from services like AWS or Google Cloud, server farms, or even a company’s on-premises remote server. It provides powerful servers and databases that enable robust IoT applications and integrate services such as data storage, big data processing, filtering, analytics, 3rd party APIs, business logic, alerts, monitoring and user interfaces. In a Three Layer IoT Architecture, the “Cloud” is also used to control, configure, and trigger events at the gateway, and ultimately the edge devices. Five Layer (Tier) IoT Architecture The Five Layer IoT Architecture essentially builds upon the three layer approach (see figure above). This is still primarily a cloud-centric IoT architecture, where almost all of the IoT data processing is done on the cloud or a remote server. The difference between the Five Layer IoT Architecture and the Three Layer IoT Architecture are the addition of the following: A Business Layer A Processing Layer The top-level Business Layer highlights the various management, business logic, and top-level requirements that need to be coordinated for a sustainable and successful architecture that is able to provide consistent value to the business and end users. It also reinforces the idea that IoT applications may be just a part of an organization’s portfolio of interconnected technology and business areas. The use of a Processing Layer unveils an important element of many IoT systems which need to incorporate numerous layers of processing in their architecture; oftentimes to filter down massive data sets and thus conserve resources. Using the processing layer at more than one point within in a specific architecture may be required for particular systems. Business Layer Manages the entire IoT system, its functionality, applications, and business models. Applications Layer Provides application specific services to users. Processing Layer Analyses, stores, and processes large data sets. Might use databases, cloud computing, big data processing resources. Transport Layer Convert and transfers sensor data between layers and through networks such as 3G, LAN, Bluetooth, LoRaWAN etc. A typical IoT gateway. Perception or Physical Layer Sensors gather data from the environment; actuators turn things on or off, or set values. Fog Computing IoT Architecture Fog computing is a newer convention that moves certain IoT services, like monitoring and pre-processing, closer to the edge to enable faster local decision making and automation. The Fog Layer resides between the Physical Layer (sensors and devices) and Transportation Layer (gateway) in what might be called the local network for that IoT cluster. In Fog architectures, computational and storage resources are typically provided by what is called a “Smart IoT Gateway” or “Fog Node”, which can also be laterally networked to other fog nodes. According to NIST’s 2018 Fog Computing Definition Draft, “Fog nodes may be either physical or virtual elements and are tightly coupled with the smart end-devices or access networks. Fog nodes typically provide some form of data management and communication service between the peripheral layer where smart end-devices reside and the Cloud. Fog nodes, especially virtual ones, also referred as cloudlets, can be federated to provide horizontal expansion of the functionality over disperse geolocations.” [6] Fog architectures can have many benefits. By pre-processing sensor data, they can reduce bandwidth requirements between the gateway and the cloud while reducing the resource consumption on the cloud. They also can lead to significantly improved real-time performance. Using the Fog Architecture makes a lot of sense for use cases where the above reasons hold value. It is sort of like refining a raw material closer to the source and only transporting the refined product to market. Fog nodes may even be configured to communicate directly with other fog nodes to create a mesh that can bypass the cloud completely. Fog computing architectures attempt to address requirements surrounding real-time performance, security and efficiency. The figure below illustrates the added layers entailed with the Fog Architecture. [7] You can see how four new layers sit on the margin between the Physical and Transport Layers and the value that these new layers can provide. That said, this also increases the complexity of the architecture, and the new layers introduce additional steps and data conversions which can lead to more points of failure. Business Layer Manages the entire IoT system, it’s functionality, applications, and business models. Applications Layer Provides application specific services to users Processing Layer Analyses, stores, and processes large data sets. Might use databases, cloud computing, big data processing resources Transport Layer Transfers sensor data between layers and through networks such as 3G, LAN, Bluetooth, LoRaWAN etc. A typical IoT typical gateway. Fog Layer - Smart IoT Gateway Security Layer Encrypt / decrypt data. Storage Layer Store files or data with localized relevance. Pre-Processing Filter, processes, analyze and reduce edge data or process commands or subscriptions from the cloud. Monitoring Monitor power, resources, responses, and services, access. Perception or Physical Layer Sensors gather data from the environment; actuators turn things on or off, or set values. Table: A Fog Computing Architecture Edge Computing Architecture Edge computing is closely related to fog computing, where the goal is to keep certain processing capabilities and functionality closer to the edge nodes. It can be particularly useful in reducing sense and respond latencies for applications that require real-time performance. In edge computing, processing takes place at the physical perception layer directly on a smart device or on an IoT device collector as discussed earlier in this article. It can work independently or in any combination with fog and cloud computing. [8] If the edge node’s processing unit were powerful enough, we could even extend layers for transport, security, storage, pre-processing, and monitoring, thereby reducing the work and functionality required between it and the cloud. According to info.opto22.com, "Edge computing saves time and money by streamlining IoT communication, reducing system and network architecture complexity, and decreasing the number of potential failure points in an IoT application. "[9] Conversely, there are many reasons why having too much computing at the edge can be inefficient and overkill. In this modality, edge computing provides similar benefits as fog computing but with an even greater capability to reduce localized latencies. Edge computing potentially allows for decentralization of computing, even greater data privacy, and allows for mesh networking off of the cloud. We go into more detail on edge computing in our piece called, “Computing from the Edge.”  Whether or not the benefits of this architecture outweigh its potential cons will depend on the specific requirements of the system and applications in question. Hybrid Cloud-Fog-Edge Architecture As hinted to earlier, fog and edge architectures can be hybridized with cloud-centric IoT architectures if deemed to be a good fit for a project’s requirements and business objectives. The below diagram portrays one combination which uses a nested configuration. Example of hybridizing Iot Architectures Mist Computing Architecture Mist! Really?! Without being too judgmental about the naming trend going on here, let’s just touch on this fairly young IoT topology. Mist is an optional layer and a subclass of fog computing. Inspired by the proliferation of IoT and introduction of IoT social applications (e.g. crowd sensing) the Mist Computing Architecture attempts to optimize for scalable, cost-efficient platforms, distributed data analytics, allocation and provisioning of limited resources, and reduced response times.[10] A Mist Layer sits on the verge between the edge domain and the fog domain, and it supports the sharing of real-time situational awareness of the environment across nodes within the same local network via mesh connectivity. Mist also supports lightweight computing residing on the edge network fabric itself. Through decentralization of computing power, mist can also help reduce the load on fog node gateways, offer a low cost processing solution, enable localized, autonomous decision making and AI, and provide real-time responses and fault tolerance. [11] According to a 2017 paper by M.K. Yogi et al: There are notable differences between edge computing a{n}d mist computing. In edge computing, functionality is fixed, data processing occurs at the edge of the network, application configuration is fixed, whereas in mist computing, there are functionalities, timings which are dynamic and adjustable, there are high level application specific rules, new applications can e assembled from existing devices at runtime. For example, when we install a movement sensor the that movement it provides a service of movement detection, so this service can be used by any device which is then connected to that network. It can be used by a light sensor to turn the light on when there is movement or it can be used by an alarm system to provide an alarm if there should not e anyone in that area at that time. Performing all these operations using a 8-bit microcontroller and communication channel with provision for a packet of 100 bytes is much more difficult. [12] SSRG International Journal of Computer Science and Engineering (SSRG-IJCSE) – volume 4 Issue 7 – July 2017 , page 19-20 Mist’s dynamic device-to-device routing technology lays on top of other complimentary IoT architectures. Furthermore, in mist any node should be able to connect to any gateway, thus eliminating a potential set of dependencies. For example, in a large-scale network, gateway failures can force the addition of a new gateway. Nodes near that gateway should have the ability to dynamically connect  and establish a new route between themselves and the alternate gateway. In this way mist supports IoT system maintainability and scalability. There’s more food for thought in this still expanding IoT universe. Currently, the company Thinnect is a leader in this exciting field. Some others IoT architectures if we only had time! SDN-Based Architecture Quality of Service (QoS) Based Architecture Service Oriented Architecture Mobility First Architecture CloudThings Architecture IoT-A Architecture S-IoT (Social IoT) Architecture And end without an end You can see that there are many models and options when it comes to IoT architectures. There clearly is no one convention to follow, but we hope that you are now able to better identify the areas for serious consideration as you plan your IoT projects. In our next post on the topic, we’ll go deeper into the IoT stack and IoT protocols, and discuss how they can compliment certain architectures and applications. Until then we look forward to your comments! ### SMTP For Your Embedded Devices By Jonathan Cox In this article, we give a brief overview of what SMTP is, the settings necessary to get it working, and how it can be used in the embedded world. We will also look at how NetBurner’s products can make this often prickly process a breeze by going through a specific example that will send an email through Gmail’s servers. In the world of electronics, protocols are the rules that let disparate devices, servers, and services talk to each other. When it comes to transmitting email messages one protocol stands above the rest, and that is the Simple Mail Transfer Protocol (SMTP). Unlike mail retrieval protocols, such as IMAP and POP3, SMTP is used exclusively for transmitting (sending) email to mail servers. Within embedded systems, SMTP is used widely for delivering system notifications, alerts, and reporting. For example, perhaps you have a few sensors that you want to keep an eye on? With SMTP you can set up your device to send out an email whenever a critical value is reached. Maybe you want to compile usage reports for your device in the field? You can program your device to collect your data and send it out at regular intervals. The list of possible SMTP applications goes on. SMTP started in the early 1980’s and was purely ASCII text-based. Over the years, it has been extended by other protocols to handle different data formats (see Multipurpose Internet Mail Extensions (MIME)) and data security (see the SMTP Service Extension of Secure SMTP over Transport Layer Security), among others. It has also continued to evolve itself over the years. RFC 5321 has, as of this writing, the most up to date revision of the protocol. The Basics Email transmission occurs over a TCP connection between an SMTP client and an SMTP server. Historically, three ports have typically been used for SMTP connections: 25, 465, and 587. Today, the recommended port is 587 with the use of Transport Layer Security (TLS). Port 465 was never officially designated as an SMTP port, though it was commonly used back in the day, and is still used presently in some legacy systems. Secure connections can happen in one of two ways. The first is for the negotiation to take place right off the bat. The second is for a server to accept an unsecured connection and then upgrade it to a secure one with the use of the STARTTLS command. This is also known as “Opportunistic TLS”. Both methods are supported by the NetBurner system libraries. Completely unsecure connections are fairly rare these days, as they should be. These would take place over port 25, though connections over this port can also be upgraded using STARTTLS, as explained above. We haven’t seen any services that offer completely unsecure connections lately, and even if we did we wouldn’t recommend using them. More to the point, if you’re hoping to use any of the major email providers, such as Gmail, Office 365, or Yahoo, you will need to use the secure ports. The big fish in the email pond also typically require some additional settings in order to play nicely with external devices and applications trying to use their services. As such, there are a few details that we need to cover in order to get your SMTP ship sailing as smoothly as possible. For Gmail, Yahoo, and Office 365, you will need to enable the “less secure apps access”. This option is found in the settings area for both services in your user account. The links to do this can be found below (you will need to be logged into your account to actually see them): For Gmail: https://myaccount.google.com/lesssecureapps For Office 365: https://docs.microsoft.com/en-us/office365/admin/misc/integrated-apps For Yahoo: https://login.yahoo.com/account/security If you happen to have two-factor authentication enabled for your account, you will also need to generate an application password for these services. This will be the password that you use to authenticate your account when trying to send email from the NetBurner device. The steps for creating this password can be found here: For Gmail: https://myaccount.google.com/apppasswords For Yahoo: https://help.yahoo.com/kb/SLN15241.html For Office 365: https://support.office.com/en-us/article/create-an-app-password-for-office-365-3e7c860f-bda4-4441-a618-b53953ee1183 NetBurner Examples You can find several SMTP example applications in your NetBurner 3.0 install directory at /examples/SSL/. The examples we currently provide are as follows: SslSendMail - Demonstrates how to send mail over with the SMTP protocol.SslSendMailAttach - Shows how to send an email with a plain text attachment using the SMTP protocol.SslSendMailAttachEffs - Shows how to send an email with an attachment from the device’s file system using the SMTP protocol. We will cover the interface and usage of the SslSendMail example, and then point out the areas within the application’s code that do the interesting bits. After building and loading the application to your device (please see our documentation on the steps needed to do this), open a browser and navigate to your device’s web page by typing its IP address into the URL bar, as shown in the image below: SMTP setup for NetBurner devices You will notice that for this demonstration, we are going to use Gmail, with the following settings (other services will require their own special blend): Mail Username: My personal Gmail email address Mail Password: Because I have two-factor authentication turned on, I used the application password generated by Google, which can be done here. SMTP Server: smtp.gmail.com Use STARTTLS: Checked (connection will start as unsecure, and then get upgraded) SMTP Port: 587 From Email Address: Also my personal Gmail email address To Address: My work email address After these fields were filled out, along with the Subject and Message Body, I hit the “Send Mail” button, and got the warm fuzzy feeling of seeing a success message (I also verified that the email was sent by looking in my inbox): NetBurner's SMTP configuration test If we crack this example open and see what’s inside, we’ll find two source files, main.cpp and webfuncs.cpp. The first file is pretty typical for all NetBurner examples and simply shows how to get your device up and running. We cover this extensively elsewhere, so we’re going to skip over it this time around. The second file contains the more interesting code that handles the form POST and sends the mail request. The code that we are the most interested in is found at the end of the file: /*** @brief A POST callback for the send mail post request. This callback is called for each field* of a post form.** @param sock HTTP socket.* @param event The kind of post event that is currently being handled with this callback.* @param pName The name of the post element that is currently being handled.* @param pValue The value of the post element that is currently being handled.*/void HandleSendMailPost(int sock, PostEvents event, const char *pName, const char *pValue){    // If the event is the start of the post, clear out all of our variables    if (event == eStartingPost)    {        var_user[0] = 0;        var_pass[0] = 0;        var_svrip[0] = 0;        var_svrport[0] = 0;        var_from[0] = 0;        var_to[0] = 0;        var_sub[0] = 0;        var_body[0] = 0;        STARTTLS[0] = 0;        iprintf("Initiating extraction of post data\r\n");    }    // If we have received a name/value pair, figure out which one it is and store it    // accordingly.    else if (event == eVariable)    {        if (strcmp(pName, "user") == 0) { snprintf(var_user, 80, pValue); }        else if (strcmp(pName, "pass") == 0) { snprintf(var_pass, 80, pValue); }        else if (strcmp(pName, "svrip") == 0) { snprintf(var_svrip, 80, pValue); }        else if (strcmp(pName, "svrport") == 0) { snprintf(var_svrport, 6, pValue); }        else if (strcmp(pName, "STARTTLS") == 0) { snprintf(STARTTLS, 5, pValue); }        else if (strcmp(pName, "from") == 0) { snprintf(var_from, 80, pValue); }        else if (strcmp(pName, "to") == 0) { snprintf(var_to, 80, pValue); }        else if (strcmp(pName, "sub") == 0) { snprintf(var_sub, 80, pValue); }        else if (strcmp(pName, "body") == 0) { snprintf(var_body, 80, pValue); }        else { iprintf("Unknown field of \"%s\" with value \"%s\"", pName, pValue); }    }    // If we are at the end of the post, we should have everything we need to send the email,    // so let’s give it a shot.    else if (event == eEndOfPost)    {        iprintf("End of post data extraction\r\n");        IPADDR SMTP_server;        DNSResult = GetHostByName(var_svrip, &SMTP_server, IPADDR::NullIP(), TICKS_PER_SECOND * 20);        if (DNSResult == DNS_OK)        {            int svrPort = strtol(var_svrport, NULL, 0);            if (svrPort == 0) { svrPort = -1; }            iprintf("Connecting to server: %s (%I) on port %ld\n", var_svrip, SMTP_server, svrPort);            if (var_pass[0] == '\0')            {                iprintf("Error: no password was entered\r\n");            }            else            {                // This actually sends the message                SendmailResult = SSL_SendMail(SMTP_server,                    var_user,                    var_pass,                    var_from,                    var_to,                    var_sub,                    var_body,                    (BOOL)STARTTLS[0],                    svrPort,                    var_svrip);            }        }        else        {            iprintf("Error - DNS failed for %s\r\n", var_svrip);        }        OSTimeDly(TICKS_PER_SECOND * 2);        RedirectResponse(sock, "sent.html");    }}HtmlPostVariableListCallback gHandleSendMailPost("sendmail.html", HandleSendMailPost); Above, we have two significant things going on. At the very bottom on the last line, we declare a global variable, gHandleSendMailPost, that will handle POST requests coming from sendmail.html, and associate it with our callback function, HandleSendMailPost(). Above this, we define the callback function itself. This function will get called several times for each POST request: At the start of each POST, with an event value of eStartingPostFor each name/value pair of the POST, with an event value of eVariableAt the end of the POST, with an event value of eEndOfPost You can see how each event is handled within the function. When the eEndOfPost event occurs, we put all of our POST field values together and initiate the email request with a call to SSL_SendMail(). A return value of 0 indicates a failure, while a return of 1 indicates success. With that, we’re all set! The most confusing aspect of getting SMTP going, from our experience, is making sure that we have the correct settings for the specific email service we want to use. Once that is squared away, using SMTP itself with your NetBurner device is pretty straightforward. We’d love to hear how you are using SMTP with your own projects. Feel free to let us know in the comments below! ### NetBurner 3.0: The Dawning of a New Age in IoT For over 20 years, NetBurner has been committed to helping our customers quickly and easily turn ideas into products and connected solutions. We’ve made it possible to “set it and forget it” with super-reliable and stable hardware, custom Real Time Operating System (RTOS), reliable firmware, life-saving libraries and associated tools that provide peace of mind to developers all over the world. We also believe in keeping our products and services at the cutting edge and working to maintain our standing as industry leaders. That’s why we are excited to announce the release of NetBurner 3.0 in tandem with the release of our brand new NetBurner ARM® Cortex®-Powered System on Module (Part Number: MODM7AE70 - with versions and dev kits available). This next generation delivers our best and brings it to the next level with new features and dual support of our NPX/Freescale® platforms, in addition to our newest Microchip/Atmel ARM® platforms! Available for download mid December 2018, and preloaded in all of our MODM7AE70 modules. In this article we’ll describe what’s new in NetBurner 3.0. You see that we’ve added exciting new capabilities to enable the use of the latest hardware platforms, security protocols, IoT capabilities, extensibility, interface, and fleet configuration and maintenance tools. We know… you are really excited about the new features, but perhaps also bit nervous? While we think you’ll ultimately agree that these updates are extremely helpful, for some even game changing, existing customers will need to make a few adjustments if you are porting code to 3.0. Don’t worry, we’ll be providing supportive 3.0 documentation and tutorials to help you every step of the way. If you are a NetBurner 2.8 stalwart don’t worry… the 2.8 documentation is still available and we will continue to support it indefinitely. But if you are looking for the latest, greatest features, 3.0 is the way to go. The following is a brief summary of those 3.0 updates, features and advisories. SUPPORT FOR THE NEW ARM-POWERED NETBURNER HARDWARE NetBurner 3.0 is really special in that it continues to supports our flagship Freescale 5441X line of microcontroller System on Modules (SOMs) (specifically the MOD5441X, NANO54415, and SB800EX) but ALSO enables our newly released NetBurner ARM® Cortex®-Powered System on Module. As you may know, ARM has really made waves in the embedded community, and NetBurner 3.0, along with our newly released line of Microchip Technologies/Atmel ARM M7-based products, is our vanguard into this exciting embedded platform. REMOTE CONFIGURATION AND UPDATE MANAGEMENT We want you to have an easy and convenient experience at all stages in your product life-cycle. Many of our users have large-scale deployments of hundreds, even thousands, of NetBurner modules. We came to realize that easily and remotely updating and configuring these IoT device “fleets” was essential. NetBurner 3.0 allows field engineers and IT managers to drastically reduce the effort and overhead of firmware updates and product configuration, and to improve the consistency of those operations. We also provide more freedom and predictability by making all of this browser-based and thus OS independent. Here’s more details on our new configuration and update system: Updates, discovery and configuration are now platform independent and do not require any OS specific utilities. AutoUpdate is now deprecated. The IPSetup windows utility can still be used to locate a device, but not configure it. Devices can be discovered by going to “discover.netburner.com”. Applications can be updated from any web browser, the nbupdate utility, nbeclipse, WGET, and through the device’s serial port. Configuration can now be done as a JSON object. These objects can be saved and uploaded through a web interface, making configuration in a production environment much easier and faster. Developers can easily create their own application specific configuration objects. Examples: nburn\examples\Configuration RTOS (Real Time Operating System) The low-level code of the RTOS has been modified to support a wide array of features listed elsewhere in this article. These changes have resulted in a significant performance improvement over our previous, already highly optimized RTOS. Overall, we improved the capacity for multi-tasking and made utilizing RTOS functionality more extensible and user friendly. Here are a couple of additional details you might find useful: Increased the number of tasks from 64 to an open-ended amount, which is user defined. Using more than 256 tasks may impact performance. RTOS functions are now managed as C++ objects. Examples: nburn\examples\RTOS TCP Our networking stack has been completely reworked and users will find its performance in NetBurner 3.0 a substantial upgrade over previous versions. Additionally, for some of our users with highly complex networked applications, having a greater number of TCP sockets is critical. NetBurner 3.0 answers this call and provides a significant boost in capability. Increased the maximum number of sockets from 32 to 256. INTERFACES Access to interfaces now requires looking at an Interface Object, rather than global variables such as ETHERNETIP. This was done to facilitate the future addition of new interfaces such as Bluetooth, cellular data, etc. Examples: nburn\examples\ShowInterfaces nburn\examples\IPv6 SSL/TLS We’ve got your back. That’s why 3.0 provides the security and reliability of the latest SSL/TLS protocols and ciphers. SSL/TLS libraries come included with NetBurner 3.0. No additional licenses will be required. The latest version of our SSL libraries will now support the creation of certificate requests. Note: NetBurner 2.8.7 also has the SSL/TLS updates (but still requires an SSL license) Updated to the latest protocols and ciphers The process for generating compiled-in certificates is slightly different. Please see the SSL documentation for more information. Examples: nburn\examples\SSL SYSTEM INITIALIZATION Here’s an important change to keep in mind for those already using our products. When you update your existing NetBurner applications, or when starting new ones, we’ve now added a single function call, init(), that will take care of initializing your stack, getting DHCP (if enabled), and running network debug (if enabled). NBECLIPSE IDE We admit, it was time for a freshening up of the NBEclipse IDE. We think you’ll really like the updated UI and capabilities offered. Updated to Eclipse IDE Oxygen. Take a look here for the noteworthy updates. You can now generate makefiles that can be used on command line builds. GCC We’ve updated to 8.1 GNU compiler. Onward! We hope that you are as excited about this upcoming release as we are! For those in a position to port their existing NetBurner Version 2 projects and products over to 3.0, please be reassured that it will be well worth it and that we are here to support you in that effort. We welcome your comments and questions here on the blog, or in our user forum so that others can benefit. Also, feel free to contact our friendly support directly. ### ARM yourself with the next Generation NetBurner The day has finally come to announce the release of our most advanced and asked for product… the NetBurner ARM® Cortex®-Powered System on Module. The all new NetBurner MODM7AE70 is designed for use as a high-performance single-board computer or to add Ethernet connectivity to a new or existing design. It can be designed into a product or used for a variety of automation and web applications in IoT, IIoT (Industrial IoT), Edge or Fog Computing, and device networking. Embedded transcendence combined with a culture of perfectionism can lead to just a “few” delays and do we apologize to those who have been waiting. Like slow-cooked food or a properly cured concrete foundation, we know the time spent will be well worth it! IoT Dev Kit Featured in this Article View Product Page Or, learn more about NetBurner IoT. “The two most powerful warriors are patience and time.” -- Leo Tolstoy We also wouldn’t dream of embarking on this journey without making sure that all of the support and tools you need to make your projects a complete success were engineered, tailored and tested. NetBurner 3.0 provides all the development tools, system libraries, and custom built, highly optimized RTOS you’ll need to hit the ground running with our newest and existing products. MODM7AE70 Product Summary: NetBurner’s new ARM Embedded System on Module is our answer to your call for an ARM® Cortex®-Powered processor for your next masterpiece. The all-new NetBurner ARM® Cortex®-Powered System on Module is here to accelerate and de-risk your product development path for serious IoT and embedded applications! The NetBurner ARM® Cortex®-Powered System on Module follows in the footsteps of our other easy to use, fast and highly reliable Ethernet System on Modules. In contrast, it features a powerful Microchip®/Atmel® SAM E70 32-bit ARM Cortex-M7 embedded processor SoC (System On a Chip) rather than our standard NPX/Freescale® ColdFire® processors. It also offers a galaxy of brilliant features like a preloaded super-optimized Real-Time Operating System (RTOS), high-speed serial peripherals, data converters and I/O, 10/100 MBPS Ethernet, real-time clocks and timers, and even DSP and image processing. Our modules quickly and reliably network-enable your products and components. The module can function as a modern and robust web server that supports communications via HTTPS via SSL/TLS, a host of industrial automation protocols, serial (RS-232/485), I2C, SPI and more. NetBurner’s new ARM® Cortex®-Powered System on Module provides a spectrum of support for IoT applications in sensor fusion, industrial automation, robotics, audio processing, image and video processing, and automotive. Download the PDF datasheet with the pinout and other gory details here or read on for our key benefit and specification summary. If you have any questions or would like us to feature a specific peripheral in a future post please comment below. You can also contact our sales team with pre-sale related inquiries at sales@netburner.com. Add it to your shopping cart from the product page. Key Benefits: High performance with ARM Cortex-M7 32-bit 300-MHz processor Floating point unit (FPU) and DSP for high-precision computing and accelerated data processing Low-power / High Energy Efficiency Memory Protection Unit (MPU) and system peripherals Reliability of ARM and Microchip/Atmel CMOS image sensor interface Industrial Operating Temperature Range (-40C to +85C) Development Kits available Optional Wi-Fi available Module Hardware Features: NetBurner Part Number – MODM7AE70 Physical Characteristics Dimensions (inches): 2.60” x 2.00” Weight: 1 oz. RoHS Compliant Environmental Operating Temperature: -40° to 85° C Power DC Input Voltage: 3.3V @ 100mA typical, 250mA max Low power modes are able to reduce power draw, with consumption dependant on enabled peripherals. Embedded Processor Microchip®/Atmel® SAM E70 32-bit ARM® Cortex®-M7 processor at 300 MHz clock speed Single and double precision hardware Floating Point Unit (FPU) DSP Instructions, Thumb®-2 Instruction Set Memory 2 MB embedded Flash 8 MB SDRAM 384 Kb embedded multi-port SRAM 1 KB embedded low-power backup RAM Network Interface 10/100 BaseT with RJ-45 connector (100 Version) 10-pin header (200 Version) Device Connectivity and Data I/O: 10/100 Ethernet with IEEE1588 PTP frames and 802.3az Energy-efficiency support. I2C and SPI Up to 3 UARTs with up to 5 additional 2-wire UARTs (see datasheet for available Serial configurations) 2 Analog Front-End Controllers (AFEC) USB 2.0 Device and Mini Host High-speed (USBHS) at 480 Mbps 16-bit external bus interface 51 digital I/Os Up to 3 two-wire interfaces (TWIHS)(I2C-compatible) SD/MMC flash card ready Image Sensor Interface (ISI) Additional Peripherals and Detail Ethernet AVB support with IEEE802.1AS Time-stamping and IEEE802.1Qav credit-based traffic-shaping hardware support. Two master Controller Area Networks (MCAN) with Flexible Data Rate (CAN-FD) with SRAM-based mailboxes, time- and event-triggered transmission 12-bit ITU-R BT. 601/656 High-speed Multimedia Card Interface (HSMCI) (SDIO/SD Card/e.MMC)̶ Serial Synchronous Controller (SSC) with I2S and TDM support Four Three-Channel 16-bit Timer/Counters (TC) with Capture, Waveform, Compare and PWM modes, constant on time. 2-bit Gray Up/Down Counter for stepper motor. Twelve 16-bit Timer/Counters, can be chained to create 32 bit and 48 bit timer/counters. Functions include capture, compare, interrupt generation, frequency measurement, event counting, interval measurement, quadrature decoder, pulse generation, waveform generation, synchronization with PWM peripheral, delay timing pulse width modulation, 2-bit Gray Up/Down Counter for stepper motor control. Each channel has three external clock inputs, five internal clock inputs and two multi-purpose input/output signals. 12-bit 1Msps-per-channel Digital-to-Analog Controller (DAC) with differential and oversampling modes. One Analog Comparator (ACC) with flexible input selection, selectable input hysteresis. Real-Time Clock and Watchdog Timer Three Two-Wire Interfaces (TWIHS) (I2C-compatible). Two-wire bus, made up of one clock line and one data line with speeds of up to 400 kbps in Fast mode, and up to 3.4 Mbps in High-speed slave mode. Easily interface to EEPROM and I²C-compatible devices, such as a Real-Time Clock (RTC), Dot Matrix/Graphic LCD Controller Dedicated SPI. Note that USARTs 0 and 1 can also be used as SPI interfaces Multiple master capability is supported. Twelve 16-bit PWMs with complementary outputs, Dead Time Generator, fault inputs motor control and an external trigger Two Analog Front-End Controllers (AFEC). The AFEC is based on an Analog Front-End cell (AFE) integrating a 12-bit Analog-to-Digital Converter (ADC), a Programmable Gain Amplifier (PGA), a Digital-to-Analog Converter (DAC) and two 6-to-1 analog multiplexers, making possible the conversions of 12 analog lines or two simultaneous conversions of 6 analog lines. The AFEC supports a 12-bit resolution mode which can be extended up to a 16-bit resolution by digital averaging. Up to 2Msps conversion rate. Automatic correction of gain and offset errors. Serial Synchronous Controller (SSC) with I2S and TDM support Parallel Capture Interface consisting of clock, data and enable signals to continuously read data from peripherals such as a CMOS digital image sensor, a high-speed parallel ADC, a DSP synchronous port in synchronous mode, etc. Up to 51 GPIO lines with external interrupt capability (edge- or level-sensitivity), debouncing, glitch filtering and on-die Series Resistor Termination Temperature Sensor MODM7AE70 Part Numbers MODM7AE70 Ethernet Core Module (100 Version, with RJ-45) Part Number: MODM7AE70-100IR MODM7AE70 Ethernet Core Module (200 Version, with 10-pin header) Part Number: MODM7AE70-200IR MODM7AE70 Development Kit Part Number: NNDK-MODM7AE70-KIT Kit includes all the hardware and software you need to customize the included platform hardware. See product page for package contents. Note: Includes the MOD-DEV-100 development board. SNMP V1 (Module License Version) Part Number: NBLIC-SNMP Available as an option if you are using a development kit. More on the ARM® SAM E70 CPU used in this NetBurner product can be found in its data sheet: http://www.microchip.com/mymicrochip/filehandler.aspx?ddocname=en589960 http://www.atmel.com/products/microcontrollers/arm/sam-e.aspx https://developer.arm.com/products/processors/cortex-m/cortex-m7 Press Release: A Call to Arms: The All-New NetBurner ARM®-Powered IoT System-on-Module BUY AN ARM® DEV KIT NOW! SAM E70/S70/V70/V71 DataSheet 0.00 KB 15107 downloads Download Photo credit top: pixabay.com ### Metamorphic Website Makeover! To complement our new ARM based system-on-module and an extensive update to our development tools, system libraries, and custom built, highly optimized RTOS, we thought we’d also announce our brand new website! You’re invited to check out and shop at our newly designed online experience at https://www.netburner.com. Not only did we feel that it was time for a bit of a visual “nip and tuck”, but we decided that we needed to provide a significantly improved user experience. The new site combines our learn blog, informational pages, product catalog, and best of all, our online store! This is just the beginning of our plans to offer a more enjoyable, easier and cohesive online experience. Our web redesign has been a long time in the making and was driven by a desire for aesthetic and functional improvements. We firmly believe that our products need to be easy to use, efficient, and fun -- so why not apply this credo to our website and online store? After conducting a detailed team and customer survey, we were able to better identify and design around areas that needed some super charging. Let us know what you think in the comments below! One of the biggest user gripes was having the blog and product catalog on our main site, www.netburner.com, and then discretely hosting our store for product purchasing at a different site. The amalgamation of these two distinct sites into a unified multipurpose site is, perhaps, our most significant change with this new release. Let’s run through a few of the most poignant updates: The union of our main NetBurner site and the online store. Find the information and products you need faster. Cleaner layouts and a fresh new look. User Accounts: Your user account and history has been securely migrated to the new website. You can access, view and update your account information and history from https://www.netburner.com/my-account/. For your first login your will need reset your password from the reset form. Contact us if you would like help accessing, updating or deleting your records or personal data. Online Purchases and Payments: We still take all major credit cards and securely process them. You can also use your PayPal account directly if you prefer. Shopping: Use the “Products” navigation item at the top of all of our pages to shop any of our product lines. Select your product and checkout straight from the product page or from your cart. We now provide a full featured shopping cart and checkout process from our main website. Your shopping cart will be saved until your browser cookie is cleared. No personal information is stored with these cookies (3 total). Learn Blog: All the same goodness as the old blog but with a more fun and responsive layout. Improved commenting, discussion notifications and comment voting. Feature Request Form: Go ahead and share your NetBurner hopes, dreams, wishes and even frustrations. Fill in our form whenever you like so that we know what else you need from our products and services. Contact Form: Have a random or general question? Don’t feel like using email, our Support Portal or calling? Our contact form is just right for you! Documentation: NEW NetBurner 3.0 Docs: With our release of the new NetBurner ARM-powered platform and the 3.0 software and firmware, we have a whole new set of documentation using the Doxygen framework. NetBurner 2.8 Docs: Don’t worry if you are a devoted NetBurner 2.8 user. Our documentation and downloads are still available, but with a new, shinier interface. We’d love to hear your thoughts on our new website. Take a tour around and come back to this post and share your comments. If you are more of a private type, feel free to use our contact form or even use our new feature request form. Go ahead and tell us if there are any other features you’d like to see and we’ll consider it for our backlog! We would also like to take a moment and offer a shoutout to thank our friends at Start Anywhere Media for their work in bringing our personality and culture to life through their creative and professional efforts in what has to be one of the smoothest transitions in modern history. Thank you!! ### Data on the Edge: Distributed IoT using the Edge Computing Paradigm Photo Credit: Reddit User, Beanful (https://www.reddit.com/user/Beanful) The Internet of Things has opened the proverbial floodgates (of data) and is redefining the high-water mark daily. Massive quantities of information are being transferred between distributed IoT “edge” sensors and device networks with centralized computing and cloud computing resources. In this regime, low latency data processing, adequate data privacy, and robust connectivity are often deficient, inconsistent and pose significant challenges. With the advent and increasing demand for modern IoT edge applications we have found a new way to “max-out” our capacity and budgets to handle the data deluge. In this article we’ll define exactly what Edge Computing is, and share some insights on this niche. We will also examine how it is being utilized to improve performance and reduce the costs, limitations, and dependencies associated with centralized processing and cloud computing for IoT. In a nutshell, Edge Computing entails the shifting of data analysis and processing to the IoT edge device microprocessor itself. This is in contrast to the common practice of transferring raw, unprocessed data streams from the IoT device to a cloud or centralized processor for analysis. With edge computing, we essentially perform the dirty work of filtering, analyzing and cleaning-up data to key indicators and actionable intelligence or stimuli in situ. According to Network World Magazine, “This on-device approach helps reduce latency for critical applications, lower dependence on the cloud, and better manage the massive deluge of data being generated by the IoT.” Furthermore, by processing and analyzing IoT edge data prior to transmission to the cloud or network, we can drastically reduce the demand for bandwidth and the problems associated with data integrity over intermittent wireless connections. This may be a non-issue for small installations of infrequently polled sensors, but for large deployments of distributed IoT or edge devices with a higher sample rate, these bandwidth and connectivity constraints can be a considerable and costly predicament. This issue becomes even more pronounced as emerging wireless services such as Narrowband IoT (NB-IoT) come online, which have greater economies of scale but with a significant trade-off in the form of reduced bandwidth and link rates when compared to Cat 1 4G/LTE and the upcoming 5G options. Now imagine a network topology combining short-range wireless IoT edge nodes to an occasional long-range, wide-area, cellular-enabled Edge Processor capable of AI, signal processing, data storage, communications and data encryption. Such a processor can be utilized to manage the local area network of edge devices as well as to coordinate with cloud or centralized computing resources. I bet you can now really see the power and efficiency of Edge Computing! Such architectures have the potential to improve latencies, bandwidth usage, energy consumption and data security and with modest cost. The possibilities are changing the landscape drastically. Edge computing is the concept behind derivative standards such as Fog Computing, which serve as alternatives to our more centralized or cloud computing IoT infrastructures. At NetBurner, we design our embedded Systems-on-Modules with capabilities to perform complex processing and analysis on-device. Our IoT optimized Real-time Operating System (RTOS), reliable TCP/IP stack and rugged embedded processing (ARM Cortex and NXP Coldfire options) are truly a formidable and efficient edge computing and networking solution for distributed IOT. Integrated SSL/TLS also allows for secure data transfer from the origin. As always, we are excited to enable our community to develop applications that are on the forefront of this exciting direction in networking and computing. So how do you get involved in edge computing? Begin by assessing what raw data can be processed on site and which data or communications can be kept within the LAN. Design-in as much storage, intelligence and processing capability as feasible on the edge device. Determine what information, value or thresholds trigger a transmittal of actionable or critical data over the internet or network. Then encrypt and output the filtered or analyzed data only as necessary. If you have questions or want to share your experience in using edge computing please comment below! Here’s some of our suggested readings on the Edge Computing topic: Why edge computing is critical for the IoT - NetworkWorld Magazine - Quick reading opinion piece Edge computing: The state of the next IT transformation - ZDnet.com - Loaded with insight, marketing research, and helpful charts and links. A guide to Edge IoT analytics - IBM - Well organized and informative piece with useful diagrams Other references: https://en.wikipedia.org/wiki/Edge_computing https://www.cisco.com/c/en/us/solutions/enterprise-networks/edge-computing.html ### Cellular LTE/4G Connectivity with NetBurner Devices For those who are too young to recall the marvel and sheer monstrosity, not to mention the high cost, of early cell phones and “car phones”, we’ve really come a long way towards making cellular a feasible option for IoT and automation. These days it seems like everyone wants cellular data service to connect their device when away from secured wifi hotspots. With all of the cost competitive cellular data service options offered over increasingly massive LTE/4G wireless networks, accessibility and availability is at all time highs. There are numerous use cases for the use of cellular data services rather than shorter range wifi, Zigbee, Lora, and other wireless technologies for embedded and IOT edge applications. In this article, we’ll show you how to integrate LTE/4G capabilities with NetBurner devices. My oh my have we gone a long way in cellular! The first Motorola car phone from 1964 (bottom). "Smaller" versions from the 1980s (top left). Martin Cooper of Motorola with a mobile phone first tested in 1973. 1. Overview This project will describe a method to add a cellular modem into the NetBurner as a TCP/IP interface component. The NetBurner communications setup discussed in this paper consists of three major components. The DIGI XBEE3 Cellular Smart Modem LTE-CAT 1 AT&T development kit (XBIB-U-DEV development board, XBee smart modem with Telit cellular module, and two cellular antennas. For the complete development kit user guide, go here.) The Netburner SB72EX (however this is just one of many NetBurner devices with this capability The level shifter board that you will build using the MAX3232 3.3V level shifter (find a breakout board version from SparkFun here) The project uses two wall wart transformers, one for the cellular modem board and one for the SB72EX. The Netburner communicates with the cellular modem board using RS-232 at 57600 baud, with no parity, 8 data bits, and 1 stop bit. The XBEE kit comes with at least 90 days free connectivity with AT&T through the cellular interface and antennas. If you are close enough to a cell tower it is not necessary to use the secondary antenna of the two. See the XBEE user’s manual for more information. In this example we are using the DIGI XBEE3 kit along with a Netburner SB72EX serial communications device, although any Netburner board / module will work providing that a second UART port is available with full handshaking connections along with the Debug serial port. The DIGI kit provides a Telit LE866 Series cellular module, 2 antennae and some handy applications that can be used to configure and update the device. The DIGI XBEE3 Cellular Smart Modem LTE-CAT 1 AT&T development kit The XBEE cellular modem has at least two major modes of operation: "Transparent" mode and "Bypass" mode. There are others, like "Micro Python" mode, that are not covered in this paper and are not necessary to us here. Bypass mode is discussed in this article at various points, and its purpose is to allow us to talk directly to the cellular network chip. The Telit cellular module chip supports two interfaces: AT commands and PPP communications. See the manuals listed at the bottom of this document for more information on the Telit chip. The cellular modem can provide the TCP/IP connection to your NetBurner platform by adding some hardware to the development board, placing the modem into bypass mode, and connecting to the cellular modem using PPP (point-to-point protocol). On the next page a drawing of the system shows the location of the level shifter board on the DIGI development board. Before you develop or install the level shifter, you should follow the instructions that come with the DIGI modem development kit. Install the XCTU application and connect to the DIGI modem module through USB as the manufacturer has specified with this kit. Talk with “ELIZA the cyber-psychologist”, send a text message to your phone, and perform any of the other documented experiments in the DIGI user’s manual. It is valuable to work with the cellular modem board using the Digi application XCTU running on Windows initially in order to get used to working with the modem at the high level before adding the level shifter board and using bypass mode to connect with PPP. When you are ready to attach to NetBurner, review section 2 of this article below, change the parameters, and then move to section 3 of the article to build the level shifter. Using a level shifter to convert the modem output to serial. 2. Setting up the cellular modem board for RS-232 operation Use the XBEE default USB cabling and follow the instructions in the XBEE user’s manual to bring up the list of modem parameters on XCTU. It is valuable to remember the following: The Association Indicator tells you a lot about what the modem is doing and what state it is in. If the value is 2A then the modem is in airplane mode, if the value is 2F it is in bypass mode and the micro-python and command API firmware features are not alive in the modem. When you are in the XCTU application you want Airplane Mode to be (0), and the Association Indicator to be something other than 2F, in other words, not in bypass mode. Connect the XCTU application to the XBEE modem/dev board. Before you connect the XBEE modem board/dev board/level shifter board to your Netburner, you will want to change the following parameters in the XBEE modem using XCTU application: Change IP protocol to TCP and press WRITE icon Set DL Destination Address to 52.45.121.77  and write Set Destination port to 2328 and write Set BD baud rate to 57600 and write Ensure parity is No Parity Ensure Stop Bits is One Stop Bit Ensure text delimiter is ‘D’ Ensure API Enable is Transparent Mode [0] Ensure Sleep mode is Normal [0] Ensure CC is still 2B, CT is 64, GT is 3E8 still Python should be Disabled [0] Now the modem is setup and ready to operate with the NetBurner library and the sample application. Go to the next section and build up the serial port level shifter hardware. 3. Level Shifter Hardware The Netburner communicates with the cellular modem through its serial port. The XBEE module supports 3.3 volts on DIN and DOUT lines, so we use a MAX3232 3.3V level shifter chip for use with RS-232 signals on one side and 3.3V signals on the XBEE side. The XBEE board uses USB to communicate with your computer when you get the kit initially, but to move forward and use the cellular modem for the Netburner TCP/IP interface, you need to use the RS-232 interface. Hook up details. The XBEE board numbers the 0.1 x 0.1 inch 20 pin dual row connector in the same manner as the modem module- which is not compatible with the usual numbering scheme of these dual row connectors. On the schematic above I have both numbering schemes shown together, with the numbers on the outside edge representing the modem module’s number scheme. The modem uses handshaking signals as shown on this schematic. I have specified a DB9-S DCE connector that is ready to plug into any DTE 9-pin connector, such as the SB72EX or a PC serial connector. I decided to hand-wire my level shifter board and a dual row 20 pin female connector on the bottom of the board using a part such as the Mouser M20-7831046 (note that despite the reference image, it is a 2 row, 20 pin connector). There are several ways to accomplish this, however. If needed, you can find a MAX3232 level shifter breakout board from SparkFun here. You would then connect the wires from the DB9-S DCE connector to the corresponding signals on pins 1-4 of the breakout board. Similarly, pins 5-10 on the breakout board would then be connected to the corresponding signals on the XBIB-U-DEV development board. ***Important Note: Four resistors are removed from the DIGI development board to take the USB UART out of the circuit. They are R32, 33, 41, 45. Once the resistors are removed and the level shifter is installed, it is still easy to communicate with the cell modem using the XCTU app by specifying that it uses the COM port address of your laptop or PC instead of the USB port you were using initially. You can use XCTU to test your level shifter board. 4. Working with the supplied Netburner firmware The Netburner application is controlled through the Debug COM port. This is the menu as supplied to the debug port at 115200 baud, with no parity, 8 data bits, and 1 stop bit. Menu item: 0: Sends <1 second>+++<1 second> to modem to place it in command mode 1: Asks the modem to report the list shown on the following page 2: Returns the modem into data mode from command mode 3: Enter a phone number for SMS 4: Specify SMS protocol mode 5: Open a terminal (cancel with cntl-c) to talk to the modem 6: Specify the IP address that you wish to connect to 7: Specify the port that you wish to connect to 8: Put modem into TCP/IP mode 9: Send “accept changes” to modem A: Send “write to NV memory” B: Enter Bypass mode C: Cancel Bypass Mode D: Set airplane mode E: Set airplane mode off F: Get associated status value J: Send Telit chip “echo off” (I do this in the terminal key 5) K: Have Telit chip list visible operators. (I do this in the terminal key 5) L: Enable IP Context M: Disable IP Context N: Show IP address of context O: Connect PPP (Telit chip command) P: Enter PPP direct mode (Netburner command) Q: Close PPP session (abort PPP) S: Say something to ELIZA server on the internet V: Shut down remote handler X: Not used In this screen the modem is reporting some interesting data: BD is 6 (baud rate of 57600), MN (operator) is AT&T, AM (airplane mode) is OFF, IP (protocol) is 2 or SMS text message, MY reports my IP address - we can see that we are connected to the internet, P# (destination phone number) is set to some fake phone number - you would set it to your cell phone number, DL (destination IP address) is set to the ELIZA/ECHO server at 52.43.121.77, DE (destination port) is set to ELIZA server port 2328, TD (text delimiter) is set to D (0x0d), AI (assoc. indicator) is set to 0- so we are not in either bypass or airplane mode (0x2f, 0x2A) From this menu system we can talk to the cellular modem at a high level (through the modem’s internal microprocessor that is between you and the Telit cellular chip High-Level Operations: (Modem is not in bypass mode to use these) To send an SMS message: Hit key 3 enter a cell phone number then ENTER Hit key 4 to set SMS protocol mode Hit key 9 to accept the changes Hit 5 to enter the terminal mode Write something and press ENTER Your cell phone will show the characters you typed in a text message Press cntl-C to exit the terminal To talk with ELIZA Hit key 6 and enter 52.43.121.77 press ENTER Hit key 7 and enter “0x2328” then press ENTER Hit key 8 to enter TCP/IP protocol mode Hit Key 9 to accept the changes Hit key 5 to enter terminal mode Type in something and hit ENTER After a bit, ELIZA will say something counselor-like to you Press cntl-C to exit the terminal ***Note: Bypass Mode with the XBEE cellular modem: When you place the modem into the Bypass Mode, you are removing the on-modem microprocessor from translating between you and the actual cellular processing chip, the Telit LE866 chip. The process of place the modem into bypass mode is straightforward, but you must check that the modem has made the transition to bypass mode by querying the AI (key F on the menu) until the result is 2F. Once you are in bypass mode the modem will stay there, even through power cycles. Now the next step will be to bypass the modem’s microprocessor and talk directly with the Telit cellular chip on the XBEE device. This chip can perform certain tasks for you like reporting all of the operators it finds in the RF stream, and connecting via PPP to the Netburner library. To enter bypass mode, press menu item ‘B’ and give the modem 4 or 5 minutes to reboot and the cellular signal to re-acquire. The RED LED which was blinking in non-bypass mode stays on solid in bypass mode. Query the associative status value by hitting key ‘F’ until you get the 2F response, as mentioned previously. Now that you have an AI of 2F and the modem is in bypass mode, hit key 5 to enter the terminal. Now enter: ATE0 This command turns off the echo- you should see: Aattee00 OK Now press cntl-C to exit the terminal Press ‘M’ to disable the IP context. You should see: Sending:AT#SGACT=1,0 OK Press ‘L’ to enable the IP context, you should see: Sending:AT#SGACT=1,1 #SGACT: nnn.nnn.nnn.nnn (a valid IP address) Press ‘O’ to tell Telit chip to connect via PPP When you see the word: CONNECT Press the ‘P’ key to connect PPP. You should see: Connecting… Connection Established You are now providing the Netburner TCP/IP stack with an internet connection through the cellular network. Go ahead and unplug the Ethernet cable from your Netburner while you are testing to prove your connectivity is through the cellular modem. Below is a screenshot of the procedure to connect with PPP, invoke ELIZA on the internet, and shut down the remote handler with key ‘V’ and scuttle the PPP session with key ‘Q’. Eliza data captured over cellular as seen in the serial terminal. 5. Building a solid cellular modem-based application: To use a cellular modem in a stand-alone Netburner application you would need to: Generate the custom hardware that accepts the XBEE modem and provides the level shifter hardware. Setup XBEE modem using XCTU application to all of the above specified settings PLUS placing the modem in Bypass mode. Save all to non-volatile memory in the modem so it reverts to this each time after power cycle. Build a state machine that will walk the modem and the PPP library through the connection states after power-up. The code would need to check the Assoc. status, place the Telit chip in non-echo mode. Get a Telit IP context in place with the AT command AT#SGACT=1,1, send a CONNECT command to Telit with the AT command ATD*99***1# Invoke PPP and check for a successful connection to be established. Build your Ethernet-based code with web pages, sockets, UDP handling, etc. The example code that is loaded onto the SB72EX for the cellular modem project is brand-spanking new, and as such it hasn’t yet made it into any of our current releases. However, we would be happy to send it to you if you want to start working on your own personal cellular modem application. Send us a note at sales@netburner.com, and we will send it your way. Look for more examples and information to surface as we continue to incorporate this exciting technology into our products. 6. List of Reference Manuals for The Modem and the Telit chip: XBEE3 LTE CAT1 User Manual XBEE Dev Kit Schematic Rev 7 Telit IP Easy User Guide r23 Telit LE866 ME866 Series AT Commands Reference Guide Telit Modules Software User Guide 2G3G4G r21 Wiki Point-to-Point Protocol ### Visualizing the MPU9250 IMU with WebGL Last month, we demonstrated how to interface our NetBurner modules with the MPU9250; a 9-axis IMU that features a gyroscope, an accelerometer, and a magnetometer on a $15 breakout board offered by SparkFun. This handy little gadget allows you to track movement data, and was used by our intern, David, to adjust the heading of an autonomous vehicle he was working on. Prior to that, we featured an article where we expounded on how to use WebGL, websockets, and the EFFS-FAT file system provided by NetBurner to visualize sensor data using a 3D model and some randomly generated data. This month, we are going to combine these wildly wonderful tutorials, and dig into how you can visualize the rotational data from the IMU using WebGL with a websocket connection. Since the gory details for each of these projects can be found at the links above, we are going to focus on the glue that binds these two together. Loving you the way we do, we went ahead and combined the necessary pieces of these projects into its own glorious repo, which you can find here. This code can be imported into an NBEclipse project, or you can compile it from the command line using make, and then load the resulting .s19 file (WebGlWithImu_APP.s19 if you didn’t get handsy with the makefile) using our AutoUpdate tool (located in \pcbin\). As mentioned above, there isn’t a tremendous amount of original code in this new project. By and large, it’s just the two individual projects smooshed together like a bunch of sardines in a can of code. The one thing that did need to be addressed was sending actual data to our visualization, instead of the fake data we were generating before. Because we now have IMUSampleLoop() do the heavy lifting in terms of reading data values from the IMU and turning it into data we can actually use in the form of a quaternion, we removed  UpdatePosAndRot() from main.cpp. The change from Euler angles to quaternions is actually very beneficial for our application as it avoids gimbal lock, which is a common problem where you end up losing a degree of freedom during your rotations. If you look at the new and improved SendWebSocketData(), you will notice that when adding the rotation values to the JSON blob, we are now using the global variable q, which holds our quaternion data. Void SendWebSocketData() { // Prevent the values from changing in the middle of trying to // assign them later by storing them in a local variable. USER_ENTER_CRITICAL(); float q0 = q[0]; float q1 = q[1]; float q2 = q[2]; float q3 = q[3]; USER_EXIT_CRITICAL(); jsonOutObj.AddObjectStart("RotUpdate"); jsonOutObj.Add("w", q0); jsonOutObj.Add("x", -q2); jsonOutObj.Add("y", -q3); jsonOutObj.Add("z", q1); jsonOutObj.EndObject(); } If you look at this code closely, you’ll notice that we aren’t assigning the quaternion values from the IMU loop to their respective axis in our function call above. This is because the IMU defines the z axis as the vertical axis in the coordinate space, while in computer graphics, this is usually reserved for the y axis. We need to make a similar adjustment for the x and z axes. Finally, we need to negate the values of the x and y axes to correctly correspond with their representation in our visualization. You will also notice that we are setting the position to 0. For the autonomous car project, we only needed to determine the rotational data for the IMU, not the positional change. We now need to change SdCardFiles/index.html so that it will accept the quaternion values in place of the Euler angles we were using previously. This happens in three places. The first is when we declare the rotation values right underneath the 

NetBurner I2C Demo With Sparkfun TMP102



NetBurner I2C Demo With Sparkfun TMP102




Temperature:

Web Page Display The resultant web page is shown below: ### How to communicate with Sparkfun's free cloud data service Last week Sparkfun Electronics announced a new, open source cloud server application called Phant. Phant acts as a logging tool which allows any device to read and write data to and from the service. Additionally, Sparkfun also created data.sparkfun.com, which is a free service running phant. This service allows anyone to save up to 50MB worth of data to the cloud, allowing 100 pushes over 15 minutes, which averages out to a push every 10 seconds or so. To send data to and from the service, you just need to register a new stream. Registering gives you a private key and public key for accessing the data. A private key is required to update that stream, while a public key grants access to any other stream on the service. Communication with Phant All communication with Phant is carried out over HTTP. The simplest way to log data is through your web browser. Type in a URL like the following in your favorite browser: http://data.sparkfun.com/input/?private_key=&= This URL would update the specified variable with the specified value. Typing a URL in the browser is great to confirm that the service is working, but what do you do when you want to send data without a user interface? To answer this, let’s briefly go back to the basics. When you type a URL in to the browser, the following is performed over TCP. Open a TCP socket to a server on port 80 Send an HTML GET request Read any response that may come back from the server Close the socket All of these commands can be boiled down to a few lines of code. The following code has been testing with the NetBurner "IoT cloud kit", with our MOD54415 module. This code however could run on any NetBurner network module. Open a TCP socket to a server on port 80 int httpSocket = connect(serverIP, 0, 80, 5 * TICKS_PER_SECOND); if (httpSocket < 0) { iprintf("Unable to connect to: "); ShowIP(serverIP); iprintf("rn"); } This line of code opens up a TCP socket to the IP address specified at port 80. A timeout is included so in case the connection fails. After verifying that the socket was opened, continue. Send an HTML GET request char buffer[255]; sprintf(buffer, "GET /input/%s?private_key=%s&%s=%lu HTTP1.0rnrn", public_key, private_key, "uptime", Secs); int n = write(httpSocket, buffer, strlen(buffer)); When you type a URL in to your browser, you are usually sending a GET request. You are getting information from the server at the specified URI. In this case, everything the server needs to know with regards to logging is send in the GET request. The full URI indicates that I want to input data, includes a private key and public key, specifies are variable name to be updated, and finally specifies the new value. Read any response that may come back from the server char rxbuffer[1500]; do { bytes = ReadWithTimeout(httpSocket, rxbuffer, 1500, 5 * TICKS_PER_SECOND); rxbuffer[bytes] = 0; iprintf("%s",rxbuffer); } while (bytes > 0); In this case, the only message sent back from Sparkfun is a confirmation of the submission. Close the socket close(httpSocket); Finally, close the socket that is currently open to Sparkfun. This will resolve the communication. If they have not already, the Sparkfun service will reciprocate by closing the socket as well. With that, the application is now sending data to the cloud. To view the data on the service, visit data.sparkfun.com and view the stream. Alternatively, the application can retrieve the stream in a similar manner as sending data to the service. The difference is the URI that the applications needs to send to the service. To retrieve data, try the following code: char buffer[255]; sprintf(buffer, "GET /output/%s.json?page=1 HTTP/1.0rnrn",public_key); int n = write(httpSocket, buffer, strlen(buffer)); This code would retrieve the first 50Kb of data from the stream associated with the provided public key. Sending data out to the cloud offers an easy way to store your data. To learn more about Phant, see the Phant Github Repository. ### The easy way to add 802.11 Wifi to your product Adding wifi is very easy to do (given the right tools). It's also full of potential pitfalls you need to be aware of. This article will be broken into two sections: how do you add wifi and what do you need to do it, and what to be aware of when designing your system or after something has gone wrong.How do you do it?In our example, we'll show you how to get started with our system and add WiFi to a NetBurner based product (hey, we get to be self serving in these articles, right?). There's really only three steps involved with this:Plug the wifi adapter board into the J2 header of the main dev board.Add these two lines of code to your application:In the headers:#include In your main function:// Use this for SPI InitWifi_SPI (); // Use this for serial InitWifi_Serial ();Boot the device, and configure the SSID and password with IPSetup. Fill in the network's SSID in the SSID field and passphrase in the WEP/WPA field. Once you have filled these fields, hit the 'Set->' button to save them to the device.Congratulations, that's it. You 're now connected to a wifi network with your embedded device.Unless something went wrong... Maybe, we should talk about why wireless isn't always just fun and games. How can something so simple ever go wrong? Well, first let's talk about how wifi works.Let's get PHYsicalAt the base level, wifi is a collection of technologies that implement a MAC (Media Access Control) and a PHYsical layer. These are the layers that actually send the bits through the air, and are somewhat finicky about not being interfered with by mister giant radio transmitter, or that electric motor next to you, or that microwave, or anything else blasting in the same radio band. Depending on the version of 802.11 you are using, the physical encoding of the bits as they fly through the air varies, with newer versions being more resistant to interference, but it's like standing in front of a speaker at a rock concert, no matter how loud you yell, your friend still won't hear you over the music.Additionally, the devices have to be close enough to communicate as well. The further away from a radiating signal source, the weaker the signal gets (the mathematically inclined of you will remember this as the Inverse Square Law). There's a limit to both what is practical, as well as legal, for the transmit power of a wireless radio. This, combined with the receiver's ability to pick up the signal sets the maximum distance the device can communicate, in open air, in a straight line. Any sort of obstacle in the way (metal cases, cabinets, machinery, shrubbery, rain, etc.) will also absorb some or all of the radiated energy pointed at it, decreasing the overall transmit power.Halt! Who goes there?!Well, now that we've determined that the signal is indeed getting to where it needs to be, and isn't being interfered with, what's happening if we can't connect to our wireless network? Well... on top of the MAC and PHY layers of wifi is the supplicant. If the network you are connecting to has any sort of security scheme (WEP, WPA, WPA2, anything other than "open"), there's some sort of encryption and authentication occurring, controlling access to the network.To be allowed to connect, you have to have the correct combination of network name (SSID) and password (key). You also have to use the right form of security to handle the transactions and the right cipher to encrypt the data. If any of these things don't match between the two devices, between the client and access point, then the client will not be allowed to connect to the network.We're connected! Anything else I should know?Yes.... And they are?Ohh... you want to know what they are? How curious of you. Well, for starters, wireless in general is slower than wired networking. In NetBurner's case, our modules have a 10/100 megabit full duplex ethernet connection which can transfer data in and out of the system. If you were to try and build a bridge from the ethernet to wifi, the wifi has about 10Mbit of throughput, which would start backing up the network data and depleting the network buffers, leading to system resource starvation.There's also the possibility for routing confusion, sending the data out the wrong interface (ethernet vs. wifi). This is a general class of problem not simply limited to wifi, but becomes apparent when adding a second interface (as wifi is to our users). Usually this won't happen or matter, as if both interfaces are on the same network, it's fine. If there on different networks, they probably have different subnets, and so routing is independent. But in the case where you can get shot in the foot, IP stacks often have a way to specify what interface certain communications get routed out (whether by table or by call). In ours it's done using the "via" calls (connectvia, RouteOutVia, udp.SendVia, etc.). ### How to get your sensor data online with xively cloud services In this video watch a live coding session on how to connect to a TSL2561 light meter via I2C, dump that data to serial, and then send the reading to the cloud. Also, don't forget to check out the new Internet of Things (IoT) Cloud Kit! ### Sign up to receive the NetBurner Newsletter Subscribe to our mailing list for Product Releases and Updates, Tech News, Tutorials * indicates required Email Address * First Name Last Name   Send me... Newsletters Product Change Notices and Software Updates   Interests DIY Maker Projects Professional Engineering Applications Product Releases Industry Tech News   Email Format html text View previous campaigns. ### NetBurner Developer Training 2014 This developer event features highly technical, in-depth sessions focused on building web and network applications. NOTE: REGISTRATION PERIOD HAS ENDED Sessions Cloud Computing with NetBurner Devices What is "Cloud Computing"? Various approaches to cloud computing Xively - Public Cloud for the Internet of Things Demo using Xively service Explanation and coding of the NetBurner side Explanation and coding of the user/ web developer / app programmer side Hands-on project New NetBurner Wifi Module 802.11 b/g/n Hardware description and interface Software description and interface Hands-on project NetBurner Network Development Kit 3.0 Cross-Platform C++ RTOS RTOS will be cross platform Architecture of next generation hardware Additional topics Vote for new topics on the NetBurner Forums TBD - Additional topics based on interest Two-day seminar includes: Development kit (includes wifi board and MOD54415) Training materials Lunch (both days) When and where: All sessions will be held at The Mandalay Bay Hotel and Casino on April 3rd-4th. April 3rd from 12PM to 5PM April 4th from 9AM to 5PM Reservations: Reservations can be telephoned directly to Hotel Reservation Department at 877-632-9001 or 702-632-9000 or by FAX at 702-632-7206. In order to receive group rate, callers must identify their affiliation with NetBurner Training 2014. The cut-off date to reserve rooms at the special group rate is Tuesday, March 4, 2014. ### Build an interactive kiosk Interactive retail kiosks are everywhere. We all recognize the pervasiveness of these devices - whether you're rushing through a self checkout machine at the hardware store or testing speakers at a department store. In a previous articles, we covered how to create interactive buttons on embedded LCD touch screens and how to play audio on embedded devices. Lets put this all together to build an interactive audio kiosk! Information Kiosk Design I saw a kiosk similar to the one we're going to build in the electronics section of a department store. There was an expensive brand name speaker with some buttons directly below it. There were only three buttons: "Previous", "Play/Pause", and Next". Lets get rid of the physical buttons and instead use an LCD touch screen. We're keeping it simple for this article, but each button could generate a request to turn on an industrial machine, display current temperature, or possibly display weather current conditions. Hardware and Software We used VersaModule’s VM5 4.3" TFT Color LCD Module. Make sure you get the drivers and example files from VersaModule. It should come in a compressed file called 'Nano_VM5_vX.X.zip'. All of the source code we created is in the kioskfiles.zip at the end of this article. You'll need a NetBurner NANO54415 Ethernet Core Module. If you don't have a development kit make sure to get one. An amplifier and speaker will be needed to hear sound. Please see the playing audio article for additional information. Start out by loading the drivers and example Boot Demo that you received from Versa Module into a new NetBurner Eclipse project. Next copy all of the files in the KioskFiles.zip folder over said project. This should be all you need to get the demo working. Note that the background image has been converted into a 'c file'. We used the main article image as a background by converting the image file using the GLCD tool that is available for download from the VersaModule website. As long as you're there, check out their VMGraphix video tutorials. I used them to help write the code for this article. We'll dive into the important parts of the code in the next section. Source code The first thing we'd like to do is refresh the screen with a background image and set three areas that will detect button presses. DisplayImage(0,0,KioskDemo_320x240); CreateTouchBox(10,120,110,230,REWIND_BUTTON,0); CreateTouchBox(110,120,210,230,PLAY_PAUSE_BUTTON,0); CreateTouchBox(210,120,310,230,FORWARD_BUTTON,0); Next we'll locate the first file on the SD card and update the LCD screen with the filename. fileNum = FindFile( &finder, fileNum ); sprintf(lcdstring, "%s", finder.filename); LCD_String(lcdstring,Calibri17x23,100,95,2,0x0000,0xFFFF); Finally, we'll create a large loop that detects if the screen has been touched. We'll check which button was pressed, and play the correct file. When the file is done playing we'll update the screen once again. while(1) { if(TOUCH_OPTION == TOUCHED) { if( GetPenLocation() == true) { // Clear screen with original background image DisplayImage(0,0,KioskDemo_320x240); // Check which button was pressed if(CheckContainer(sx8654_touch.pen_x,sx8654_touch.pen_y, REWIND_BUTTON) == true) { // The rewind button was pressed, lets add a // green circle to it so that the user gets // visual feedback letting them know the button // is being pressed. LCD_Circle(52,182,40,0x0f0f); WaitForTouchRelease(30); // Once the button is released, // clear the screen and load the previous file. DisplayImage(0,0,KioskDemo_320x240); DoPrevious(finder, player, fileNum, loadFile); } else if(CheckContainer(sx8654_touch.pen_x,sx8654_touch.pen_y, PLAY_PAUSE_BUTTON) == true) { // The Play/Pause button was pressed LCD_Circle(160,182,40,0x0f0f); WaitForTouchRelease(30); DisplayImage(0,0,KioskDemo_320x240); DoPlay(finder, player, fileNum, loadFile, pollState); } else if(CheckContainer(sx8654_touch.pen_x,sx8654_touch.pen_y, FORWARD_BUTTON) == true) { // The forward button was pressed LCD_Circle(266,182,40,0x0f0f); WaitForTouchRelease(30); DisplayImage(0,0,KioskDemo_320x240); DoNext(finder, player, fileNum, loadFile); } } } // If audio file has finished playing update screen text if (pollState && (player.GetState() == WavPlayer::STATE_FINISHED)) { sprintf(lcdstring,"Done: %s", finder.filename); LCD_String(lcdstring,Calibri17x23,100,95,2,0x0000,0xFFFF); pollState = false; } } } You can download the files we created for this project in the "download attatchemnts" section below. If you like this article please click on the Facebook 'like' button above or send out a Tweet. ### New Release: NetBurner NNDK 2.6.4 NetBurner NNDK 2.6.4 beta is here! If you have a current software and support account, this is a free upgrade for you. Please note that NNDK 2.6.3, has been elevated to stable status. If your support account subscription has expired, you may need to renew your support agreement. Read the full release notes after the break. RELEASE 2.6.4 (November 2013) New in this version Examples Added PIT timer for the SBL2E Adding wav_player examples to NANO54415 and MOD5441X platforms PK70 PK70–232CR, –485CR, and -MMSCR devices now supported by secure factory app Serial Added SerialSendComplete(), which will check to see if all serial characters are sent System Added task time logging feature. To enable it, the system library needs to be compiled with the macro UCOS_TIME defined in constants.h Adding support in uc/os for handling OS_TCBs changing in size without recompiling debug Ethernet drivers. Allows for using stack checking with the debug driver Corrections in this version MCF5441X Fixed so that chip select mask values for DSPIInit did matches their description and behavior of the qspi driver Fixed multi channel i2c driver to not rely on DEFAULT_I2C_MODULE definition by replacing calls such as i2cinit with multichannel_i2cinit calls internally. MOD5441X Fixed pin_irq class error on IRQ6 Modified pinio class to reflect hardware revision changes (J1–9/10, J2–17/18) SBL2e Documentation updated to more clearly state the 768 stack size value represents 32-bit values, not bytes. Fixed TCP Buffered connect error not clearing error variable SNMP Fixed error reporting issues Fixed getNext with null OID Fixed too big error so errors are properly reported and system does not hang System WriteHtmlVariable() fixed. Was writing last byte of MAC address incorrectly Fixed problem with incomplete transfers of static web resources Fixed DHCP discover on fast boot with lossy networks TCP Fixed scheduling issues with TCP which caused 1 tick busy waits in lower priority tasks WIFI Fixed error in AddWifiInterfaceWithName() which could case flash corruption with erratic power ### Access your data from the cloud with NetBurner and Xively NOTE Nov, 2018: Xively is now part of Google Cloud IOT. This post may still be of interest but may have obsolete information or links that no longer work. See Google Cloud IoT for more information. NetBurner will be releasing a new tutorial and integration with google Clout IOT late 2018 into early 2019. With NetBurner hardware, you already have the power to connect, collect and quantify your data. Now with Xively support, add the power of Xively’s cloud service and API to access your data anywhere and from any device. With Xively, connect to your data with C, Objective-C, Javascript, Python, Ruby and more! With this tutorial, learn how to send and receive data between NetBurner hardware and the Xively platform. This is part one of a multi-part series of articles in exploration of the Xively platform and the libxively C API. Additional articles will be referenced here when they are posted. What is Xively Xively is cloud service solution that allows hardware and software to connect via a cloud access point. Need to create a phone application that speaks to your NANO54415? Use the Objective-C library to design the IOS application, then use the C library to write your hardware application. Adding a web access point? A Javascript library is available to accelerate the process. Learn more about what is Xively and how it works at the Xively experience site. Xively Prerequisites To continue, create a Xively developers account at the Xively Developer signup page. With a developer account, you are granted free access to the Xively API, but are limited to a small number of devices. Read the Xively Develop and Deploy Tutorial and create a new device. Click on the new device to see the device feed page. Examine the API Keys section, and make note of the feed id (9 digit number) and the long Device key that grants read, update, create and delete rights. These will be needed when writing an application that utilizes the Xively API. While on this page, click on “Add Channel” and call it uptime. This new channel will be used below when the example application broadcasts it’s uptime to Xively. Install the NB-libxively library Before an application can use the libxively API, you need to install and configure the NetBurner libxively library. This process involved downloading the library, building it with make, and then including it in any NBEclipse application. To install the NB-libxively library, first ensure that you have Git installed on your system. This guide will focus on the command line installation, but if you prefer to work within a windows utility, install GitHub for Windows and follow the Github guides on cloning a repository. Open a cmd window by clicking Start->Run… and then typing cmd cd c:nburn to enter the NetBurner folder (default is c:nburn) setenv.bat to set the local environment to build NetBurner products mkdir library to create a new library folder cd library to enter the new library directory git clone https://github.com/NetBurner/nb-libxively cd nb-libxively/src/libxively make to build the library Once the build is complete, find nb-libxively.a in the c:nburnbin directory. This is the library file that will need to be included in the application. Include the nb-libxively library in any application Adding the nb-libxively library to an application is the same process as adding any extra library to an application. First, the nb-libxively.a file is included in the dependency list. Second, the nb-libxively folder is included so that it is possible to add #include statements. Finally, rebuilding the application allows the new dependencies to be found. Include nb-libxively.a Right click on the project and select Properties. Under C/C++ Build, select Settings. Change the Configuration to “All configurations”. Under GNU C/C++ Linker, select “Libraries” and add the nb-libxively.a library. Add the nb-libxively folder Right click on the project and select Properties. Under C/C++ Build, select Settings. Change the Configuration to “All configurations”. Under GNU C and GNU C++ Compiler, select “Directories” and add “c:nburnlibrarynb-libxivelysrclibxively” folder. If the library was installed in an alternate location, select the alternate location instead. Rebuild the project Click Project->Clean… and select the application to be rebuilt. Apply to initiate the rebuild process. The application is now ready to use the nb-libxively library. Sending data with Xively Sending data to the cloud is accomplished with a few API calls. To accelerate this process, an example is included with the nb-libxively library that demonstrates this. Let’s examine this example’s API calls in more detail. Comments have been removed in this article, but can be viewed by examining the copy of this file in the nb-libxively/examples directory. // #define API_KEY "longstring" // #define FEED_ID 123456789 Near the top of main.cpp, there are two define statements that need to be filled in the API key and Feed ID that were created Xively prerequisites section of this article. Uncomment these lines and change the values to the API Key and Feed ID provided by Xively. extern "C" void UserMain(void * pd) { init(); iprintf("Application startedn"); OSSimpleTaskCreatewName(updateXively,MAIN_PRIO-1,"Xively"); while (1) { OSTimeDly(TICKS_PER_SECOND); } } The UserMain section of this example should be fairly self-explanatory. The device is initialized, and a new task is started that will periodically send data to Xively. Beyond that, UserMain is just going to sit idle. void updateXively(void *) { xi_context_t* xi_context = xi_create_context(XI_TCP, API_KEY, FEED_ID); while (1) { if (xi_context != 0) { xi_datapoint_t uptime; xi_set_value_i32(&uptime, Secs); uptime.timestamp.timestamp = 0; xi_datastream_update(xi_context, FEED_ID, "uptime", &uptime); } OSTimeDly(30*TICKS_PER_SECOND); } xi_delete_context(xi_context); } xi_create_context() is called, which is required before sending data to the cloud server. This is where the API_KEY and FEED_ID are used. A context must be created for every feed that is accessed, either reading or writing. This uses a malloc call, so for ever context that is created, one should be deleted when it is done being used. The xi_delete_context() function will free the space that was malloc’d. This call is placed at the bottom of the task. In this example, it will never be called, as the thread never ends. This example updates a datapoint, so a datapoint is created, called uptime. The libxively library contains several helper functions, xi_set_value_i32() is one of these functions. It is used to set the unsigned value Secs to the datapoints. Secs is a NetBurner global that is the uptime of the unit, in seconds. Finally, xi_datastream_update() is called, which sends the datapoint to the server. Once this application is running, if the device page is viewed at Xively’s developer page will begin updating the uptime channel every 30 seconds. Okay, that was probably a lot to take in. Take some time and examine the xively.h header file located in the nb-libxively/src folder. This header documents that main public API C functions that are called to access Xively directly through your application. Stay tuned for part two of the Xively + NetBurner API discussion. In the next installment, we will discuss receiving values from Xively. Then, everything will be put together to create a real world luminosity sensor that can be controlled via the web. ### Playing audio on an embedded device Sometimes you have an embedded project that needs to play audio. Maybe you just need to make a beep, in which case a simple piezo speaker and a square wave will work, but other times you'll need to play actual audio, like voice or music. In that case, you need to use a Digital to Analog Converter (DAC) to generate the stored waveforms. The other question is how to store these waveforms; the easiest way is to use the WAV file format. This tutorial will discuss the basics of WAV files and how to play these with the provided code, using the on-board DACs of the MCF5441X processor found on Netburner's MOD5441X and NANO54415 modules. Playing audio on an embedded device What's a WAV? Playing a WAV Hardware Considerations Source Code What's a WAV? A WAV file (pronounced 'wāv'), also referred to as a WAVE file, is an audio format which stores the waveform as raw values in an uncompressed form. While there are many possible encodings and internal formats, there is a standard "canonical" format. This is the format our application will be expecting; it's also the format that practically every WAV file follows. Playing a WAV To play a WAV file using the provided example, you'll need to create and configure a WavPlayer. This class provides a simple interface with very little to configure. A quick configuration looks like this: #include "wavPlayer.h" WavPlayer::WavPlayer testPlayer; WavPlayer::wavError ret; ret = testPlayer.SetChannelDAC( 1, 0 ); // Play channel 1 on DAC 0 ret = testPlayer.SetChannelDAC( 0, 1 ); // Play channel 0 on DAC 1 ret = testPlayer.SetTimer( 3 ); // Use DMA timer 3 as the clock source Now that we've got the WavPlayer configured for the hardware, we can load the WAV file to be played. For that, we can either load it from a preloaded buffer (for example, if had been compiled into the application) or from an offboard SD card using the FlashFileSystem: // To open a preloaded buffer, use this testPlayer.OpenBuffer( preload_buffer ); // To open a file on an SD card, use this ret = testPlayer.OpenFile( WAV_filename, buffer_to_load_into, BUFFER_SIZE ); if ( ret == WavPlayer::ERROR_FILE_SIZE ) { iprintf("Wav file too big. Increase BUFFER_SIZE or use smaller file.rn"); break; } Once we've opened the file with the player, we just tell it to play: testPlayer.Play(); If we want to wait until the file finishes playing, we can pass a semaphore and then pend on the semaphore: testPlayer.Play( &playbackSem ); OSSemPend( &playbackSem, 0 ); Or we could poll the player's state: testPlayer.Play(); while (testPlayer.GetState() != WavPlayer::STATE_FINISHED); Putting that all together a simple case would look like the following: #include "wavPlayer.h" WavPlayer::WavPlayer testPlayer; WavPlayer::wavError ret; ret = testPlayer.SetChannelDAC( 1, 0 ); // Play channel 1 on DAC 0 ret = testPlayer.SetChannelDAC( 0, 1 ); // Play channel 0 on DAC 1 ret = testPlayer.SetTimer( 3 ); // Use DMA timer 3 as the clock source testPlayer.OpenBuffer( preload_buffer );// Open a preloaded buffer testPlayer.Play( &playbackSem ); // Play the loaded WAV file OSSemPend( &playbackSem, 0 ); // Wait until the file has finished playing Hardware Considerations To actually hear the audio being played, you'll need to connect the DAC outputs to an amplifier and speaker. You'll also want to connect the analog ground of the device to the ground of the amplifier, therefore you'll want to either use the same power supply or a battery powered amplifier. If using a battery powered speaker and hearing a 50/60 Hz buzz (mains hum), you may also with to put a high value capacitor in series with the DAC output and the amplifier inputs to filter it out. Source Code The project, with full source code, for the application described is one of over a hundred that come with the  NetBurner development kits. ### Modifying Network Configuration Settings at Run Time Most applications at boot will get a DHCP or static IP address and not dynamically change between them. Once network configuration settings have been assigned, typically they remain until the device is reset. But sometimes the network configuration settings need to be configured and modified at run time. This article describes several ways to manipulate the network configuration at run time. Flash vs RAM Network Settings Before modifying the network configuration, it is important to know the difference between reading and writing the configuration in RAM or in Flash. The NetBurner device contains runtime and stored (Flash) system configuration parameters. Interface Blocks are used at runtime, and Configuration Records are stored in Flash. At boot time, data from the Configuration Records are copied to Interface Blocks. There are 3 Configuration Records as defined in netinterfaces.h: #define CONFIG_IF_ID_ETHERNET (0) #define CONFIG_IF_ID_WIFI (1) #define CONFIG_IF_ID_ETHERNET2 (2) The order of these configuration records is fixed, regardless of the Interface Block number. For example, if you have only a WiFi interface, you still use Configuration Record 1. Interface Blocks are numbered 1, 2, 3. There is no correlation between this numbering. Interface Block 3 could reference Configuration Record 1, depending on the order of interface registration calls by your application. Modifying Run Time Network Configurations When run time network configurations are modified, changes are stored in RAM. This is useful if you only need to temporarily change the network configuration settings. When the device loses power or is restarted, the settings stored in flash will be loaded. Here is some example code that modifies the run time network configuration. void ChangeRuntimeIPSettings(int InterfaceNumber, IPADDR IpAddr, IPADDR IpMask, IPADDR IpGate, IPADDR IpDNS) { iprintf("rnChanging IP runtime settings for interface %d:rn", InterfaceNumber); // Display current values InterfaceBlock *ib = GetInterFaceBlock(InterfaceNumber); iprintf("Old Settings:rn"); printNetworkConfig(ib->netIP,ib->netIpMask,ib->netIpGate,ib->netDNS); iprintf(" Interface Name: %srn", ib->InterfaceName); // Change to new values ib->netIP = IpAddr; ib->netIpMask = IpMask; ib->netIpGate = IpGate; ib->netDNS = IpDNS; // Display new values. At this point, you can communicate with the // device using the new ip address and mask. iprintf("New Settings:rn"); printNetworkConfig(ib->netIP,ib->netIpMask,ib->netIpGate,ib->netDNS); iprintf(" Interface Name: %srn", ib->InterfaceName); } This function is called with new network configuration settings. Initially, the function creates a pointer to the runtime configuration InterfaceBlock. Once this pointer is valid, changing the runtime network settings is as easy as modifying the InterfaceBlock structure. In this example, we are only interested in netIP, netIpMask, netIpGate, and netDNS. Additional settings are available, and studying the InterfaceBlock declaration in /nburn/include/netinterface.h will provide additional insight. Modifying Flash Network Configurations When configuration records are modified, changes are stored in Flash. When changes are made in flash, they will be applied to the device on next boot. After a reset, changes to the network configuration are applied and saved through power loss. If you want the device to immediately update its network configuration, you should either simultaneously modify the run time settings, or trigger a software reset after flash settings are updated. Here is example code that modifies the Flash network configuration. void ChangeFlashIPSettings(int RecordNumber, IPADDR IpAddr, IPADDR IpMask, IPADDR IpGate, IPADDR IpDNS) { iprintf("rnChanging Flash settings using RawGetConfig() for Record %d:rn", RecordNumber); // Get pointer to Configuration Record ConfigRecord *cr = RawGetConfig(RecordNumber); // Display current Flash values iprintf("Old Settings:rn"); printNetworkConfig(cr->ip_Addr,cr->ip_Mask,cr->ip_GateWay,cr->ip_DNS_server); // create new config record and copy data ConfigRecord NewRec; memcpy( &NewRec, cr, sizeof( NewRec ) ); // Change parameters NewRec.ip_Addr = IpAddr; NewRec.ip_Mask = IpMask; NewRec.ip_GateWay = IpGate; NewRec.ip_DNS_server = IpDNS; // Write new values to Flash system configuration sector UpdateConfigRecord_Num(&NewRec, RecordNumber); // Display current Flash values iprintf("New Settings:rn"); printNetworkConfig(cr->ip_Addr,cr->ip_Mask,cr->ip_GateWay,cr->ip_DNS_server); // You do not need to reboot if you change both the runtime // and flash values. ForceReboot(); } This function is called with new network configuration settings. The function creates a pointer to a ConfigRecord object. New values are set at ip_Addr, ip_Mask, ip_GateWay, and ip_DNS_server. Unlike the run time configuration process, you must call UpdateConfigRecord_Num() to save the new ConfigRecord in to Flash. Finally, call ForceReboot() to cause the device to reset and load the new flash settings. Alternatively, you could call ChangeRuntimeIPSettings(), which was mentioned in the previous section, to update the run time settings without rebooting the device. Full Source for Example Application To see the above code in action, a full source example is provided at GitHub. To build and load this example, clone the source code located at https://github.com/NetBurner/ChangeIP ### Rollback source code to a previously saved version (Eclipse IDE) This is not a replacement for a CVS, but it is certainly useful in many cases. If you would like to revert your source code back to the way it looked an hours ago, the NB Eclipse IDE makes it easy. The key is to use Eclipses' built-in local history manager. Configuration This feature is already built-in to Eclipse IDE, but if you'd like to tweak it go to Window → Preferences → General → Workspace → Local History. Video Click on the following picture to view a step-by-step video that shows how to use the NB Eclipse local history manager to replace the current source code file with any previously saved version. ### Build an Ethernet enabled Arduino with LCD display for under $50 If your prototype needs to communicate over Ethernet, adding a serial to Ethernet server is a quick low-cost solution. There’s a good chance that your Arduino has a spare TX UART pin, so why not put it to good use? Bill of Material (BOM) This project is dead simple, but first you have to find the following parts. Which NetBurner parts can I use? Any programmable NetBurner part with a serial port will work, but we’ll use the SBL2e (100 version) in this example. We’ll only need one TX pin for this example. NetBurner Part Number:NNDK-MOD54415LC-KIT Pick one of these Serial LCD Panels: There are tons of options out there. The example code will focus on the Sparkfun part. Sparkfun Part Number: LCD-10097 Adafruit Part Number: 782 Build Serial LCD (if necessary) All the instructions you need to build the LCD can be found on the Sparkfun Serial Enabled LCD Kit page. Connect the Serial LCD to NetBurner This project is dead simple, but first you have to find the following: Find an unused serial transmit pin on the NetBurner Module, and a source for 3.3V power and ground. ### Software Release: NNDK 2.6.2 Stable (WinOS), 2.6.3 Beta (WinOS), 2.63 Beta (MacOS) RELEASE 2.6.3 (July 2013) New in this version Examples Added Twitter Bootstrap example, a web css framework for UI features on web pages. Added AJAX real time data graph example Added example on SBL2E serial callbacks Github Several examples open sourced and moved to github.com/netburner HTTP Documented web function. Works like FUNCTIONCALL, but allows support for C++ functions Added robots.txt to disallow search engine crawling of examples by default MCF5441X Added DSPI driver and example Added multi channel i2c driver NANO54415 Added SetDefPinUsage() to set default pin assignments SBL2e Added serial callback functions to SBL2e serial drivers SSL Added 4096 key support Added RSA_RC4_SHA1 cipher System Added FreeBufferList() utility function to free buffer list Added init() and initWithWeb() utility functions. These functions provide standard initialization for apps TCP Added NoBlockConnect() non blocking connect function Tools MTTTY updated with better USB/Serial port support Corrections in this version Ethernet Fixed maximum packet size error Examples Fixed NTP app/example bug which reduced time accuracy Fixed MCF54415 PWM examples for edge aligned PWMs bug to remove dead time MCF5441X Fixed i2c default baud rate IRQ Vector table moved in to SRAM from external DDR Created unified i2cstruct definition, which allows a single type access to all i2c modules Fixed critical processor latency bug which caused 0.5 ms processor hangs SNMP Added ability to handle octet writes with embedded zeros SSL Fixed TCP socket leak on SSL failures System Fixed default timezone parsing so default daylight savings time is 2am, not midnight TCP Increased speed of duplicate ack retransmission on a lossy network Tools Fixed issue where IPSetup did not see multi interfaces that are not exposed to network RELEASE 2.6.2 (April 2013) New in this version Ethernet Added callback for custom Ethernet handlers with RX of Ethernet frames Examples Examples for StandardStack platforms moved to StandardStack directory hierarchy Added SSH Server example Added BufferedAD example to MCF54415 NANO54415 Added driver for internal RTC MOD54415 Multiple CAN drivers support added Corrections in this version MOD54415 Fixed ExternalIRQ example Fixed card detection/write protection on off-board memory card reader NBEclipse Fixed bug in which Rebuild Libraries failed on imported projects Fixed bug in which MOD5213 failed to load an application on to the device Updated version tag Tools IPSetup/Autoupdate run on any socket. This allows multiple instances to run at once IPSetup/Autoupdate bug fix that prevented find from seeing devices with multiple interfaces RELEASE 2.6.1 (February 2013) New in this version Ethernet Added EtherLinkCallBack() callback function to all Ethernet drivers. Does not get called in debug mode Moved DoRX Ethernet RX function out of individual platforms and made a common NetDoRx function in the system directory. Debug drivers do call this function. Customer modified Ethernet drivers should be amended to support this function Examples Added DAC example to MCF54415 Added OnChip RTC example to MCF54415 Added PWM example to MCF54415 Added UDPNotify to standard stack examples Added CB34EX support to SecureEthToSer example Added ExternalIRQ example to MCF54415 Added EFFS-RAM RAM drive example Added PIT timer example to MCF54415 L2e Added XON XOFF flow control Added ability to disable serial update on individual ports. Some serial binary data was triggering update logic on the device MCF5213 Added XON XOFF flow control Added ability to disable serial update on individual ports. Some serial binary data was triggering update logic on the device MCF54415 Added proper support to sim structure for RTC and DMA Added pin_irq class support Added beta DMA SPI driver Added DSPI driver and examples to demonstrate usage LUA Added support for LUA scripting language Added several examples to demonstrate LUA usage System Added getFunctions to pinIO. This allows current pin function to be read Smarttrap now includes additional message which reports spurious interrupts Tools Added no reboot option to autoupdate Added BatchUpdate script in pctools. This script can be used to batch update several NetBurner modules with a single application NBEclipse updated for OSX and Windows NBEclipse now support names in NBLIBRARY files. This file allow NBEclipse to automatically link libraries in all projects. Corrections in this version AutoIP Changed getState member function from private to public. This function returns the current state of the auto IP client Fixed issue where disabling AutoIP in predef.h was causing compilation errors. DHCP DHCP is now more random in initial DHCP request. This helps prevent IP conflicts when multiple devices come online simultaneously EFFS Fixed mutex bug that generated problems when simultaneous SD cards are used on MOD5441X Changed ram_mcf.cpp from a per-Platform file to a per-Project file. This allows for different sized drives. HTTP Fixed extraneous 0xFF sent at the end of some http responses I2C Added mutex guards to i2cmulti and i2cmaster headers. Including both now results in a compile error MCF54415 Fixed missing sim error Fixed support for both can devices NANO544115 Fixed spaceleft() function, which calculates head size Fixed startup flash memory sequence error SBL2e Factory application properly enabled RTS when flow control is disabled System putled() and getdipsw() functions now have proper support for platforms that don’t use these functions Added microsecond delays to HiResTimer Fixed incorrect constant in MOD5270 pinconstant.h WIFI RTL8711 library support was mistakenly removed from 2.6.0. This has be re-added RELEASE 2.6.0 (September 2012) New in this version Examples Added EFFS/WIFI shared QSPI example Added external RTC clock example to MOD54415 Tools CompHTML now allows user to ignore individual files Corrections in this version Installer Fixed case where USB driver not installed automatically MOD54415 Fixed unchangeable timetick bug Added missing can driver NANO54415 Fixed unchangeable timetick bug Added missing can driver SBL2e Fixed TCP duplicate ACK bug Tools Added required dll to MTTTY RELEASE 2.6.0 BETA ADDENDUM (AUGUST 2012 #2) Corrections in this version I2C Fixed build error in mod5213 MOD54415 Fixed usable memory space. Was 16MB, now up to 32MB available NANO54415 Added new pit timer access class System Fixed system library build error RELEASE 2.6.0 BETA ADDENDUM (AUGUST 2012) New in this version Examples Merged multiplatform SSH examples in to one app MOD54415 Added RapidGPIO example (Pulses GPIO pin at max speed) NANO54415 Added PDF documentation SBL2e Added new Software Watchdog example Utility Fixed slow bootup time caused by AutoIP Added documentation for AutoIP functions to NetBurner Runtime Library's PDF Corrections in this version EFFS Fixed race condition which caused unreadable drive error MOD54415 Fixed I2C driver bug NBEclipse Fixed debugging timeout/disconnect/breakpoint errors Fixed missing library error when changing platforms in a project PK70 NTP Application Fixed username/password bug Fixed floating point precision bug TCP Fixed multihome error state when using the connect() function. RELEASE 2.6.0 BETA ADDENDUM (JUNE 2012) New in this version MOD5441X Added I2C driver Added RTC driver NANO54415 Added I2C driver Added interrupt definitions Utility Added AutoIP capability and example on use Corrections in this version Installer Fixed compcode hang bug introduced in previous beta Fixed missing platform documents in new installs MOD5441X Added missing InitNetworkGDBandWait() function NANO54415 Fixed SPI flash section misalignment bug Fixed time ticks setup. Was running to quickly and ignored the settings NBEclipse Fixed missing m68k-elf-gdb target in new run configurations RELEASE 2.6.0 BETA New in this version New products NANO54415 MOD5441X FAT Added the ability to support multiple drives/SD Cards IP Asymmetric route checking added OS X Support added for Mac PC Tools CompHTML now supports arbitrary file types and extensions. To add/modify a file type, modify pcbinMIME_Magic.txt TCP Send - Allows you to send a file from PC to module over TCP Compcode - added binary output option RTOS/UCOS Moved UC/OS initialization to allow global static objects to use rtos functions Utility Added HiResTimer. An easy to use configurable time delay/stopwatch functionality with a DMA timer Corrections in this version DHCP Fixed bug in which DHCP was not handling infinite rebind times Ethernet Improved Ethernet status reporting in dynamically changing speed and duplex configurations FTP/TCP Fixed 32Kb long get request attack which caused NetBurner web server to lock up. Fixed FTP server bug in which directories were not properly displayed by some clients I�C Cleaned up I�C bug that caused a periodical lock up during a re-init call. Fixed timeout bug in MultiI2CRestart() IP Fixed IP Checksum error in some debug releases Fixed broadcast filter for fragments and for broadcast packets not on the local subnet. L2E Fixed bug in which buffered tcp data object had an error in report charavail(). Fixed bug with receiving zero window probe requests SSL Certs Fixed error in conversion code that incorrectly converted some certs SSL Sendmail Fixed bug in which TCP socket was lost left half open on an SMTP email failure UC/OS Fixed race condition during boot up with slow-boot memories (SERIAL). Does not affect existing platforms, might affect custom platforms RELEASE 2.5.3 New in this version New Platform Added MOD53315 Added PINK example EFFS Upgraded EFFS-STD from 1.631 to 1.91.: With version change, you must reformat file systems using older versions. This does not apply to SD cards using the EFFS Added multi-threading support Wildcard searches now follow DOS conventions ( *.* for files, * for everything ) HTTP Added 2 new globals for HTTP server #define MAX_HTTP_PENDING_SOCKETS (5) // Number of sockets allowed to be pending on listening socket, performance will degrade < 3 #define MAX_HTTP_CONNECTED_SOCKETS (3) // Number of sockets allowed to be connected to http server simultaneously I2C Added slave i2c callback functions Mail Added port parameter option to SendMailAuth PC Tools Added java version of autoupdate and ipsetup for upcoming OSX release Added command line interface to ipsetup. Allows for script support System Added dual boot and ABOOT commands Corrections in this version Ethernet Fixed IP source address error in Ping and SendICMPError. These functions could generate corrupt packets when programmed incorrectly. Debug Ethernet driver functions pulled out to allow changing of system constants in the debug Ethernet driver Fixed rare soft reboot lockup on MOD5272 micrel PHY Fixed problem with MOD5272 failing to communicate with PHY after soft reboot Fixed some network code flow to remove confusing conditionals Modified checking of PHY ID to focus on OUI ID so most Micrel, Davicom, National and AMD PHYs should now work without any software modification. HTTP Fixed IE9 issue in which IE9 opens 2 sockets for every web page and handles all communication on the second socket, leaving the first socket hanging. All open sockets are now placed in a select statement to handle this situation properly L2e Platform Fixed sprintf error case Fixed PostHandler bug that occurs when searching through multiple filenames Fixed Get handler to not capitalize all url encodiing Fixed bad timeout in connect Fixed bad pointer on failed connect MCF5272 Fixed Flash size error in monitor ld file Fixed UDP error in which network driver would sometimes deliver out of order or duplicate packets when receiving full size Ethernet frames PC Tools Improved network communication on Win7/Vista Fixed clinetool for script support of autoupdate Fixed pythonfind example to work with 3.0 release of Python Fixed socket open error in TCPUpdate Fixed javascript MIME encoding in comphtml RTOS Fixed trap occurring when UCOS_TASKLIST was enabled Increased performance for applications using atomicity macros Serial Fixed SendBreak() function for use with RS-422/485 mode Added custom baud rate support for MCF5272 processors SNMP Fixed case when SNMP task is stuck in a loop when a string larger than 254 chars is written. SSH/SSL Fixed memory leak/cleanup support in TCP error state System Fixed itoa library function for large hex values Fixed printf bug, not printing all characters of an unsigned long decimal (5213/L2e Devices) TCP TCP errors in Release 2.5.2 are significant and can the TCP stack and/or user tasks to permanently hang up. Symptoms include: Locking TCP connections Freezing web pages after consecutive reloads Freezing web pages after days of idle time. Fixed TCP timeout processing of closed sockets Fixed TCP hangup and half closed sockets memory leak Performance improvement Fixed incorrect arp caching scenario Fixed Accept close race in TCP Fixed bug that can cause TCP task to remain in infinite loop. ### How to add power over Ethernet (PoE) to your device for $7.69 USD Power over Ethernet (PoE) applications can vary widely with regard to product design requirements. NetBurner module versions with a 10-pin male header in place of the RJ-45 Ethernet jack can be used in conjunction with a PoE power supply module to create a PoE end product. This article will provide a design example of PoE using the SB70LC-200IR and SBL2E-200IR modules. Eliminate the power supply by adding power over ethernet connectivity. A block diagram of the PoE design is shown below. The design uses a RJ-45 PoE jack with integrated magnetics. The power signals are routed to the PoE compatible power module, which then supplies the 3.3VDC power to the NetBurner module. The Ethernet signals are routed to the NetBurner module for network connectivity. The power module in this example design is a Silvertel AG9603. Power of Ethernet (PoE) Diagram Hardware Design Download : Schematic and PCB This design supports the NetBurner SB70LC-200IR and SBL2e-200IR modules. The SB70LC interface connectors are shown on the left side of the page, and the SBL2e module interface connectors are shown on the lower right hand side of the page. You would replace these connectors with the appropriate interface connectors for your specific NetBurner module. Other than the Silvertel PoE power supply module and PoE jack, there are two bridge rectifiers as specified in the Sivertel Ag9600 product series datasheet. The Silverlite 9603 module has an input voltage range of 36V to 57V, and output voltage of 3.3V, and a maximum power output of 6 watts. Bill of Material Used Part Type Designator Vendor Part Number Description 2 330uF* C1 C2 Digikey 493-2157-1-ND CAP 330UF 6.3V ELECT WT SMD 1 380-1119-ND J1 DIGIKEY 380-1119-ND POE Ethernet Jack 2 HEADER 5X2 J6 JP2 Central components ARS-02-10-GD 0.1" 2x5 Receptacle 2 HEADER 10X2 JP1 JP1_H Central Components ARS-02-20-GD 0.1" 2x10 Receptacle 1 Header 8X2 J10 Central Components ARS-02-16-GD 0.1" 2x8 Receptacle 2 MB16S-TPMSCT-ND D1 D2 Digikey MB16S-TPMSCT-ND Schlocky Bridge Rectifier 1 SW SPST S1 Digikey 7914G-000ECT-ND Reset pushbutton 1 Silvertel AG9603 U1 Silvertel Ag9603 POE power converter ## Downloads ### Serial Port Hardware Manual ### SB800 EX Latest Factory Application Firmware (v3) V3 firmware (for both wired and WiFi) S19 and BIN files plus associated documentation and upgrade instructions. ### Secure Serial Factory App User's Manual ### SBL2e Latest Factory Application Firmware This is the latest available firmware for SBL2e. ### SBL2e Shipping Factory Application Firmware This firmware version is what's shipping with SBL2e units from the factory as of March 2026. There are newer versions available, but this version is kept online for troubleshooting purposes. ### NTP1061 Datasheet ### NBWIFIIN-SOM-UFL End of Life Notice (EOL) ### SBE70LC Development Board Schematic: DEV-SBE70LC-100CR ### PCN018 MOD54417 Ethernet Jack ### PCN017 MOD5270 Crystal Package and SDRAM Qualification ### PCN016 Manufacturing (FES) ### SBE70LC Latest Factory Application Firmware ### MODRT1171 Datasheet and Pinout ### MODRT1171 STEP File ### MOD5282 End of Life Notice ### SB70 and SB70LC End of Life Notice ### NBPKBD-100CR End of Life Notice ### SOMRT1061 Altium Component Library ### NBWIFI Adapter Schematic ### NANO54415 Adapter Schematic ### SOMRT1061 KiCad Footprint ### SOMRT1061 Quick Start Guide ### SOMRT1061 Footprint ### MOD5441X STEP Files ### MODM7AE70 STEP Files ### SB70LC STEP Files ### SBL2e STEP Files ### SOMRT1061 STEP Files 3D models for the bare SOMRT1061 as well as SOM-on-carrier CAR-SOMRT1061 ### SOMRT1061 200IR Mechanical Diagram ### CAR-SOMRT1061 200IR Mechanical Diagram ### SOMRT1061 200IR Datasheet and Pinout ### PCN014-MOD5441x Assembly modifications for MOD54415 revision 2.3, MOD54417 revision 1.6 Implementation Date: November 16, 2022 Reference: Assembly modifications for MOD54415 revision 2.3, and MOD54417 revision 1.6. NetBurner Part Numbers: • MOD54415-100IR • MOD54415-200IR • MOD54417-100IR • MOD54417-200IR Description: MOD54415: • Due to part shortages, added resistors to support alternate reset controller: Diodes, Inc APX803S00-29SR-7. • Added optional resistors to oscillator circuit to allow non spread spectrum clock to function on CPU, even if spread spectrum enable pin is used. • Qualified the SiTime SIT8008BI-13-YYN-25.000 oscillator as an alternate component. MOD54417: • Added reset controller, Diodes, Inc APX803S00-29SR-7. • Modified oscillator PCB footprint for manufacturability improvement. • Qualified the SiTime SIT8008BI-32-33E-50.000000 oscillator as an alternate component. Effectivity Modifications do not affect form, fit or function. No changes to hardware or software are required. ### PCN 013-MOD5441X Additional flash memory chip qualification Implementation Date: November 16, 2022 Reference: Additional flash memory chip qualification (Also see PCN 009). NetBurner Part Numbers • MOD54415-100IR • MOD54415-200IR • MOD54417-100IR • MOD54417-200IR Description Due to the worldwide chip shortages, additional 32MB Flash memory chips have been qualified for these devices: Infineon S29GL256S10DHI020 Infineon S29GL256S10DHIV20 Infineon S29GL256S10DHV020 Infineon S29GL256S10DHVV20 Effectivity The part is form, fit and function compatible. No changes to hardware or software are required. ### PCN 012 Ethernet RJ-45 jack modification PCN 012 Notice Date: November 16, 2022 Reference: Ethernet RJ-45 jack modification NetBurner Part Numbers All Ethernet products Effectivity The part is form, fit and function compatible. No changes to hardware or software are required. The part has been qualified and tested by both YDS and NetBurner. Description: The RJ-45 green LEDs have been changed resolve sourcing issues by the manufacturer, YDS, for their part number 13-641GGDP2NL. There has been no change electrically or with physical overall dimensions. The photos below show the slight change in the appearance of the LEDs. The component drawing is attached. ### NNDK USB Driver for Windows This is the USB driver provided with the NNDK installer. ### Spot Buy Pricing Notice for 2022 ### Price Increase Notice for 2022 ### PCN 009 - Additional Flash Memory Chip Qualification ### SBE70 LC STEP Files STEP files for both versions of the SBE70 LC module. Find out more about this module on its product page. ### SBE70 LC Datasheet ### macOS Big Sur PCN ### PK70 Flash Memory PCN This Product Change Notice details the flash memory component change of our PK70 based devices. ### MCF5272 End Of Life Notice ### UBLOX GPS Receiver Chip Specification ### MODM7AE70 Mechanical Diagram (100 Version) This document is the mechanical diagram for the MODM7AE70-100IR. ### NetBurner Support ### MOD5234 1588 Datasheet ### LocalDiscovery Tool (NNDK 3.x) Find NetBurner devices on your local area network. Unlike discover.netburner.com, you won't need a connection to the internet for this application to work. However, it does use port 20034, so that will need to be unblocked across the network. This tool is compatible with NetBurner devices running applications built with our latest toolset, NNDK 3.x. For more information, please see our online documentation here. Screenshot of Local Discovery Application When run, this tool will open up a web browser page that displays all of the local NetBurner devices that responded to the discovery request and displays that information, along with links to their respective configuration pages and web interfaces. ### UDPTerminal A simple program used to send and receive UDP packets. ### ARM Cortex-M7 Processor Technical Reference Manual ### ARMv7-M Architecture Reference Manual ### SAM E70/S70/V70/V71 DataSheet ### SAM E70/S70/V70/V71 Reference Manual ### SAM E70/S70/V70/V71 Errata ### NetBurner License Datasheet and Price List ### MTTTY Download Multi-Threaded TTY (MTTTY) is an easy to use serial terminal utility that you can use to communicate with the RS-232 serial ports on your device or development kit. It is multi-threaded in that you can run multiple instances of MTTTY for each serial port. ### MODM7AE70 Datasheet The ARM® Cortex®-powered NetBurner Ethernet System-on-Module is a device containing everything needed to add industrial-quality network control and monitoring to nearly any hardware or device. For a very low price point, this module solves the problem of network-enabling devices with 10/100 Ethernet, including those requiring digital, analog and serial control, and much more. Microchip®/Atmel® ARM® processors are combined with NetBurner’s acclaimed reliability and easy-of-use to get you a solution you can depend on. View product page. ### SBL2e XA Revision History ### Custom Baud Rates ### MOD5234 DMA Timer ### NANO54415 Mechanical Diagram (200 Version) ### Software and Protocols: Network Standard ### Software and Protocols: Network Single-Chip ### uCOS Library ### Legacy SB72 Revision History ### Legacy SB72 Mechanical Diagram ### Legacy SB72 EX Revision History ### Legacy SB72 EX Serial Tunneling ### Legacy SB72 EX Mechanical Diagram ### SB70 Mechanical Diagram (100 Version) ### MOD5213 Mechanical Diagram (100 Version) ### AutoUpdate (Windows) The NetBurner AutoUpdate download for Windows. Get the OSX version here. Read more about our deployment tools including AutoUpdate here. ### MTTTY Serial Terminal ### IP Setup IPSetup is a Windows program used to configure NetBurner hardware through a network connection. Running IPSetup will automatically identify your NetBurner device (even if its IP address is 0.0.0.0). ### AutoUpdate (OS X) ### Writing Assembly Code for the NetBurner Coldfire Platform ### SerialDownload Pdf ### Embedded Flash File System Implementation Guide ### How to Write Your Own Serial Driver (serial 70) ### How to Write Your Own Serial Driver (serial 72) ### MOD5282 How to Write Your Own Serial Driver ### MOD5234 How to Write Your Own Serial Driver ### What Female Header is Used to Accept a NetBurner Module on the Development Carrier Board? ### Creating a Custom Square Wave ### eTPU ### Software and Protocols: Embedded ### I2C I/O Expansion ### Blade Board Mechanical Diagram ### NNDK 1.98 RC5 Compile Error for bsp.o ### Legacy NBWIFIUG Product Discontinuation Notice ### Mechanical Diagram (Top) ### Mechanical Diagram (Bottom) ### PINK70 UDP Terminal ### USB Stand Alone Driver Developer Manual ### USB Host Driver Developer Manual ### Programmable Interrupt Timer ### Standard Serial Tunneling ### SBL2e XA User's Manual ### SBL2e XA Quick Start Guide ### SBL2e XA Latest Factory Application Firmware ### SBL2e X Quick Start Guide ### SBL2e X User's Manual ### SBL2e X Revision History ### SBL2e X Latest Factory Application Firmware ### SBL2e Serial Tunneling ### SBL2e Dual Serial to Ethernet User's Manual ### SBL2e Quick Start Guide ### SBL2e Revision History ### SBL2e Previous Factory Application Firmware This was the current version as of March 10 2026, available for historical purposes, and has since been superseded. ### SBL2e Evaluation Kit Quick Start Guide ### SBL2e Schematic ### SBL2e Mechanical Diagram (100 Version) ### SBL2e Mechanical Diagram (200 Version) ### SBL2e Pin I/O Class ### Network Programming Guide ### SB800 EX Previous Factory Application Firmware (v3) V3 firmware (for both wired and WiFi) S19 and BIN files plus associated documentation. ### SB800 EX Quick Start Guide ### SB800 EX Build Options ### Legacy SB72 User's Manual ### Legacy SB72 EX Recovery ### Legacy SB72 EX Latest Factory Application Firmware ### Legacy SB72 User's Manual ### Legacy SB72 EX Quick Start Guide ### Legacy SB72 General Purpose I/O ### Legacy SB72 Quick Start Guide ### Legacy SB72 Mechanical Diagram ### Legacy SB70 User's Manual ### SB70LC / PINK70 LC General Purpose I/O ### SB70LC / PINK70 LC Pin I/O Class ### SB70LC / PINK70 LC General Purpose I/O ### SB70LC / PINK70 LC Pin I/O Class ### PINK70 LC Latest Factory Application Firmware ### SB70LC Quick Start Guide ### SB70LC Latest Factory Application Firmware ### SB70LC Mechanical Diagram (100 Version) ### SB70LC Revision History ### SB70LC (EOL) Adapter Board Schematic: SB70LC-ADPT-100CR ### SB70LC Mechanical Diagram (200 Version) ### Certificates and Keys ### Comparing RTOS to Infinite Loop Designs ### Power Over Ethernet ### Legacy SB70 Latest Factory Application Firmware ### Legacy SB70 Quick Start Guide ### SB700 EX Quick Start Guide ### SB700 EX Latest Factory Application Firmware ### SB700EX Hardware Revision ### PK70 EX MMS Revision History ### PK70 EX 485 Revision History ### PK70 EX 232 Revision History ### PK70 Custom Design Program ### PK70 Quick Start Guide ### PK70 EX User's Manual: NBPKX500 ### PK70 EX MMS User's Manual ### PK70 EX MMS Latest Factory Application Firmware ### PK70 EX NTP Latest Factory Application Firmware ### PK70 EX NTP Revision History ### PK70 EX NTP User's Manual ### PK70 EX NTP User's Manual: GPS Blade Board ### PK70 EX 485 User's Manual ### PK70 EX 485 Latest Factory Application Firmware ### PK70 EX 232 User's Manual ### PK70 EX 232 Latest Factory Application Firmware ### PINK70 LC Quick Start Guide ### PINK70 Latest Factory Application Firmware ### PINK70 Tools ### PINK70 Quick Start Guide ### PINK70 / PINK70 LC User's Manual ### Legacy SB72 Part Change Notice: Ethernet PHY Updated ### PK70 EX Product Change Notice: Industrial Temperature Range ### MOD5441X Product Change Notice ### Legacy SB72 PHY Patch ### PK70 EX NTP Mechanical Diagram (Top) ### Legacy NBWIFIUG Quick Start Guide ### Legacy NBWIFIUG Mechanical Diagram ### NBWIFIIN Schematic ### NBWIFIIN Programmers Guide ### NBWIFIIN Quick Start Guide ### NBWIFIIN Hardware Configuration ### PK70 EX Reference Guide: NBPKBM ### Network Programming Examples ### Network Security Libraries ### Debugging Network Communications ### Network Programming Guide ### Virtual COMM Port Driver (Windows 7 - 11) Download the Virtual COMM Port Driver for use with NetBurner modules. Add a virtual serial port to your computer and interact with legacy applications or hardware using a modern PC. This driver is for use with our Serial to Ethernet products and licensed for users of NetBurner products only. Please login with your NetBurner Customer Account or contact Sales/Support for access. You can also see this Learn Blog post for how to use the driver or get started with an affordable NetBurner Serial to Ethernet converter. ### NNDK Installation Notes ### Reference Guide: NetBurner PC Tools ### Runtime Libraries ### Getting Started Guide: NetBurner's Eclipse IDE (NBEclipse) ### NANO54415 Latest Factory Application Firmware ### NANO54415 Quick Start Guide ### NANO54415 Pin I/O Class ### Legacy SB72 Monitor Recovery ### MOD Mechanical Diagram (100 Version) ### MOD Mechanical Diagram (200 Version) ### MOD54415 Pin I/O Class ### MOD54417 Quick Start Guide ### MOD54415 Quick Start Guide ### MOD5282 How to Install Dev Driver ### MOD5282 Dev Source ### MOD5282 Programmable Interrupt Timer ### MOD5282 Pulse Width Modulation ### MOD5282 Hardware Design Notes ### MOD5282 Interrupts ### MOD5282 General Purpose I/O ### Legacy MOD5282 Quick Start Guide ### MOD5272 Example of an Interrupt Request ### Legacy MOD5272 Quick Start Guide ### MOD5272 Hardware Design Notes ### MOD5272 General Purpose I/O ### MOD5270 Quick Start Guide (LC Version) ### MOD5270 Quick Start Guide ### MOD5270 Interrupts ### MOD5270 General Purpose I/O ### MOD5270 Hardware Design Notes ### MOD5234 Programmable Interrupt Timer ### MOD5234 Hardware Design Notes ### MOD5234 General Purpose I/O ### MOD5234 Quick Start Guide (LC Version) ### MOD5234 Quick Start Guide ### MOD5213 General Purpose I/O ### MOD5213 Programming Guide ### MOD5213 Configuration: MOD-DEV-40 ### MOD5213 Schematic ### MOD5213 Schematic: MOD-DEV-40 ### MOD5213 Quick Start Guide ### Schematic: MOD-DEV-70 ### Errata: MOD-DEV-100 ### Schematic: MOD-DEV-100 ### Freescale Coldfire MCF5441x Reference Manual ### Freescale Coldfire MCF5441x Errata ### Freescale Coldfire MCF5441x Datasheet ### Freescale Coldfire MCF5282 Reference Manual ### Freescale Coldfire MCF5272 User's Manual Freescale Coldfire MCF5272 User's Manual provides OEM information pertaining to NetBurner's devices running NXP/Freescale Coldfire microcontrollers. ### Freescale Coldfire MCF5272 Errata ### Freescale Coldfire MCF5271 Reference Manual ### Freescale Coldfire MCF5271 Errata ### Freescale Coldfire MCF5271 Hardware Specification ### Freescale Coldfire MCF5235 Hardware Specification ### Freescale Coldfire MCF5235 Errata ### Freescale Coldfire MCF5235 Reference Manual ### Freescale Coldfire MCF52235 Errata ### Freescale Coldfire MCF52235 Datasheet ### Freescale Coldfire MCF52235 Reference Manual ### Freescale Coldfire MCF5213 Reference Manual ### Freescale Coldfire MCF5213 Errata ### Freescale Coldfire MCF5213 Hardware Specification ### PINK70 Javelin Stamp Example Code ### How to Increase User Flash Storage ### How To Order A NetBurner Part With Options ### NANO54415 Errata ### PINK70 HTML Examples ### Embedded Flash File System Programming Guide ### PINK70 Example Code ### SBL2e XA Datasheet ### SBL2EX Datasheet ### SBL2e CHIP & BOB Datasheet ### SBL2e Datasheet ### SB800 EX Datasheet ### Legacy SB72 EX Datasheet ### Legacy SB72 Datasheet ### SB70LC Datasheet ### SB700EX Datasheet ### Legacy SB70 Datasheet ### PK70 EX NTP Datasheet ### PK70 EX MMS Datasheet ### PK70 EX 485 Datasheet ### PK70 EX 232 Datasheet ### PK70 EX Datasheet ### Legacy NBWIFIUG Datasheet ### NBWIFIIN Datasheet ### NANO54415 Datasheet ### MOD5441X Embedded Ethernet System on Module Datasheet Datasheet for our popular MOD5441X embedded system on module. The datasheets provides data and specifications for our single and dual jack models, MOD54415 and MOD54417, respectively. Electrical, mechanical and interface details. ### Legacy MOD5282 Datasheet ### Legacy MOD5272 Datasheet ### MOD5270 Datasheet ### MOD5234 Datasheet ### MOD5213 Datasheet ### CB34 EX Datasheet CB34 EX Datasheet. Find data and specifications on this NetBurner module. Mechanical, electrical and interface details. CAN to Ethernet Server. Access 2 serial ports over SSL & SSH Ethernet! Web Based Configuration. Ind temp range -40°C to 85°C Customize with dev kit. ### Databus I/O Expansion ### CB34 EX Latest Factory Application Firmware ### CB34 EX Hardware Manual ### CB34 EX Quick Start Guide ### CB34 EX Hardware Revision Comparison ### CB34 EX Hardware Revision ### DIN-100 Mechanical Diagram ### DIN-200 Mechanical Diagram ### Adding an Ethernet RJ-45 Connector ### MOD5282 Pin I/O Class ### MOD5272 Pin I/O Class ### Programmable Interrupt Timer ### MOD5270 Pin I/O Class ### MOD5270 DMA Timer ### MOD5234 Pin I/O Class ### MOD5234 DMA Timer ### MOD5234 Interrupt Controller ### MOD5213 RS-232/ CAN Transceiver ### MOD5213 Pin I/O Class ### MOD5213 Programmable Interrupt Timer ### MOD5213 Pulse Width Modulation ### MOD5213 Interrupt Controller ### NBANT-464 (ANT555 Datasheet) ### MOD54417 Mechanical Diagram (200 Version) ### MOD54417 Mechanical Diagram (100 Version) ### CB34 EX Mechanical Diagram (Top) ### CB34 EX Mechanical Diagram (Bottom)