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协议。有空再单独写一篇关于移动终端消息推送整体架构及选型的方案