一、環(huán)境介紹
GSM模塊:?GA6--果云
完整源碼下載:??https://download.csdn.net/download/xiaolong1126626497/18245590
其他參考文章:?STM32+ESP8266使用MQTT協(xié)議連接阿里云物聯(lián)網(wǎng)服務(wù)器
其他參考文章:STM32+ESP8266使用標(biāo)準(zhǔn)MQTT協(xié)議(MQTTS)連接中國(guó)移動(dòng)OneNet物聯(lián)網(wǎng)服務(wù)器
二、GA6-GSM模塊介紹與調(diào)試
說(shuō)明: ?GA6-B模塊供電必須5V,采用電腦USB供電可能不穩(wěn)定(沒(méi)有5V,只有4.8V左右),導(dǎo)致模塊使用不穩(wěn)定,發(fā)送AT指令沒(méi)有反應(yīng),調(diào)試階段,可將開(kāi)發(fā)板的USB線連接充電寶或者手機(jī)充電插頭取電。
2.1? GA6-B模塊概述
GA6-B 模組:
1.?? ?GA6 尺寸 22.8mm x 16.8mm x 2.2 mm;
2.?? ?正常工作溫度:-30°C ~ +80°C,
3.?? ?受限工作溫度:-40°C ~ -30°C 及+80°C ~+85°C*
4.?? ?工作電壓 3.5V-4.2V;
5.?? ?開(kāi)機(jī)電壓>3.5V;
6.?? ?SLEEP 模式下的耗流為 0.9mA;
7.?? ?四頻:GSM850, EGSM 900 和 DCS 1800,PCS1900 可以自動(dòng)的搜尋 四個(gè)頻段。 l 符合 GSM Phase 2 / 2+ l GPRS Class 10;
8.?? ?靈敏度<-107;
9.?? ?支持語(yǔ)音通話;
10.?? ?支持 SMS 短信;
11.?? ?支持移動(dòng)和聯(lián)通2G,以及全球的GSM網(wǎng)絡(luò)
12.?? ?GPRS 數(shù)據(jù)特性,最大數(shù)據(jù)速率,下載 85.6Kbps,上傳 42.8Kbps;
13.?? ?支持符合 GSM 07.10 協(xié)議的串口復(fù)用功能
14.?? ?支持 2 個(gè)串口,一個(gè)下載串口,一個(gè) AT 命令口;
15.?? ?AT 命令支持標(biāo)準(zhǔn) AT 和 TCP/IP 命令接口;
16.?? ?支持?jǐn)?shù)字音頻和模擬音頻,支持 HR,F(xiàn)R,EFR,AMR 語(yǔ)音編碼;
17.?? ?支持FCC,CE認(rèn)證;
18.?? ?SMT 42PIN 封裝;
GA6模塊的優(yōu)勢(shì)
廣域覆蓋:GPRS在全國(guó)34個(gè)省均有良好覆蓋,更是全球通行的2G通訊標(biāo)準(zhǔn)?;旧显谑謾C(jī)可以打電話的地方都可以通過(guò)GPRS無(wú)線上網(wǎng);
永遠(yuǎn)在線:只要激活GPRS應(yīng)用后,將一直保持在線,類似于無(wú)線專線網(wǎng)絡(luò)服務(wù)。
按量計(jì)費(fèi):GPRS服務(wù)雖然保持一直在線,但您不必?fù)?dān)心費(fèi)用問(wèn)題;因?yàn)橹挥挟a(chǎn)生通信流量時(shí)才計(jì)費(fèi)。
高速傳輸:目前GPRS可支持85.6Kbps的峰值傳輸速率,理論峰值傳輸可達(dá)100余Kbps。
價(jià)格便宜 :相對(duì)于 SIM 系列的模塊 價(jià)格只有其的一半。大大降低了物聯(lián)網(wǎng)設(shè)備的入門(mén)門(mén)檻憑借超小的尺寸,超低功耗和寬工作溫度范圍,GA6是M2M應(yīng)用的理想解決方案,適用于車載、工業(yè)及PDA、個(gè)人跟蹤、電力環(huán)境檢測(cè)、無(wú)線POS、智能計(jì)量以及其它M2M的應(yīng)用,為其提供完善的GSM/GPRS短信、數(shù)據(jù)傳輸及語(yǔ)音服務(wù)。
2.2 GA6模塊調(diào)試
模塊默認(rèn)波特率: ?115200
電壓: ?5V
TX---URX(GA6模塊)
RX---UTX(GA6模塊)
- 模塊上電串口助手收到的消息:
注意: ?電壓必須5V否則,給模塊發(fā)送AT指令沒(méi)有用。
- 正常情況下,模塊插上SIM電話卡,供電達(dá)到5V時(shí),模塊上電會(huì)返回以下提示信息。
當(dāng)模塊出現(xiàn) “SMS Ready”字符串提示時(shí),說(shuō)明模塊已經(jīng)可以正常的接收“AT”指令了。
2.3 基礎(chǔ)常用的指令介紹使用
(指令結(jié)尾發(fā)送都需要加rn)
1. 檢測(cè)模塊是否正常
給模塊發(fā)送指令: AT
模塊正常返回,這個(gè)指令可以檢測(cè)模塊是否正常: OK |
2. 查詢SIM卡是否在卡槽內(nèi)
給模塊發(fā)送指令: AT+CPIN?
如果卡在卡槽內(nèi),模塊正常返回值: +CPIN:READY OK |
3. 查詢模塊是否注冊(cè)到網(wǎng)絡(luò)
給模塊發(fā)送指令: AT+CREG?
如果模塊已經(jīng)正常注冊(cè)到網(wǎng)絡(luò)的返回值: AT+CREG? +CREG: 1,1 OK |
4. 關(guān)閉指令回顯
給模塊發(fā)送指令: ATE0
指令執(zhí)行成功返回值: (關(guān)閉AT指令回顯,方便調(diào)試,提高程序效率) OK |
2.4?GPRS網(wǎng)絡(luò)通信相關(guān)指令介紹
1. 查詢網(wǎng)絡(luò)連接狀態(tài)
給模塊發(fā)送指令: AT+CIPSTATUS
指令執(zhí)行成功返回值如下(多種): "IP INITIAL" 初始化 "IP START" 啟動(dòng)任務(wù) "IP CONFIG" 配置場(chǎng)景 "IP IND" 激活 GPRS/CSD 場(chǎng)景中 "IP GPRSACT" 接收?qǐng)鼍芭渲?/p> "IP STATUS" 獲得本地 IP 地址(參考 AT+CIFSR 命令) "TCP CONNECTING" TCP 連接中 "UDP CONNECTING" UDP 連接中 "IP CLOSE" TCP/UDP 連接關(guān)閉 "CONNECT OK" TCP/UDP 連接成功 ??,連接成功之后才可進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)通信 |
2. 附著GPRS網(wǎng)絡(luò) (進(jìn)行網(wǎng)絡(luò)通信前,需要先附著GPRS網(wǎng)絡(luò)才可進(jìn)行正常通信)
給模塊發(fā)送指令: AT+CGATT=1
模塊正常附著了GPRS網(wǎng)絡(luò),返回值: (注意該指令第一次附著網(wǎng)絡(luò)需要點(diǎn)時(shí)間,需等待一段時(shí)間) OK |
3. 激活GPRS網(wǎng)絡(luò)
給模塊發(fā)送指令: AT+CGACT=1,1
模塊正常激活了GPRS網(wǎng)絡(luò)返回值: OK |
4. 建立TCP連接: ?連接TCP服務(wù)器
模塊發(fā)送指令: AT+CIPSTART="TCP","183.230.40.33",80
如果服務(wù)器正常連接成功的返回值: OK CONNECT OK |
說(shuō)明: ?上面的指令是采用TCP協(xié)議連接,183.230.40.33服務(wù)器,端口號(hào)是80。
5. 發(fā)送數(shù)據(jù)
給模塊發(fā)送指令: AT+CIPSEND
如果收到指令后會(huì)返回 ?> ?符號(hào)。,接下來(lái)就可以發(fā)送 實(shí)際要發(fā)送的數(shù)據(jù),在發(fā)送實(shí)際數(shù)據(jù)時(shí),不需要加回車符(rn)。 實(shí)際數(shù)據(jù)發(fā)送之后,緊接著發(fā)送一個(gè)0x1A,即可啟動(dòng)數(shù)據(jù)發(fā)送。 注意: ?0x1A是十六進(jìn)制格式數(shù)據(jù),不是字符串。 如果數(shù)據(jù)發(fā)送成功,會(huì)返回 “SEND OK” 字符串。 |
發(fā)送數(shù)據(jù)示例:
POST /devices/517704007/datapoints HTTP/1.1
api-key:vvQAUiBG=HwKzqGicH=RxBvFCDw= Host:api.heclouds.com Connection:close Content-Length:65 {"datastreams":[{"id":"ds18b20","datapoints":[{"value":66.66}]}]} |
三、STM32代碼調(diào)試GA6模塊
3.1 通過(guò)STM32串口代碼測(cè)試GA6模塊
直接接在STM32F103C8T6最小系統(tǒng)板上面:
注意: ?如果是使用USB給開(kāi)發(fā)板供電,為了防止電壓不夠,USB線不要接分線器,直接接電腦的USB口。
因?yàn)?/strong>GA6模塊的電壓必須5V才可驅(qū)動(dòng),4.8V都不行。
STM32F103C8T6最小系統(tǒng)板使用串口3與GA6-B模塊連接:
5V-----5V
GND---G PB10—URX PB11---UTX |
出現(xiàn)以上提示之后,發(fā)送AT能返回OK就說(shuō)明模塊已經(jīng)正常工作了。
模塊上電會(huì)返回以下信息: ?(注意: 電壓一定要保證是5V)
AT Ready
AST_POWERON +NITZ:19/03/20,01:57:46,32 Call Ready +CREG: 1 SMS Ready |
?3.2 通過(guò)STM32封裝標(biāo)準(zhǔn)函數(shù)(使用HTTP協(xié)議連接OneNet服務(wù)器)
GA6_GPRS.c文件代碼:
#include "ga6_gprs.h"
#define GS6_GSM_CHECK_CNT 10
/*
函數(shù)功能:向GA6_GPRS發(fā)送指令
函數(shù)參數(shù):
char *cmd :發(fā)送的指令
char *check :檢查返回的字符串
u32 wait_time :等待的時(shí)間(100ms)為單位
說(shuō)明:該函數(shù)只是適用于成功后返回OK的指令
返回值: 0表示成功 1表示失敗
*/
u8 GA6_GSM_SendCmd(char *cmd,char *check,u32 wait_time)
{
u32 i,j;
for(i=0;i<GS6_GSM_CHECK_CNT;i++) //測(cè)試的總次數(shù)
{
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
memset(USART3_RX_BUFF,0,sizeof(USART3_RX_BUFF));
USART_X_SendString(USART3,cmd);
for(j=0;j<wait_time;j++) //等待的時(shí)間(ms單位)
{
delay_ms(100); //一次的時(shí)間
if(USART3_RX_FLAG)
{
USART3_RX_BUFF[USART3_RX_CNT]='?';
if(strstr((char*)USART3_RX_BUFF,check))
{
return 0;
}
else break;
}
}
}
return 1;
}
/*
函數(shù)功能: 檢查GA6的狀態(tài)
返 回 值: 0表示成功,其他值表示失敗
*/
u8 GA6_GSM_StateCheck(void)
{
/*1. 檢查模塊是否正常*/
if(GA6_GSM_SendCmd("ATrn","OK",50))
{
return 1; //模塊不正常
}
/*2. 關(guān)閉回顯功能*/
if(GA6_GSM_SendCmd("ATE0rn","OK",50))
{
return 2; //回顯沒(méi)有關(guān)閉成功
}
/*3. 查詢卡是否插上*/
if(GA6_GSM_SendCmd("AT+CPIN?rn","READY",50))
{
return 3; //卡沒(méi)有查上
}
/*4. 查詢卡是否注冊(cè)到網(wǎng)絡(luò)*/
if(GA6_GSM_SendCmd("AT+CREG?rn","+CREG: 1,1",50))
{
return 4; //卡沒(méi)有注冊(cè)到網(wǎng)絡(luò)
}
return 0;
}
/*
函數(shù)功能: 連接TCP服務(wù)器
函數(shù)參數(shù):
char *server_ip : 服務(wù)器地址
u32 port :服務(wù)器端口
返 回 值: 0表示成功連接服務(wù)器,其他值表示服務(wù)器連接失敗
*/
u8 GA6_GSM_ConnectServer(char *server_ip,u32 port)
{
char cmd_buffer[50];
/*1. 檢查服務(wù)器連接狀態(tài)*/
if(GA6_GSM_SendCmd("AT+CIPSTATUSrn","CONNECT",50))
{
/*2 附著GPRS網(wǎng)絡(luò)*/
if(GA6_GSM_SendCmd("AT+CGATT=1rn","OK",50))return 1;
/*3 激活GPRS網(wǎng)絡(luò)*/
if(GA6_GSM_SendCmd("AT+CGACT=1,1rn","OK",50))return 2;
/*4 連接指定的服務(wù)器*/
//組合命令
snprintf(cmd_buffer,sizeof(cmd_buffer),"AT+CIPSTART="TCP","%s",%drn",server_ip,port);
//連接服務(wù)器
//服務(wù)器連接成功的情況下該指令會(huì)返回兩種狀態(tài): ALREAY CONNECT ,CONNECT OK
if(GA6_GSM_SendCmd(cmd_buffer,"CONNECT",50))return 3;
}
return 0;
}
/*
函數(shù)功能: 向服務(wù)器發(fā)送數(shù)據(jù)
函數(shù)參數(shù):
u8 *data:發(fā)送的數(shù)據(jù)首地址
u32 len :數(shù)據(jù)長(zhǎng)度
*/
u8 GA6_GSM_SendDataToServer(u8 *data,u32 len)
{
char end_char[2];
end_char[0] = 0x1A;//結(jié)束字符
end_char[1] = '?';
/*2.1 啟動(dòng)數(shù)據(jù)發(fā)送*/
if(GA6_GSM_SendCmd("AT+CIPSENDrn",">",50))return 1;
/*2.2 發(fā)送實(shí)際要發(fā)送的數(shù)據(jù)*/
USART_X_SendData(USART3,data,len);
/*2.3 結(jié)束數(shù)據(jù)發(fā)送*/
if(GA6_GSM_SendCmd(end_char,"SEND OK",100))return 2;
return 0;
}
-
GA6_GPRS.h文件代碼:
#ifndef GA6_GPRS
#define GA6_GPRS
#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
u8 GA6_GSM_StateCheck(void);
u8 GA6_GSM_SendDataToServer(u8 *data,u32 len);
u8 GA6_GSM_ConnectServer(char *server_ip,u32 port);
u8 GA6_GSM_SendCmd(char *cmd,char *check,u32 wait_time);
#endif
-
Main.c代碼
#include "stm32f10x.h"
#include <string.h>
#include <stdio.h>
#include "ga6_gprs.h"
#include "usart.h"
#include "timer.h"
#include "led.h"
#include "key.h"
//u8 onenet_http_cmd[]=
//{
// "POST /devices/517704007/datapoints HTTP/1.1rn"
// "api-key:vvQAUiBG=HwKzqGicH=RxBvFCDw=rn"
// "Host:api.heclouds.comrn"
// "Connection:closern"
// "Content-Length:65rn"
// "rn"
// "{"datastreams":[{"id":"ds18b20","datapoints":[{"value":88.88}]}]}"
//};
u8 onenet_http_cmd[]=
{
"POST /devices/517620924/datapoints HTTP/1.1rn"
"api-key:OCZ6ghYPdky3=FJQCOEVZbByHRM=rn"
"Host:api.heclouds.comrn"
"Connection:closern"
"Content-Length:62rn"
"rn"
"{"datastreams":[{"id":"temp","datapoints":[{"value":88.88}]}]}"
};
//應(yīng)用發(fā)布地址: https://open.iot.10086.cn/iotbox/appsquare/appview?openid=905ef1b56ba526fdeee0c69a0787f176
/*
以下程序正確運(yùn)行返回的數(shù)據(jù):
+NITZ:19/03/20,14:45:27,32
Call Ready
+CREG: 1
SMS Ready
發(fā)送一次數(shù)據(jù)!
GA6_GSM_StateCheck=0
GA6_GSM_ConnectServer=0
GA6_GSM_SendDataToServer=0
SEND OK
HTTP/1.1 200 OK
Date: Wed, 20 Mar 2019 14:45:40 GMT
Content-Type: application/json
Content-Length: 26
Connection: close
Server: Apache-Coyote/1.1
Pragma: no-cache
{"errno":0,"error":"succ"}
CLOSED
*/
int main()
{
u8 key,state;
LED_Init();
KEY_Init();
BEEP_Init();
TIM1_Init(72,20000); //輔助串口1接收,超時(shí)時(shí)間為20ms
USART_X_Init(USART1,72,115200);
TIM2_Init(72,20000);//輔助串口2接收,超時(shí)時(shí)間為20ms
USART_X_Init(USART2,36,9600);
TIM3_Init(72,20000);//輔助串口3接收,超時(shí)時(shí)間為20ms
USART_X_Init(USART3,36,115200);
printf("UART1 OK.....n");
while(1)
{
if(USART3_RX_FLAG)
{
USART3_RX_BUFF[USART3_RX_CNT]='?';
//printf("buff=%s,cnt=%dnn",USART3_RX_BUFF,USART3_RX_CNT);
printf("%s",USART3_RX_BUFF);
USART3_RX_CNT=0;
USART3_RX_FLAG=0;
memset(USART3_RX_BUFF,0,sizeof(USART3_RX_BUFF));
}
key=KEY_Scanf();
if(key)
{
LED0=!LED0;
LED1=!LED1;
printf("發(fā)送一次數(shù)據(jù)!n");
/*1. 檢查GSM工作狀態(tài)*/
state=GA6_GSM_StateCheck();
printf("GA6_GSM_StateCheck=%dn",state);
if(!state)
{
/*2. 連接服務(wù)器*/
state=GA6_GSM_ConnectServer("183.230.40.33",80);
printf("GA6_GSM_ConnectServer=%dn",state);
if(!state)
{
/*3. 向服務(wù)器發(fā)送數(shù)據(jù)*/
state=GA6_GSM_SendDataToServer(onenet_http_cmd,strlen((char*)onenet_http_cmd));
printf("GA6_GSM_SendDataToServer=%dn",state);
}
else
{
//手動(dòng)斷開(kāi)服務(wù)器連接
printf("斷開(kāi)服務(wù)器連接:%drn",GA6_GSM_SendCmd("AT+CIPCLOSErn","OK",5000));
}
}
}
}
}
3.3 GA6-B模塊使用HTTP協(xié)議連接OneNet服務(wù)器上傳GPS經(jīng)緯度
為了提高效率,通過(guò)GPS配置軟件,可以將GPS模塊配置成功以下選項(xiàng):
主要修改的地方:
- GPS模塊默認(rèn)波特率為9600,配置成115200
- 輸出的語(yǔ)句,只是輸出RMC(推薦定位信息),因?yàn)楝F(xiàn)在只需要經(jīng)緯度信息即可。
- 系統(tǒng)設(shè)置熱啟動(dòng)狀態(tài),提高定位速度
經(jīng)緯度格式分為三種:
度:? ? ? ? ? ? ? (?ddd.ddddd °)? ? ? ? ? ? ? 十進(jìn)制小數(shù)部分(5位) 度 . 分 :? ? ? ?(ddd°mm.mmm’ )? ? ? ? 十進(jìn)制小數(shù)部分(3位) 度 . 分 . 秒 :(ddd°mm’ss’’) 關(guān)系: 一度(°)等于60分鐘(’)等于3600秒(“): 整度(d)等于十進(jìn)制的度的整數(shù)部分(dd): 分鐘(m)等于十進(jìn)制的度的整數(shù)部分(dd)減去整數(shù)度(d)的60倍: 秒(s)等于十進(jìn)制的度(dd)減去整數(shù)度(d)減分(M)除以60乘以3600: |
-
GPS.c文件代碼示例:
#include "gps.h"
/*
函數(shù)功能:從buf里面得到第cnt個(gè)逗號(hào)所在的位置
返 回 值:0~254,代表逗號(hào)所在位置的偏移.
255,代表不存在第cnt個(gè)逗號(hào)
*/
u8 GPS_GetCommaOffset(char *buf,u8 cnt)
{
char *p=buf;
while(cnt)
{
if(*buf=='*'||*buf<' '||*buf>'z')return 255;//遇到'*'或者非法字符,則不存在第cx個(gè)逗號(hào)
if(*buf==',')cnt--;
buf++;
}
return buf-p; //計(jì)算偏移量
}
/*
函數(shù)功能: 獲取GPS經(jīng)緯度數(shù)據(jù)值
函數(shù)參數(shù):
double *Longitude :經(jīng)度
double *latitude :緯度
返回值: 0表示定位成功,1表示定位失敗
說(shuō)明: 解析$GNRMC命令,得到經(jīng)緯度
$GNRMC,023705.000,A,2842.4164,N,11549.5713,E,1.73,91.65,150319,,,A*41
轉(zhuǎn)換公式示例:
經(jīng)度: dddmm.mmmm 東經(jīng) 11408.4790 114+(08.4790/60)=114.141317
緯度: ddmm.mmmm 北緯 2236.9453 22+(36.9453/60)= 22.615755
*/
u8 GPS_GNRMC_Decoding(char *gps_buffer,double *Longitude,double *latitude)
{
u8 Offset;
u32 int_data;
double s_Longitude,s_latitude;
char *p;
/*1. 確定下定位是否成功*/
p=strstr(gps_buffer,"$GNRMC");
if(!p)return 1;
Offset=GPS_GetCommaOffset(p,2);
if(Offset==255)return 2;
if(*(p+Offset)!='A')return 3; //定位不準(zhǔn)確
/*2. 得到緯度*/
Offset=GPS_GetCommaOffset(p,3);
if(Offset==255)return 4;
sscanf(p+Offset,"%lf",&s_latitude);
// printf("轉(zhuǎn)換前的緯度:%lfrn",s_latitude);
s_latitude=s_latitude/100;
int_data=s_latitude;//得到緯度整數(shù)部分
s_latitude=s_latitude-int_data;//得到緯度小數(shù)部分
s_latitude=(s_latitude)*100;
*latitude=int_data+(s_latitude/60.0); //得到轉(zhuǎn)換后的值
// printf("轉(zhuǎn)換后的緯度: %lfrn",*latitude);
/*3. 得到經(jīng)度*/
Offset=GPS_GetCommaOffset(p,5);
if(Offset==255)return 5;
sscanf(p+Offset,"%lf",&s_Longitude);
// printf("轉(zhuǎn)換前的經(jīng)度:%lfrn",s_Longitude);
s_Longitude=s_Longitude/100;
int_data=s_Longitude;//得到經(jīng)度整數(shù)部分
s_Longitude=s_Longitude-int_data; //得到經(jīng)度小數(shù)部分
s_Longitude=s_Longitude*100;
*Longitude=int_data+(s_Longitude/60.0);
// printf("轉(zhuǎn)換后的經(jīng)度:%lfrn",*Longitude);
return 0;
}
-
GPS.h代碼示例
#ifndef GPS_H
#define GPS_H
#include "stm32f10x.h"
#include <string.h>
#include "usart.h"
u8 GPS_GNRMC_Decoding(char *gps_buffer,double *Longitude,double *latitude);
#endif
?Main.c代碼示例
#include "stm32f10x.h"
#include <string.h>
#include <stdio.h>
#include "ga6_gprs.h"
#include "usart.h"
#include "timer.h"
#include "led.h"
#include "key.h"
#include "gps.h"
char onenet_http_cmd[1024];
//應(yīng)用發(fā)布地址: https://open.iot.10086.cn/iotbox/appsquare/appview?openid=fd1307a02210acbef4b34de89d6cfe21
/*
GPS 接線方式: 將 GPS 模塊的 TX 腳與 PA3 相連接。 (串口 2 的接收腳)
GPS 模塊波特率默認(rèn)為 9600 (為了提高速度,可以將GPS的波特率設(shè)置成115200---可直接通過(guò)上位機(jī)軟件設(shè)置)
GPS 模塊型號(hào): ATGM336H-5N
電 源: 3V
*/
/*
GA6-GSM 接線方式: 將 GA6-GSM 模塊的 UTX 腳與 PB11 相連接,URX 腳與 PB10 相連接。 (串口 3 的接收腳)
GA6-GSM 模塊波特率默認(rèn)為 115200
GA6-GSM 模塊型號(hào): 果云GA6-B
電 源: 5V
*/
int main()
{
double Longitude,latitude;
u8 state;
u32 time_cnt=0;
u16 data_tx_len=0;
char temp_buff[50];
LED_Init();
KEY_Init();
BEEP_Init();
TIM1_Init(72,20000); //輔助串口1接收,超時(shí)時(shí)間為20ms
USART_X_Init(USART1,72,115200);
TIM2_Init(72,20000);//輔助串口2接收,超時(shí)時(shí)間為20ms
USART_X_Init(USART2,36,115200); //接GPS模塊
TIM3_Init(72,20000);//輔助串口3接收,超時(shí)時(shí)間為20ms
USART_X_Init(USART3,36,115200); //接GSM模塊
printf("UART1 OK.....n");
while(1)
{
//接收GPRS模塊的返回值
if(USART3_RX_FLAG)
{
USART3_RX_BUFF[USART3_RX_CNT]='?';
//printf("buff=%s,cnt=%dnn",USART3_RX_BUFF,USART3_RX_CNT);
printf("%s",USART3_RX_BUFF);
USART3_RX_CNT=0;
USART3_RX_FLAG=0;
memset(USART3_RX_BUFF,0,sizeof(USART3_RX_BUFF));
}
//接收GPS模塊的返回值
if(USART2_RX_FLAG)
{
USART2_RX_BUFF[USART2_RX_CNT]='?';
//printf("USART2_RX_BUFF=%s",USART2_RX_BUFF);
//解析GPS數(shù)據(jù),得到經(jīng)緯度
if(GPS_GNRMC_Decoding((char*)USART2_RX_BUFF,&Longitude,&latitude))
{
printf("GPS定位失敗! 請(qǐng)到空曠地方定位rn");
}
else //定位成功
{
if(time_cnt>=8000) //8秒一次
{
data_tx_len=71;
sprintf(temp_buff,"%lf",Longitude);
data_tx_len+=strlen(temp_buff);
sprintf(temp_buff,"%lf",latitude);
data_tx_len+=strlen(temp_buff); //得到發(fā)送的數(shù)據(jù)長(zhǎng)度
snprintf(onenet_http_cmd,sizeof(onenet_http_cmd),
"POST /devices/517704007/datapoints HTTP/1.1rn"
"api-key:vvQAUiBG=HwKzqGicH=RxBvFCDw=rn"
"Host:api.heclouds.comrn"
"Connection:closern"
"Content-Length:%drn"
"rn"
"{"datastreams":[{"id":"gps","datapoints":[{"value":{"lon":%lf,"lat":%lf}}]}]}",
data_tx_len,Longitude,latitude
);
printf("data_tx_len=%drn",data_tx_len);
printf("經(jīng)度:%lf,緯度:%lfrn",Longitude,latitude);
time_cnt=0;
LED0=!LED0;
LED1=!LED1;
/*1. 檢查GSM工作狀態(tài)*/
state=GA6_GSM_StateCheck();
printf("GA6_GSM_StateCheck=%dn",state);
if(!state)
{
/*2. 連接服務(wù)器*/
state=GA6_GSM_ConnectServer("183.230.40.33",80);
printf("GA6_GSM_ConnectServer=%dn",state);
if(!state)
{
/*3. 向服務(wù)器發(fā)送數(shù)據(jù)*/
state=GA6_GSM_SendDataToServer((u8*)onenet_http_cmd,strlen((char*)onenet_http_cmd));
printf("GA6_GSM_SendDataToServer=%dn",state);
}
else
{
//手動(dòng)斷開(kāi)服務(wù)器連接
printf("斷開(kāi)服務(wù)器連接:%drn",GA6_GSM_SendCmd("AT+CIPCLOSErn","OK",5000));
}
}
}
}
USART2_RX_CNT=0;
USART2_RX_FLAG=0;
memset(USART2_RX_BUFF,0,sizeof(USART2_RX_BUFF));
}
time_cnt++;
delay_ms(1);
}
}
- 網(wǎng)頁(yè)上顯示的效果: