无需Firebase等外部云,本地PHP实现Android推送教程求助
无需外部云服务,本地PHP向Android发推送的实现方案
嘿,我之前刚好做过类似的需求,完全不用依赖Firebase、OneSignal这类第三方云服务,我们可以用自建MQTT服务来实现——它轻量稳定,特别适合移动端推送场景。下面给你拆解具体实现步骤:
整体逻辑
整个流程需要三个核心部分:
- 本地部署MQTT Broker(消息中转中心),负责传递推送消息
- Android客户端订阅指定主题,保持和Broker的长连接
- 本地PHP脚本作为消息发布者,向Broker推送内容,再由Broker转发给Android客户端
具体实现步骤
第一步:部署本地MQTT Broker
我推荐用Eclipse Mosquitto,这是个开源轻量的MQTT Broker,部署超简单:
- 下载安装:根据你的系统(Windows/macOS/Linux)下载对应安装包,安装完成后启动服务
- Windows:在系统服务里找到
Mosquitto Broker启动即可 - Linux:执行命令
sudo systemctl start mosquitto
- Windows:在系统服务里找到
- 验证运行:打开两个终端,第一个输入
mosquitto_sub -t test,第二个输入mosquitto_pub -t test -m "hello",如果第一个终端能收到消息,说明Broker正常工作。
第二步:Android客户端实现MQTT订阅
我们用Eclipse Paho的Android客户端库来连接Broker,代码示例如下:
- 在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' }
- 在
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>
- 编写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); } }
- 在Activity中初始化Helper:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new MqttPushHelper(this); }
第三步:本地PHP脚本实现消息发布
我们用phpMQTT库来实现PHP端的消息推送:
- 下载
phpMQTT.php源码,放到你的PHP项目目录中 - 编写推送脚本:
<?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和服务状态!"; } ?>
- 运行脚本:可以通过浏览器访问该PHP文件,或者用命令行执行
php push_notification.php,Android客户端就能收到推送通知了。
注意事项
- 确保Android设备和PHP服务器在同一局域网内,若需要外网推送,需给Broker所在机器配置端口映射
- 若要提升安全性,可以给MQTT Broker设置用户名密码,并启用SSL/TLS加密
- Android端建议用前台服务保持MQTT连接,避免被系统后台杀死
内容的提问来源于stack exchange,提问作者Doblist Doblist
相关产品推荐
相关产品推荐

