Laravel Websocket отправляет сообщение на определенные устройства Android

Я работаю над приложением laravel, используя веб-сокеты. Я настроил веб-сокеты из библиотеки.

Создание приложения реального времени, такого как uber или ola.

Клиент создает поездку с начальным и конечным местоположением.

В бэкенде выбирается ближайшее местонахождение водителя и необходимо транслировать поездку ближайшим водителям

Событие транслируется при создании новой поездки.

EventServiceProvider

\App\Events\NewTripHasCreatedEvent::class => [
        \App\Listeners\SendTripCreationNotificationToTheDriverListener::class,
    ],

NewTripHasCreatedEvent

class NewTripHasCreatedEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $trip;
    public $trip_details;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Trip $trip, $trip_details)
    {
        $this->trip = $trip;
        $this->trip_details = $trip_details;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

SendTripCreationNotificationToTheDriverListener

public function handle(NewTripHasCreatedEvent $event)
{
     Find nearest driver
     $km = 0.008997742; //1 km = 0.008997742 degree
    $drivers_distance = 5;
    $query      = Driver::Distance('location', $trip->from_location, $drivers_distance * $km)->take(5)->pluck('user_id');
    //Here send notification to Driver
}

person B L Praveen    schedule 23.01.2021    source источник


Ответы (1)


чтобы отправить сообщение конкретному клиенту с веб-сокетами laravel, они должны быть подписаны на канал сами по себе, нет возможности указать одного клиента для отправки.

я бы предложил переключиться на node ws для вашего бэкэнда, laravel-websockets не предназначен для этого. (я столкнулся с точно такой же проблемой, был на полпути к сборке сервера в laravel и переключился на узел, это было мгновенно НАГРУЗИТЬ проще)

если вам абсолютно необходимо придерживаться laravel-websockets, вы можете использовать этот обходной путь

  1. транслировать сообщение всем с идентификатором пользователя / пользователей, которым вы хотите отправить личное сообщение, и случайной строкой символов
  2. клиенты проверяют, совпадает ли id с их, если совпадают, берут случайные символы и подписываются на канал
  3. сервер передает личное сообщение на новый канал, который получают только недавно подписавшиеся пользователи.
  4. клиент/ы отписаться от нового канала.

если вы переключитесь на узел, вы можете очень легко отправить сообщение конкретному клиенту

person aidan byrne    schedule 23.01.2021