开发者社区> 问答> 正文

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

因为打算写个系列教程,前面的4篇整理下为第0课到第3课,本文为第四课。
上一次我们介绍了如何从设备通过MNS向服务器发送TOPIC消息数据,这回我们看看服务器如何向设备发送TOPIC消息。由于在阿里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/
vi make.settings
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 lesson4
cd lesson4
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 "服务器下发TOPIC到设备<br>";
echo "日期: 2017年7月16号<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/lesson4/sendtopic.php,来检查一下我们的程序运行是否正确:


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




附件:
timelapse: http://xunyun17.xyz/iottimelapse/lesson4.mp4







展开
收起
洵云 2017-07-15 05:38:26 5010 0
1 条回答
写回答
取消 提交回答
  • TA有点害羞,没有介绍自己...
    2017-07-20 18:31:00
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
ST + AliOS > Smart IoT ! 立即下载
IOT赋能旅行场景的实践与展望 立即下载
阿里云IoT物联网市场暨合作伙伴计划发布 立即下载