基于LiteOS的智慧农业案例实验分享

news2024/11/18 9:34:48

最近在指导一位读者朋友做毕业设计,该毕设是关于端云互通的,基于小熊派+LiteOS+华为云。

在指导他的过程中我也学到了不少东西,这里通过一个案例实验(智慧农业)给大家分享一些知识。

图片

实验框图

图片

图片

相关模块简介

1、STM32L431RCT6

图片

2、LiteOS

LiteOS是华为开发的轻量级实时操作系统:

图片

LiteOS源码GitHub仓库链接:

https://github.com/LiteOS/LiteOS

其源码一级目录结构如下:

图片

其内核包括任务管理、内存管理、时间管理、通信机制、中断管理、队列管理、事件管理、定时器等操作系统基础组件,可以单独运行。

Huawei LiteOS是一个支持多任务的操作系统。在Huawei LiteOS中,一个任务表示一个线程。 其任务是抢占式调度机制,同时支持时间片轮转调度方式。

高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度。

创建任务示例:

左右滑动查看全部代码>>>

UINT32 creat_test_task(VOID)
{
  UINT32 uwRet = LOS_OK;
  TSK_INIT_PARAM_S task_init_param;
  UINT32 TskHandle;

  task_init_param.usTaskPrio = TASK_PRIO; /* 任务优先级 */
  task_init_param.pcName = "test_task"; /* 任务名称 */
  task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)test_task; /* 任务入口函数 */
  task_init_param.uwStackSize = STACK_SIZE; /* 任务栈大小 */

  /* 任务创建 */
  uwRet = LOS_TaskCreate(&TskHandle, &task_init_param);
  if(LOS_OK != uwRet)
  {
      return uwRet;
  }
  return uwRet;
}

3、华为云平台

本次实验的云平台为华为的OceanConnect物联网平台:

图片

其云端开发框图如下:

图片

我们主要是用来做实验,着重关注红框里的内容

下面简单介绍一下Profile文件编解码器插件这两块大家可能比较陌生的部分:

(1)Profile文件开发

Profile(即产品模型)是用来描述一款产品中的设备“是什么”、“能做什么”以及“如何控制该设备”的文件。

在物联网平台集成对接中需要先创建Profile,因为Profile里面定义了设备上报的数据和应用服务器下发的命令包含了哪些字段。

定义Profile,即在物联网平台构建一款设备的抽象模型,使平台理解该款设备支持的服务、属性、命令、升级能力等信息。

Profile主要包含产品信息、服务能力和维护能力三部分:

图片

本次实验我们主要关注红框部分,其具体表现如:

图片

(2)编解码插件开发

一款产品的设备上报数据时,如果“数据格式”为二进制码流,则该产品需要进行编解码插件开发;如果“数据格式”为JSON,则该产品下不需要进行编解码插件开发。两种数据举例:

图片

作为物联网的终端设备,比较讲究的就是功耗问题了,这个问题也关乎到通信传输的数据量的问题。

上图举例的两种数据格式其实代表着同样的信息,虽然对于我们程序员而言,我们更容易读懂JSON格式的数据包含的信息;但是对于设备而言,其更喜欢二进制流格式的数据了。

因为使用二进制流来表示的话传输的数据量就会小很多,进而可以降低功耗。其实这个二进制流格式也很好理解,是按照特定格式的,比如:

图片

本次实验我们设备端发送与接收的数据均为二进制流格式数据,因此需要进行云端编码器插件的开发。下面是设备数据上报的流程:

图片

图片

4、BH1750光强度传感器

BH1750是一种用于两线制串行总线接口的16位数字型光强度传感器集成电路。利用它的高分辨率可以探测较大范围的光强度变化。(1lx~65535lx)。

图片

主要特性:

  • 支持 IIC BUS 接口

  • 光源依赖性弱

  • 有两种可选的 IIC slave 地址

  • 最小误差变动在±20%

5、SHT30温湿度模块

温湿度传感器 SHT30的温度范围为-40℃~125℃ ,湿度范围为0%RH~100%RH

图片

主要特性:

  • 完全校准的线性化,温度补偿式的数字输出

  • 电压范围 2.4V-5.5V

  • 通信速度高达 1MHz 的 IIC 接口,两个可选的用户地址

  • 相对湿度误差± 2%RH

  • 温度误差± 0.3%

6、补光灯模块

与普通的LED的控制一样,通过一个GPIO来控制其亮、灭。

图片

7、直流电机模块

通过一个GPIO来控制其转、停。

图片

重要步骤解析

我们可以用Keil MDK来编写、编译代码,也可以使用LiteOS Studio来编写、编译代码。

在解析重要步骤之前有必要介绍一下LiteOS Studio

图片

LiteOS Studio是LiteOS集成开发环境,一站式开发工具,支持C、C++、汇编等语言,让您快速,高效的进行物联网开发。

主题默认是大家都喜欢的暗黑色,使用起来也比较简单,其用Makefile来管理工程,使用时添加新的源文件需要同步更新Makefile文件:

图片

1、读取传感器数据并显示至LCD

准备BH1750SHT30传感器驱动。这里跟初学者分享一点经验,看这些传感器驱动代码的时候不要只看代码。

这种与实际硬件(芯片)密切相关的代码光看代码是没有多大意义的,只会越看越懵。

因此正确姿势应该是对照着datasheet一起看,需要写出这些代码得好好研读datasheet

一般比较成熟的传感器驱动网上都有很多现成的可以直接用的,多数情况下我们很少去亲自写这个。

特别是工作之后,能copy的代码坚决不自己写

图片

图片

,老板可不看你代码写得多秀,只看你任务完成得怎么样。

但是还是有必要了解一下这些驱动代码怎么写出来的方法,万一某天需要我们自己写呢。下面我们从例程代码中扣出一些核心代码:

图片

图片

图片

图片

我们最终要用到的就是最后一个函数来读取传感器数据,然后显示在LCD上,核心代码:

图片

结果:

图片

这个结果多了一个烟感数据。这里简单说明一下:写这篇笔记时用的是智慧农业的模块。后来才加了一个烟感模块,改起来比较麻烦就没去改了,所以上面的一些图的说明没有烟感模块。

2、云端配置

在设备端接入云端之前,遇到对云端进行相应的配置。这里也是抽取出重要的步骤,具体的步骤可以查看华为云上相关的文档,很详细:

图片

文档链接:

https://support.huaweicloud.com/devg-IoT/iot_02_9994.html

(1)创建产品:

图片

有几种方式创建产品,这里我们选择自定义的方式,学会了自定义的方式创建产品了,其它几种方式就更简单了。

图片

图片

(2)Profile、编解码器插件开发

接着进行产品开发,主要是进行Profile文件与编解码器插件的开发。

Profile文件有两种开发方式:离线的方式与在线的方式。我们使用在线的方式创建,创建的Profile文件如下:

图片

图片

编解码器插件的开发依赖与Profile文件,我们创建的编解码器插件如下:

图片

图片

(3)调测

接着验证我们的Profile文件与编解码器插件,这里有两种方法验证.

一是创建真实的设备,这个需要我们真实的设备端进行连接测试,下面我们再做这一步;

二是使用虚拟的设备。这里我们使用虚拟的设备进行验证:

图片

图片

3、设备端开发

设备端我们使用LiteOS SDK端云互通组件agent tiny对接IoT平台。

借助这个组件我们只需要调用几个API函数就可以很方便地连接华为IOT平台,其重要接口函数如下:

左右滑动查看全部代码>>>

/* LiteOS SDK端云互通组件的初始化接口 */
int atiny_init(atiny_param_t* atiny_params, void** phandle);
/* LiteOS SDK端云互通组件的主函数体 */
int atiny_bind(atiny_device_info_t* device_info, void* phandle);
/* LwM2M标准对象向设备下发命令的统一入口 */
int atiny_cmd_ioctl(atiny_cmd_e cmd, char* arg, int len);
/* LiteOS SDK端云互通组件数据上报接口 */
int atiny_data_report(void* phandle, data_report_t* report_data);

设备对接IOT平台的流程示意图:

图片

其实本云端互通实验主要围绕的就是一个agent_tiny任务,其任务入口函数就是这个流程图上的agent_tiny_entry函数。

这个入口函数里面主要做的内容是:atiny的初始化、对于入参atiny_params的设定(要根据具体的业务来进行)。

还有创建一些子任务(数据采集任务、数据上报任务、下发命令的应答任务),最后进行到。

核心代码如端云互通组件的主函数体,具体核心代码如:

左右滑动查看全部代码>>>

void agent_tiny_entry(void)
{
  UINT32 uwRet = LOS_OK;
  atiny_param_t *atiny_params;
  atiny_security_param_t  *iot_security_param = NULL;
  atiny_security_param_t  *bs_security_param = NULL;

  atiny_device_info_t *device_info = &g_device_info;

  //  省略部分内容。。。。。。。。。。。。
  device_info->endpoint_name = g_endpoint_name;
  atiny_params = &g_atiny_params;
  atiny_params->server_params.binding = "UQ";
  //  省略部分内容。。。。。。。。。。。。

  /* LiteOS SDK端云互通组件的初始化接口 */
  if(ATINY_OK != atiny_init(atiny_params, &g_phandle))
  {
      return;
  }

  /* 创建数据采集任务 */
  uwRet = creat_collection_task();
  if (uwRet != LOS_OK)
  {
      return ;
  }

  /* 创建数据上报任务 */
  uwRet = creat_report_task();
  if(LOS_OK != uwRet)
  {
      return;
  }

  /* 创建一个信号量 */
  uwRet = LOS_SemCreate(0,&reply_sem);
  if (uwRet != LOS_OK)
  {
  return ;
  }

  /* 创建下发命令的应答任务 */
  uwRet = creat_reply_report_task();
  if (uwRet != LOS_OK)
  {
      return ;
  }

  /* LiteOS SDK端云互通组件的主函数体 */
  (void)atiny_bind(device_info, g_phandle);
  }

更具体的代码就不展开了,篇幅好像有点长了。。。

除此之外,在对接云端之前,还需要一个可以联网的媒介,这里我们选用的是ESP8266,使用AT设备框架来管理我们的ESP8266设备:

图片

现在,我们就可以使用真实的设备对接云端了,对接云端需要一个设备标识码,用ESP8266模块时需要我们自己创建一个标识码。

用其它联网模块如NB-IOT模块则只需使用模块出厂自带的设备码即可。这里我们创建的设备标识码为:

图片

这个标识码其实就是在我们上面的agent_tiny_entry函数中有配置给device_info设备结构体了。然后使用这个标识码在云端创建设备:

图片

图片

图片

图片

4、web应用开发

上面在调试阶段已经可以上传云端到IOT平台了,也可以看到数据了。但是那些数据对于用户来说总归是看不习惯吧,我们开发产品就是为了给用户使用、给用户看的。

所以最终体现出来给用户的不应该是一堆数据,而是一个对用户较友好的可视化界面。

华为物联网开发平台也给我们提供了web应用开发的环境:

图片

这里的应用开发也比较简单,通过拖拽一些空间,简单修改一下控件的一些属性即可:

图片

最终效果:

图片

总结

以上就是本次分享的智慧农业案例实验,本次实验用了华为IOT平台,其实其它平台用起来也是类似的,之后有时间再分享其它云平台的案例实验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1129461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

管理类联考——英语二——翻译篇——名词性从句的译法

第四节 名词性从句的译法 英语的名词性从句有四种,分别是主语从句,宾语从句,表语从句和同位语从句。整体而言,名词性从句的理解和中文语序的理解大致相同,因此在英译汉时,它无须作太大的调整(…

Centos安装gitlabce

服务器配置要求(2c4g) 1、 安装其他组件 yum install -y curl policycoreutils-python openssh perl2、 安装Postfix服务以发送电子邮件通知,启动服务并自启 yum -y install postfix systemctl enable postfix --now3、 安装gitlab&#xf…

Linux C语言开发-D5常量

指数形式的实数一般由尾数部分、字母e或E和指数部分组成。格式如下: 字符常量 常见的字符常量的ASCII码的值为: A:65;Z:90; :32;0:48; a:97&…

怎么进行设备维护与保养?智能巡检系统有什么用?

设备维护与保养需要遵循三个原则:故障设备全面分析的原则、故障设备深入检查的原则以及故障设备分析排查的原则。 一、故障设备全面分析的原则   检修人员在对设备维护与保养时,如果看到设备在运行中出现了异常的现象,要立刻停止设备的工作…

有一门课不及格的学生

系列文章目录 进阶的卡莎C_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(C…

2023年香港《施政报告》即将发布,人才引进计划最新政策解读!

2023年香港《施政报告》即将发布,人才引进计划最新政策解读! 香港行政长官李家超将于10月25日发表任内第二份《施政报告》。李家超昨日(10月22日)在社交媒体分享视频,他手持新一份施政报告,封面是浅绿色为背…

【C语言|关键字】C语言32个关键字详解(4)——其他(typedef、sizeof)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

使用 Redis 如何统计一亿个 keys ?

目录 1、聚合统计 2、排序统计 3、二值状态统计 4、基数统计 总结 // 淡泊明志,宁静致远 在 Web 和移动应用的业务场景中,我们经常需要保存这样一种信息:一个 key 对应了一个数据集合。举几个例子: 手机 App 中的每天的用户…

任务调度器详解(FreeRTOS)

目录 什么是任务调度器 FreeRTOS的任务调度器 抢占式调度 协作式调度 时间片调度 什么是任务调度器 任务调度器是实时操作系统(RTOS)的一个关键组件,它负责决定在多个可运行任务中哪一个将获得CPU时间以执行。它基于任务的优先级和状态来…

软考高级系统架构 上午真题错题总结

目录 前言一、2022年真题(√)二、2021年真题三、2020年真题(√)四、2019年真题(√)五、2018年真题(√)六、2017年真题(√)七、2016年真题(√&…

Remmina Linux 远程桌面(堡垒机)解决方案,含文件互传

简介 Remmina 是一款在 Linux 和其他类 Unix 系统下的自由开源、功能丰富、强大的远程桌面客户端。 对于一个Linux作为主力开发机而言,Remmina 解决痛点主要是公司堡垒机远程客户现场的计算机,公司只给开发了win系统下的远程连接程序,而没有…

SQLi靶场

SQLi靶场 less1- less2 (详细讲解) less 1 Error Based-String (字符类型注入) 思路分析 判断是否存在SQL注入 已知参数名为id,输入数值和‘ 单引号‘’ 双引号来判断,它是数值类型还是字符类型 首先输入 1 , 发现…

IDEA在GitHub / Gitee中拉取特定一个分支代码方法

IDEA通过HTTP / SSH拉取项目的时候,默认都是拉取master分支的节点代码,对于我们通过分支来逐一消化项目的需求是相违背的,那么下面就是如何对一个项目特定分支读取方法 首先正常通过HTTP / SSH拉一个项目下来 打开分支列表,选择指…

一文了解GC垃圾回收

一文了解GC垃圾回收 1 判断一个对象为垃圾对象的方法 引用计数法(弃用) 可达性分析算法 是否有指向GC root 的引用链,如果有,不是垃圾对象 ---->GC roo:即rt.jar包中内容 2 内存泄漏与内存溢出区别 泄漏:原本需要被回收的对象&#…

Python 深度学习入门之CNN

CNN 前言一、CNN简介1、简介2、结构 二、CNN简介1、输出层2、卷积层3、池化层4、全连接层5、输出层 前言 1024快乐!1024快乐!今天开新坑,学点深度学习相关的,说下比较火的CNN。 一、CNN简介 1、简介 CNN的全称是Convolutiona…

英语——语法——从句——名词性从句——笔记

文章目录 名词性从句一、定义二、分类(一)宾语从句(二)主语从句(三)C同位语从句(四)D表语从句 名词性从句 一、句子成分 简而言之,构成一个句子的成分(或要素…

关于 provide、inject 在Vue3中的用法

Vue3关于 provide、inject 的用法 一、传递变量/数据二、传递函数 前言: 在父子组件传递数据时,通常使用的是 props 和 emit。 父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件…

STM32:TTL串口调试

一.TTL串口概要 TTL只需要两个线就可以完成两个设备之间的双向通信,一个发送电平的I/O称之为TX,与另一个设备的接收I/O口RX相互连接。两设备之间还需要连接地线(GND),这样两设备就有相同的0V参考电势。 二.TTL串口调试 实现电脑通过STM32发送…

高等数学啃书汇总重难点(六)定积分的应用

无论是考研还是学校期末考试,这一部分的内容都不会太难,因此今天的内容一页笔记就足够放的下了。 重点在于理解所谓的元素法——也就是微元法,即定积分的几何意义。只不过,定积分几何意义的引例为平面问题,实际上&…