GPS-STM32-ESP8266-OneNET

操作

OneNET

版本:5.2.9
首先需要创建一个帐号
登录后点击控制台
在这里插入图片描述
光标移到“全部产品服务”,在弹出的复选框中选择“多协议接入”
在这里插入图片描述
到这里基本就不会迷路了,我也简单点,之后在里面创建MQTT协议的产品、设备

程序

永久有效提取码: ymth

主要是main.c文件中的主函数、串口1中断服务函数和串口2中断服务函数

主函数

int main(void)
{
delay_init();
NVIC_Configuration();
Usart1_Init(9600); //串口一用于接收GPS数据包,此型号GPS波特率一定得是9600,不然会乱码
Usart2_Init(115200); //用于与ESP8266对接,也是限定115200

 ESP8266_Init();											//连接WiFi和网络
 ESP8266_SendData(connect,42);			    //与MQTT服务端连接,需要由客户端发送connect报文
 delay_ms(1000);

while(1)
{
parseGpsBuffer(); //GPS数据包筛选处理
//GPS已正常启动
if (Save_Data.isParseData){
Save_Data.isParseData = 0;
if(Save_Data.isUsefull){
Save_Data.isUsefull = 0;

			 memset(StrWeiDu,'\0',sizeof(StrWeiDu));
			 memset(StrJingDu,'\0',sizeof(StrJingDu));				 
			//改经纬度格式
			WeiDu=atof(Save_Data.latitude);
			WeiDu =(int)WeiDu/100+(WeiDu-( (int)WeiDu/100 )*100)/60.0;
			JingDu=atof(Save_Data.longitude);
			JingDu =(int)JingDu/100+(JingDu-( (int)JingDu/100 )*100)/60.0;
			 sprintf(StrWeiDu,"%lf",WeiDu);
			 sprintf(StrJingDu,"%lf",JingDu);
			 //改变publish报文中有效载荷的信息
			 ChangeJingWei();		
			 //下面语句意思是大约5s上传一次坐标数据
			  delay_ms(1000);
			  delay_ms(1000);
			  delay_ms(1000);
			  delay_ms(1000);
			  delay_ms(1000);	
			  ESP8266_SendData(publish,105);	  				 
		}}	
		
}	

}

串口1中断服务函数

void USART1_IRQHandler(void)
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
Res =USART_ReceiveData(USART1);
if(Res == ‘$’) point1 = 0;

    USART_RX_BUF[point1++] = Res;

	if(USART_RX_BUF[0] == '$' && USART_RX_BUF[4] == 'M' && USART_RX_BUF[5] == 'C')	{
	//筛选出头部为'$GPRMC'的经纬度数据
		if(Res == '\n'){
		//GPS的一帧数据往往以'\r\n'为尾
			memset(Save_Data.GPS_Buffer, 0, 80);     
			memcpy(Save_Data.GPS_Buffer, USART_RX_BUF, point1); 	
			Save_Data.isGetData = 1;
			point1 = 0;
			memset(USART_RX_BUF, 0, 200);    	
		}	
	}
	if(point1 >= 200)		point1 = 200;		 

}
}

串口2中断服务函数

void USART2_IRQHandler(void)
{

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //½ÓÊÕÖжÏ
{
	if(esp8266_cnt >= sizeof(esp8266_buf))	esp8266_cnt = 0;
	esp8266_buf[esp8266_cnt++] = USART2->DR;
	
	USART_ClearFlag(USART2, USART_FLAG_RXNE);
}

}

论文

永久有效提取码: 74u5

帮助

GPS

Onenet GPS上传经纬度的格式

型号 ATGM336H-5N

长这样

使用方法
使用串口读取GPS模块的数据,通电以后自动会与卫星进行交互通信,然后过两三分钟就能发出正确的坐标信息,要注意空旷的地方才有卫星信号。
GPS和STM32的程序,可供参考(永久有效) 提取码 5yra

纠偏
一般GPS坐标转换百度地图的过程被称为“纠偏”,而使用Onenet我们根本不需要去研究这个复杂的计算或者API调用,因为中国移动的服务器会自动去转换地图坐标,我们不需要关心,只知道有这个纠偏过程就行了。

STM32

型号 STM32F103ZET6
串口1 PA9(TX) PA10(RX)
串口2 PA2(TX) PA3(RX)

ESP8266

刷固件

8266本身就是单片机,可以编程和烧录,我们一般不用编程,因为有固件;只有8266里烧录了AT固件,主控单片机才可以通过串口使用AT指令对8266进行配置。
通常8266买来都已经刷好了原厂固件,但是呢,有时候会莫名其妙的失效,使用串口调试助手发AT时,返回的都是乱码,因此时常需要重新烧录固件;烧录过程中需要用到固件包、烧录专用软件,都可以在安信可官网找到,里面的资料还是很周全的,这个网站不错。
手把手教你给NodeMCU-ESP8266刷AT固件(附AT指令集)

调试

使用串口调试助手对8266进行调试,8266通过串口转USB线和电脑连接,然后打开串口调试助手,设置波特率为115200,ASCII码显示,发送AT指令后面要加回车,比如发送‘ AT + RST '指令, 加了回车后实际发送的ASCII码为AT+RST\r\n

连接手机热点

AT+RST

AT+CWMODE=1

AT+CWJAP=“热点名称”,“热点密码”

以上是通过RS232串口发送AT指令,使ESP8266连接上手机热点的步骤

设置好以后,下一次8266上电后会自动连接上热点,不用再重复设置;而连接服务器的AT指令是需要重新设置的

实例

ESP8266从天气云平台获取天气数据包,只使用AT指令和串口调试助手

如何用ESP8266的AT指令获取网络数据_哔哩哔哩_bilibili

补充

ESP8266教程——采用AT指令_嵌入式爱好者-CSDN博客

OneNet

BrokerHost = ‘183.230.40.39’ OneNET使用TCP方式连接时的主机地址
BrokerPort = 6002 OneNET使用TCP方式连接时的主机端口号

设备上传并存储数据时,必须以key-value的格式上传数据,其中key即为数据流(stream)名称,value为实际存储的数据点(point),value格式可以为int、float、string、json等多种自定义格式,上传经纬度数据必须以json格式上传,即必须打包成如下
{“datastreams”:[{“id”:“location”,“datapoints”:[{“value”:{“lon”:119.034405,“lat”:33.554351}}]}]}

MQTT

connect报文

举例:
10 28 (固定报头)
00 04 4D 51 54 54 04 C0 01 00 (可变报头)
MQTT + 标志 + 设备在线保持时间(KeepAlive)

00 09      38 36 33 30 39 36 38 31 31 
         +    设备ID
00 06      34 37 37 37 37 30 
         +    产品ID
00 09      7A 6E 78 36 35 34 33 32 31
         +    密码		(有效载荷)

publish报文

头部:
可变报头:包含主题
有效载荷:包含需要上传的数据(温湿度、经纬度等)

json数据格式

数据类型和Json格式

猜你喜欢

转载自blog.csdn.net/weixin_50772838/article/details/122262093