DEV Community

Cover image for Building a Real-Time Location Tracking Solution with Pulsetracker, Laravel, and Python
Walid LAGGOUNE
Walid LAGGOUNE

Posted on

Building a Real-Time Location Tracking Solution with Pulsetracker, Laravel, and Python

Introduction: What is PulseTracker?

Pulsetracker is a backend service for real-time location tracking, designed specifically for developers who need a robust and flexible way to monitor location data without being tied to proprietary SDKs or infrastructure. It allows developers to implement their own client SDKs using either UDP or WebSocket protocols. Additionally, Pulsetracker can dispatch real-time location updates directly to the developer's backend, making it a powerful choice for applications requiring real-time tracking.

In this tutorial, we’ll walk through using Pulsetracker with a Python script as the listener for real-time location updates. The Python script acts as a Pulsetracker listener that receives updates and dispatches them to a Laravel job handler through Redis, enabling Laravel to process these updates efficiently.

Prerequisites

1.Pulsetracker Account: Set up a Pulsetracker account and get your app key and authorization token.

2.Redis: Ensure you have Redis installed and running.

3.Laravel Project: Set up a Laravel project if you don’t already have one.

Project Setup

This setup involves two main components:

1.Python Script: Listens for location updates from Pulsetracker.

2.Laravel Job: Processes the location data received from the Python script.

Step 1: Setting Up the Python Script

The Python script connects to Pulsetracker’s Pusher service, listens for location updates, and pushes them into a Redis queue for Laravel to handle.

#!/usr/bin/env python

import sys
sys.path.append('..')
import pysher
import time
import logging
import redis
import json 
import uuid

global pusher
global redis

def channel_callback(data):
    messageBody = json.dumps({
        "uuid": str(uuid.uuid4()),
        "displayName": "App\\Jobs\\PulseLocationUpdatedJob",
        "job": "App\\Jobs\\PulseLocationUpdatedJob@handle",
        "data": json.loads(data),
        "maxTries": 0,
        "attempts": 0
    })
    # YOUR_APP_NAME_database_queues:QUEUE_NAME
    redis.rpush("pulsetracker_database_queues:geopulse", messageBody)

def connect_handler(data):
    channel = pusher.subscribe("private-apps.<your_app_id>")
    channel.bind('App\\Events\\DeviceLocationUpdated', channel_callback)

if __name__ == '__main__':

    appkey = "<pusher_app_key_in_our_documentation>"
    auth_endpoint = "https://www.pulsestracker.com/api/broadcasting/auth"

    pusher = pysher.Pusher(
        key=appkey,
        auth_endpoint_headers={            
                "Authorization": "Bearer <your_token>"
        },
        auth_endpoint=auth_endpoint,
        custom_host="pusher.pulsestracker.com",
        secure=True,
    )

    redis = redis.Redis(host='127.0.0.1', port=6379, db=0, password="<your_redis_password>")

    pusher.connection.ping_interval = 30
    pusher.connect()

    pusher.connection.bind('pusher:connection_established', connect_handler)

    while True:
        time.sleep(1)

Enter fullscreen mode Exit fullscreen mode

In this script:

The channel_callback function pushes location updates into a Redis queue.

The connect_handler function subscribes to a specific Pulsetracker channel and binds it to the DeviceLocationUpdated event.

This script should be running continuously to listen for updates and pass them to Redis for Laravel

Step 2: Configuring Laravel

Now, let's create a Laravel job class that will process the updates received from the Python script.

Laravel Job: PulseLocationUpdatedJob

In Laravel, the job class processes data pushed into the Redis queue by the Python listener. Here’s the PulseLocationUpdatedJob class:

<?php

namespace App\Jobs;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;

class PulseLocationUpdatedJob implements ShouldQueue
{
    use Queueable;

    /**
     * Create a new job instance.
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     */
    public function handle($job, array $data)
    {
        // Handle the data here, e.g., save to the database
        var_dump($data);

        return $job->delete();
    }
}

Enter fullscreen mode Exit fullscreen mode

Start the Laravel queue worker to begin processing jobs:

php artisan queue:work --queue=geopulse
Enter fullscreen mode Exit fullscreen mode

Results

Pulsetracker demo with laravel and python

Conclusion

In this setup, the Python listener efficiently streams real-time location data from Pulsetracker to your Redis queue, which Laravel processes as background jobs. This approach enables you to handle high volumes of real-time data, while letting Laravel focus on data persistence and backend tasks.

Resources :
https://fly.io/laravel-bytes/queues-with-other-languages/

Top comments (0)