文章目录
操作
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
型号 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报文
头部:
可变报头:包含主题
有效载荷:包含需要上传的数据(温湿度、经纬度等)