Android消息推送的服务端

2、Android消息推送

MQTT服务器采用mosquito  http://mosquitto.org/

PHP管理包采用phpmqttclient:https://github.com/tokudu/PhpMQTTClient

 

2.1、mosquito安装

cd /etc/yum.repos.d

wget http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-5/home:oojah:mqtt.repo

yum update

yum install mosquitto

 

2.2、mosquito命令行使用

mosquito安装主要包含三个部分:

mosquitto mosquitto服务器主程序,实现了MQTT协议

mosquitto_pub mosquitto发布消息的命令行程序

mosquitto_sub mosquitto订阅消息的命令行程序

 

启动mosquitto在前台运行

mosquitto

启动mosquitto在后台运行

mosquitto -d

启动订阅:

mosquitto_sub -t hello/world //订阅topic为hello/world的消息,使用默认地址和端口1883

发布消息

mosquitto_pub -t hello/world -m “hello,world” //发布topic 为hello/world的消息 “hello,world”

 

更多mosquitto命令可以参考

http://mosquitto.org/documentation/

 

2.3、PhpMQTTClient安装

2.3.1、从https://github.com/tokudu/PhpMQTTClient 下载

将tokudu-PhpMQTTClient-ba4e494/tokudu-PhpMQTTClient-ba4e494拷贝到服务器对应目录下

假设为/var/www/html/mqtt,可以通过http://host:port/mqtt访问phpmqttclient

2.3.2、将index.php的$result = $conn->connect(SAM_MQTT, array(SAM_HOST => ’127.0.0.1′, SAM_PORT => 1883));   修改为

$result = $conn->connect(SAM_MQTT, array(‘SAM_HOST’ => ’127.0.0.1′, ‘SAM_PORT’ => 1883));

备注:如果phpmqttclient的http服务器与mosquitto没有安装在同一台服务器,注意将index.php中的127.0.0.1和send_mqtt.php修改成mosquitto的ip地址

2.3.3、将SAM/MQTT/sam_mqtt.php的SAM_PORT和SAM_HOST也都加上”

if ($options[‘SAM_PORT‘] == ”) {

$this->port = 1883;

} else {

$this->port = $options[‘SAM_PORT‘];

}

if ($options[‘SAM_HOST‘] == ”) {

$this->host = ‘localhost’;

} else {

$this->host = $options[‘SAM_HOST‘];

 

2.3.4、服务器测试,测试PhpMQTTClient安装成功

启动mosquitto在前台运行,以方便获取连接客户端的信息

mosquitto

 

在服务器另外一终端上启动订阅消息的进程,订阅所有tokudu开头topic

mosquitto_sub  –t  tokudu /+

注意,此处之所以要使用tokudu,可以看index.php的182行          var target = ‘tokudu/’ + $(‘#messageTarget’).val();

在mosquitto的终端获得mosquitto_sub客户端的id

1350006978: New client connected from 127.0.0.1 as mosqsub/8491-localhost..

 

访问http://host:port/mqtt ,push notification target字段填写8491-localhost,push notification text填写需要推送的测试消息

在在mosquitto的终端查看是否收到了推送的消息,如果收到,说明phpmqttclient已经安装配置成功

 

2.3.5、android Demo程序安装

https://github.com/tokudu/AndroidPushNotificationsDemo 下载Android客户端例子,安装到Android,启动后获取客户端的Device Target

 

2.3.6、先客户端推送消息

访问http://host:port/mqtt ,push notification target字段填写Android客户端的Device Target,push notification text填写需要推送的测试消息

 

2.4、问题

1、需要在客户端增加向服务器端上报Device Target的通信报文,服务器端获取客户端的设备信息后存入到数据库中。需要发送消息时候从设备信息表中获取Device Target,然后调用推送接口发送消息,可参考send_mqtt.php

2、消息队列的持久化及轮询机制,初期可存放到数据库中(参考easy apns),后期放到NOSQL数据库中。需要程序轮询消息队列,获取mosquitto消息队列状态、对未成功发送的消息重试等

3、大批量消息推送:可能的瓶颈应该主要在mosquitto的处理性能 ,由于是使用C++写的,性能应该可以支撑需要,可以先通过调整mosquitto.conf参数来优化mosquitto的性能。

4、除了MQTT+Mosquitto外,Apache ActiveMQ/Apollo+MQTT也是值得考虑的方案,ActiveMQ 5.6开始也支持MQTT协议了

5、之所以选择MQTT而非XMPP协议,可以参考 http://slidesha.re/PrXJvb,值得注意的Facebook Messenger也采用了MQTT协议。有空再单独写一篇关于移动终端消息推送整体架构及选型的方案

Android消息推送的服务端

上一篇:实现微信浏览器内打开App Store链接


下一篇:CSS中的一些细节