介绍完设备和服务器之间的上报和下发通信,这一节课,我们介绍一下设备之间的通信,这要用到IOT套件中的规则引擎了。说到规则引擎,有必要简单介绍一下便于后面容易理解和操作,规则引擎顾名思义,是一套定义的规则对输入进行分析处理后再转到输出,规则这里定义的是使用SQL语句对输入进行过滤,而引擎的含义,笔者理解的是将SQL语句的分析结果转发到输出,目前IOT套件的规则引擎可以转发到五个地方:设备的另一个主题,存储表格,DATAHUB,RDS和MNS。我们这里先做一个稍微简单的操作示例,便于读者理解,我们打算要做的是把一个设备发出来的主题转到另一个设备的接收主题中,所以规则引擎的输入SQL语句基本没有过滤,而规则引擎的输出则用到第一种,转发到另一个设备的主题。好了,let's go,让我们动手开始操作吧:
首先在网页控制台创建两个设备,然后在记事本上记下设备的名称和SECRET,后面要用到,类似下面格式:
DEVICE1
MyIeFYt7HYNTyxdwiydjtF9N1LUMovqa
DEVICE2
it78l2JJU3e3kCtn2fojE18ju8ZmmE7T
然后就是在规则引擎中添加规则了,在IOT套件的规则引擎一栏中,点击右上方的创建规则按钮,规则名称输入:设备间转发,规则描述输入:设备1的TOPIC:update转发到设备2的TOPIC:get。创建完规则,点击右方的管理,进入规则详细信息的配置,处理数据的SQL语句中,字段填入*,表示我们选择所有字段,Topic一项,我们输入DEVICE1/update,表示接收设备一的UPDATE主题。条件一项为空,表示对所有输入分析。在转发数据一块,点击添加方法,选择方法一项选择发布到另一个TOPIC,TOPIC后面一项,输入DEVICE2/get,表示转发到设备二的GET主题。配置完规则引擎,退到上一页,点击右边的启动,这时可以看到我们新加的规则引擎状态已经变为运行中了。
最后就是修改我们模拟设备端的代码了。如前几课一样,显示下载设备端的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
这里,我们要用到两个模拟设备,所以把SDK例子中的demo拷贝为device1,device2,然后删除原有的demo文件,同时要把makefile也分别拷贝为makefile1和makefile2,使得我们的模拟设备1和2可以编译:
cd examples/linux/mqtt/
cp demo.c device1.c
cp makefile makefile1
cp demo.c device2.c
cp makefile makefile2
rm demo demo.c makefile
先修改设备1,填入我们设备的相关参数,然后修改消息为‘这是来自设备1的一条消息’
vi device1.c
#define PRODUCT_KEY "产品KEY"
#define PRODUCT_SECRET "产品SECRET"
#define DEVICE_NAME "设备1的名称"
#define DEVICE_SECRET "设备1S的SECRET"
sprintf(buf, "{\"message\":\"Hello World\"}");这一行改为:
sprintf(buf, "{\"消息\":\"这是来自设备1的一条消息\"}");
vi makefile1
设备一的makefile1文件相关demo的名称改为device1,编译设备一的代码:
make -f makefile1
修改设备2的代码
vi device2.c
填入设备2相关参数,修改接收消息为‘设备2接收到的消息:’
#define PRODUCT_KEY "产品KEY"
#define PRODUCT_SECRET "产品SECRET"
#define DEVICE_NAME "设备1的名称"
#define DEVICE_SECRET "设备1S的SECRET"
printf("Message : %s\n", msg);这一行改为:
printf("设备2接收到的消息 : %s\n", msg);
然后修改设备二的makefile2文件,把demo相关的名称改为device2
vi makefile2
然后编译设备2代码
make -f makefile2
最后,将设备二运行在后台,用于接收消息,设备一后运行用于发送消息,我们编译一个shell脚本来实现,内容如下两行:
vi r.sh
./device2&
./device1
最后修改脚本的权限,然后运行脚本,查看运行结果:
chmod 777 r.sh
./r.sh
附件:
TIMELAPSE :
http://xunyun17.xyz/iottimelapse/lesson8.mp4
-------------------------
-------------------------
-------------------------
${deviceName}这个换成实际的设备名城啊
-------------------------
这种需求感觉不太符合 iot的结构,因为终端设备往往是执行部件,不需要知道其他设备的状态,如果要做可以在服务端加入接收topic和转发topic的逻辑。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。