RT-Thread 软件包-IoT-OneNET①

这篇具有很好参考价值的文章主要介绍了RT-Thread 软件包-IoT-OneNET①。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RT-Thread 软件包-IoT-OneNET①

RT-Thread 软件包-IoT-OneNET①,Linux,Python,ARM MCU,linux,stm32,arm开发,运维,java,物联网

OneNET

中文页 | English

1、介绍

OneNET 平台是中国移动基于物联网产业打造的生态平台,具有高并发可用、多协议接入、丰富 API 支持、数据安全存储、快速应用孵化等特点,同时,OneNET 平台还提供全方位支撑,加速用户产品的开发速度。

OneNET 软件包是 RT-Thread 针对 OneNET 平台连接做的的适配,通过这个软件包,可以让设备在 RT-Thread 上非常方便的连接 OneNet 平台,完成数据的发送、接收、设备的注册和控制等功能。

软件包具有以下优点:

  • 断线重连
  • 自动注册
  • 自定义响应函数
  • 自定义 topic 和 topic 对应的回调函数
  • 上传二进制数据

更多介绍请查看详细介绍

1.1 目录结构

OneNET
│   README.md                       // 软件包使用说明
│   SConscript                      // RT-Thread 默认的构建脚本
├───docs 
│   └───figures                     // 文档使用图片
│   │   api.md                      // API 使用说明
│   │   introduction.md             // 软件包详细介绍
│   │   principle.md                // 实现原理
│   │   README.md                   // 文档结构说明
│   │   samples.md                  // 软件包示例
│   │   user-guide.md               // 使用说明
│   │   port.md                     // 移植说明文档
│   └───version.md                  // 版本
├───ports                           // 移植文件                 
│   └───onenet_port.c               // 移植文件模板
├───samples                         // 示例代码
│   └───onenet_sample.c             // 软件包应用示例代码
├───inc                             // 头文件
└───src                             // 源文件

1.2 许可证

OneNET package 遵循 GUN GPL 许可,详见 LICENSE 文件。

1.3 依赖

  • RT_Thread 3.0+
  • paho-mqtt
  • webclient
  • cJSON

2、获取方式

使用 OneNET package 需要在 RT-Thread 的包管理中选中它,具体路径如下:

RT-Thread online packages
    IoT - internet of things  --->
        IoT Cloud  --->
            [*] OneNET: China Mobile OneNet cloud SDK for RT-Thread

进入 onenet 软件包的配置菜单按下图所示配置,里面的信息依据自己的产品和设备的实际情况填写

--- OneNET: China Mobile OneNet cloud SDK for RT-Thread                            
    [ ]   Enable OneNET sample                                                  
    [*]   Enable support MQTT protocol                                                 
    [ ]   Enable OneNET automatic register device (NEW)                             
    (35936966) device id                                                             
    (201807171718) auth info
    (H3ak5Bbl0NxpW3QVVe33InnPxOg=) api key                                              
    (156418) product id                                                                 
    (dVZ=ZjVJvGjXIUDsbropzg1a8Dw=) master/product apikey (NEW)                       
        version (latest)  --->

Enable OneNET sample :开启 OneNET 示例代码

Enable support MQTT protocol :开启 MQTT 协议连接 OneNET 支持

Enable OneNET automatic register device :开启 OneNET 自动注册设备功能

device id :配置云端创建设备时获取的 设备ID

auth info :配置云端创建产品时 用户自定义的鉴权信息 (每个产品的每个设备唯一)

api key :配置云端创建设备时获取的 APIkey

product id :配置云端创建产品时获取的 产品ID

master/product apikey :配置云端创建产品时获取的 产品APIKey

配置完成后让 RT-Thread 的包管理器自动更新,或者使用 pkgs --update 命令更新包到 BSP 中。

3、使用 OneNET 软件包

  • 详细的示例介绍,请参考 示例文档 。

  • 如何从零开始使用,请参考 用户手册。

  • 完整的 API 文档,请参考 API 手册。

  • OneNET 软件包工作原理,请参考 工作原理 。

  • OneNET 软件包移植,请参考 移植手册 。

  • 更多详细介绍文档位于 /docs 文件夹下,使用软件包进行开发前请务必查看

4、注意事项

  • 未启用自动注册功能,在 menuconfig 选项中配置的 device idapi keyproduct idauth info 等信息需要和 OneNET 云端新建产品和新建设备时获取的信息一致。
  • 启用自动注册功能后,需要阅读移植手册并完成移植工作。
  • 初始化 OneNET package 之前需要设备联网成功

示例代码

…\bsp\stm32\stm32l452-st-nucleo\board\board.c文章来源地址https://www.toymoban.com/news/detail-824061.html

/*
 * File      : onenet_http.c
 * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-04-24     chenyong     first version
 */
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>

#include <cJSON_util.h>
#include <webclient.h>

#include <onenet.h>

#define DBG_ENABLE
#define DBG_COLOR
#define DBG_SECTION_NAME    "onenet.http"
#if ONENET_DEBUG
#define DBG_LEVEL           DBG_LOG
#else
#define DBG_LEVEL           DBG_INFO
#endif /* ONENET_DEBUG */

#include <rtdbg.h>

#define ONENET_SEND_DATA_LEN           1024
#define ONENET_HEAD_DATA_LEN           256
#define ONENET_CON_URI_LEN             256
#define ONENET_RECV_RESP_LEN           1024
#define ONENET_TIME_BUF_LEN            24
#define ONENET_HTTP_HEAD_LEN           1024

#if WEBCLIENT_SW_VERSION_NUM < 0x20000
#error "Please upgrade the webclient version "
#endif

#define WEBCLIENT_HEADER_ADD(session, fmt, ...)                                                         \
    do                                                                                                  \
    {                                                                                                   \
        if (webclient_header_fields_add(session, fmt, ##__VA_ARGS__) < 0)                               \
        {                                                                                               \
            LOG_E("webclient add header failed!");                                                      \
            goto __exit;                                                                                \
        }                                                                                               \
    } while(0);                                                                                         \

extern struct rt_onenet_info onenet_info;

static rt_err_t onenet_upload_data(char *send_buffer)
{
    struct webclient_session *session = RT_NULL;
    char *buffer = send_buffer;
    char *URI = RT_NULL;
    rt_err_t result = RT_EOK;

    RT_ASSERT(send_buffer);

    URI = ONENET_CALLOC(1, ONENET_CON_URI_LEN);
    if (URI == RT_NULL)
    {
        LOG_E("OneNet Send data failed! No memory for URI buffer!");
        result = -RT_ENOMEM;
        goto __exit;
    }

    rt_snprintf(URI, ONENET_CON_URI_LEN, "http://api.heclouds.com/devices/%s/datapoints?type=3", onenet_info.device_id);

    session = webclient_session_create(ONENET_HTTP_HEAD_LEN);
    if (session == RT_NULL)
    {
        result = -RT_ERROR;
        goto __exit;
    }

    WEBCLIENT_HEADER_ADD(session, "api-key: %s\r\n", onenet_info.api_key);
    WEBCLIENT_HEADER_ADD(session, "Content-Length: %d\r\n", strlen(buffer));
    WEBCLIENT_HEADER_ADD(session, "Content-Type: application/octet-stream\r\n");

    if (webclient_post(session, URI, buffer, strlen(buffer)) != 200)
    {
        result = -RT_ERROR;
        goto __exit;
    }

    LOG_D("buffer : %.*s", strlen(buffer), buffer);

__exit:
    if (session)
    {
        webclient_close(session);
    }
    if (URI)
    {
        ONENET_FREE(URI);
    }

    return result;
}


static rt_err_t onenet_get_string_data(const char *ds_name, const char *str, char **out_buff)
{
    rt_err_t result = RT_EOK;
    cJSON *root = RT_NULL;

    RT_ASSERT(ds_name);
    RT_ASSERT(str);
    RT_ASSERT(out_buff);

    root = cJSON_CreateObject();
    if (!root)
    {
        LOG_E("onenet publish string data failed! cJSON create object error return NULL!");
        return -RT_ENOMEM;
    }

    cJSON_AddStringToObject(root, ds_name, str);

    /* render a cJSON structure to buffer */
    *out_buff = cJSON_PrintUnformatted(root);
    if (!(*out_buff))
    {
        LOG_E("onenet publish string data failed! cJSON print unformatted error return NULL!");
        result = -RT_ENOMEM;
        goto __exit;
    }

__exit:
    if (root)
    {
        cJSON_Delete(root);
    }

    return result;
}

static rt_err_t onenet_get_digit_data(const char *ds_name, const double digit, char **out_buff)
{
    rt_err_t result = RT_EOK;
    cJSON *root = RT_NULL;

    RT_ASSERT(ds_name);
    RT_ASSERT(out_buff);

    root = cJSON_CreateObject();
    if (!root)
    {
        LOG_E("onenet publish digit data failed! cJSON create object error return NULL!");
        return -RT_ENOMEM;
    }

    cJSON_AddNumberToObject(root, ds_name, digit);

    /* render a cJSON structure to buffer */
    *out_buff = cJSON_PrintUnformatted(root);
    if (!(*out_buff))
    {
        LOG_E("onenet publish digit data failed! cJSON print unformatted error return NULL!");
        result = -RT_ENOMEM;
        goto __exit;
    }

__exit:
    if (root)
    {
        cJSON_Delete(root);
    }

    return result;
}

/**
 * upload digit data to OneNET cloud.
 *
 * @param   ds_name     datastream name
 * @param   digit       digit data
 *
 * @return  0 : upload data success
 *         -5 : no memory
 */
rt_err_t onenet_http_upload_digit(const char *ds_name, const double digit)
{
    char *send_buffer = RT_NULL;
    rt_err_t result = RT_EOK;

    RT_ASSERT(ds_name);

    /* get JSON format data */
    result = onenet_get_digit_data(ds_name, digit, &send_buffer);
    if (result < 0)
    {
        goto __exit;
    }

    /* send data to cloud by HTTP */
    result = onenet_upload_data(send_buffer);
    if (result < 0)
    {
        goto __exit;
    }

__exit:
    if (send_buffer)
    {
        cJSON_free(send_buffer);
    }

    return result;
}

/**
 * upload string data to OneNET cloud.
 *
 * @param   ds_name     datastream name
 * @param   str         string data
 *
 * @return  0 : upload data success
 *         -5 : no memory
 */
rt_err_t onenet_http_upload_string(const char *ds_name, const char *str)
{
    char *send_buffer = RT_NULL;
    rt_err_t result = RT_EOK;

    RT_ASSERT(ds_name);
    RT_ASSERT(str);

    /* get JSON format data */
    result = onenet_get_string_data(ds_name, str, &send_buffer);
    if (result < 0)
    {
        goto __exit;
    }

    /* send data to cloud by HTTP */
    result = onenet_upload_data(send_buffer);
    if (result < 0)
    {
        goto __exit;
    }

__exit:
    if (send_buffer)
    {
        cJSON_free(send_buffer);
    }

    return result;
}

#ifdef ONENET_USING_AUTO_REGISTER
static rt_err_t response_register_handlers(const unsigned char *rec_buf, const size_t length)
{
    cJSON *root = RT_NULL;
    cJSON *item = RT_NULL;
    cJSON *itemid = RT_NULL;
    cJSON *itemapikey = RT_NULL;

    RT_ASSERT(rec_buf);

    LOG_D("response is %.*s", length, rec_buf);

    root = cJSON_Parse((char *)rec_buf);
    if (!root)
    {
        LOG_E("onenet register device failed! cJSON Parse data error return NULL!");
        return -RT_ENOMEM;
    }

    item = cJSON_GetObjectItem(root, "errno");
    if (item->valueint == 0)
    {
        itemid = cJSON_GetObjectItem(root->child->next, "device_id");
        itemapikey = cJSON_GetObjectItem(root->child->next, "key");

        onenet_port_save_device_info(itemid->valuestring, itemapikey->valuestring);
    }
    else
    {
        LOG_E("onenet register device failed! errno is %d", item->valueint);
        return -RT_ERROR;
    }

    return RT_EOK;

}



#endif /* ONENET_USING_AUTO_REGISTER */







维护人:

  • 华为奋斗者精神, 邮箱:1992152446@qq.com

到了这里,关于RT-Thread 软件包-IoT-OneNET①的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RT-Thread 软件包-物联网-网络工具集NetUtils使用指南①

    本文介绍 RT-Thread NetUtils 的使用方法,帮助开发者更好地使用 RT-Thread NetUtils 组件来解决网络开发过程中遇到的问题。 简介 在进行网络相关的产品开发和调试时,一些好用的小工具往往能取到事半功倍的效果。 RT-Thread NetUtils 组件基于此应用场景,开发和封装了一系列简洁好

    2024年02月20日
    浏览(42)
  • RT-Thread 软件包-PikaScript用户手册-STM32模块API文档①

    RT-Thread软件包中的PikaScript用户手册针对STM32模块提供了API文档。STM32模块是一个为基于STM32微控制器的RT-Thread系统提供支持的功能模块,它提供了对STM32硬件资源的访问和控制。 在PikaScript用户手册中,针对STM32模块的API文档主要包括以下几个部分: GPIO控制:STM32模块提供了一

    2024年02月02日
    浏览(34)
  • RT-Thread STM32L475 IoT Discovery kit BSP说明①

    本文档为 RT-Thread 开发团队为 STM32L475 IoT Discovery kit开发板提供的 BSP (板级支持包) 说明。 主要内容如下: 开发板资源介绍 BSP 快速上手 进阶使用方法 通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功

    2024年02月02日
    浏览(69)
  • RT-Thread 1. GD32移植RT-Thread Nano

    1. RT-Thread Nano 下载 RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实

    2024年02月05日
    浏览(33)
  • RT-Thread 9. VS2012下仿真RT-Thread 和LVGL

    1. 在ENV中添加组件 2. 下载组件 3. 生成代码 4. 打开代码 双击project.vcxproj 编译 5. 运行

    2024年02月06日
    浏览(45)
  • 【STM32&RT-Thread零基础入门】 2. 新建RT-Thread项目

    硬件:STM32F103ZET6、ST-LINK、usb转串口工具 RT-Thread的全称是Real Time Thread,顾名思义,它是一个嵌入式实时多线程操作系统。相较于 Linux 操作系统,RT-Thread 体积小,成本低,功耗低、启动快速,除此之外 RT-Thread 还具有实时性高、占用资源小等特点,非常适用于各种资源受限(

    2024年02月13日
    浏览(32)
  • RT-Thread 7. RT-Thread Studio ENV修改MCU型号

    1. 修改MCU型号 2.在ENV界面输入 3. dist下为更新后完整源代码 4.导入RT-Thread Studio 发现GD32F330已经生效了。 5. 自己编写startup_gd32f3x0.S,准确性待验证

    2024年02月06日
    浏览(30)
  • 使用RT-Thread Studio搭配STM32CubeMX新建RT-Thread项目

    STM32CubeMX下载 RT-Thread Studio下载 安装好RT-Thread Studio后,先打开RT-Thread SDK管理器确认有没有自己MCU需要的SDK包,直接安装好之后里面是有STM32F1系列的SDK包,其他的需要自己安装。 之后点击文件→新建→RT-Thread项目,根据自己需要配置好后点击完成就会生成RT-Thread项目。 新建项

    2024年02月11日
    浏览(31)
  • 【RT-Thread】使用RT-Thread Studio 配置BootLoader及App实现OTA功能

    由于项目需要实现OTA功能学习了一下具体实现方法,以备后期查看,有问题的地方随时指正修改 1.什么是OTA OTA是“over-the-air”的缩写,是一种无线技术,用于在不需要接触设备的情况下向移动设备或物联网设备提供更新、补丁或新版本的软件。OTA更新通常通过无线网络(如

    2024年02月09日
    浏览(27)
  • 【STM32&RT-Thread零基础入门】8. 基于 CubeMX 移植 RT-Thread Nano

    硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 利用RT_Thread操作系统实现三种不同的LED等闪烁 提示:以下是本篇文章正文内容,下面案例可供参考 cubemx配置参考教程: 基于 CubeMX 移植 RT-Thread Nano 后面程序所需的引脚 RT

    2024年02月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包