【教程】教你如何运用 ARM mbed OS 接入 OneNET—HTTP 篇-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13975|回复: 1

【教程】教你如何运用 ARM mbed OS 接入 OneNET—HTTP 篇

[复制链接]
发表于 2016-1-28 13:43 | 显示全部楼层 |阅读模式
一、 引言
mbed OS是专为基于ARM Cortex-M处理器的设备所设计的免费操作系统.,将物联网所需的所有基础组件,包括安全, 通信传输与设备管理等功能,整合为一套完整软件,以协助开发低功耗、产品级的物联网设备并实现量产。为了降低 mbed OS用户开发的工作量,ARM公司提供了一套强大的编译系统,支持本地编译和在线编译。如果你在你的设备上运用mbed OS进行开发,那么,在线编译会大大降低你的工作量。
对于接入OneNET的用户来讲,为了应对硬件差异性,开发者大部分时间浪费在和硬件相关的代码上开发和调试上,为了省去用户开发环境安装的麻烦,mbed提供了一个完备的基于浏览器的微处理器软件开发环境,包括代码编写,程序编译,版本控制等功能,用户只要上网就可以开发,编译结果只要下载保存到mbed开发板上即可工作,非常方便。在这里详细介绍运用mbed OS的在线编译方式接入OneNET。
本文着重介绍运用mbed OS接入OneNET的方法,为了便于说明,例子中用到的上传数据并非真实采集的传感器数据,而是用函数产生的随机数。

二、 硬件准备
你只需要一块mbed enabled的开发板,就可以很方便的实现接入,这里顺便提一下,由于ARM公司在硬件领域的强大影响力,在mbed OS推荐后不久,已经有数十家硬件厂商完成对ARM mbed的支持,你可以在某宝很方便的获取各种硬件资源,包括开发板、传感器等。在本例中选择frdm-k64f的硬件开发板,如下图:
frdm-k64f开发板
c7c0a67ebb84e910de0cdc77a3dd0eab.png
USB线
51e673dcaeb917425c079865751619ce.png
三、 安装驱动
将frdm-k64f连接到PC,系统会提醒安装驱动,可以到如下地址下载驱动并安装:https://developer.mbed.org/handbook/Windows-serial-configuration
安装完成后,在Win7下面会多出一个盘符:
5dc0cc4d45b833a79dc12a5ab5f15db9.png
系统的设备管理器里查看状态:
2166683e09f549ef7c12884407728a80.png
为什么会多出一个盘符呢,卖个关子。硬件我们搭好了,接下来就是软件环境了,一直在讲mbed的web在线开发环境多么方便,那我们就来亲身体验一下吧。

四、在线编译环境
点击进入MBED的官网 https://developer.mbed.org/, 如下图:
4e2589a11148914dc4b57812c8444ecb.png
如果是第一次进入网站,那么我们就要选择我们的目标硬件,点击Platforms,出现一大堆的开发板。如下图所示:
88b8be0c5f1ca3ee1af3148bdd25fecb.png
在左边我们选择硬件厂商,筛选硬件平台:
bb69ea6ecb5f6fe627fe457474c7408d.png
看见了吧,出现的全是freescale的,我们的目标设备是frdm-k64f,选择 frdm-k64f 进入如下界面,这个页面里的信息就是frdm-k64f这个开发板的所有信息。很直观的一个图。选择“Add your mbed Compiler”:
7ee31938913552cf5cf750d2ab846448.png
点击 Open mbed Compiler:
0361caf69a55321dae198c80989e6d9f.png
经过加载后进入编译器界面,如下图:
90a8e7f623b5209a5e8a9c6edb69a682.png
选择例程,点击OK后,编辑自动导入例程。由于我们要进行网络编程,选择Ethernet_UDP_client例子作为模板,将名字改成“Ethernet_TCP_client”。如下图:
bf1e2350c501fc0f085e6162e9b0b969.png
五、编辑代码
在代码编辑之前,要在OneNET平台端做好创建设备、数据流、APIkey等相关的准备工作,由于这些都比较简单,这里不在详细介绍,假设我们已经做好了平台端准备工作。 双击main.cpp。将其中代码替换成如下:
[mw_shl_code=cpp,true]#include "mbed.h"
#include "EthernetInterface.h"

EthernetInterface eth;
TCPSocketConnection sock;

char http_cmd[500];
char devid[] = "your device id";//替换成你的设备id
char api_key[] ="your apikey"//替换成你自己设备的apikey
char host[] = "api.heclouds.com";

void creat_cmd(char* dev_id, char* apikey)
{
    char tmp[30];
    char pJson[30];
    int cnt = 0;

    cnt = rand() % 99;
    sprintf(pJson,"{\"sys_time\":%d}", cnt);
    http_cmd[0] = 0;
    strcat(http_cmd,"POST /devices/");
    strcat(http_cmd,dev_id);
    strcat(http_cmd,"/datapoints?type=3 HTTP/1.1\r\n");
    strcat(http_cmd,"api-key:");
    strcat(http_cmd,apikey);
    strcat(http_cmd,"\r\n");
    strcat(http_cmd,"Host:");
    strcat(http_cmd,host);
    strcat(http_cmd,"\r\n");
    sprintf(tmp,"Content-Length:%d\r\n\r\n", strlen(pJson));
    strcat(http_cmd,tmp);
    strcat(http_cmd,pJson);
}

int main()
{

    eth.init(); //DHCP
    while(1) {
        eth.connect();
        printf("IP Address is %s\n", eth.getIPAddress());
        sock.connect("api.heclouds.com", 80);

        while(1) {
            /*create the http message about add datapoint */
            creat_cmd(devid, api_key);
            if(sock.is_connected()) {
                sock.send(http_cmd, strlen(http_cmd));
                printf("%s\n",http_cmd);
            } else {
                /*******start reconnect**************/
                printf("sock.is_connected = false\n");
                sock.close();
                eth.disconnect();
                break;
            }
            wait(4);

            /**********receive response data*******************/
            char buffer[300];
            int ret = 0;
            buffer[0] = '\0';
            ret = sock.receive(buffer, sizeof(buffer)-1);
            if(ret >= 0) {
                buffer[ret] = '\0';
            }
            printf("Received %d chars from server:\n%s\n", ret, buffer);

        }
    }
}[/mw_shl_code]
然后点击编译,如下图:
34c4838e25d3d16eaef7bdb0ec068fd9.png
编译完成后,出现保存二进制文件的提示:
9c1c8aed47b65dd1b70e7256a4c44fed.png
点击“另存为”,选择存储路径,在选择存储路径的时候,选择前面提到的多出的mbed盘符:
5dc0cc4d45b833a79dc12a5ab5f15db91.png
点击“保存”,你会发现,开发板上的LED等不停的闪烁,这个时候实际上是将程序下载到开发板上,很神奇吧!这个是mbed支持的开发板的特殊之处,这样大大简化了程序烧写过程。
六、数据查看
程序烧写完成后,登录OneNET查看数据上传情况,如果不出意外,在相应数据流下面会出现类似下面的曲线,如下图: 4411d355afd8607e37e4a2f35b5e160e.png
打开串口调试工具,查看数据上传的响应信息:
e0694149040e895b52ebc00b9423823b.png
以上就是运用arm mbed OS上传数据到OneNET的整个过程,无需自己搭建编译环境、无需关注硬件细节、无需专用的烧写工具,只需编写一小段数据上传的应用程序就实现了OneNET接入,很方便。


发表于 2016-9-24 08:25 来自手机 | 显示全部楼层
感谢老师分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 00:54 , Processed in 0.079469 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表