热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于RTThread的智能家居DIY教程连载(4)——手把手连接OneNet

智能家居DIY教程连载(4)云乃万物互联之本Hi,各位小伙伴,DIY活动已经来到了

智能家居 DIY 教程连载(4)

云乃万物互联之本

Hi,各位小伙伴,DIY 活动已经来到了尾声,第四周的任务是整个项目中最有趣也是最重要的部分——物联网。本周的任务完成之后,也就意味着整个项目就完全做完啦,是不是迫不及待先把整个 DIY 做出来打造一个属于自己的智能家居温度监控系统呢?那就赶紧来看看最后的任务是如何完成的吧~

本文目录





    1. 第四周任务概览




    1. 准备工作




    1. 配置工程




    1. 开发思路




    1. OneNet 应用开发




    1. 开源代码




    1. 结果展示




    1. 注意事项



1. 第四周任务概览

我们来回顾一下第四周的任务:


  • 接收节点根据上位机数据帧格式,通过串口发送温度数据给上位机,上位机能正确显示温度曲线

  • 了解 RT-Thread 的 OneNet 云软件包、AT 组件,并使用它们实现将接收节点的数据通过 esp8266 wifi 模块上传至 OneNet 云端,云端要求能简单制作小应用实现实时温度远程监控

这一周的任务重点是对接云,云是物联网中必不可少的一个重要部分,与物联网有着密切的关联。本篇教程将给大家讲解一下如何通过 esp8266 wifi 模块将温度数据上传到 OneNet 云,实现远程监控温度。

本篇文章取消了对上位机使用的讲解,因为上位机的使用过于简单,大家私底下自行尝试即可。上位机的使用方法及其源码:点此处跳转。

2. 准备工作

请务必先学习以下内容,再继续看本篇文章:


  • OneNet 的产品创建与设备接入视频教程:点此处跳转

  • OneNet 软件包简介与使用说明:点此处跳转

  • AT Device 软件包简介与使用说明:点此处跳转

  • 《RT-Thread 编程指南》中 AT 组件的章节 :点此处跳转

  • Paho MQTT 软件包简介与使用说明:点此处跳转

以上内容是十分重要的预备知识,不要偷懒略过上述内容的学习噢。

3. 配置工程

首先,要想清楚第四周的整个工程需要依赖什么工具才能正常工作,简单来说,我们需要将 ESP8266 对接到 OneNet 云,而 ESP8266 通过 AT Device 控制的,所以现在目标是明确的:开启 AT 和 ESP8266,并配置 OneNet 软件包中的相关参数。

开启 AT 和 ESP8266,ESP8266 的 WIFI 账号和密码需要写对,不然连不上网,自然就对接不上 OneNet 了:

RT-Thread online packages --->
IoT - internet of things --->
[*] AT DEVICE: RT-Thread AT component porting or samples for different device --->
[*]Espressif ESP8266 --->
(testwifi) WIFI ssid
(12345678) WIFI password
(uart2) AT client device name
(512)The maximum length of receive line buffer

开启 OneNet,完成相关参数配置,其中 device idauth infoapi keyproduct idmaster/product apikey 这些参数如何配置请查看 OneNet 的产品创建与设备接入视频教程:点此处跳转

RT-Thread online packages --->
IoT - internet of things --->
IoT Cloud --->
[*] OneNET: China Mobile OneNet cloud SDK for RT-Thread --->
[ ]Enable OneNET sample
[*]Enable support MQTT protocol
[ ]Enable OneNET automatic register device
(534342011) device id
(201907091115) auth info
(IFzqRGOjq530YSyFY6EMda45Xdw=) api key
(258302) product id
(FV=ssEvYvHcKqN0=ZdTjM6NrGv0=) master/product apikey

值得一提的是,OneNet 软件包是需要依赖 paho-mqtt、webclient、cJSON 的,选中 OneNet 后,以上三个选项也会被自动选中,如下图:

注意自己手上的 ESP8266 接板子的哪个串口,需要将这个串口打开:

Hardware Drivers Config --->
On-chip Peripheral Drivers --->
[*] Enable UART --->
[*] Enable UARTx

在 menuconfig 中完成以上配置之后,先 pkgs --update 将软件包获取到本地,再 scons --target=mdk5 更新工程,将相关软件包加载到工程中来。

4. 开发思路


4.1 OneNet 软件包工作原理

首先,我们需要大致了解一下 OneNet 软件包的工作原理。

OneNet 软件包数据的上传和命令的接收是基于 MQTT 实现的,OneNet 的初始化其实就是 MQTT 客户端的初始化,初始化完成后,MQTT 客户端会自动连接 OneNet 平台。数据的上传其实就是往特定的 topic 发布消息。当服务器有命令或者响应需要下发时,会将消息推送给设备。

获取数据流、数据点,发布命令则是基于 HTTP Client 实现的,通过 POST 或 GET 将相应的请求发送给 OneNet 平台,OneNet 将对应的数据返回,这样,我们 就能在网页上或者手机 APP 上看到设备上传的数据了。

下图是应用显示设备上传数据的流程图:

下图是应用下发命令给设备的流程图:

4.2 MQTT 初始化

了解了 OneNet 软件包的工作原理后,我们知道,OneNet 软件包数据的上传和命令的接收是基于 MQTT 实现的,OneNet 的初始化其实就是 MQTT 客户端的初始化。OneNet 软件包提供了一个接口 onenet_mqtt_init,供用户去初始化 MQTT,只有当 MQTT 初始化成功之后,才能做后续的操作,如上传数据到 OneNet 服务器。

我们创建两个线程去工作,onenet_mqtt_init_thread 线程用于初始化 MQTT 客户端,onenet_upload_data_thread 线程去上传数据给云。那么问题来了,onenet_upload_data_thread 线程怎么知道 MQTT 初始化成功了呢?这里使用信号量去通知。

要用信号量之前,第一步当然是创建一个信号量:

mqttinit_sem = rt_sem_create("mqtt_sem", RT_NULL, RT_IPC_FLAG_FIFO);

onenet_mqtt_init_thread 线程的线程入口函数中使用 OneNet 软件包提供的接口 onenet_mqtt_init 去初始化 MQTT,初始化成功后,释放信号量:

static void onenet_mqtt_init_entry(void *parameter)
{
uint8_t onenet_mqtt_init_failed_times;
/* mqtt初始化 */
while (1)
{
if (!onenet_mqtt_init())
{
/* mqtt初始化成功之后,释放信号量告知onenet_upload_data_thread线程可以上传数据了 */
rt_sem_release(mqttinit_sem);
return;
}
rt_thread_mdelay(100);
LOG_E("onenet mqtt init failed %d times", onenet_mqtt_init_failed_times++);
}
}

onenet_upload_data_thread 线程要一直等待信号量的到来,才能上传数据,看看它的线程入口函数的伪代码:

static void onenet_upload_data_entry(void *parameter)
{
/* 永久等待方式接收信号量,若收不到,该线程会一直挂起 */
rt_sem_take(mqttinit_sem, RT_WAITING_FOREVER);
/* 后面用不到这个信号量了,把它删除了,回收资源 */
rt_sem_delete(mqttinit_sem);
while (1)
{
/* 这里是上传数据到OneNet的代码*/
/* 这里要怎么写,后面会有教程说明 */
}
}

在上面的代码中,其实不用信号量也能完成上述工作。这里创建两个线程,并且使用信号量去做通知工作,旨在能让大家多学习些 IPC 的使用。

4.3 上传数据至云端

在 ESP8266 已经正常连上 WIFI 的前提下,MQTT 初始化成功后,就可以放心大胆的上传数据给 OneNet 了。OneNet 软件包给用户提供了几个上传数据的接口,详情请查看 OneNet 软件包的 API 说明文档:点此处跳转。这个 DIY 项目中需要上传的数据是温度数据,属于数字数据,可以使用下面这个 API:

rt_err_t onenet_mqtt_upload_digit(const char *ds_name, const double digit);

利用 mqtt 向 OneNET 平台发送字符串数据。






























参数描述
ds_name数据流名称
str要上传的字符串
返回
0上传成功
-5内存不足

根据前两周的教程,我们知道 nrf24l01_thread 线程是用来通过 nrf24l01 射频模块接收发送节点采集到的温度数据的。那么如何将 nrf24l01_thread 线程收到的温度数据给 onenet_upload_data_thread 线程上传云呢?这里使用邮箱和内存池来实现。邮箱和内存池的使用,可以回顾一下第二周的教程:点此处跳转。

使用邮箱和内存池是为了解决一下问题:


  • nrf24l01_thread 线程接收数据过快,onenet_upload_data_thread 线程来不及上传。

  • onenet_upload_data_thread 线程上传过快,nrf24l01_thread 线程来不及接收数据。

其实就是典型的流控问题,或者说是供求关系问题。

onenet_upload_data_thread 线程入口函数中利用 onenet_mqtt_upload_digit 上传数据给 OneNet:

static void onenet_upload_data_entry(void *parameter)
{
struct recvdata *buf_mp;
/* 永久等待方式接收信号量,若收不到,该线程会一直挂起 */
rt_sem_take(mqttinit_sem, RT_WAITING_FOREVER);
/* 后面用不到这个信号量了,把它删除了,回收资源 */
rt_sem_delete(mqttinit_sem);
while (1)
{
if (rt_mb_recv(tmp_msg_mb, (rt_ubase_t*)&buf_mp, RT_WAITING_FOREVER) == RT_EOK)
{
/* 500ms上传一次数据 */
rt_thread_delay(rt_tick_from_millisecond(500));
/* 上传发送节点1的数据到OneNet服务器,数据流名字是temperature_p0 */
if (onenet_mqtt_upload_digit("temperature_p0", buf_mp->temperature_p0) != RT_EOK)
rt_kprintf("upload temperature_p0 has an error, try again\n");
else
printf("onenet upload OK >>> temp_p0:%f\n", buf_mp->temperature_p0);
rt_mp_free(buf_mp); /* 释放内存块 */
buf_mp = RT_NULL;/* 请务必要做 */
}
}
}

就是这么简单。

如果说,我们底下有多个发送节点采集温度,接收节点会收到多个发送节点的温度数据,而只有 一个 ESP8266,怎么在上传数据给 OneNet 的时候区分这些不同节点的数据?这里其实只需要建立不同的数据流就好了,每一个节点的数据为一个数据流,rt_err_t onenet_mqtt_upload_digit(const char *ds_name, const double digit) 函数的第一个参数就是数据流的名称,起不同名字就是不用的数据流了,如:

/* 上传发送节点1的数据到OneNet服务器,数据流名字是temperature_p0 */
onenet_mqtt_upload_digit("temperature_p0", buf_mp->temperature_p0);
/* 上传发送节点2的数据到OneNet服务器,数据流名字是temperature_p1 */
onenet_mqtt_upload_digit("temperature_p1", buf_mp->temperature_p1);

5. OneNet 应用开发

我们关把数据上传给 OneNet 后,如何才能看到这些数据呢?OneNet 给开发者提供了一些简单应用开发的工具,我们利用这些工具在 OneNet 上创建一些简单的小应用,即可实现对数据的远程监控了。

由于文章篇幅有限,这里就不详细展示如何制作应用了,更多内容,请查看 OneNet 的产品创建与设备接入视频教程:点此处跳转。

6. 开源代码

为了更进一步便于大家学习,第四周任务的代码已经开源啦~ 请点击这里查看。请给这个项目点个小星星(Star)_

获得更多官方技术支持,请添加 RT-Thread 小师妹为好友,备注智能家居 DIY,可拉进技术交流群。微信扫下方二维码添加好友:

7. 结果展示



  • 在网页上查看 OneNet 云端数据,能正常收到来自每个发送节点数据流了:

  • OneNet PC端应用,可在电脑实现远程监控。(如:人坐在办公室,查看家里房间客厅的温度,看看家里着火没有):

  • OneNet 移动端应用,可在手机平板等设备实现远程监控。(如:外出旅游,打开手机 APP,查看办公室的温度,看看办公室着火没)

  • 本地 FinSH 信息输出,提示 mqtt 初始化成功、ESP8266 连接 WIFI 成功、数据上传 OneNet 服务器成功:


8. 注意事项



  • 第四周的 demo 工程只接收两个发送节点的数据,需要更多发送节点的可以自行添加。

  • 第四周的 demo 工程中的 RECEIVE(stm32l475-atk-pandora)(SD_Card)(ESP8266) 是利用 ESP8266 对接 OneNet 的,使用 SD Card 挂载文件系统。

  • 第四周的 demo 工程中的 RECEIVE(stm32l475-atk-pandora)(SPI Flash)(RW007) 是利用 RW007 对接 OneNet 的,使用 SPI Flash 挂载文件系统,RW007 的配置与 ESP8266 一样,请参考上面教程。

  • 发送节点的程序下载第二周中的 demo 就好了,GitHub 中的 Fourth week mission 文件夹不再包含发送节点工程。

  • 移动端要远程监控温度需要在 OneNet 官网下载一个叫设备云的 APP,如下图,点击此链接跳转至官网下载页面:


推荐阅读
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringCloudRibbon部分源码相关的知识,希望对你有一定的参考价值。1:ribbon是提供通过servi ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • scrcpy通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制您的Android设备。它可以通过USB连接,也可以通过Wifi连接(类似于隔空投屏),而且不需要任何ro ... [详细]
  • 开发板:FL2440内核:linux3.0无线网卡:RT3070RT3070的工作模式分为STA(station)模式、SoftAP(AccessPoint)模式两种。STA ... [详细]
  • MySQL修改表结构操作命令总结【MySQL】
    数据库|mysql教程MySQL,修改表结构命令数据库-mysql教程表的结构如下:错误页面源码,ubuntu电脑自动休眠,爬虫造景视频,rapapiphp,廊坊seo开发lzwm ... [详细]
author-avatar
天亮说晚安
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有