在第四课中我们介绍过服务器下发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
-------------------------
-------------------------
-------------------------
-------------------------
返回什么错误信息,提交工单问一下?
-------------------------
返回什么错误信息吗?
-------------------------
产品只有ProductKey,设备才有secret
-------------------------
恩,应该是的
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。