基于RT-Thread的战舰开发板连接Onenent云平台(学习笔记)
摘要:本文主要是我在使用正点原子开发板在rt_thread框架下连接onenet云平台的学习笔记。此文主要介绍配置步骤和开发过程中遇到的问题,写本文的主要目的是为了强化自己的学习过程,第一次发文,希望对他人有所帮助,也希望大佬勿喷。
配置用的硬件主要是正点原子战舰开发板、正点原子ESP8266模块、DHT11温湿度传感器。通过运行rt_thread并加入相关的软件包连接云平台。软件有MDK5、MobaXterm串口调试助手。
准备工作:将ESP266WiFi模块连接到串口3、DHT11使用单总线通信数据传输,模块与开发板连接如下图
一、登录Onenet云平台创建产品和设备产品的联网方式为WIFI
设备接入协议为MQTT

在产品下创建设备,按照要求填写即可。

二、使用ENV工具添加软件包,需要添加的软件包主要有三个分别为:ESP8266软件包、DHT11软件包、onenet软件包,建议全部开启软件包示例sample,这样方便根据示例代码编写自己的工程

device id :为设备ID
auth info: 为鉴权信息
api key : API秘钥
product id :产品ID
master/product key:产品秘钥
以上信息按照你创建的产品和设备的信息如实填写,保证准确,当然你也可以在配置完成后在工程中的rtconfig.h中修改相关信息。
在AT DEVICE中使能ESP8266,并开启Enable sample

同理,还需要打开DHT11软件包,并Enable sample。
还需要打开串口3因为DHT11连接到了串口3上。
****注意在rtconfig.h中修改软件包相关参数会在下次更新软件包时,自动更新为软件包配置时的参数,所以建议在ENV中修改软件包相关参数。
退出ENV配置,输入scons --target=mdk5生成新的工程。
三、代码的修改
1、如果你没有在ENV中配置软件包参数则可以在rtconfig.h中修改

#define PKG_USING_AT_DEVICE
#define AT_DEVICE_USING_ESP8266
#define AT_DEVICE_ESP8266_SAMPLE
#define ESP8266_SAMPLE_WIFI_SSID "WiFi账号"
#define ESP8266_SAMPLE_WIFI_PASSWORD "WiFi密码"
#define ESP8266_SAMPLE_CLIENT_NAME "uart3"
#define ESP8266_SAMPLE_RECV_BUFF_LEN 512
#define PKG_USING_AT_DEVICE_V202
#define PKG_AT_DEVICE_VER_NUM 0x20002/* IoT Cloud */#define PKG_USING_ONENET
#define PKG_USING_ONENET_SAMPLE
#define ONENET_USING_MQTT
#define ONENET_INFO_DEVID "设备ID"
#define ONENET_INFO_AUTH "鉴权信息"
#define ONENET_INFO_APIKEY "设备的APIkey"
#define ONENET_INFO_PROID "产品ID"
#define ONENET_MASTER_APIKEY "产品APIkey"
#define PKG_USING_ONENET_LATEST_VERSION
/* On-chip Peripheral Drivers */
#define BSP_USING_GPIO
#define BSP_USING_UART
#define BSP_USING_UART1
#define BSP_UART1_RX_USING_DMA
#define BSP_USING_UART3

2、在宏定义中打开串口3,编译工程下载后可能会导致死机,原因可能是没有在硬件层打开串口3导致系统初始化失败,下面是我修改的代码,仅供参考
该函数在是stm32f1xx_hal_msp.c中

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(huart->Instance==USART1){/* USER CODE BEGIN USART1_MspInit 0 *//* USER CODE END USART1_MspInit 0 *//* Peripheral clock enable */__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**USART1 GPIO Configuration    PA9     ------> USART1_TXPA10     ------> USART1_RX */GPIO_InitStruct.Pin = GPIO_PIN_9;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USER CODE BEGIN USART1_MspInit 1 *//* USER CODE END USART1_MspInit 1 */}if(huart->Instance==USART3){/* USER CODE BEGIN USART3_MspInit 0 *//* USER CODE END USART3_MspInit 0 *//* Peripheral clock enable */__HAL_RCC_USART3_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/**USART3 GPIO Configuration    PB10     ------> USART3_TXPB11     ------> USART3_RX */GPIO_InitStruct.Pin = GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/* USER CODE BEGIN USART3_MspInit 1 *//* USER CODE END USART3_MspInit 1 */}}

修改完成后,可以尝试编译代码,并下载到开发板中,输入相关命令检查硬件是否能够正常工作。
打开MobaXterm串口调试助手(由于正点原子开发板带有一键下载电路,建议先重启开发板在打开串口,否则可能会导致串口打开失败)
输入命令dht11_read_temp_sample查看串口1是否打印DHT11温湿度数据。
3、完成上述过程后添加温湿度数据到MQTT协议中准备上传给Onenet云平台
首先,注释掉dht11_sample.c 中的DHT11温湿度读取线程,修改代码到onenet_sample.c中读取温湿度数据。

#include <rtthread.h>
#include <rtdevice.h>
#include "sensor.h"
#include "sensor_dallas_dht11.h"
#include "drv_gpio.h"/* Modify this pin according to the actual wiring situation */
#define DHT11_DATA_PIN    GET_PIN(G, 11)/*DHT11的数据读取在onenet_sample中完成*/
#if 0
static void read_temp_entry(void *parameter)
{rt_device_t dev = RT_NULL;struct rt_sensor_data sensor_data;rt_size_t res;rt_uint8_t get_data_freq = 1; /* 1Hz */dev = rt_device_find("temp_dht11");if (dev == RT_NULL){return;}if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK){rt_kprintf("open device failed!\n");return;}rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)(&get_data_freq));while (1){res = rt_device_read(dev, 0, &sensor_data, 1);if (res != 1){rt_kprintf("read data failed! result is %d\n", res);rt_device_close(dev);return;}else{if (sensor_data.data.temp >= 0){uint8_t temp = (sensor_data.data.temp & 0xffff) >> 0;      // get tempuint8_t humi = (sensor_data.data.temp & 0xffff0000) >> 16; // get humirt_kprintf("temp:%d, humi:%d\n" ,temp, humi);}}rt_thread_delay(1000);}
}static int dht11_read_temp_sample(void)
{rt_thread_t dht11_thread;dht11_thread = rt_thread_create("dht_tem",read_temp_entry,RT_NULL,1024,RT_THREAD_PRIORITY_MAX / 2,20);if (dht11_thread != RT_NULL){rt_thread_startup(dht11_thread);}return RT_EOK;
}
MSH_CMD_EXPORT(dht11_read_temp_sample,sample);
#endif/*DHT11相关设备注册和初始化*/
static int rt_hw_dht11_port(void)
{struct rt_sensor_config cfg;cfg.intf.user_data = (void *)DHT11_DATA_PIN;rt_hw_dht11_init("dht11", &cfg);return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_dht11_port);

注意:DHT11的引脚需要修改为PG11

其次,修改onenet_sample.c中的代码
数据上传函数为onenet_mqtt_upload_digit()

#include <stdlib.h>
/*DHT11相关头文件*/
#include "sensor.h"
#include "sensor_dallas_dht11.h"
#include "drv_gpio.h"#include <onenet.h>#define DBG_ENABLE
#define DBG_COLOR
#define DBG_SECTION_NAME    "onenet.sample"
#if ONENET_DEBUG
#define DBG_LEVEL           DBG_LOG
#else
#define DBG_LEVEL           DBG_INFO
#endif /* ONENET_DEBUG */#include <rtdbg.h>#ifdef FINSH_USING_MSH
#include <finsh.h>/* upload random value to temperature*/
static void onenet_upload_entry(void *parameter)
{/*DHT11相关参数定义*/rt_device_t dev = RT_NULL;struct rt_sensor_data sensor_data;rt_size_t res;rt_uint8_t get_data_freq = 1; /* 1Hz */uint8_t temp;uint8_t humi;
/*DHT11设备查找并打开*/dev = rt_device_find("temp_dht11");if (dev == RT_NULL){return;}if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK){rt_kprintf("open device failed!\n");return;}rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)(&get_data_freq));while (1){res = rt_device_read(dev, 0, &sensor_data, 1);if (res != 1){rt_kprintf("read data failed! result is %d\n", res);rt_device_close(dev);return;}else{if (sensor_data.data.temp >= 0){/*从传感器读取温湿度*/temp = (sensor_data.data.temp & 0xffff) >> 0;      // get temphumi = (sensor_data.data.temp & 0xffff0000) >> 16; // get humi/*上传温度*/if (onenet_mqtt_upload_digit("temperature", temp) < 0){LOG_E("upload has an error, stop uploading");break;}else{LOG_D("buffer : {\"temperature\":%d}", temp);}/*延时,为湿度上传提供时间*/rt_thread_mdelay(100);/*上传湿度*/if (onenet_mqtt_upload_digit("humidity", humi) < 0){LOG_E("upload has an error, stop uploading");break;}else{LOG_D("buffer : {\"humidity\":%d}", humi);}}}rt_thread_delay(rt_tick_from_millisecond(5 * 1000));}
}int onenet_upload_cycle(void)
{rt_thread_t tid;tid = rt_thread_create("onenet_send",onenet_upload_entry,RT_NULL,2 * 1024,RT_THREAD_PRIORITY_MAX / 3 - 1,5);if (tid){rt_thread_startup(tid);}return 0;
}
MSH_CMD_EXPORT(onenet_upload_cycle, send data to OneNET cloud cycle);int onenet_publish_digit(int argc, char **argv)
{if (argc != 3){LOG_E("onenet_publish [datastream_id]  [value]  - mqtt pulish digit data to OneNET.");return -1;}if (onenet_mqtt_upload_digit(argv[1], atoi(argv[2])) < 0){LOG_E("upload digit data has an error!\n");}return 0;
}
MSH_CMD_EXPORT_ALIAS(onenet_publish_digit, onenet_mqtt_publish_digit, send digit data to onenet cloud);int onenet_publish_string(int argc, char **argv)
{if (argc != 3){LOG_E("onenet_publish [datastream_id]  [string]  - mqtt pulish string data to OneNET.");return -1;}if (onenet_mqtt_upload_string(argv[1], argv[2]) < 0){LOG_E("upload string has an error!\n");}return 0;
}
MSH_CMD_EXPORT_ALIAS(onenet_publish_string, onenet_mqtt_publish_string, send string data to onenet cloud);/* onenet mqtt command response callback function */
static void onenet_cmd_rsp_cb(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size)
{char res_buf[] = { "cmd is received!\n" };LOG_D("recv data is %.*s\n", recv_size, recv_data);/* user have to malloc memory for response data */*resp_data = (uint8_t *) ONENET_MALLOC(strlen(res_buf));strncpy((char *)*resp_data, res_buf, strlen(res_buf));*resp_size = strlen(res_buf);
}/* set the onenet mqtt command response callback function */
int onenet_set_cmd_rsp(int argc, char **argv)
{onenet_set_cmd_rsp_cb(onenet_cmd_rsp_cb);return 0;
}
MSH_CMD_EXPORT(onenet_set_cmd_rsp, set cmd response function);#endif /* FINSH_USING_MSH */

注意:在上传温度和湿度的中间需要加入延时函数,因为数据时不断循环上传的,如果不加延时会导致湿度数据来不及上传。
四、运行调试
编译工程下载到开发板
输入命令onenet_mqtt_init进行MQTT初始化
输入命令onenet_upload_cycle进行温湿度循环上报
WiFi连接超时时间到达前请耐心等待开发板连接WiFi

查看云平台数据和上报数据是否一致,数据正常上报则说明实验成功。

**总结:**配置过程参考了rt_thread的官方文档说明
RT-Thread Onenet软件包配置文档
只是对软件包部分代码进行了修改。详情参考官方文档。

*基于RT-Thread的战舰开发板连接Onenent云平台(学习笔记)**相关推荐

  1. 基于ShineBlink物联网开发板和机智云平台开发的“针对短期内宠物无人照顾的智能宠物屋”系统

    正式介绍作品前先说明一下,我是湖南文理学院计算机与电气工程学院的一名大三学生,我叫陈海涛.作品全部内容均为个人创意.个人设计并手工制作,后期会考虑写论文投期刊,So!!严禁抄袭!抄袭必究! 该作品是用 ...

  2. stm32——esp8266物联网开发,连接onenet云平台(http)做智能家居(1)

    此处感谢b站up主--彼岸有光我们有船(我认为讲的和江科大老师一样好,如果习惯江科大老师的讲法的朋友们都可以看看捏) 提供的教程和最初的正点原子的源码,因为我学习的是江科大的stm32,所以进行了部分 ...

  3. 中国移动M5310 nbiot开发板连接onenet平台全过程

    中国移动M5310 nbiot开发板连接onenet平台全过程 详细介绍一下中移m5310 nbiot开发板对接onenet云平台的全过程,简单实现了温湿度的采集,及数据上报与可视化显示. 一.M53 ...

  4. 基于STM32战舰开发板的USMART调试组件的使用

    基于STM32战舰开发板的USMART调试组件的使用 USMART调试组件是什么? USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具.具体工作过程是通过串 ...

  5. 基于rt thread smart构建EtherCAT主站

    我把源码开源到到了gitee,https://gitee.com/rathon/rt-thread-smart-soem 有兴趣的去可以下载下来跑一下 软件工程推荐用vscode 打开.rt thre ...

  6. STM32下载程序至SRAM——基于正点原子精英STM32F103ZET6开发板

    STM32下载程序至SRAM--基于正点原子精英STM32F103ZET6开发板 如题,由于STM32的FLASH烧写寿命在1万次左右,对于本人这样的改一行代码都想下载到开发板中测试的强迫症患者,真是 ...

  7. c语言模拟32u4单片机,一种基于Atmega32u4的教学型Arduino开发板的制作方法

    本实用新型涉及一种教学型Arduino开发板,具体是基于Atmega32u4芯片的教学型Arduino开发板. 背景技术: 近些年来,互联网和物联网高速发展,在推动社会生产力快速发展的同时,也对我们的 ...

  8. PAJ7620手势传感器快速应用- -基于涂鸦CBU模组开发板

    PAJ7620手势传感器快速驱动- -基于涂鸦CBU模组开发板 正在,或是想要开发物联网小产品的你是否会觉得一些常用的控制需要繁琐地掏出手机会让你的产品体验不佳?添加实体按键又显得太 low ?不妨来 ...

  9. Linux学习之ARM开发板连接ubuntu18.04LTS及NFS相关配置

    Linux学习之ARM开发板连接ubuntu18.04LTS及NFS相关配置 第一步:在PC机安装Ubuntu18.04LTS 具体安装步骤参见上一篇文章 第二步:安装arm-linux-gcc交叉编 ...

最新文章

  1. 计算机书籍- 网络爬虫开发实战
  2. python快速编程入门黑马-新手如何快速入门Python编程?/开发python入门教程
  3. ios swift ios8 模糊
  4. centos7 安装配置mesos+marathon+zookeeper
  5. sql查询字段的值不为空
  6. 计算机组成原理第八章课后答案6,计算机组成原理 第八章 复习
  7. python寻找多数元素_寻找多数元素
  8. java nio 强制关闭_Java NIO服务器:远程主机强迫关闭了一个现有的连接
  9. python函数的作用域是什么_python函数的作用域
  10. 通过哈希MD5实现加密(python3.X)
  11. 技术人的未来(三)——红海与蓝海
  12. Mybatis报错 :Error evaluating expression ‘condition.xxxx!= null ‘
  13. 金仓数据库字段_金仓数据库认证工程师(KCE)考试试题_含答案_
  14. HTML5期末大作业:网页设计——小米商城官网首页(1页) HTML+CSS+JavaScript web期末作业设计网页_清新淡雅个人网页大学生网页设计作业成品
  15. 十一. MySQL InnoDB 三大特性之 BufferPool
  16. 如何判断建设用地是否符合土地利用总体规划?
  17. 【PHP】json返回大括弧和中括弧,json返回{}和[]
  18. 怎么把qlv格式转成mp4?附裁剪qlv视频尺寸技巧
  19. n76e003引脚图_新唐推出N76E003高规格低管脚1T 8051单片机
  20. 有效前沿和最优投资组合matlab,matlab 实验名称:投资组合分析 实验性质:综合性和研究探索性 实 联合开发网 - pudn.com...

热门文章

  1. 数千个数据库、遍布全国的物理机,京东物流全量上云实录 | 卓越技术团队访谈录...
  2. 使用canvas对图片进行裁切
  3. 我是一个硬盘(很感人)
  4. Android第三方登录详解2
  5. IT路要如何走?——老程序员的10个忠告
  6. 十二星座物语,女生最喜欢的星座性格【10】
  7. 普华i-VirtualApp应用交付系统介绍
  8. 寒门难出贵子,AI助力教育但问题依然难解
  9. 前端白屏问题_H5白屏问题
  10. 剪不断,理还乱——UML的四种关系