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

results matching ""

    No results matching ""