• 太阳集团tcy8722

    当前位置: 首页 >应用方案 >技术应用 >

    利用云平台脚本解析连接物模型(一)

    不久前太阳集团tcy8722小编发布在《串口服务器接入阿里云物模型》一文中通过编写TPC-7062MCGS脚本)的脚本程序解析Alink JSON数据,从而实现阿里云物模型采集控制RTU设备。

    本文将介绍另一种方式实现阿里云物模型控制RTU设备,之前是通过设备进行数据解析,因此开发者既需要了解MCGS脚本程序还需要了解Modbus协议导致使用门槛较高,而本文使用方法无需使用设备解析Alink JSON数据,因此不需要编写MCGS脚本从而降低是使用门槛。

    小编将通过物模型查询RTU设备的保持寄存器(0x0000)的值讲解如何实现该功能。

    一.软硬件准备

    1.硬件准备

    串口服务器一台用于连接MQTT服务器,本例程的从机将通过Modbus Slave仿真实现(方便观察数据变化);

    可上网路由器一台;

    网线两根,一根连接串口服务器与路由器,一根连接电脑与路由器;

    电脑一台,用于配置串口服务器以及调试云平台;

    2.软件准备

    MQTTX调试工具(http://mqttx.app/zh),用于接入前数据帧分析;

    Modbus Slave仿真工具(http://www.modbustools.com/),用于Modbus RTU从机仿真;

    太阳集团tcy8722网络配置工具(http://www.hanzaichips.com/product/1465.html,相关下载),用于配置串口服务器,可以不适应软件通过网页配置,由于设备采用DHCP获取本机IP,因此采用上位机配置更为方便;

    二.云平台

    第一次使用阿里云的数据解析功能,并且这是笔者第一次使用JavaScript(ECMAScript 5)编写脚本,因此接下的云平台配置都将参考阿里云帮助中性的最佳实例下的设备通过DTU接入物联网平台”进行开发,建议开发者仔细阅读阿里云手册可以发现不一样的世界,活学活用里面案例能对初学者有很好的引导和启发。

    阿里云平台

    三.产品与设备创建

    1.产品创建

    这次创建的产品和以往的不同不能无脑点击下一步,需要调整数据收发协议为透传/自定义,如下图:

    阿里云产品创建2

    其余参数保持默认。

    2.设备创建

    阿里云设备创建3

    3.物模型配置

    在产品详情下的功能定义目录下点击编辑草稿”,选择添加自定义功能;

    物模型配置4

    一共需要添加两个自定义功能,一个用于保存寄存器值(左图),一个用于物模型发起读取指令;

    物模型配置5

    这里需要分析下Modbus响应数据帧,0103020064320C,可以看到响应帧只有地址用于标记,未标记寄存器地址,因此只有在平台对收发数据进行标记,本例程重点介绍连接使用不需要考虑标记,保留接口待后续使用。因此在定义功能时使用枚举变量。

    脚本语言JavaScript(ECMAScript 5)配置

    复制参考实例的脚本,并调整部分配置,如下:

    var ALINK_ID = "12345";

    var ALINK_VERSION = "1.1";

    var ALINK_PROP_POST_METHOD = 'thing.event.property.post';

    var ALINK_PROP_SET_METHOD = 'thing.service.property.set';

    /*此函数将设备上报数据转换为Alink JSON物模型数据。*/

    function rawDataToProtocol(bytes) {

       /*将设备上报的原始数据转换为数组。其中bytes对象中存储着设备上报原始数据。*/

       var uint8Array = new Uint8Array(bytes.length);

       for (var i = 0; i < bytes.length; i++) {

           uint8Array[i] = bytes[i] & 0xff;

       }

       var params = {};                            // 定义属性存放对象。

       var jsonMap = {};                           // 定义模拟Alink数据报对象。

       /*填写Alink数据报协议头部分。*/

       jsonMap['version'] = ALINK_VERSION;         // Alink 协议版本号。

       jsonMap['id'] = ALINK_ID;                   // 消息ID。

       jsonMap['method'] = ALINK_PROP_POST_METHOD; // 设备上行数据方法:设备属性上报。

    /*填写Alink数据报属性部分。*/

    //0103020064320c

       params['register'] = uint8Array[3]*265+ uint8Array[4];            // 将收到的第一和第二字节转换为十进制数存储。

       jsonMap['params'] = params;                 // 将参数打包到数据帧中。

       return jsonMap;                             // 返回结果会发送给物联网平台。

    }

    //以下是部分辅助函数。

    function buffer_uint8(value)

    {

       var uint8Array = new Uint8Array(1);

       var dv = new DataView(uint8Array.buffer, 0);

       dv.setUint8(0, value);

       return [].slice.call(uint8Array);

    }

    /*此函数实现由物联网平台下发数据转换为设备能识别的16进制数。*/

    function protocolToRawData(json)

    {

       var method = json['method'];

       var id = json['id'];

       var version = json['version'];

       var payloadArray = [];

       if (method == ALINK_PROP_SET_METHOD)    // 接收来自物联网平台的“设置设备属性”的命令。

       {

           var send_params = json['params'];

           var prop_cur = send_params['READ_R'];   // 将设置的具体值抽取出来。

           //按照自定义协议格式拼接rawdata。

    //0103000000018833

           payloadArray = payloadArray.concat(buffer_uint8(0x01));

    payloadArray = payloadArray.concat(buffer_uint8(0x03));

    payloadArray = payloadArray.concat(buffer_uint8(0x00));

    payloadArray = payloadArray.concat(buffer_uint8(0x00));

    payloadArray = payloadArray.concat(buffer_uint8(0x00));

    payloadArray = payloadArray.concat(buffer_uint8(0x01));

    payloadArray = payloadArray.concat(buffer_uint8(0x88));//校验错误,但保留错误,引导学习如何分析问题,见“从机仿真”,正确校验0x840A

    payloadArray = payloadArray.concat(buffer_uint8(0x33));//

       }

       return payloadArray;    // 返回时,将数据发送至设备端。

    }

    function transformPayload(topic, rawData) {

       var jsonObj = {};

       return jsonObj;

    }

    将上述脚本粘贴到产品详情下的数据解析”,如图所示:

    物联网云平台配置6

    脚本语言测试与提交

    测试数据上报功能,如下图所示:

    数据上报7

    测试数据下发功能,如下图所示:

    数据下发8

    测试完成点击“提交”,自此云平台脚本与产品配置完成。

    四.软件调试

    1.MQTT X软件测试

    使用MQTT X软件连接MQTT服务器进行测试,配置如下:

    MQTT协议服务器9

    查询“订阅”“发布”的地址,如下图所示:

    MQTT协议服务器10

    平台发送读取请求,如下图所示:

    MQTT协议服务器11

    MQTT X发送响应帧,如下图所示:

    MQTT协议服务器12

    通过调试软件可以更加直观的对数据帧进行分析,若发现数据帧错误可以更加方便定位问题,这里是没有错误的可进入下一步串口服务器演示。

    五.设备演示

    串口服务器参数配置,如下图所示:

    串口服务器13

    从机仿真

    Modbus Slave并非免费软件,可免费试用30天,若有长时间使用需求请购买正版授权。

    点击Connection”配置连接参数,选择“Serial Port”,并配置正确端口与匹配的波特率参数,如下图所示:

    串口服务器14

    配置仿真软件的保持寄存器值,如下图所示:

    串口服务器15

    物模型发送查询指令,仿真从机收到云平台下发指令,仿真设备未响应,检查发现之前使用的校验工具没有配置正确导致校验错误。

    串口服务器16

    修改脚本中关于校验的两位,注意需要先调试才能提交生效。

    串口服务器17

    修改后再次发送,如下图所示:

    串口服务器18

    效果演示,如下图所示:

    串口服务器19

    利用云平台脚本解析连接物模型(



    太阳集团tcy8722