IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]物联网及NodeRed 技术讲解及动手实践活动分享

    testcs_dn发表于 2016-12-04 20:05:32
    love 0

    在上篇文章“IBM Bluemix 中文公众版初体验”中提到昨天又参加了“物联网及NodeRed 技术讲解及动手实践 ”活动,这里把活动学习的内容分享给大家。通过昨天的学习,对MQTT有了更深的了解,学会如何使用Nodejs将数据发送到物联网平台上,学会如何使用NodeRed像拼积木一样查看传上来的设备数据。为大家做分享的是IBMGCG 的技术“旗帜”詹海萍总经理。早些年,詹总主管大中华区的软件技术团队很多年,后来又去国外实验室10多年,有雄厚的技术背景和丰富的应用经验。

    需要了解或学习的技术

    1、IBM Bluemix 账号

    中国版: https://console.chinabluemix.net/

    国际版:https://console.ng.bluemix.net/

    2、物联网(IoT) 

    我有一些相关的文章大家可以了解一下:http://blog.csdn.net/testcs_dn/article/category/6420588

    3、Node.js

    关于环境的配置请参考:http://blog.csdn.net/testcs_dn/article/category/6072291

    4、MQTT

    MQTT 已经快20年了,可靠、不需要那么长的Header,省电省带宽。

    稍后把相关资料传上来提供下载。

    5、Node-RED

    Node-RED是一个独立应用,适合做可视化的流程控制,只要有Node环境就可以了。

    网站:http://nodered.org/

    Github:https://github.com/node-red/node-red

    创建Node-RED应用程序

    基于样板创建就可以了。


    输入应用程序名称,其它保持默认,点击“创建”按钮。


    稍等一会你将看到下面的页面,显示您的应用程序正在运行,点击查看应用程序


    点击“Go to your Node-RED flow editor”打开一个在线的编辑器


    会看到下面的界面:


    这一步就到这里就可以了,后面再来介绍它的使用。

    创建 Internet of Things Platform 服务

    点击目录,然后在左侧选择Internet of Things,点击 Internet of Things Platform 服务


    服务名称可以保持默认的,你也可以输入一个


    拖动滚动条到下面,套餐选择免费,然后点击创建


    创建完成后,点击启动仪表板


    鼠标移动到左侧菜单,选择设备


    点击添加设备按钮


    首次应用需要先创建设备类型



    输入设备名称,然后点击下一步


    现在很多使用默认项就可以,以后管理自己真实的设备时,最好都填上。


    下一步


    创建


    设备类型添加完成之后,选择设备类型,下一步


    输入设备标识,最好英文半角字符,不要超过23个字符,下一步


    保持默认,下一步


    保持默认,下一步


    点击添加按钮


    创建完成之后会看到下图的信息

    注意:一定要将红框中的信息复制出来保存到其它位置,一会儿还要用到,关闭对话框之后就找不到了。


    点击右上角的关闭按钮

    选择左侧的应用程序菜单,然后点击右侧的生成API密钥


    点击生成按钮,同样要把红框中的信息保存下来,一会儿要用到。


    编程:发布和订阅设备数据

    下载本示例程序包:

    1、使用Nodejs将数据发送到物联网平台上,程序文件:mqtt-device-pub-china.js

    var mqtt = require('mqtt');
    // 这里是非常重要的,填写错误了就不通;0ct4vz是组织标识
    var client = mqtt.connect("tcp://" + "0ct4vz" + ".messaging.internetofthings.chinabluemix.net:1883", 
      {
      // d 代表设备,0ct4vz组织标识,设备类型,设备标识
        "clientId" : "d:0ct4vz:type1:devcie1",   //dev1  must be less than 23 characters
        "keepalive" : 30,
        "username" : "use-token-auth",  // 这里是配置认证的方式,而不是通常认为的用户名
        "password" : "wf8fP(pld7UlcQ(9Q*"     // 设备 devcie1 的认证令牌
      });
    
    client.on('connect', function() {
      console.log('MQTT mqtt dev client connected to IBM IoT Cloud. Publish side');
    });
    
    client.on('error', function(err) {
      console.log('client error' + err);
      process.exit(1);
    });
    
    client.on('close', function() {
      console.log('client closed');
      process.exit(1);
    });
    
    var stdin = process.openStdin();
    console.log("Type some text and press <ENTER>:\t");
    stdin.on('data', function(inputStr) {
      //console.log("Your input: " + inputStr);
      if (inputStr.toString() == "end") { process.exit(1)};
    
      // iot-2/evt/事件标识/数据格式/数据类型
      client.publish('iot-2/evt/XY/fmt/string', inputStr, function() {
          console.log("push " + inputStr+ " to IOT");    
      });
    });
    

    这里用到的就是创建设备时保存下来的信息,需要修改的位置都添加了注释。

    2、使用Nodejs订阅发送到物联网平台上的数据,程序文件:mqtt-application-sub-china.js

    var mqtt = require('mqtt');
    // 组织标识
    var client = mqtt.connect("tcp://" + "0ct4vz" + ".messaging.internetofthings.chinabluemix.net:1883", 
      {
    	// a代表应用,组织标识,test 是应用名称,自己随便起
        "clientId" : "a:0ct4vz:test",
        "keepalive" : 30,
        "username" : "a-0ct4vz-igsow2ncjn", // API 密钥
        "password" : "3c&1_i)VgPCnolB(hx"   // 认证令牌
      });
    
    client.on('connect', function() {
      console.log('MQTT app client connected to IBM IoT Cloud. Subscribe side'); 
    
      // iot-2/type/设备类型/id/设备标识/evt/事件标识/数据格式/数据类型
      client.subscribe('iot-2/type/type1/id/devcie1/evt/XY/fmt/string');
    });
    
    client.on('error', function(err) {
      console.log('client error' + err);
      process.exit(1);
    });
    
    client.on('close', function() {
      console.log('client closed');
      process.exit(1);
    });
    
    client.on('message', function(topic, message) {
      console.log("message received: " +  message);
      //console.log(JSON.parse(message)); 
    });
    
    这个文件中用到的就是生成 API 密钥时保存的信息,组织标识要保持一致。

    3、关于两个文件中的“clientId”说明:

    我们注意到一个是以“a:”开头代表APP(应用),一个是以“d:”开头代表Device(设备);

    为什么这样设计呢?

    因为只有应用可以订阅,应用需要等待就是Looping,耗电较大,通常运行在服务器端;

    设备要接收指令,不需要等什么;所以Command的只能给设备,不能给应用;

    4、运行发布和订阅端测试

    两端的启动顺序不分先后,启动后在发布端输入信息,在订阅端就会看到了。


    注意:这个数据是经过IBM Bluemix 上的物联网平台的。

    5、原理示意图


    使用NodeRed,拼积木

    一开始我们就创建了Node-RED应用程序,打开了一个在线的流程编辑器却没有使用,现在它被派上用场了。

    1、首先,我们通过按下拖动鼠标来选中Flow1中的图形,然后按Delete键将其删除。


    2、在左侧的 input 中选择 mqtt 拖动添加到 Flow 1 中,双击它 


    3、然后点击Server 后面的编辑按钮


    4、输入Server信息,就是上面js文件中的:组织标识+.messaging.internetofthings.chinabluemix.net

    例如:0ct4vz.messaging.internetofthings.chinabluemix.net

    Client ID,可以和上面订阅程序文件中的一样。

    5、然后选择Security标签:


    这里就是你生成的API 密钥和认证令牌,然后点击Update按钮。


    6、在左侧的 output 中选择 debug 拖动添加到 Flow 1 中


    7、在 mqtt 的右侧按下鼠标拖动到 debug 的左侧,这样两个组件就建立了连接,也就是 mqtt 的输出作为 debug 的输入。

    然后点击 Deploy


    8、注意左侧的连接状态


    9、右侧切换到 debug 标签


    10、再回到我们刚刚运行的发布端程序,输入信息发布吧,然后在上图的 debug 信息中就可以看到发布的信息了。

    是不是很有意思呢?Node-Red的功能远不止于此。

    结束语

    之前一直想尝试Bluemx上的物联网和Node-Red,但限于能力一直也没搞清楚怎么用。

    非常感谢詹总的分享,让我们吃着零食,喝着饮料,边听边动手实践,非常容易的就掌握了使用方法。

    希望以后能多组织一些这样的活动,提供一些最佳实践;这里面有一些需要注意的地方,

    如果不是有人指导,自己就要去看文档,可能会有很多弯路要走。

    这样让我们大大的节省了探索的时间,直接走上捷径。

    ===========文档信息============ 
    版权声明:非商用自由转载-保持署名-注明出处 
    署名(BY) :testcs_dn(微wx笑) 
    文章出处:[无知人生,记录点滴](http://blog.csdn.net/testcs_dn)



沪ICP备19023445号-2号
友情链接