500+Active Nodes
AES-128Encryption
<2sLocation Update
6moBattery Life
MCUNordic nRF52840 · ARM Cortex-M4F @ 64MHz
RTOSZephyr 3.4 with BLE stack
BLEMesh v1.0 · Friend/LPN · GATT provisioning
RFIDISO 15693 · NFC-V via SX1502 front-end
SecurityAES-128-CCM · LE Secure Connections · ECDH
BatteryLi-MnO2 3.0V 2000mAh · 6 month life
AppReact Native · BLE GATT · REST → AWS API GW
Project Overview
Designed a warehouse asset tracking system using BLE mesh networking. 500+ sensor nodes track pallets, equipment, and vehicles in real time. Each node contains an RFID reader, accelerometer, and temperature sensor, reporting location and status through a self-healing BLE mesh to cloud gateways.
BLE Mesh Architecture
Built on Zephyr RTOS with the Nordic BLE Mesh stack (SIG Mesh v1.0). The mesh uses a 3-tier topology:
- Asset nodes — Low-power Friend nodes with 6-month battery life, RFID + accelerometer
- Relay nodes — Mains-powered, extend mesh range, cache messages for sleeping nodes
- Gateway nodes — Proxy nodes bridging BLE mesh to LTE → AWS IoT Core
Encrypted Provisioning
/* Out-of-band provisioning via NFC */
static void prov_complete(uint16_t net_idx, uint16_t addr) {
bt_mesh_prov_complete(net_idx, addr);
/* Set LE Secure Connections security level */
bt_conn_set_security(conn, BT_SECURITY_L4);
/* Distribute application key via OOB NFC record */
struct bt_mesh_cfg_app_key_add key_add = {
.net_idx = net_idx,
.app_idx = APP_KEY_IDX,
};
memcpy(key_add.app_key, app_key_128, 16);
bt_mesh_cfg_cli_app_key_add(net_idx, addr, &key_add, NULL);
}
Power Optimisation
Achieved 6-month battery life on a 2000mAh Li-MnO2 cell through aggressive duty cycling:
- BLE radio: 25ms advertising every 10 seconds when stationary, 1 second when moving
- RFID reader: powered on only when NFC field detected (interrupt-driven)
- STM32 companion MCU in Stop mode between measurements
- Total average current: 18µA stationary, 340µA active tracking