功能:

测试把固定的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. 创建你的第一个ionic+cordova应用(1)

    前面我们安装了前端的神器webstorm11,体验到了强大的开发体验,接着我们来安装ionic 必备: Node.js (npm安装工具) 百度下载 官网下载  注:如果官网新版不能安装请用百度下载0 ...

  2. vue 的 起手式

    代码: vue.js // vue 起手势 (function(root,factory) { root.Vue = factory(); })(this,function(){ // 设置基础的默认 ...

  3. Vue 事件修饰符 阻止默认事件

    阻止默认事件: <a v-on:click.prevent="doThat"></a>

  4. DbVisualizer出现下列错误:Could not read XML file

    数据库连接工具对于我们软件测试工程师来说是日常的工具,一旦关键时刻报些莫名的错误,相信大家很是苦恼.当然,各公司数据库连接工具各异,像DbVisualizer.PLsql.sqldeveloper.T ...

  5. Java 常见的异常错误分析大集合

      算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:Negative ...

  6. ubuntu 安装时出错 sudo apt-get update Reading package lists… Error

    安装过程出错 首先出现问题sudo apt-get updateReading package lists… Error!E: Encountered a section with no Packag ...

  7. 我们常用的在a标签中有点击事件

    我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题 ...

  8. day14—JQuery编程基础

    JQuery 1.什么是jQuery jQuery是一个优秀的JavaScript框架.一个轻量级的JavaScript类库.jQuery的核心理念是Write less.Do more. 使用jQu ...

  9. Atitit.软件硕士  博士课程 一览表 attilax 总结

    Atitit.软件硕士  博士课程 一览表 attilax 总结 1. Attilax聚焦的领域1 2. 研究生硕士博士课程汇总表1 3. 博士课程3 4. Attilax额外的4 5. 参考4 1. ...

  10. android Webview 实现js调用java代码实现Activity跳转

    今天有了一个需求,在android里webview加载的html页面,要求点击html页面的按钮实现Activity的跳转. 咱是是菜鸟,webview的接触不多,于是就和度娘来了次亲密接触.在其中也 ...