前两篇介绍了CCP协议中的RPC&RRPC通信,因为CCP协议分两块:RPC&RRPC和PUB&SUB,关于PUB和SUB的全名分别是PUBLISH和SUBSCRIBE, 中文名的话就叫发布和订阅。通俗的理解, 我觉得可以像我们小时候订报纸或者杂志,发布就是做为作者在报刊杂志被允许定期或不定期发表文章,订阅就是我们读者定期收到报社杂志社的刊物或者能阅读某个专栏的文章,而在阿里IOT的范畴内,报社杂志社就好比这个阿里IOT的大平台,每个TOPIC就类似某种报纸杂志或者某个专栏,而我们读者或作者就是这个IOT生态圈里的某类产品下的一个特定设备。这样说应该好理解一些了吧,比如某个设备对某个TOPIC感兴趣,它就先要像服务器申请订阅这个TOPIC,那么以后如果关于这个TOPIC的信息,如果有更新,服务器就会发送给订阅的这个设备。而如果某个设备打算把自己的状态或相关信息让其他设备或服务器知道,它就可以通过发布的方式,放到相关的TOPIC上面。这次我们先来介绍下发布【PUB】的具体实现。
在阿里IOT上,TOPIC一般默认定义有三种TOPIC:GET,UPDATE,ERROR,分别对应接受信息,上报信息和上报错误异常,当然我们也可以创建新的设备特有的TOPIC。根据这个三个TOPIC的解释,我们也可以猜到他们的通信方向或权限应该是订阅,发布,发布。通过IOT控制台查看也确实是这样:
而按照阿里IOT平台的架构,设备要发布信息到服务器上需要通过MNS消息服务,所以我们先要开通消息服务,在阿里云主页产品一项下18个大类产品中应用服务中选择消息服务,也就是第一列的最下面一类,然后点击立即开通。
而在服务器一端,我们同样需要做一些配置,消息服务分为队列和TOPIC两种,我们先来看看队列是如何操作。在控制台页面的服务端订阅一栏中,点击配置,然后选择设备信息上报,然后保存,配置好后,要记住右边队列的名字,最好拷到记事本中,因为我们后面会用到这个值:
下一步,是获取消息队列的ENDPOINT,在消息队列的控制台页面,点击队列一栏,点击获取ENDPOINT,在弹出来的信息框中复制第一行的链接;
相关的准备过程完了以后,我们就可以开始修改代码了。先修改设备一端的。
修改aliyun-iot-device-sdk-c-2017-01-24exampleslinuxccp目录下的demo.c文件:
将273行
strncpy(subscribe.topics[0], TOPIC_GET, sizeof(subscribe.topics[0]) - 1);
改为
strncpy(subscribe.topics[0], TOPIC_UPDATE, sizeof(subscribe.topics[0]) - 1);
将287行的
publish.payload = (unsigned char *)"{"message":"hello,world."}";
内容改为hello,queue.
publish.payload = (unsigned char *)"{"message":"hello,queue."}";
然后在命令行运行make clean;make;demo
看看结果,我们设备发的信息,自己可以接收到
下一步,我们修改服务器端的代码,让服务器也能收到并且显示设备发送的消息:
在服务器上运行wget HTTP://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/32381/cn_zh/1496733042815/aliyun-mns-php-sdk-1.3.5.zip,
然后解压:unzip aliyun-mns-php-sdk-1.3.5.zip,
进入例子目录: cd php_sdkSamplesQueue
CreateQueueAndSendMessage.php这个文件有创建队列,发送消息,接收消息,删除消息和删除队列5步,因为我们现在先做接收消息的功能,去掉发送消息的第二步,然后在103行左右输入我们的AK,SK和ENDPOINT。
$accessId = "";
$accessKey = "";
$endPoint = "";
在25行左右改为我们队列的名字
$queueName = "CreateQueueAndSendMessageExample";
改成:
$queueName = "aliyun-iot-1000188705";
在接收消息的那块,添加代码如下,把收到的JSON格式数据转成数组,并且显示出里面的TOPIC和PAYLOAD信息,由于PAYLOAD是用BASE64有编码了一层,所以对于payload还要加上base64的解码:
$jd=json_decode($body);
$topic = "topic is :".$jd->topic;
$payload = "payload is :".base64_decode($jd->payload);
echo $topic."<br>";
echo $payload."<br>";
保存退出,再在浏览器运行一下,然后运行设备模拟程序,在看浏览器的结果。由于这个例子的php文件收消息是30秒之内,所以足够我们设备发消息。
附件为相关代码:
lesson3.rar (4 K) 下载次数:1
timelapse视频:
HTTP://www.xunyun17.xyz/aliiot/lesson3/lesson3.mp4