Bluetooth Indoor Positioning System with LoRaWAN
Introduction
Overview
Indoor positioning is a common challenge for many industries. While high-precision systems like UWB exist, they can be costly and complex. This solution offers a flexible and cost-effective alternative by combining two powerful wireless technologies: Bluetooth Low Energy (BLE) for location sensing and LoRaWAN for long-range, low-power data transmission.
The system is built around the SenseCAP T1000 Tracker and supports two distinct positioning modes, allowing you to balance precision with battery life based on your needs:
-
High-Precision Tracking (Trilateration): When a tracker detects signals from three or more BLE beacons, it can calculate its precise (x, y) coordinates on a map. This mode is ideal for tracking the movement of assets or personnel, providing accurate location updates periodically or whenever movement occurs.
-
Zone-Based Positioning (Proximity): When a tracker is in range of only one or two beacons, it identifies its location based on proximity to the nearest beacon. This mode is perfect for simpler use cases like automated check-ins, confirming an asset is in a designated room, or conserving battery life by reporting location less frequently.
By supporting both methods, this solution provides a versatile and easy-to-deploy system for a wide range of indoor tracking applications, from simple presence detection to more detailed coordinate-based monitoring.
Check out our Indoor & Outdoor Integrated Positioning bundle page for all the products you need to implement this solution.
Key Features & Benefits
- Cost-Effective & Scalable: Leverages affordable BLE beacons and avoids the need for expensive gateway installations in every room.
- Long-Range Data Transmission: A single LoRaWAN gateway can cover an entire building or campus, drastically reducing infrastructure costs.
- Instant SOS Alert: Trackers include a panic button that, when pressed, immediately sends an SOS alert via LoRaWAN for rapid emergency response.
- Intelligent Power Management: By using a built-in accelerometer, the tracker can report only when movement is detected and send periodic "heartbeat" signals otherwise. This dramatically extends battery life to up to 6 months with optimal settings for many asset tracking applications.
- Simple Deployment: Setting up BLE beacons and LoRaWAN gateways is straightforward, getting your positioning system online quickly.
- Open-Source Software: The project is fully open-source, allowing you to build and customize your own backend server using our GitHub repository.
Use Cases
Use Cases
This solution is ideal for a wide range of zone-based tracking and safety applications:
Campus & School Safety
Provide students and staff with a wearable tracker. The built-in SOS button allows them to instantly send an emergency alert with their last known location from anywhere on campus, providing peace of mind and enabling faster response times.
Asset Management
Track the location of valuable assets, both indoors and outdoors (e.g., vehicles in a parking lot). Configure the tracker to only report when it moves, conserving battery while ensuring you are alerted to unauthorized movement.
Automated Check-In & Personnel Management
By adjusting the signal strength of a BLE beacon, you can create a "check-in" zone for offices or nursing homes. When a person wearing a tracker enters the zone, their presence is automatically logged.
System Architecture
The system operates on a simple yet powerful principle. Mobile trackers listen for signals from fixed beacons and report what they hear to a central server.
Prerequisites
The main components are:
- BLE Beacons: These are small, fixed transmitters placed at known locations (e.g., room entrances, key zones). They continuously broadcast a unique ID.
- SenseCAP T1000 Tracker: This is the mobile device attached to the asset or person you want to track. It scans for nearby BLE beacons and identifies the one with the strongest signal.
- LoRaWAN Gateway: The tracker sends a data packet containing the ID of the nearest BLE beacon to the gateway via LoRaWAN.
- Network & Application Server: The gateway forwards the data to a LoRaWAN Network Server(SenseCraft Data), which then routes it to an application server. The application server holds a map of the beacon IDs and their real-world locations, allowing it to determine the tracker's position (e.g., "Tracker #58 is near Beacon #12, which is in Conference Room 3").
Before you begin, make sure you have the following:
- A SenseCAP T1000 Tracker
- One or more BLE beacons
- A LoRaWAN gateway connected to the internet
- A server or computer with Docker installed
SenseCAP T1000 Tracker
LoRaWAN® mobile tracker with BLE scanning capabilities
BLE Beacon Detection: Supports BLE 5.1 for precise indoor and outdoor positioning.
Wide Area Network: LoRaWAN® Class A(v1.0.4) connectivity for long-range, low-power communication.
Motion Detection: Built-in accelerometer for real-time motion and stationary status sensing.
Emergency Button: Independent SOS button to trigger emergency alerts with one press.
BLE Beacons
Regular Bluetooth Broadcasting
Protocol Compatible: Bluetooth® LE 5.0 | Full support for iBeacon and Eddystone formats.
Flexible Deployment: Configurable transmission power for adjustable coverage radius.
Long-lasting: Up to 2 years of battery life with standard settings.
Easy Installation: Comes with adhesive backing for easy mounting on walls or other surfaces.
Broadcasting Range: Up to 75 meters outdoors, 120 meters indoors in open areas.
SenseCAP M2 Multi-Platform Gateway
LoRaWAN® Network Infrastructure
Wide Coverage: Indoor coverage radius of up to 2 km, ensuring stable signal.
Massive Connectivity: Supports over 200 concurrent devices with excellent performance.
Multiple Backhauls: Provides multiple network backhaul options including Ethernet, Wi-Fi, and 4G.
Integrated Solution: Built-in local LoRaWAN server capabilities to simplify network deployment and management.
Getting Started Guide
- Deploy Beacons: Place BLE beacons at strategic locations throughout your facility. Create a map or list documenting the unique ID of each beacon and its physical location (e.g.,
Beacon_ID_01: "Main Entrance"
,Beacon_ID_02: "Warehouse Zone A"
). - Set up the Gateway: Connect your LoRaWAN gateway to the internet and configure it to forward packets to your chosen LoRaWAN Network Server.
- Deploy the Application: On your application server, create the logic to map the reported beacon IDs back to the physical locations you documented in Step 3.
- Configure the Tracker: Activate the SenseCAP T1000 and onboard it to your LoRaWAN Network Server. Ensure it is configured for BLE scanning mode.
- Visualize: As the tracker moves through the facility, it will report the nearest beacon, and your application can display its location on a dashboard or map.
Step 1: Set Up Your Hardware
First, you need to set up the physical devices in your facility.
1a. Deploy Beacons
For complete technical details, refer to the BC01 Indoor Bluetooth Beacon documentation.
First, place your BLE beacons at key locations throughout your facility, such as at the main entrance, in the warehouse, and in offices.

Next, create a list(template) for yourself to record each beacon's unique MAC Address and its physical location. This record is essential for the software configuration step.
Example Record:
MAC Address,Location,Beacon ID
c30000564b31,"Main Entrance",01
c30000564b32,"Warehouse Zone A",02
c30000564b33,"Corner Office",03
The video below shows how you will use this list to add your beacons to the application's map later. Creating an accurate record now will make the software setup much easier.
Pro Tip: For easier management, you can use the SenseCraft app to give all your beacons a consistent UUID. This helps ensure the tracker only listens to your devices and ignores others. Check out Feature 4: Filter by Beacon UUID for more details.
Quick view of the parameters of BC01 beacon
Parameters | Default Value |
---|---|
UUID | FDA50693-A4E2-4FB1-AFCF-C6EB07647825 |
Major | 10001 |
Minor | 19641 |
Measured power | -59dBm |
Tx Power | -30 - +4dBm, default 0dBm |
Adv Interval | 100ms~10s, default 500ms |
Password | seeed123 (Letters and numbers) |
Device Name | BC01 (1-7 characters) |
Soft Reboot | seeed123 (same with the password) |
1b. Set Up the Gateway
First, power on your LoRaWAN gateway and connect it to the internet. From here, the steps depend on which network server you're using.
- SenseCraft Data
- ChirpStack (Local LoRaWAN Server)
If you're using the default SenseCraft Data(formerly SenseCAP Portal) platform, your gateway is already pre-configured.
- Follow the official user manual to make sure the gateway is online and connected to your account.
- Once that's done, you can move on to Step 2.
If you're using a self-hosted ChirpStack server, you'll need to re-point the gateway and prepare a decoder script.
-
Configure the Gateway: Follow this guide to redirect your gateway's data to ChirpStack.
-
Download the Decoder: ChirpStack needs a decoder to understand the data sent by your T1000 tracker. Download the script now so it's ready for a later step.
Note: You'll add this script inside the ChirpStack application settings, not on the gateway itself.
Step 2: Install the Positioning Application
Next, you will install the main application on your server using Docker. Or you can have a view of the demo first.

Run the Installation Command
Open a terminal on your server and run the following command:
docker run -p 5173:5173 -p 8022:8022 --name indoor-positioning --restart unless-stopped -v /data/indoor-positioning/db/:/app/db/ -d seeedcloud/sensecraft-indoor-positioning
What this command does:
- It downloads and starts the SenseCraft Indoor Positioning application.
-p 5173:5173
makes the web dashboard accessible on port5173
.-v /data/indoor-positioning/db/:/app/db/
tells the application to store its database and maps in the/data/indoor-positioning/db/
folder on your machine.-d
runs the application in the background.
After running the command, you can access the dashboard by opening a web browser and going to http://<your_server_ip>:5173
.
Step 3: Configure the Application

Now, open the application dashboard in your browser to configure the system settings.
3a. Runtime Configuration (Connecting to LoRaWAN)
This setting connects the application to your LoRaWAN Network Server to receive tracker data. A key feature is that the application supports simultaneous connections to both the SenseCraft Data platform and a ChirpStack server.

In the dashboard, you can enable one or both of the following MQTT sources to connect to your network servers.
To Connect to SenseCraft Data
- Enable the SenseCAP OpenStream MQTT toggle.
- Enter your Username and API Key.
- You can generate these credentials by following the Data OpenStream API Quickstart guide.
To Connect to ChirpStack
- Enable the ChirpStack MQTT toggle.
- Enter your ChirpStack server address and Application ID.
- The MQTT topic field will then update automatically. You can find the Application ID on the main page for your application within ChirpStack.

Note: The {clientID}
field is used by the system and will be replaced with a random ID on startup. You don't need to change it.
Important: After enabling or changing any of these settings, you must restart the application (the Docker container) for them to take effect.
Other Settings
The following settings can be changed at any time without restarting the application:
- Authentication: Update the username and password used to log in to the application's dashboard.
- Area Positioning: Enable this option to estimate a tracker's location when there are too few beacon signals available for precise, multi-point positioning.
- Tracker Access Control: Configure which devices are allowed to send data to the application. You can either allow data from any device or create a specific list of authorized trackers.
- Webhook: Enable this to push location results to your own service using an HTTP POST request.
3b. Map and Beacon Configuration
In this step, you will use the application's dashboard to upload your floor plan and add the beacons you physically deployed earlier.

- Upload Your Map First, go to the configuration menu and upload an image of your floor plan. Standard image formats like PNG or JPG are recommended.
- Add Your Beacons Go to the "Beacons" section. Using the list you created in Step 1a, add each beacon's information (like its MAC address). The easiest way to do this is to click directly on the beacon's location on the map you just uploaded.
- Adjust the Environmental Factor (Optional)
This is an advanced setting that fine-tunes location accuracy. It helps the system convert signal strength (RSSI) into a more accurate distance by accounting for your specific environment.
- For open spaces, the default value of ~2.0 is usually sufficient.
- For complex indoor areas with many walls and obstacles, you may need to adjust the value between 1.8 and 4.0.
- Recommendation: It's best to leave this at the default setting to start. You can come back and adjust it later if you need to improve positioning accuracy.
Step 4: Activate and Visualize Your Tracker
The final step is to turn on your tracker and see it on the map.

- Activate the SenseCAP T1000 Tracker and onboard it to your LoRaWAN Network Server. Ensure your gateway is online and the tracker devices is 'registered' on the LNS server. check Step 1b for details.
- Ensure it is set to BLE scanning mode so it can detect the beacons. Check the video below for help.
- Visualize: As the tracker moves through your facility, it will detect the nearest beacons and report its location. You will see its icon moving across the map on your dashboard.
Opt for Other Platform
, When using ChirpStack.
Retain the default platform settings (SenseCAP for The Things Network), When using SenseCraft Data.
Application Features Overview
Feature 1: Data Pushing (Webhook & WebSocket)
You can get real-time data from the system in two ways:
- Webhook: As mentioned in the configuration, this pushes data to a URL you provide.
- WebSocket: For real-time applications, you can connect to the
/ws
endpoint using Basic HTTP Authentication. The data formats forsos
,tracker_update
(trilateration), andtracker_location_approximate
(proximity) are detailed in the JSON examples provided in the original document.
Data Formats
- SOS Alert
- Trilateration/Multilateral
- Area Positioning
{
"type": "tracker_sos",
"data": {
"2CF7F1C0530004AD": {
"timestamp": 1756967508000,
"sos": 0
}
}
}
{
"type": "tracker_update",
"data": {
"2CF7F1C0530003BD": {
"trackerId": "2CF7F1C0530003BD",
"timestamp": 1756967455550,
"position": {
"x": 11.1,
"y": 12.3
},
"last_detected_beacons": [
{
"macAddress": "C3:00:00:56:4B:5D",
"major": null,
"minor": null,
"name": "Unknown Beacon",
"rssi": -79,
"txPower": null,
"configured_x": null,
"configured_y": null
},
{
"macAddress": "C3:00:00:3E:7D:AA",
"major": null,
"minor": null,
"name": "Unknown Beacon",
"rssi": -80,
"txPower": null,
"configured_x": null,
"configured_y": null
},
{
"macAddress": "C3:00:00:13:3C:99",
"major": null,
"minor": null,
"name": "Unknown Beacon",
"rssi": -80,
"txPower": null,
"configured_x": null,
"configured_y": null
}
],
"position_history": [],
"map": "10 Floor",
"sos": 2
}
}
}
{
"type": "tracker_location_approximate",
"data": {
"2CF7F1C0530004AD": {
"trackerId": "2CF7F1C0530004AD",
"timestamp": 1756967098851,
"radius": 5.248074602497725,
"last_detected_beacons": [
{
"txPower": -59,
"rssi": -77,
"name": "corner",
"configured_x": 32.41,
"configured_y": 21.26,
"macAddress": "C3:00:00:56:4B:59"
}
],
"map": "10.5 Floor",
"sos": 0
}
}
}
Feature 2: Two Positioning Modes
The system supports two positioning methods:
- Trilateration: When the tracker detects three or more beacons, it calculates a precise (x, y) coordinate. This is the default and most accurate mode.
- Proximity (Area Positioning): If you enable this and the tracker can only detect one beacon, it will report its position as being "near" that beacon within a calculated radius. This is useful for ensuring coverage in all areas.
Trilateration
Trilateration | Trilateration(SOS) |
---|---|
![]() | ![]() |
Area Positioning
Area Positioning | Area Positioning(SOS) |
---|---|
![]() | ![]() |
Feature 3: Viewing Alert History
You can view the alert history (e.g., SOS button presses) for any tracker by clicking on its icon on the map. The system logs each new alert and will continue to push notifications for an active alert until it is resolved.

Feature 4: Filter by Beacon UUID
You can filter the displayed trackers on the map by their associated beacon UUIDs. This allows for more focused monitoring of specific areas or assets. it is valued not to be hacked.

Reference & Resource
- Landing Page: SenseCraft Indoor Positioning Solution
- Docker Image: seeedcloud/sensecraft-indoor-positioning - Docker Hub
- Live Demo Site: IndoorPositioning
FAQ
Why is my tracker not reporting its location?
- Probable Cause: There may be an issue with the LoRaWAN connectivity.
- Solution: Check the status of your LoRaWAN gateway to ensure it's online and connected. Also, verify that the tracker's Device EUI is correctly registered on your network server.
Why is the tracker's position inaccurate?
- Probable Cause: The placement of your BLE beacons might be causing interference or weak signal coverage.
- Solution: Try adjusting the transmission power of the beacons. You may also need to relocate them to reduce signal obstruction from walls or machinery.
Why is the tracker's battery draining so quickly?
- Probable Cause: The reporting frequency is set too high, causing the device to transmit data more often than necessary.
- Solution: Optimize the motion detection settings to only report when the tracker is moving. You can also increase the reporting interval (the time between location updates) to conserve power.
Why is location data missing or not showing up?
- Probable Cause: There could be a problem with the database or API, often related to how the data payload is being interpreted.
- Solution: First, verify that the payload decoder on your application server is correct and working. If the decoder is correct, check the application server logs for any errors or connectivity issues.
Why are SOS alerts not being received promptly?
- Probable Cause: The LoRaWAN network may be congested, or the device class isn't suitable for urgent messages.
- Solution: For time-critical applications like SOS alerts, ensure your tracker is configured to use Class C mode. This keeps the device's receiver on continuously, allowing for immediate reception of messages from the server.
How do I adjust the advertising interval and transmission power of a BC01 beacon?
You can use the SenseCraft app to configure the BC01 beacon.
- Install the SenseCraft app from the Google Play Store or Apple App Store.
- Open the app and enable Bluetooth on your phone.
- Scan for nearby beacons and select the one you wish to configure.
- Enter the default password "seeed123" to access the settings.
- Adjust the advertising interval (100ms to 10s) and transmission power (-30dBm to +4dBm) to your needs.
- Save the changes.