文章目錄
- 操作
- OneNET
- 程式
- 主函式
- 串口1中斷服務函式
- 串口2中斷服務函式
- 論文
- 幫助
- GPS
- STM32
- ESP8266
- 刷韌體
- 除錯
- 連接手機熱點
- 實體
- 補充
- OneNet
- MQTT
- connect報文
- publish報文
- json資料格式
操作
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) //?óê??D??
{
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格式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/400356.html
標籤:其他
