功能:

测试把固定的GPS数据发送到OneNet平台

调试途中碰到的问题

ARDUINO不支持sprintf的double打印,只能转换为char字符串然后再%s打印

#include <TimerOne.h>

#define DebugSerial Serial
#define GprsSerail Serial3 #define Success 1U
#define Failure 0U int L = 13; //LED指示灯引脚 unsigned long Time_Cont = 0; //定时器计数器 const unsigned int gprsRxBufferLength = 600;
char gprsRxBuffer[gprsRxBufferLength];
unsigned int gprsBufferCount = 0;
char OneNetServer[] = "api.heclouds.com"; //不需要修改 char device_id[] = "3225187"; //修改为自己的设备ID
char API_KEY[] = "R9xO5NZm6oVI4YBHvCPKEqtwYtMA"; //修改为自己的API_KEY
char sensor_gps[] = "location"; char lon_str[] = "11224.4992";
char lat_str[] = "3438.1633"; void setup() {
pinMode(L, OUTPUT);
digitalWrite(L, LOW);
DebugSerial.begin(9600);
GprsSerail.begin(9600); Timer1.initialize(1000);
Timer1.attachInterrupt(Timer1_handler); initGprs(); DebugSerial.println("\r\nsetup end!");
} void loop() {
postGpsDataToOneNet(API_KEY,device_id,sensor_gps,lon_str,lat_str);
delay(5000);
} double longitudeToOnenetFormat(char *lon_str_temp)
{
double lon_temp = 0;
long lon_Onenet = 0;
int dd_int = 0;
long mm_int = 0;
double lon_Onenet_double = 0; lon_temp = atof(lon_str_temp);
lon_Onenet =lon_temp*100000; //转换为整数 dd_int = lon_Onenet/10000000; //取出dd mm_int = lon_Onenet%10000000; //取出MM部分 lon_Onenet_double = dd_int + (double)mm_int/60/100000;//换算为Onenet格式 return lon_Onenet_double;
} double latitudeToOnenetFormat(char *lat_str_temp)
{
double lat_temp = 0;
long lat_Onenet = 0;
int dd_int = 0;
long mm_int = 0; double lat_Onenet_double = 0; lat_temp = atof(lat_str_temp);
lat_Onenet =lat_temp*100000; //转换为整数 dd_int = lat_Onenet/10000000; //取出dd mm_int = lat_Onenet%10000000; //取出MM部分 lat_Onenet_double = dd_int + (double)mm_int/60/100000;//换算为Onenet格式 return lat_Onenet_double;
} void postGpsDataToOneNet(char* API_VALUE_temp,char* device_id_temp,char* sensor_id_temp,char* lon_temp,char* lat_temp)
{
char send_buf[400]= {0};
char text[100] = {0};
char tmp[25] = {0}; char lon_str_end[15] = {0};
char lat_str_end[15] = {0}; dtostrf(longitudeToOnenetFormat(lon_temp),3,6, lon_str_end); //转换成字符串输出
dtostrf(latitudeToOnenetFormat(lat_temp),2,6, lat_str_end); //转换成字符串输出 //连接服务器
memset(send_buf, 0, 400); //清空
strcpy(send_buf, "AT+CIPSTART=\"TCP\",\"");
strcat(send_buf, OneNetServer);
strcat(send_buf, "\",80\r\n");
if (sendCommand(send_buf, "CONNECT", 10000, 5) == Success);
else GPRS_ERROR(7); //发送数据
if (sendCommand("AT+CIPSEND\r\n", ">", 3000, 1) == Success);
else GPRS_ERROR(8); memset(send_buf, 0, 400); //清空 /*准备JSON串*/
//ARDUINO平台不支持sprintf的double的打印,只能转换到字符串然后打印
sprintf(text,"{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":{\"lon\":%s,\"lat\":%s}}]}]}"
,sensor_id_temp,lon_str_end,lat_str_end); /*准备HTTP报头*/
send_buf[0] = 0;
strcat(send_buf,"POST /devices/");
strcat(send_buf,device_id_temp);
strcat(send_buf,"/datapoints HTTP/1.1\r\n");//注意后面必须加上\r\n
strcat(send_buf,"api-key:");
strcat(send_buf,API_VALUE_temp);
strcat(send_buf,"\r\n");
strcat(send_buf,"Host:");
strcat(send_buf,OneNetServer);
strcat(send_buf,"\r\n");
sprintf(tmp,"Content-Length:%d\r\n\r\n", strlen(text));//计算JSON串长度
strcat(send_buf,tmp);
strcat(send_buf,text); if (sendCommand(send_buf, send_buf, 3000, 1) == Success);
else GPRS_ERROR(9); char sendCom[2] = {0x1A};
if (sendCommand(sendCom, "\"succ\"}", 3000, 1) == Success);
else GPRS_ERROR(10); if (sendCommand("AT+CIPCLOSE\r\n", "CLOSE OK", 3000, 1) == Success);
else GPRS_ERROR(11); if (sendCommand("AT+CIPSHUT\r\n", "SHUT OK", 3000, 1) == Success);
else GPRS_ERROR(11);
} void initGprs()
{
if (sendCommand("AT\r\n", "OK", 3000, 10) == Success);
else GPRS_ERROR(1); // 如果输入 AT+CREG? <CR>则返回+CREG: <mode>, <stat> [ ,<lac>,<ci> ]
// 注: <mode>的值共有三个选项,分别是 0 or 1 or 2, 其中0 代表关闭网络注册结果
// 码, 1 代表当网络注册状态改变时激活网络注册结果码, 2 代表激活网
// 络注册结果码同时显示区域和小区信息.
// <stat>的返回值共有三个,分别是 0, 1, 2,3,4,5 , 其中 0 代表没有注册网络同时
// 模块没有找到运营商, 1代注册到了本地网络, 2 代表找到运营商但没
// 有注册网络, 3 代表注册被拒绝, 4 代表未知的数据, 5代表注册在漫游
// 状态.
// <lac>表示所属网络区域代码,十六进制格式显示,如: “ 279C”
// <ci>表示所属网络的小区 ID,十六进制格式显示,如: “ 0EB2” Tech-Link T&E
if (sendCommand("AT+CREG?\r\n", "+CREG: 0,1", 3000, 10) == Success);
else GPRS_ERROR(2); if (sendCommand("AT+CGCLASS=\"B\"\r\n", "OK", 3000, 2) == Success);
else GPRS_ERROR(3); if (sendCommand("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n", "OK", 3000, 2) == Success);
else GPRS_ERROR(4); if (sendCommand("AT+CGATT=1\r\n", "OK", 3000, 2) == Success);
else GPRS_ERROR(5); if (sendCommand("AT+CLPORT=\"TCP\",\"2000\"\r\n", "OK", 3000, 2) == Success);
else GPRS_ERROR(6);
} void(* resetFunc) (void) = 0; //制造重启命令 void GPRS_ERROR(int num)
{
DebugSerial.print("ERROR");
DebugSerial.println(num);
while (1)
{
digitalWrite(L, HIGH);
delay(300);
digitalWrite(L, LOW);
delay(300); if (sendCommand("AT\r\n", "OK", 100, 10) == Success)
{
DebugSerial.print("\r\nRESET!!!!!!\r\n");
resetFunc();
}
}
} unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry)
{
clrGprsRxBuffer();
for (unsigned char n = 0; n < Retry; n++)
{
DebugSerial.print("\r\n---------send AT Command:---------\r\n");
DebugSerial.write(Command); GprsSerail.write(Command); Time_Cont = 0;
while (Time_Cont < Timeout)
{
gprsReadBuffer();
if(strstr(gprsRxBuffer, Response) != NULL)
{
DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
DebugSerial.print(gprsRxBuffer); //输出接收到的信息
clrGprsRxBuffer();
return Success;
}
}
Time_Cont = 0;
}
DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
DebugSerial.print(gprsRxBuffer);//输出接收到的信息
clrGprsRxBuffer();
return Failure;
} void Timer1_handler(void)
{
Time_Cont++;
} void gprsReadBuffer() {
while (GprsSerail.available())
{
gprsRxBuffer[gprsBufferCount++] = GprsSerail.read();
if (gprsBufferCount == gprsRxBufferLength)clrGprsRxBuffer();
}
} void clrGprsRxBuffer(void)
{
memset(gprsRxBuffer, 0, gprsRxBufferLength); //清空
gprsBufferCount = 0;
}

ARDUINO使用GPRS发送GPS数据到OneNet测试的更多相关文章

  1. 2.4 使用ARDUINO控制MC20进行GPS数据的获取和解析

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  2. GPS数据转换为OneNet需要的数据

    GPS的数据格式是DDMM.MMMMMM 获取到的GPS帧数据比如是:$GNRMC,112317.000,A,3438.1633,N,11224.4992,E,0.19,186.95,240916,, ...

  3. 通过GPRS将GPS数据上传到OneNet流程

    AT OK AT+CGCLASS="B" OK AT+CGDCONT=1,"IP","CMNET" OK AT+CGATT=1 OK AT+ ...

  4. ARDUINO MEGA2560 经过ESP8266 WIFI模块上传温湿度数据到 OneNet 服务器

    简述 原来写了一个C++的wifi库但是发现用c++ arduino这小身板有点扛不住,代码比较大,使用String类型数据处理速度慢,而且很容易无缘无故跑飞.而且封装成库后使用还需要修改arduin ...

  5. sim800 gprs发送数据的AT流程

    switch(send_flag) { case 1: uart_send(&huart4,"AT\r\n",4); //AT break; case 2: uart_se ...

  6. 中国移动OneNet平台上传GPS数据JSON格式

    最终目的输出 POST /devices/3225187/datapoints HTTP/1.1 api-key: R9xO5NZm6oVI4YBHvCPKEqtwYtMA Host: api.hec ...

  7. GPS数据读取与处理

    GPS数据读取与处理 GPS模块简介 SiRF芯片在2004年发布的最新的第三代芯片SiRFstar III(GSW 3.0/3.1),使得民用GPS芯片在性能方面登上了一个顶峰,灵敏度比以前的产品大 ...

  8. 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)

    原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图. ...

  9. 使用Python2.7 POST 数据到 onenet 平台

    功能 发送数据名称为SENSORID(这里用TEST测试),数值为VALUE(这里用49值做测试)的数据,发送到自己的onenet对应设备 效果发送成功 代码 # -*- coding: utf-8 ...

随机推荐

  1. Java 二分法查找

    算法:当数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的. 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功:若 x 小于 ...

  2. MyISAM和InnoDB存储引擎的差别

    1.MyISAM不支持事务处理等高级处理,而InnoDB支持. 2.MyISAM强调的是性能,速度更快,而InnoDB提供事务支持以及外键等高级数据库功能. 3.MyISAM读性能比InnoDB强非常 ...

  3. windows 下编译64位ffmpeg

    window下如何编译ffmpeg 前文已有介绍,前面介绍的都是如何编译32位的库,本文主要介绍window 下如何编译64位ffmpeg库. 一.搭建编译环境 1.下载 windows下编译64位F ...

  4. php代码中使用换行及(\n或\r\n和br)的应用

    浏览器识别不了\n或\r\n,这两个换行符是文本换行符,文本文件有效;假设须要将结果输出到浏览器或打印到显示器,代码中使用br;假设仅仅是在源码中换行.则使用\n或\r\n,感兴趣的朋友能够了解下,也 ...

  5. 将Latex tex文档转换成 word文档(下)

    在上篇中我们介绍了一款将 tex 文件转换成 word 文件的工具 借用万能的搜索引擎,在 Google 上找到了更好的工具 它就是Pandoc 介绍 Pandoc 是由 John McaFarlan ...

  6. PHP curl post header

    第三方教程推荐:https://www.cnblogs.com/CHEUNGKAMING/p/5717429.html

  7. 使用 yarn 作为 Npm 的代替方案

    相关传送门: # window 安装包下载https://yarnpkg.com/zh-Hans/docs/install#windows-stable # yarn官方网站 https://yarn ...

  8. javascript与as3交互

    文章都是发布在github再转到这边的,这边格式可能会乱掉.博客地址:benqy.com 写在前面的废话 公司首页的flash广告,都是由第三方制作的,脚本和flash文件都是由各个广告公司独立制作, ...

  9. HDU 4883 TIANKENG’s restaurant Bestcoder 2-1(模拟)

    TIANKENG's restaurant Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/O ...

  10. 事件驱动模型实例详解(Java篇)

    或许每个软件从业者都有从学习控制台应用程序到学习可视化编程的转变过程,控制台应用程序的优点在于可以方便的练习某个语言的语法和开发习惯(如.net和java),而可视化编程的学习又可以非常方便开发出各类 ...