阿里云首页 IoT物联网操作系统

【HaaS 600/510】OTA - 远程升级组件

说明

硬件平台支持

硬件平台

是否支持

说明

HaaS600-EC100Y

HaaS600-EC600S

HaaS510

HaaS531

HaaS100

HaaS EDU K1

HaaS200

简介

OTA升级是很多嵌入式产品必备的一个功能。HaaS 轻应用提供了完备的OTA解决方案。本案例就是一个升级JS脚本的端云一体化例子,用户可以通过JS脚本实现应用脚本的版本上报,下载,完整性检验和脚本加载;具体流程如下图所示:

API使用说明

open

创建一个OTA实例

report

上报脚本版本号

download

下载文件

verify

对下载的文件做完整性验证

upgrade

覆盖老脚本并运行新的脚本

属性

类型

必填

描述

iot

Text

传入IOT组件的device handle

属性

类型

必填

描述

device_handle

Number

传入IOT组件的device handle指针

product_key

String

设备的产品密钥

device_name

String

设备名称

module_name

String

模块名称

version

String

模块的版本号

属性

类型

必填

描述

url

String

下载文件的URL

store_path

String

存储下载文件的路径包括文件名称

callback

Function

下载完后的回调函数

属性

类型

必填

描述

length

String

下载文件的长度

hash_type

String

是md5还是sha256

store_path

String

存储下载文件的路径

callback

Functiom

校验结果的回调函数

属性

类型

必填

描述

length

String

下载文件的长度

store_path

String

存储下载文件的路径

install_path

String

安装脚本的路径

callback

Function

升级成功的回调函数

开发板支持

硬件连接

运行示例

示例代码(app.js)

var network=require('network');
var appota = require('appota');
var iot = require('iot');


/* device info */
var productKey = ' ';       /* 用户的 productKey */
var deviceName = ' ';      /* 用户的 deviceName */
var deviceSecret = ' ';      /* 用户的 deviceSecret */
var module_name = 'default';  /* 脚本归属的模块 */
var default_ver = '2.0.0';  /* 脚本的版本号 */

var ota;
var device;
var status;
/* download info */
var info = {
 url: '',
 store_path: 'U:/pack.bin', /* haas600(EC600S)下载的脚本存储路径(绝对路径,此路径会因为不同的平台而不同) */
 install_path: 'U:/',       /*haas600(EC600S)脚本运行的路径 (绝对路径,此路径会因为不同的平台而不同)*/
 length: 0,
 hashType: '',
 hash: ''
}

function createDevice(){
    if (!(iot && iot.device)) {
        throw new Error("iot: [failed] require(\'iot\')");
    }
    console.log('iot: [success] require(\'iot\')');

    device = iot.device({
        productKey: productKey,
        deviceName: deviceName,
        deviceSecret: deviceSecret,
        region: 'cn-shanghai',
    });
    
    device.on('connect', function() {
        console.log('iot device connected success!');
        var iotDeviceHandle = device.getDeviceHandle();
        ota = appota.open(iotDeviceHandle);
        console.log('report default module ver');
        ota.report({
            device_handle: iotDeviceHandle,
            product_key: productKey,
            device_name: deviceName,
            module_name: module_name,
            version: default_ver
        });
        ota.on('new', function(res) {
            console.log('length is ' + res.length);
            console.log('module_name is ' + res.module_name);
            console.log('version is ' + res.version);
            console.log('url is ' + res.url);
            console.log('hash is ' + res.hash);
            console.log('hash_type is ' + res.hash_type);

            info.url = res.url;
            info.length = res.length;
            info.module_name = res.module_name;
            info.version = res.version;
            info.hash = res.hash;
            info.hashType = res.hash_type;

            ota.download({
                url: info.url,
                store_path: info.store_path
            }, function(res) {
                if (res >= 0) {
                    console.log('download success');
                    console.log('verify start');
                    console.log(info.hashType);
                    ota.verify({
                        length: info.length,
                        hash_type: info.hashType,
                        hash: info.hash,
                        store_path: info.store_path
                    }, function(res) {
                        if (res >= 0) {
                            console.log('verify success');
                            console.log('upgrade start');
                            ota.upgrade({
                                length: info.length,
                                store_path: info.store_path,
                                install_path: info.install_path
                            }, function(res) {
                                if (res >= 0) {
                                    console.log('upgrade success')
                                } else {
                                    console.log('upgrade failed')
                                }
                            }) 
                        } else {
                            console.log('verify failed');
                        }
                    })
                } else {
                    console.log('download failed');
                }
            });
            console.log('hello after download');
        });
    })
}

var net=network.openNetWorkClient();
var status=net.getStatus();
console.log('net status is: '+status);

if (status=='connect') {
    createDevice();
}else{
    net.on('connect',function(){
    console.log('net is connected success!');
    createDevice();
});
}

示例介绍

本示例主要介绍了升级JS脚本的示例代码,相关函数接口,以及使用步骤;通过此示例用户可以在HaaS600上完成脚本的升级。如果想了解更多的OTA云端详情可以参考OTA云端介绍文档

运行步骤

在做脚本升级前确保设备是连网上线的,连网需要加入IOT组件,如果是wifi设备,需要加入netmgr组件进行配网,所以如上代码中,引入了iot组件和network组件

var network=require('network');
var appota = require('appota');
var iot = require('iot');

还需要添加设备的三元组信息:

var productKey = ' ';       /* 用户的 productKey */
var deviceName = ' ';      /* 用户的 deviceName */
var deviceSecret = ' ';      /* 用户的 deviceSecret */

通过调用如下代码:

var device = iot.device({
 productKey: productKey,
 deviceName: deviceName,
 deviceSecret: deviceSecret
});

实现设备的上线;

当设备上线后,需要将脚本的版本号报上云端,所以需要事先定义好脚本的版本,如示例代码定义的版本为:

var default_ver = '2.0.0';

由于阿里云IOT物联平台OTA是多模块升级方式,所以还需要定义一个模块名称,如果当前的脚本为设备的主业务,模块名称必须为"default",如示例代码:

var module_name = 'default';

版本号和模块名定义完成后,配合设备名和产品密钥,调用如下代码可实现版本号上报云端:

ota.report({
  device_handle: iotDeviceHandle,
  product_key: productKey,
  device_name: deviceName,
  module_name: module_name,
  version: default_ver
 });

ota.report接口用来将脚本版本号上报云端,入参有5个,第一个为IOT 设备handlem,设备成功连网后,会返回整个对象,第二参数为产品的密钥,第三个参数为设备名称,第四个参数为要上报版本模块的名称;

完成以上调用后,在阿里云物联网平台会看到如下信息:

上图中的default模块版本即为脚本中填入的版本号,system模块的版本为当前运行JS的OS系统版本;

首先需要做个高版本的js脚本,将步骤2中的JS版本号改成var default_ver = '3.0.0';,然后创建一个app.json文件,文件内容如下:

{
    "version": "3.0.0", //此版本号需要和上面的js脚本中的default_ver保持一致
    "io": {},
    "debugLevel": "DEBUG"
}

此文件主要是JS配套的配置,如设备端的io配置以及JS的版本号(与JS脚本中的版本号要相同);将app.js和app.json放到一个文件夹中,用JS工具打包成app.bin;JS工具用法请参考JS命令行工具; 中pack命令的使用章节,打包完成后请参考下图完成固件上传到云端:

JS脚本上传完成后,云端触发升级,如下图:

当云端触发升级后,设备端会收到云端的发送的脚本信息,具体包括:文件大小、url、模块名称、hash type(md5或sha256)、hash值;对应上面的代码为:

ota.on('new', function(res) {
  console.log('length is ' + res.length);
  console.log('module_name is ' + res.module_name);
  console.log('version is ' + res.version);
  console.log('url is ' + res.url);
  console.log('hash is ' + res.hash);
  console.log('hash_type is ' + res.hash_type);

通过步骤5设备端已拿到云端即将下发文件的版本号、url、模块名等,用户可根据需求决定是否下载此文件,比如版本比对,发现版本号较当前版本小,可以选择不下载,还可以通过模块名称判断下载的是什么文件,如模块名称为default,则下载的是JS脚本,用户可根据自己需要自己定义; 如用设备需要下载此文件,则通过download方法可实现下载,如示例代码:

ota.download({
   url: info.url,
   store_path: info.store_path
  }, function(res) {

下载接口,需要填入的参数有2个,第一参数为文件的URL,第二参数为文件的存储路径,包括存储的文件名称,如示例代码定义的:

var info = {
 url: '',
 store_path: 'U:/pack.bin',

当文件下载完成后,需要验证文件下载的是否完整,需要调用verify验证,如上面示例代码:

ota.verify({
     length: info.length,
     hash_type: info.hashType,
     hash: info.hash,
     store_path: info.store_path
    }, function(res) {

ota.verify入参有4个,分别为,下载文件的长度、云端下发的hash type(md5或sha256)、对应的hash值以及存储已下载文件的路径,这些参数已通过步骤5全部获取,直接填入即可;

当步骤7校验成功后,即可实现脚本文件的加载,此时调用upgrade即可实现脚本的重新加载,如上面的示例代码:

ota.upgrade({
       length: info.length,
       store_path: info.store_path,
       install_path: info.install_path
      }, function(res)

ota.upgrade有3个入参,第一个为下载文件的长度,第二入参为已下载文件的路径,第三个参数为要安装的路径,如示例代码定义的安装路径:

install_path: 'U:/',

运行结果