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)
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();
}
}
Start the Laravel queue worker to begin processing jobs:
php artisan queue:work --queue=geopulse
Results
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 (2)
awesome!! thanks for sharing.
Thank you for the kind words! I’m glad you found it helpful. 😊