阿里云
向代码致敬,寻找你的第83行
发表主题 回复主题
  • 1637阅读
  • 12回复

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

级别: 论坛版主
发帖
1953
云币
4108



在第四课中我们介绍过服务下发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,来检查一下我们的程序运行是否正确:


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




附件:
attach.rar (4 K) 下载次数:31

timelapse:
http://www.xunyun17.xyz/aliiot/lesson7/lesson7.mp4



级别: 新人
发帖
5
云币
5
只看该作者 沙发  发表于: 2017-08-06
Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
版主, 可否做一个华东2站点的 PHP_服务器 发送信息给设备  的例子,
级别: 论坛版主
发帖
1953
云币
4108
只看该作者 板凳  发表于: 2017-08-06
目前华东2节点的PHP SDK代码,官方正在开发中,预计这个月会发布。
级别: 新人
发帖
6
云币
8
只看该作者 地板  发表于: 2017-09-05
Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
把cn-hangzhou改成cn-shanghai

发送失败
级别: 论坛版主
发帖
1953
云币
4108
只看该作者 4楼 发表于: 2017-09-06
返回什么错误信息,提交工单问一下?
级别: 新人
发帖
6
云币
8
只看该作者 5楼 发表于: 2017-09-06
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);

?>

级别: 论坛版主
发帖
1953
云币
4108
只看该作者 6楼 发表于: 2017-09-07
返回什么错误信息吗?
级别: 新人
发帖
9
云币
15
只看该作者 7楼 发表于: 2017-11-02
Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
节点改为上海返回的信息
级别: 新人
发帖
9
云币
15
只看该作者 8楼 发表于: 2017-11-02
Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
搞定了,是我们的PubRequet引用的路径错了。
级别: 新人
发帖
2
云币
2
只看该作者 9楼 发表于: 01-03
Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
现在没有productsecret了吧,行不通了
级别: 论坛版主
发帖
1953
云币
4108
只看该作者 10楼 发表于: 01-03
产品只有ProductKey,设备才有secret
级别: 新人
发帖
2
云币
2
只看该作者 11楼 发表于: 01-04
Re小白学习IOT 第七课 MQTT服务器下发TOPIC到设备
但是你使用的demo还是老版本的吧,需要productsecret
级别: 论坛版主
发帖
1953
云币
4108
只看该作者 12楼 发表于: 01-09
恩,应该是的
发表主题 回复主题
« 返回列表上一主题下一主题

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