DEV Community

Cover image for Real-Time Location Tracking with Laravel and Pulsetracker's Redis Pub/Sub
Walid LAGGOUNE
Walid LAGGOUNE

Posted on

Real-Time Location Tracking with Laravel and Pulsetracker's Redis Pub/Sub

In the fast-paced world of app development, real-time location tracking is essential for logistics, fleet management, and various other applications. Pulsetracker simplifies this process by providing a robust backend for location tracking, allowing developers to focus on building their applications instead of managing infrastructure.

Laravel, a powerful PHP framework, offers a seamless way to integrate Pulsetracker Redis Pub/Sub functionality, enabling developers to listen to real-time location updates effortlessly.

In this article, we’ll demonstrate how to set up Laravel to act as a subscriber to Pulsetracker's Redis server.

What is Pulsetracker and Why Use It?

Pulsetracker is a comprehensive backend-as-a-service (BaaS) solution for real-time location tracking. With support for WebSockets, UDP for clients . WebSockets and Redis Pub/Sub solution for listeners, it offers flexibility and scalability for developers creating location-aware applications.

Key Features:

  • Scalable Infrastructure: Avoid the complexity of managing backend services for real-time data.
  • Developer-Friendly: Integration is straightforward, supporting various programming languages.
  • Privacy-Focused Options: Control data storage to balance privacy and functionality.

Pulsetracker's Redis Pub/Sub feature is ideal for developers who need real-time data streaming to their backends without overhead.

Why Laravel?

Laravel provides an elegant, developer-friendly environment for backend development. With its built-in support for Redis, task scheduling, and a robust ecosystem, Laravel is perfectly suited for applications that require real-time updates. Using Pulsetracker's Redis server with Laravel ensures seamless integration, allowing you to focus on your application’s unique features.

Setting Up Laravel with Pulsetracker's Redis Pub/Sub

Follow these steps to integrate Pulsetracker's Redis Pub/Sub into your Laravel application:

Step 1: Update Redis Configuration

In your Laravel project, modify the config/database.php file to add a new Redis connection for Pulsetracker:

'pulsetracker' => [
    'url' => env('PULSETRACKER_REDIS_URL'),
],
Enter fullscreen mode Exit fullscreen mode

Next, add the Pulsetracker's Redis server URL to your .env file:

PULSETRACKER_REDIS_URL=redis://redis-sub.pulsestracker.com:6378
Enter fullscreen mode Exit fullscreen mode

Step 2: Create a Console Command

Laravel’s console commands are an excellent way to run background processes. Create a new console command to subscribe to Pulsetracker's Redis server:

Run the following Artisan command:

php artisan make:command PulsetrackerSubscribe
Enter fullscreen mode Exit fullscreen mode

Replace the content of the generated file (app/Console/Commands/PulsetrackerSubscribe.php) with the provided example code. This command subscribes to a channel specific to your application and processes incoming location updates in real-time:

<?php

namespace App\Console\Commands;

use Exception;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Str;

class PulsetrackerSubscribe extends Command
{
    protected $signature = 'pulsetracker:subscribe';
    protected $description = 'Subscribe to Pulsetracker Redis server for real-time updates';

    public function handle(): void
    {
        $appKey = 'your-app-key'; // Replace with your Pulsetracker app key
        $token = 'your-bearer-token'; // Replace with your Pulsetracker token
        $signature = $this->generateSignature($appKey, $token);

        Redis::connection('pulsetracker')->subscribe(["app:$appKey.$signature"], function (string $message) {
            echo "Received: $message\n";
        });
    }

    private function generateSignature(string $appKey, string $token): string
    {
        if (!str_contains($token, '|')) {
            throw new Exception('Invalid token format');
        }

        return hash_hmac('sha256', $appKey, hash('sha256', Str::after($token, '|')));
    }
}
Enter fullscreen mode Exit fullscreen mode

Step 3: Run the Subscriber

Use Laravel’s Artisan command to run the subscriber as a background process:

php artisan pulsetracker:subscribe
Enter fullscreen mode Exit fullscreen mode

This command will start listening for real-time location updates on the specified channel.

Handling Location Updates

Each message received on the subscribed channel represents a real-time location update. You can process these messages to:

  • Update a database.
  • Trigger notifications.
  • Integrate with mapping tools.

Example locations broadcaster in javascript using websockets

var wsServer = 'wss://ws-tracking.pulsestracker.com';
var websocket = new WebSocket(wsServer);
const appId = 'YOUR_APP_KEY';
const clientId = 'YOUR_CLIENT_KEY';

websocket.onopen = function(evt) {
    console.log("Connected to WebSocket server.");
    setInterval(() => {
        if (websocket.readyState === WebSocket.OPEN) {
            navigator.geolocation.getCurrentPosition((position) => {
                const locationData = {
                    appId: appId,
                    clientId: clientId,
                    data: {
                        type: "Point",
                        coordinates: [position.coords.longitude, position.coords.latitude]
                    },
                    extra: {
                        key: "value"
                    }
                };


                // Send location data as JSON
                websocket.send(JSON.stringify(locationData));
                console.log('Location sent:', locationData);
            }, (error) => {
                console.error('Error getting location:', error);
            });
        }
    }, 3000);
};

websocket.onclose = function(evt) {
    console.log("Disconnected");
};

websocket.onmessage = function(evt) {
    if (event.data === 'Pong') {
        console.log('Received Pong from server');
    } else {
        // Handle other messages
        console.log('Received:', event.data);
    }
};

websocket.onerror = function(evt, e) {
    console.log('Error occurred: ' + evt.data);
};
Enter fullscreen mode Exit fullscreen mode

Conclusion

Pulsetracker's Redis Pub/Sub functionality makes it easier than ever to implement real-time location tracking in your applications. By leveraging Laravel’s robust framework and Pulsetracker's scalable backend, you can build powerful, location-aware applications in hours, not months.

Start integrating Pulsetracker today, and take your real-time tracking to the next level! For more details, visit Pulsetracker Documentation.

Top comments (0)