MQTT服务使用说明
1. 简介
MQTT 是轻量级基于代理的发布/订阅的消息传输协议,设计思想开放、简单、轻量、易于实现。由于规范很简单,非常适合需要低功耗和网络带宽有限的IoT场景。该协议的主要特点有: 1、使用发布/订阅消息模式,方便消息在传感器之间传递。 2、允许用户动态创建主题,零运维成本。 3、把低带宽、高延迟、不稳定的网络等因素考虑在内。 4、支持连续的会话控制。 5、把传输量降到最低以提高传输效率。
2. 版本
当前订阅的MQTT服务的版本:1.0
3. 订阅及使用说明
1 参考寄云应用开发与数据分析平台使用手册完成MQTT服务的订阅,订阅过程中,可以输入MQTT服务的服务名称。
完成服务订阅后,可以通过服务详情页面,了解服务的具体信息。
2 MQTT服务与应用绑定
寄云应用开发与数据分析平台能够提供应用绑定服务的能力,在完成绑定后,将把服务相关的环境变量注入到应用实例中去(绑定的详细操作过程,请参见使用手册),在应用开发的过程中,直接使用这些环境变量即可实现对MQTT服务的访问和操作。
绑定后注入应用的环境变量包括:
XXXX(服务名)_ MQTT _IP:MQTT服务的IP地址或URL
XXXX(服务名)_ MQTT _PORT:MQTT服务的端口
XXXX(服务名)_ MQTT _USER:MQTT用户名
XXXX(服务名)_ MQTT _PASSWORD:MQTT用户密码
XXXX(服务名)_ MQTT _TOPICS:MQTT用户Topic
VCAP_SERVICES:MQTT服务连接信息
3 MQTT服务使用
使用HiveMQ网页客户端测试
通过HiveMQ的网页测试客户端,可以完成MQTT消息发布和订阅的测试。
HiveMQ网页测试客户端URL:http://www.hivemq.com/demos/websocket-client
打开网页后,将MQTT服务详情页面的相关参数配置到页面中。示例如下:(注:由于该测试页面使用了websocket协议,故端口为8083)
配置完成后,点击连接按钮,即可连接到MQTT服务中。
选择增加订阅新的Topic按钮,然后输入MQTT服务的Topic名称,即可完成消息订阅工作。
在Publish窗口中设置相关的Topic,然后输入新的消息,点击Publish按钮,即可发送消息,同时,在消息窗口,可以看到刚刚发送的消息内容。
在PHP应用中使用MQTT服务示例:
通过GitHub获取PHP客户端代码,URL如下:
https://github.com/sskaje/mqtt
完成代码部署后,根据MQTT服务的参数,修改test目录下的test.inc.php文件:
<?php
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require(__DIR__ . '/../vendor/autoload.php');
} else {
require(__DIR__ . '/../autoload.example.php');
}
$MQTT_SERVER = 'tcp://mqtt.neuseer.com:1883/';
根据MQTT服务的参数,修改test/subscribe/目录下的subscribe.php文件:
<?php
require(__DIR__ . '/../test.inc.php');
use \sskaje\mqtt\MQTT;
use \sskaje\mqtt\Debug;
use \sskaje\mqtt\MessageHandler;
$mqtt = new MQTT($MQTT_SERVER);
$context = stream_context_create();
$mqtt->setSocketContext($context);
////Debug::Enable();
$mqtt->setAuth('uuG15F07fy', 'kZNa5tUZdl9rRvBF');
$mqtt->setKeepalive(10);
$connected = $mqtt->connect();
if (!$connected) {
die("Not connected\n");
}
$topics['Topic_uuG15F07fy'] = 2;
$mqtt->subscribe($topics);
#$mqtt->unsubscribe(array_keys($topics));
class MySubscribeCallback extends MessageHandler
{
public function publish(MQTT $mqtt, sskaje\mqtt\Message\PUBLISH $publish_object)
{
printf(
"\e[32mI got a message\e[0m:(msgid=%d, QoS=%d, dup=%d, topic=%s) \e[32m%s\e[0m\n",
$publish_object->getMsgID(),
$publish_object->getQoS(),
$publish_object->getDup(),
$publish_object->getTopic(),
$publish_object->getMessage()
);
}
}
$callback = new MySubscribeCallback();
$mqtt->setHandler($callback);
根据MQTT服务的参数,修改test/publish_sync/qos0.php文件:
<?php
require(__DIR__ . '/../test.inc.php');
ini_set('error_log', __DIR__ . '/../../logs/examples_publish.log');
use \sskaje\mqtt\MQTT;
use \sskaje\mqtt\Debug;
$mqtt = new MQTT($MQTT_SERVER);
# Set Socket Context
$context = stream_context_create();
$mqtt->setSocketContext($context);
# Set Connect Will
$mqtt->setWill(
'sskaje/will',
'Ciao~',
0,
0
);
Debug::Enable();
Debug::SetLogPriority(Debug::NOTICE);
$mqtt->setAuth('uuG15F07fy', 'kZNa5tUZdl9rRvBF');
$connected = $mqtt->connect();
if (!$connected) {
die("Not connected\n");
}
$msg = str_repeat('1234567890', 1);
Debug::Log(Debug::INFO, "QoS=0");
$c = 0;
do {
# mosquitto_sub -t 'sskaje/#' -q 1 -h test.mosquitto.org
`_**$mqtt->publishsync('Topic_uuG15F07fy', $msg, 0, 0);`**
echo "======== QoS=0, Count={$c}\n";
#sleep(1);
} while (++$c < 100);
修改完成后,先运行subscribe.php,在另外一个终端中再运行qos0.php,即可在运行subscribe.php的窗口看到相关的消息。
此外MQTT协议还提供了众多的客户端库,详情参见https://github.com/mqtt/mqtt.github.io/wiki/libraries