开发笔记-AliOS Things如何从3.1.0升级到3.3.0
Posted 亿企创新-莫学良
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发笔记-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
移植代码是有成本的,也是有风险的,原来的可以用,升级上去之后,可能整个体系都会“不可逆”的变化,我也是考虑了近一个月,才下定决心,做迁移,主要是以下的考虑:
- 新版本的技术支持一定是比旧版本的更积极响应的。如果3.1.0有历史遗留问题没有解决,那常理上开发人员肯定优先解决3.3.0版本的。
- 3.3.0代码一定是更优化的,性能和稳定性一定在升级,不更新心里痒痒的,毕竟电脑用最新版的Windows,每次升级都允许,手机上的app也是保持最新的,为什么嵌入式设备新出了版本不升级呢?
- 新版本对于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,咱们可以一起研究研究。
以上是关于开发笔记-AliOS Things如何从3.1.0升级到3.3.0的主要内容,如果未能解决你的问题,请参考以下文章
使用HaaS Studio开发AliOS Things C/C++应用
AliOS Things 3.3.0 : 实战HaaS100扩展SD卡