MCU: STM32F103C8T6
GSM模块: GA6--果云
开发软件: Keil5
完整源码下载: https://download.csdn.net/download/xiaolong1126626497/18245590
其他参考文章: STM32+ESP8266使用MQTT协议连接阿里云物联网服务器
其他参考文章:STM32+ESP8266使用标准MQTT协议(MQTTS)连接中国移动OneNet物联网服务器
二、GA6-GSM模块介绍与调试说明: GA6-B模块供电必须5V,采用电脑USB供电可能不稳定(没有5V,只有4.8V左右),导致模块使用不稳定,发送AT指令没有反应,调试阶段,可将开发板的USB线连接充电宝或者手机充电插头取电。
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. 开机电压>3.5V; 6. SLEEP 模式下的耗流为 0.9mA; 7. 四频:GSM850, EGSM 900 和 DCS 1800,PCS1900 可以自动的搜寻 四个频段。 l 符合 GSM Phase 2 / 2+ l GPRS Class 10; 8. 灵敏度 符号。,接下来就可以发送 实际要发送的数据,在发送实际数据时,不需要加回车符(\r\n)。
实际数据发送之后,紧接着发送一个0x1A,即可启动数据发送。
注意: 0x1A是十六进制格式数据,不是字符串。
如果数据发送成功,会返回 “SEND OK” 字符串。
发送数据示例:
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代码调试GA6模块 3.1 通过STM32串口代码测试GA6模块
直接接在STM32F103C8T6最小系统板上面:
注意: 如果是使用USB给开发板供电,为了防止电压不够,USB线不要接分线器,直接接电脑的USB口。
因为GA6模块的电压必须5V才可驱动,4.8V都不行。
STM32F103C8T6最小系统板使用串口3与GA6-B模块连接:
5V-----5V
GND---G
PB10—URX
PB11---UTX
出现以上提示之后,发送AT能返回OK就说明模块已经正常工作了。
模块上电会返回以下信息: (注意: 电压一定要保证是5V)
AT Ready
AST_POWERON
+NITZ:19/03/20,01:57:46,32
Call Ready
+CREG: 1
SMS Ready
3.2 通过STM32封装标准函数(使用HTTP协议连接OneNet服务器) GA6_GPRS.c文件代码:#include "ga6_gprs.h"
#define GS6_GSM_CHECK_CNT 10
/*
函数功能:向GA6_GPRS发送指令
函数参数:
char *cmd :发送的指令
char *check :检查返回的字符串
u32 wait_time :等待的时间(100ms)为单位
说明:该函数只是适用于成功后返回OK的指令
返回值: 0表示成功 1表示失败
*/
u8 GA6_GSM_SendCmd(char *cmd,char *check,u32 wait_time)
{
u32 i,j;
for(i=0;i=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); //得到发送的数据长度
snprintf(onenet_http_cmd,sizeof(onenet_http_cmd),
"POST /devices/517704007/datapoints HTTP/1.1\r\n"\
"api-key:vvQAUiBG=HwKzqGicH=RxBvFCDw=\r\n"\
"Host:api.heclouds.com\r\n"\
"Connection:close\r\n"\
"Content-Length:%d\r\n"\
"\r\n"\
"{\"datastreams\":[{\"id\":\"gps\",\"datapoints\":[{\"value\":{\"lon\":%lf,\"lat\":%lf}}]}]}",
data_tx_len,Longitude,latitude
);
printf("data_tx_len=%d\r\n",data_tx_len);
printf("经度:%lf,纬度:%lf\r\n",Longitude,latitude);
time_cnt=0;
LED0=!LED0;
LED1=!LED1;
/*1. 检查GSM工作状态*/
state=GA6_GSM_StateCheck();
printf("GA6_GSM_StateCheck=%d\n",state);
if(!state)
{
/*2. 连接服务器*/
state=GA6_GSM_ConnectServer("183.230.40.33",80);
printf("GA6_GSM_ConnectServer=%d\n",state);
if(!state)
{
/*3. 向服务器发送数据*/
state=GA6_GSM_SendDataToServer((u8*)onenet_http_cmd,strlen((char*)onenet_http_cmd));
printf("GA6_GSM_SendDataToServer=%d\n",state);
}
else
{
//手动断开服务器连接
printf("断开服务器连接:%d\r\n",GA6_GSM_SendCmd("AT+CIPCLOSE\r\n","OK",5000));
}
}
}
}
USART2_RX_CNT=0;
USART2_RX_FLAG=0;
memset(USART2_RX_BUFF,0,sizeof(USART2_RX_BUFF));
}
time_cnt++;
delay_ms(1);
}
}
- 网页上显示的效果: