2、Android消息推送php
MQTT服務器採用mosquito http://mosquitto.org/html
PHP管理包採用phpmqttclient:https://github.com/tokudu/PhpMQTTClientandroid
2.1、mosquito安裝git
cd /etc/yum.repos.dgithub
wget http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-5/home:oojah:mqtt.repo數據庫
yum update服務器
yum install mosquitto架構
2.2、mosquito命令行使用ide
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、問題
一、須要在客戶端增長向服務器端上報Device Target的通訊報文,服務器端獲取客戶端的設備信息後存入到數據庫中。須要發送消息時候從設備信息表中獲取Device Target,而後調用推送接口發送消息,可參考send_mqtt.php
二、消息隊列的持久化及輪詢機制,初期可存放到數據庫中(參考easy apns),後期放到NOSQL數據庫中。須要程序輪詢消息隊列,獲取mosquitto消息隊列狀態、對未成功發送的消息重試等
三、大批量消息推送:可能的瓶頸應該主要在mosquitto的處理性能 ,因爲是使用C++寫的,性能應該能夠支撐須要,能夠先經過調整mosquitto.conf參數來優化mosquitto的性能。
四、除了MQTT+Mosquitto外,Apache ActiveMQ/Apollo+MQTT也是值得考慮的方案,ActiveMQ 5.6開始也支持MQTT協議了
五、之因此選擇MQTT而非XMPP協議,能夠參考 http://slidesha.re/PrXJvb,值得注意的Facebook Messenger也採用了MQTT協議。有空再單獨寫一篇關於移動終端消息推送總體架構及選型的方案