You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需Firebase等外部云,本地PHP实现Android推送教程求助

无需外部云服务,本地PHP向Android发推送的实现方案

嘿,我之前刚好做过类似的需求,完全不用依赖Firebase、OneSignal这类第三方云服务,我们可以用自建MQTT服务来实现——它轻量稳定,特别适合移动端推送场景。下面给你拆解具体实现步骤:

整体逻辑

整个流程需要三个核心部分:

  1. 本地部署MQTT Broker(消息中转中心),负责传递推送消息
  2. Android客户端订阅指定主题,保持和Broker的长连接
  3. 本地PHP脚本作为消息发布者,向Broker推送内容,再由Broker转发给Android客户端

具体实现步骤

第一步:部署本地MQTT Broker

我推荐用Eclipse Mosquitto,这是个开源轻量的MQTT Broker,部署超简单:

  • 下载安装:根据你的系统(Windows/macOS/Linux)下载对应安装包,安装完成后启动服务
    • Windows:在系统服务里找到Mosquitto Broker启动即可
    • Linux:执行命令sudo systemctl start mosquitto
  • 验证运行:打开两个终端,第一个输入mosquitto_sub -t test,第二个输入mosquitto_pub -t test -m "hello",如果第一个终端能收到消息,说明Broker正常工作。

第二步:Android客户端实现MQTT订阅

我们用Eclipse Paho的Android客户端库来连接Broker,代码示例如下:

  1. 在Module级别的build.gradle添加依赖:
dependencies {
    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
}
  1. 在AndroidManifest.xml添加权限和服务:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<application>
    <service android:name="org.eclipse.paho.android.service.MqttService" />
</application>
  1. 编写MQTT连接与消息接收代码:
import android.content.Context;
import android.os.Build;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.NotificationChannel;
import androidx.core.app.NotificationCompat;
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.*;

public class MqttPushHelper {
    private MqttAndroidClient mqttClient;
    private final String brokerUri = "tcp://你的本地IP:1883"; // 替换成你的Broker局域网IP,比如192.168.1.105
    private final String clientId = "AndroidPushClient-" + System.currentTimeMillis();
    private final String pushTopic = "android/local/push"; // 自定义订阅主题

    public MqttPushHelper(Context context) {
        mqttClient = new MqttAndroidClient(context, brokerUri, clientId);
        setMqttCallback(context);
        connectToBroker();
    }

    private void setMqttCallback(Context context) {
        mqttClient.setCallback(new MqttCallbackExtended() {
            @Override
            public void connectComplete(boolean reconnect, String serverURI) {
                // 连接成功后订阅主题
                try {
                    mqttClient.subscribe(pushTopic, 0);
                } catch (MqttException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void connectionLost(Throwable cause) {
                // 连接断开时可实现自动重连逻辑
            }

            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
                // 收到推送消息,展示到通知栏
                String pushContent = new String(message.getPayload());
                showNotification(context, "本地推送", pushContent);
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {}
        });
    }

    private void connectToBroker() {
        MqttConnectOptions options = new MqttConnectOptions();
        options.setAutomaticReconnect(true);
        options.setCleanSession(false);

        try {
            mqttClient.connect(options, null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    // 连接成功的额外处理
                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    // 连接失败的异常处理
                }
            });
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    private void showNotification(Context context, String title, String content) {
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        
        // Android 8.0以上需要创建通知渠道
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(
                "local_push_channel", 
                "本地推送", 
                NotificationManager.IMPORTANCE_DEFAULT
            );
            notificationManager.createNotificationChannel(channel);
        }

        Notification notification = new NotificationCompat.Builder(context, "local_push_channel")
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(title)
                .setContentText(content)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .build();

        notificationManager.notify(1, notification);
    }
}
  1. 在Activity中初始化Helper:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new MqttPushHelper(this);
}

第三步:本地PHP脚本实现消息发布

我们用phpMQTT库来实现PHP端的消息推送:

  1. 下载phpMQTT.php源码,放到你的PHP项目目录中
  2. 编写推送脚本:
<?php
require("phpMQTT.php");

$brokerIp = "你的本地IP"; // 和Android端的Broker IP保持一致
$port = 1883;
$clientId = "PHPPushClient-" . rand(); // 生成唯一客户端ID
$username = ""; // 如果Broker没设置账号密码,留空即可
$password = "";
$pushTopic = "android/local/push"; // 和Android订阅的主题一致
$pushContent = "这是来自本地PHP的测试推送!";

$mqtt = new phpMQTT($brokerIp, $port, $clientId);

if ($mqtt->connect(true, NULL, $username, $password)) {
    $mqtt->publish($pushTopic, $pushContent, 0);
    $mqtt->close();
    echo "推送消息发送成功!";
} else {
    echo "连接MQTT Broker失败,请检查IP和服务状态!";
}
?>
  1. 运行脚本:可以通过浏览器访问该PHP文件,或者用命令行执行php push_notification.php,Android客户端就能收到推送通知了。

注意事项

  • 确保Android设备和PHP服务器在同一局域网内,若需要外网推送,需给Broker所在机器配置端口映射
  • 若要提升安全性,可以给MQTT Broker设置用户名密码,并启用SSL/TLS加密
  • Android端建议用前台服务保持MQTT连接,避免被系统后台杀死

内容的提问来源于stack exchange,提问作者Doblist Doblist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:49:30