开发笔记-AliOS Things如何从3.1.0升级到3.3.0

前言:
          之前用Alios Things 3.1.0开发了一套智能物联网系统,经历过大概断断续续一个月的组合调试,成功的把linkit_demo和modbus_demo结合到一起。实现了7款modbus传感器的读取,一款LED点阵液晶屏的驱动,还有一个Modbus继电器的云端控制(有40个开关),还配置了三元组信息,OTA秘钥字符串等功能。
        后续的更新大部分都是基于3.3的,因此在项目还没有投入运行之前,赶紧升级到3.3。

目录

我为什么升级到3.3.0

1.备份3.1.0代码

2.重新下载3.3.0分支

3.运行3.3.0例程

4.移植代码

4.1上传数据的位置

4.2 下发控制命令位置

4.3 库函数的更改

5.总结 


我为什么升级到3.3.0

          移植代码是有成本的,也是有风险的,原来的可以用,升级上去之后,可能整个体系都会“不可逆”的变化,我也是考虑了近一个月,才下定决心,做迁移,主要是以下的考虑:

 

  1. 新版本的技术支持一定是比旧版本的更积极响应的。如果3.1.0有历史遗留问题没有解决,那常理上开发人员肯定优先解决3.3.0版本的。
  2. 3.3.0代码一定是更优化的,性能和稳定性一定在升级,不更新心里痒痒的,毕竟电脑用最新版的Windows,每次升级都允许,手机上的app也是保持最新的,为什么嵌入式设备新出了版本不升级呢?
  3. 新版本对于python轻应用的支持越来越大,在旧版本上做轻应用开发,明显已经落后了,虽然我还没有用,但是,不能输在起跑线上,对吧。

下面开始升级:

1.备份3.1.0代码

首先来git三板斧备份源码:

git add ./
git commit -m "更改的内容"
git push origin master

记录好自己更改的地方,比如OTA的密匙,自己更改过的库函数位置等。

2.重新下载3.3.0分支

直接下载了两次失败,提示:

fetch-pack: unexpected disconnect while reading sideband packet
fatal: fetch-pack: invalid index-pack output


度娘说:仓库太大了。可以这样下载(地址要改成你自己的gitee地址,或者官方的仓库地址):

git clone --depth 1 -b rel_3.3.0 https://gitee.com/xxxxxx/AliOS-Things.git

以后的备份也是按照备份流程直接做即可,已经切换到3.3版本了。

3.运行3.3.0例程

      下载好了之后,先运行例程,确保代码和组件的完整性,我选择了linksdk_demo来运行,这里要更改的是三元组信息,3.3.0的变化是三元组放在主函数里了(3.1.0是在文件开头的宏定义里)。

     如果你原来的代码使用宏定义来写三元组的话,可以不用改动,直接在主函数里更改三元组信息的赋值。

    /* TODO: 替换为自己设备的三元组 */
    char *product_key       = PRODUCT_KEY;
    char *device_name       = DEVICE_NAME;
    char *device_secret     = DEVICE_SECRET;


原来的宏定义保持不变:

    #define PRODUCT_KEY      "a15k0WRui64"
    #define PRODUCT_SECRET   "I2tyMEFw83ZzOSlW"
    #define DEVICE_NAME      "NR-Iot-2-01"
    #define DEVICE_SECRET    "9560eb465b6fa1ce199ed4fe1f1b3e5b"

4.移植代码

       上云最重要的是两件事情,数据上报和命令下发,3.1.0版本的两件事情都是在回调函数里,3.3.0简化了代码,上报时间直接在主函数里调就可以了。

4.1上传数据的位置

3.1.0的上报函数的是这个:

void user_post_property()
{
    static int cnt = 0;

    int res = 0;

3.3.0直接在主函数里调用属性和事件上报函数,那么我们直接在这个写我们自己的上报函数。

    while (1) {
        /* TODO: 以下代码演示了简单的属性上报和事件上报, 用户可取消注释观察演示效果 */
        demo_send_property_post(dm_handle, "{\"LightSwitch\": 0}");
        demo_send_event_post(dm_handle, "Error", "{\"ErrorCode\": 0}");

        aos_msleep(10000);
    }


4.2 下发控制命令位置

3.1.0 下发控制命令的位置:

static int user_property_set_event_handler(const int devid, const char *request, const int request_len)

{

    int res = 0;

    EXAMPLE_TRACE("Property Set Received, Request: %s", request);


3.3.0里,接收下发命令的位置在这里:

/* 用户数据接收处理回调函数 */
static void demo_dm_recv_handler(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata)
{
    cJSON *root = NULL, *item_PowerSwitch = NULL;
    int i=0;

    aiot_dm_msg_t msg;

    printf("demo_dm_recv_handler, type = %d\r\n", recv->type);

    switch (recv->type) {


下发命令的解析也发生了一些变化,我们可以看小车的例子,接收,接受处理云端的控制命令,包括后退、左转、右转、停止、前进等。 参考代码的路径在:/solution/auto_demo/data_model_basic_demo.c下:

static void demo_dm_recv_handler(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata)
{
    uint8_t i;
    printf("demo_dm_recv_handler, type = %d\r\n", recv->type);
 
    switch (recv->type) {
        /* 云端下发的属性设置 */
        case AIOT_DMRECV_PROPERTY_SET: {
            printf("msg_id = %ld, params = %.*s\r\n",
                   (unsigned long)recv->data.property_set.msg_id,
                   recv->data.property_set.params_len,
                   recv->data.property_set.params);
            
            char *auto_temp[5]={"sWITCH","left","right","stop","front"};
            cJSON *root = cJSON_Parse(recv->data.property_set.params);
            for(i = 0 ;i<5 ;i++){
                cJSON *value = cJSON_GetObjectItem(root,auto_temp[i]);
                if (value != NULL && cJSON_IsNumber(value)) {
                    printf("%s is find!\r\n",auto_temp[i]);  
                    break;      
                }
            }
            switch(i){
                case 0:
                    back_ctl(); //后退
                    printf("---back\r\n");
                break;
 
                case 1:
                    left_ctl(); //左转
                    printf("---left\r\n");
                break;
 
                case 2:
                    right_ctl(); //右转
                    printf("---right\r\n");
                break;
 
                case 3:
                    stop_ctl(); //停止
                    printf("---stop\r\n");
                break;
 
                case 4:
                    front_ctl(); //前进
                    printf("---front\r\n");
                break;
 
                default:
                    break;
            }
        }
        break;
            
            ....
                
        default:
            break;
    }
}


4.3 库函数的更改

1.字符串打印函数变化

HAL_Snprintf(property_payload, sizeof(property_payload)

变为:

snprintf(property_payload, sizeof(property_payload)

2.直接调用的睡眠函数

HAL_SleepMs(5000);

变为:

aos_msleep(5000);

3.EXAMPLE_TRACE没用了
     这个函数要注释掉,否则编译异常:

// define EXAMPLE_TRACE(...)                                          \
//     do {                                                            \
//         HAL_Printf("\033[1;32;40m%s.%d: ", __func__, __LINE__);     \
//         HAL_Printf(__VA_ARGS__);                                    \
//         HAL_Printf("\033[0m\r\n");                                  \
//     } while (0)

4.没有aosmenuconfig了
       没有aos menuconfig的对话框了,一点也不想念它。硬是把Alios Things变成一个像BIOS系统一样的庞大复杂的系统。为.yaml新的配置模式点赞。

5.总结 

         3.3.0的代码结构更加简洁清晰,解释的文档系统换了个模样,更加的细致,还有小程序,老板来了AI图像识别的例程,浓缩精炼,3.3.0增加了如下组件能力:

  • 轻应用框架:同时支持JavaScript和Python两种轻应用开发模式。
  • HaaS UI:ugraphics, udisplay,提供从点阵屏到小屏的支持。
  • HaaS AI:ucloud_ai, ai_agent,提供云端AI推理能力。
  • VFS:统一文件和驱动的接入方式,同时提供IO多路复用机制。
  • 文件系统:LittleFS和FatFS,分别为Nand/NOR Flash和SD卡提供文件操作能力。
  • 音频组件:a2sa, uvoice,提供从端到云全链路的语音能力。
  • 摄像头组件:ucamera,提供Wi-Fi摄像头的支持。
  • 云存储:oss,为设备增加云端存储的能力。

        从3.1.0升级上来也没有想象的那么困难,没升级的赶紧升级,如果升级过程中有什么问题,可以加VX paulmark,咱们可以一起研究研究。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员熊子峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值