阿里云
1024开发者盛宴之Java专家问答专场
发表主题 回复主题
  • 1353阅读
  • 1回复

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

级别: 论坛版主
发帖
1966
云币
4134
因为打算写个系列教程,前面的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,来检查一下我们的程序运行是否正确:


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




附件: lesson4.rar (4 K) 下载次数:32
timelapse: http://xunyun17.xyz/iottimelapse/lesson4.mp4







[ 此帖被魔咒626在2018-06-10 10:48重新编辑 ]
级别: 论坛版主
发帖
131
云币
622
只看该作者 沙发  发表于: 2017-07-20
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
验证问题: ECS是阿里云提供的什么服务? 正确答案:云服务器
上一个 下一个