Laravel后台作为客户端,socket或mqtt作为服务端,App或其他作为另一个客户端

Laravel事件广播+redis+socket.io 或 mqtt

简介

laravel API 与 Android App 进行通讯,推送消息,或者是其他的使用的场景。

1.后台安装所需

    1. 新建 Laravel 项目
      composer create-project laravel/laravel demo --prefer-dist
    1. 安装 redis
      composer require predis/predis
    1. 配置 redis
      修改 config/database.php
      'redis' => [
         'client' => env('REDIS_CLIENT', 'phpredis'),
         'options' => [
         'cluster' => env('REDIS_CLUSTER', 'redis'),
         // 'prefix' => env(...)   注释掉这一行
         ],
         ...
      ]
    1. 修改 App\Providers\EventServiceProvider.php 中的 $listen
      protected $listen = [
         'App\Events\TestEvent' => [
             'App\Listeners\TestEventListener',
         ],
      ];
      然后使用命令自动生成 EventsListeners文件
      php artisan event:generate
    1. TestEvent.php 实现

      <?php
      namespace App\Events;
      use ...class TestEvent implements ShouldBroadcast
      {
         use ...public $token;
         protected $channel;
      
         public function __construct($token, $channel)
         {
             $this->token = $token;
             $this->channel = $channel;
         }
      
         public function broadcastOn()
         {
             return [$this->channel];
         }
      }
    1. TestEventListener.php 实现

      <?php
      namespace App\Listeners;
      use App\Events\TestEvent;
      use ...class TestEventListener implements ShouldQueue
      {
         use InteractsWithQueue;
         protected $request;
      
         public function __construct(Request $request)
         {
             $this->request = $request;
         }
      
         public function handle(TestEvent $event){}
      
         public function log($event){
             info("event -------- ".$event->token);
         }
      
         public function subscribe($events)
         {
             $events->listen(
                 TestEvent::class,
                 'App\Listeners\TestEventListener@log'
             );
         }
      }
    1. EventServiceProvider.php 中新增或修改
      protected $subscribe = [
         TestEventListener::class,
      ];
    1. 修改 .envBROADCAST_DRIVER 为 redis

      2.socket 或 mqtt 服务器

    1. 新建 node 项目
      新建 demo 目录,在目录中新建 package.json 文件,并输入
      {
       "name": "demo",
       "version": "0.0.1",
       "description": "socket server",
       "dependencies": {}
      }
    1. socket 服务器
    • 2.1 socket 安装所需
       npm install --save express
       npm install --save socket.io
       npm install --save ioredis
    • 2.2 新建 app.js

       // app.js
       const express = require('express');
       const app = express();
       const port = process.env.PORT || 3000;
       const server = require('http').createServer(app);
       const io = require('socket.io')(server, {
           cors: true,//开启跨域
           maxHttpBufferSize: 1e8//单次最大数据,初始为1e6
       });
       var Redis = require('ioredis');
       var redis = new Redis({
           port: 6379,          // Redis port
           host: '127.0.0.1',   // Redis host
           password:null,
           db: 0,
       });
      
       server.listen(port, () => {
         appLogger.debug('Server listening at port %d', port);
       });
      
       io.on('connection', function (socket) {
         socket.on('message', function (message) {
           // 一般这里要做一些处理
           console.log(message)
         })
         socket.on('disconnect', function () {
           console.log('user disconnect')
         })
       });
      
       redis.psubscribe('*', function (err, count) {});
      
       redis.on('pmessage', function (subscrbed, channel, message) {
         message = JSON.parse(message);
         var obj = {
           channel : channel,
           message:message
         };
         io.emit("message",JSON.stringify(obj));
       });

      使用node app.js执行该服务或使用 pm2 方式

    • 2.3 js客户端页面 其他类型客户端类似
       // 网上有在线jquery和socket.io可用
       <script type="text/javascript" src="jquery.js"></script>
       <script type="text/javascript" src="socket.io.js"></script>
       <script type="text/javascript">
       $(function(){
           var socket = io.connect('http://ip:3000');
           socket.on('message', function (data) {
             console.log("接收到通知:"+data);
           });
       });
       </script>
  • 3 mqtt 服务器

    • 3.1 mqtt 安装所需
       npm install --save mqtt
       npm install --save mosca
       npm install --save ioredis
    • 3.2 新建 app.js

       // app.js
       var mosca = require('mosca');
       var mqtt = require('mqtt');
       var Redis = require('ioredis');
       var client = mqtt.connect('mqtt://127.0.0.1');
      
       var MqttServer = new mosca.Server({
         port: 1883
       });
      
       var redis = new Redis({
         port: 6379,          // Redis port
         host: '127.0.0.1',   // Redis host
         password: null,
         db: 0,
       });
      
       MqttServer.on('clientConnected', function (client) {
         console.log('client connected', client.id);
       });
      
       MqttServer.on('published', function (packet, client) {
         var topic = packet.topic;
         switch (topic) {
           case 'test':
             console.log('message-publish', packet.payload.toString());
             break;
           case 'other':
             console.log('message-other', packet.payload.toString());
             break;
         }
       });
      
       MqttServer.on('ready', function () {
         console.log('mqtt is running...');
       });
      
       redis.psubscribe('*', function (err, count) {});
      
       redis.on('pmessage', function (subscrbed, channel, message) {
         message = JSON.parse(message);
         client.publish('test', message, {qos: 0, retain: true});//监听到redis消息后,往通道 test 中发送消息
       });
      
       client.subscribe('test', {qos: 1});//订阅主题为test的消息
      
       client.on('message', function (top, message) {
         console.log('client2.message:', message);
       });

      使用node app.js执行该服务或使用 pm2 方式

    1. Laravel 中在需要执行的地方使用 event()
      event(new TestEvent("content", "channel_1"));
      也可以在输入php artisan tinker进入tinker后,输入
      event(new App\Events\TestEvent("content", "channel_1"));

初步接触 mqtt ,phpmqtt 碰壁较多,改用 nodejs 版 mqtt ,方便许多,记录一下。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!