开发者社区> 问答> 正文

小白学习IOT 第七课 MQTT服务器下发TOPIC到设备



在第四课中我们介绍过服务器下发TOPIC到设备,那时用的是CCP协议,这次我们用设备端的MQTT操作一次。由于在阿里IOT的架构中,MNS只是接收设备的消息并转发给服务器。所以如果要服务器给设备发送数据,需要通过相应服务端的SDK配置运行。下面为具体的操作步骤。


第一步:前几篇文章用的是20170124的SDK版本,由于官方SDK在5月份有更新,我们这回用最新的SDK来做演示,先下载20170511版本的SDK,然后解压编译。
客户端运行:
wget http://aliyun-iot.oss-cn-hangzhou.aliyuncs.com/aliyun-iot-device-sdk-c-2017-05-11.zip
unzip aliyun-iot-device-sdk-c-2017-05-11.zip
cd aliyun-iot-device-sdk-c-2017-05-11/
这里不需要改动编译配置选项,直接编译;
make,
在demo.c中更新我们自己的产品KEY,SECRET,设备名称和SECRET,然后重新编译DEMO。
cd examples/linux/ccp/
vi demo.c
make
在客户端运行我们的模拟设备程序,以方便查看是否有接收到服务端下发的TOPIC消息,
./demo


第二步:服务器端支持多种语言的SDK,这里以PHP版本的为例,先下载相关SDK,然后创建一个我们自己的php文件,用来调用和测试。
cd /usr/share/nginx/html/aliiot/
mkdir lesson7
cd lesson7
git clone https://github.com/aliyun/aliyun-openapi-php-sdk.git




这里有两个地方要注意的是:第一点是消息在发送前要用BASE64进行编码,所以在我们把消息字符串放到$MSGPAYLOAD变量后,用base64_encode函数做了一次BASE64编码,第二点是TOPIC消息的格式为产品名/设备名/消息名,如1000810/device1/get,所以我们在将产品KEY通过setProductKey接口配置后,还需要通过接口setTopicFullName来配置完成的TOPIC名称。详细的代码如下,首先在命令行运行下面的命令创建一个sendtopic.php文件,然后录入相关内容:
vi sendtopic.php
拷贝如下代码:
<?php
header("Content-type: text/html; charset=utf-8");
echo "<BODY BGCOLOR=\"#808080\">";
echo "<center>小白学习IOT 第七课<br>";
echo "MQTT协议服务器下发TOPIC到设备<br>";
echo "作者: XY15 STUDIO<hr>";
include_once 'aliyun-openapi-php-sdk/aliyun-php-sdk-core/Config.php';
include_once 'aliyun-openapi-php-sdk/aliyun-php-sdk-iot/Iot/Request/V20160530/PubRequest.php';


// 设置你的AccessKeyId/AccessSecret/ProductKey
$accessKeyId = "你自己的AK";
$accessSecret = "你自己的SK";
$iClientProfile = DefaultProfile::getProfile("cn-hangzhou", $accessKeyId, $accessSecret);
$client = new DefaultAcsClient($iClientProfile);


$request = new Iot\Request\V20160530\PubRequest();
$request->setProductKey(产品KEY);
$msgpayload='[这是来自服务器的一条消息。]';
$request->setMessageContent(base64_encode($msgpayload));
$request->setTopicFullName("/产品KEY/设备名称/get");//消息发送给哪个topic中.
$response = $client->getAcsResponse($request);
echo '发送请求ID号:'.$response->RequestId.'<br>';
if($response->Success==1)
echo '发送成功。<br>';
else
    echo '发送失败:'.$response->Success;
echo '</center>';
//print_r("<br>");
//print_r($response);


?>


第三步:在浏览器中打开指向sendtopic.php的网页,这里演示的链接为: http://www.xunyun17.xyz/aliiot/lesson7/sendtopic.php,来检查一下我们的程序运行是否正确:


第四步:查看模拟设备终端是否收到消息。




附件:


timelapse:
http://xunyun17.xyz/iottimelapse/lesson7.mp4



展开
收起
洵云 2017-08-05 08:44:01 7516 0
5 条回答
写回答
取消 提交回答
  • les
    Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
    现在没有productsecret了吧,行不通了

    -------------------------

    Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
    但是你使用的demo还是老版本的吧,需要productsecret
    2018-01-03 02:25:45
    赞同 展开评论 打赏
  • Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
    节点改为上海返回的信息

    -------------------------

    Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
    搞定了,是我们的PubRequet引用的路径错了。
    2017-11-02 13:24:40
    赞同 展开评论 打赏
  • Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
    把cn-hangzhou改成cn-shanghai

    发送失败

    -------------------------

    Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
    参考版主的第七课和官方skd修改了下
    echo "2" 未执行到这一行.

    <?php
    // 5.5.9-1ubuntu4.22

    header("Content-type: text/html; charset=utf-8");
    echo "<BODY BGCOLOR=\"#808080\">";
    echo "<center>小白学习IOT xu_pub<br>";
    echo "MQTT协议服务器下发TOPIC到设备<br>";
    echo "作者: XY15 STUDIO<hr>";

    include_once './aliyun-openapi-php-sdk/aliyun-php-sdk-core/Config.php';
    use \Iot\Request\v20170420 as Iot;
    // 设置你的AccessKeyId/AccessSecret/ProductKey
    $accessKeyId = "xxx";
    $accessSecret = "xxx";
    $iClientProfile = DefaultProfile::getProfile("cn-shanghai", $accessKeyId, $accessSecret);
    $client = new DefaultAcsClient($iClientProfile);
    echo '1<br>';

    // pub数据到设备
    $request = new Iot\PubRequest();
    echo '2<br>';
    $request->setProductKey("WTbJ0ETJaxx");
    $request->setMessageContent("aGVsbG93b3JsZA="); //hello world Base64 String.
    $request->setTopicFullName("/WTbJ0ETJaxx/device_01/data"); //消息发送到的Topic全名.
    $request->setQos(0);
    $response = $client->getAcsResponse($request);
    print_r($response);

    ?>

    2017-09-05 16:57:37
    赞同 展开评论 打赏
  • 目前华东2节点的PHP SDK代码,官方正在开发中,预计这个月会发布。

    -------------------------

    返回什么错误信息,提交工单问一下?

    -------------------------

    返回什么错误信息吗?

    -------------------------

    产品只有ProductKey,设备才有secret

    -------------------------

    恩,应该是的

    2017-08-06 16:06:19
    赞同 展开评论 打赏
  • Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
    版主, 可否做一个华东2站点的 PHP_服务器 发送信息给设备  的例子,
    2017-08-06 11:27:06
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
RocketMQ Client-GO 介绍 立即下载
RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载
基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载