php - Laravel Websocket 向特定的 Android 设备发送消息
问题描述
我正在使用 websockets 开发 laravel 应用程序。我已经从库中配置了 websocket
构建像 uber 或 ola 这样的实时应用程序。
客户正在创建具有起点和终点位置的旅行。
在后端选择最近的司机位置,需要向最近的司机广播行程
创建新行程时广播事件。
事件服务提供者
\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
}
解决方案
为了使用 laravel websockets 向特定客户端发送消息,他们需要自己订阅频道,无法指定要发送到的单个客户端。
我建议为您的后端切换到节点 ws,laravel-websockets 不是为此而设计的。(我面临着完全相同的问题,在 laravel 中构建服务器并切换到节点的一半,它立即加载更容易)
如果您绝对需要坚持使用 laravel-websockets,那么您可以使用此解决方法
- 向所有人广播一条消息,其中包含您要向其发送私人消息的用户的 ID,以及一个随机字符串
- 客户端检查 id 是否与他们的匹配,如果匹配,他们会获取随机字符并订阅频道
- 服务器将私人消息广播到只有新订阅的用户才能收到的新频道。
- 客户退订新频道。
如果您确实切换到节点,那么您可以非常轻松地向特定客户端发送消息
推荐阅读
- angular - Angular 9 IVY 延迟加载的组件绑定不起作用
- python-3.x - VSCode pytest 测试发现在 Mac 上失败
- angular - Windows 上 Angular 9“ng new”的错误
- ios - 使用蓝牙 HID 切换虚拟键盘
- linux-mint - 如何恢复 Nemo“我的电脑”中的链接
- symfony - 根据客户下拉选择数据动态填充项目下拉数据。但是在 symfony 5 中编辑表单显示异常/错误
- jenkins - Jenkinsfile sh echo 给出空结果
- string - 以更简单的方式重写 for 循环函数?
- vue.js - vue @click 不改变类
- javascript - ApolloGraphQL - 不能同时在 MockedProvider 中使用模拟、客户端、缓存、解析器