一、 引言 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开发板 USB线 三、 安装驱动安装完成后,在Win7下面会多出一个盘符: 系统的设备管理器里查看状态: 为什么会多出一个盘符呢,卖个关子。硬件我们搭好了,接下来就是软件环境了,一直在讲mbed的web在线开发环境多么方便,那我们就来亲身体验一下吧。 四、在线编译环境如果是第一次进入网站,那么我们就要选择我们的目标硬件,点击Platforms,出现一大堆的开发板。如下图所示: 在左边我们选择硬件厂商,筛选硬件平台: 看见了吧,出现的全是freescale的,我们的目标设备是frdm-k64f,选择 frdm-k64f 进入如下界面,这个页面里的信息就是frdm-k64f这个开发板的所有信息。很直观的一个图。选择“Add your mbed Compiler”: 点击 Open mbed Compiler: 经过加载后进入编译器界面,如下图: 选择例程,点击OK后,编辑自动导入例程。由于我们要进行网络编程,选择Ethernet_UDP_client例子作为模板,将名字改成“Ethernet_TCP_client”。如下图: 五、编辑代码在代码编辑之前,要在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]然后点击编译,如下图: 编译完成后,出现保存二进制文件的提示: 点击“另存为”,选择存储路径,在选择存储路径的时候,选择前面提到的多出的mbed盘符: 点击“保存”,你会发现,开发板上的LED等不停的闪烁,这个时候实际上是将程序下载到开发板上,很神奇吧!这个是mbed支持的开发板的特殊之处,这样大大简化了程序烧写过程。 六、数据查看程序烧写完成后,登录OneNET查看数据上传情况,如果不出意外,在相应数据流下面会出现类似下面的曲线,如下图:
打开串口调试工具,查看数据上传的响应信息: 以上就是运用arm mbed OS上传数据到OneNET的整个过程,无需自己搭建编译环境、无需关注硬件细节、无需专用的烧写工具,只需编写一小段数据上传的应用程序就实现了OneNET接入,很方便。
|