前言:
之前用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.总结
移植代码是有成本的,也是有风险的,原来的可以用,升级上去之后,可能整个体系都会“不可逆”的变化,我也是考虑了近一个月,才下定决心,做迁移,主要是以下的考虑:
下面开始升级:
首先来git三板斧备份源码:
git add ./
git commit -m "更改的内容"
git push origin master
记录好自己更改的地方,比如OTA的密匙,自己更改过的库函数位置等。
直接下载了两次失败,提示:
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版本了。
下载好了之后,先运行例程,确保代码和组件的完整性,我选择了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"
上云最重要的是两件事情,数据上报和命令下发,3.1.0版本的两件事情都是在回调函数里,3.3.0简化了代码,上报时间直接在主函数里调就可以了。
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);
}
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;
}
}
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新的配置模式点赞。
3.3.0的代码结构更加简洁清晰,解释的文档系统换了个模样,更加的细致,还有小程序,老板来了AI图像识别的例程,浓缩精炼,3.3.0增加了如下组件能力:
从3.1.0升级上来也没有想象的那么困难,没升级的赶紧升级,如果升级过程中有什么问题,可以加VX paulmark,咱们可以一起研究研究。