阿里云物联网云端开发之脚本解析

一、注册阿里云账号登录物联网平台(过程省略)
二、在物联网平台中创建一个高级版透传格式产品
点击创建产品
选择高级版
在创建产品时,选择透传/自定义数据格式
三、为产品添加一个设备(过程根据阿里云文档自行创建)
四、为产品添加功能,如下
为产品添加功能
五、根据报文内容编写脚本
这里困扰了我好多天,设备端上传得报文(01034042140000)是以字符串的形式传过来的,脚本解析接收的是十六进制数据,因此将报文(01034042140000)转变成了对应的十六进制数(3031303334303432313430303030)。脚本解析的时候本是对十六进制数为(01034042140000)的数据进行解析,而现在却对(3031303334303432313430303030)这些数据进行解析了。现在脚本需要做的是将十六进制(3031303334303432313430303030)转变为十六进制(01034042140000),在对(01034042140000)进行解析。而将十六进制(3031303334303432313430303030)转变为十六进制(01034042140000)的过程我实现不了。所以最后的解析结果虽然没有报错,但物模型数据是不正确的。过程不在叙述,全在代码里。

var COMMAND_REPORT = 0x01;
var COMMAND_SET = 0x01; //属性设置
var COMMAND_REPORT_REPLY = 0x02; //上报数据返回结果
var COMMAND_SET_REPLY = 0x03; //属性设置设备返回结果
var COMMAD_UNKOWN = 0xff;    //未知的命令
var ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'; //标准ALink JSON格式topic, 设备上传属性数据到云端
var ALINK_PROP_SET_METHOD = 'thing.service.property.set'; //标准ALink JSON格式topic, 云端下发属性控制指令到设备端
var ALINK_PROP_SET_REPLY_METHOD = 'thing.service.property.set'; //标准ALink JSON格式topic, 设备上报属性设置的结果到云端
//上行数据,自定义二进制转物模型json
function rawDataToProtocol(bytes) {
     var tstr=[];
    for (var i = 0; i < bytes.length; i++) {
        tstr += String.fromCharCode(parseInt(bytes[i], 10))
    } 
    //tstr=parseInt(tstr,10);
    var uint8Array = new Uint8Array(tstr.length);
     for (var i = 0; i <tstr.length; i++) {
        uint8Array[i] = parseInt(tstr.substr(2*i, 2), 16) & 0xff;
    }
    var dataView = new DataView(uint8Array.buffer, 0);

    var jsonMap = new Object();

    var fHead = uint8Array[0]; // command
    if (fHead == COMMAND_REPORT) {
        //属性上报method
        jsonMap['method'] = ALINK_PROP_REPORT_METHOD;
        //协议版本号固定字段
        jsonMap['version'] = '1.0';
        //标示该次请求id值
       jsonMap['id'] =dataView.getInt32(1);
        var params = {};
        //对应产品属性中 temperature
       params['temperature'] = dataView.getFloat32(3);
        //对应产品属性中 humidity
        params['humidity'] = dataView.getFloat32(7);

        jsonMap['params'] = params;
    }

    return jsonMap;
}
//下行指令,物模型json转二进制格式
function protocolToRawData(json) {
    var method = json['method'];
    var id = json['id'];
    var version = json['version'];
    var payloadArray = [];
    if (method == ALINK_PROP_SET_METHOD) // 属性设置
    {
        var params = json['params'];
       // var prop_float = params['prop_float'];
        var prop_int16 = params['prop_int16'];
        //var prop_bool = params['prop_bool'];
        //按照自定义协议格式拼接 rawData
        payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET)); // command字段
        payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // ALink JSON格式 'id'
        payloadArray = payloadArray.concat(buffer_int16(prop_int16)); // 属性'prop_int16'的值
      // payloadArray = payloadArray.concat(buffer_uint8(prop_bool)); // 属性'prop_bool'的值
       // payloadArray = payloadArray.concat(buffer_float32(prop_float)); // 属性'prop_float'的值
    } else if (method ==  ALINK_PROP_REPORT_METHOD) { //设备上报数据返回结果
        var code = json['code'];
        payloadArray = payloadArray.concat(buffer_uint8(COMMAND_REPORT_REPLY)); //command字段
        payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // ALink JSON格式 'id'
        payloadArray = payloadArray.concat(buffer_uint8(code));
    } else { //未知命令,对于有些命令不做处理
        var code = json['code'];
        payloadArray = payloadArray.concat(buffer_uint8(COMMAD_UNKOWN)); //command字段
        payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // ALink JSON格式 'id'
        payloadArray = payloadArray.concat(buffer_uint8(code));
    }
    return payloadArray;
}
//以下是部分辅助函数
function buffer_uint8(value) {
    var uint8Array = new Uint8Array(1);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setUint8(0, value);
    return [].slice.call(uint8Array);
}
function buffer_int16(value) {
    var uint8Array = new Uint8Array(2);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setInt16(0, value);
    return [].slice.call(uint8Array);
}
function buffer_int32(value) {
    var uint8Array = new Uint8Array(4);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setInt32(0, value);
    return [].slice.call(uint8Array);
}
function buffer_float32(value) {
    var uint8Array = new Uint8Array(4);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setFloat32(0, value);
    return [].slice.call(uint8Array);
}

五、运行结果
在这里插入图片描述
在这里插入图片描述
最后如果大家有什么疑问,都会尽力解答。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 阿里云物联网云端API开发是基于阿里云物联网平台的一项功能,通过使用云端API,用户可以在物联网场景中实现对设备的远程控制、数据存储和管理等操作。 首先,用户可以通过物联网云端API进行设备的注册和管理。通过API接口,可以实现设备的添加、删除、查询等操作,方便对大量设备进行管理。 其次,用户可以通过物联网云端API获取设备上传的数据。设备通过物联网平台将采集到的数据上传至云端,用户可以通过API接口获取设备数据,实现数据的存储和分析。 另外,在阿里云物联网云端API开发中,用户还可以实现对设备的远程控制。通过API接口,用户可以发送指令至物联网平台,再由平台转发至设备,实现远程控制设备的功能。 最后,物联网云端API开发还提供了数据推送的功能。用户可以通过API接口配置数据推送的规则,当设备上传的数据满足规则时,云平台会将数据推送给用户定义的接收端,实现实时数据推送的功能。 总之,阿里云物联网云端API开发提供了丰富的功能,包括设备管理、数据存储和分析、远程控制、数据推送等。通过使用这些API接口,用户可以轻松实现物联网场景中的各项操作,提高物联网应用的可用性和便捷性。 ### 回答2: 阿里云物联网云端API开发是指基于阿里云物联网平台的云端开发服务,开发者可以通过该API实现物联网设备的远程控制、数据上报、设备管理等功能。CSDN作为国内知名的IT技术社区,提供了丰富的技术交流和资源共享平台。 阿里云物联网云端API开发可以帮助开发者实现智能物联网系统的核心功能。开发者可以通过阿里云控制台创建物联网平台实例,获取设备的身份认证信息(ProductKey、DeviceName、DeviceSecret等),并使用这些信息调用物联网云端API实现设备的远程控制。 通过云端API,开发者可以向物联网设备发送指令,控制设备的开关、调节设备的状态或执行特定操作。同时,设备也可以通过云端API上报数据,将设备产生的数据传输到云端进行存储和分析。开发者还可以通过云端API实现设备的管理功能,例如注册设备、删除设备、查询设备状态等。 CSDN作为中国最大的IT技术社区和资源共享平台,为开发者提供了众多物联网云端API开发相关的教程、技术文章和开发者社区。在CSDN社区中,开发者可以通过阅读、讨论和分享,获得有关阿里云物联网云端API开发的最新技术资讯和经验分享。 总之,阿里云物联网云端API开发物联网系统提供了灵活、高效的远程控制、数据上报和设备管理功能,而CSDN作为技术社区为开发者提供了丰富的技术资源和交流平台,帮助开发者更好地实现物联网应用的开发和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值