基于8266實現無線獲取天氣預報
使用ESP8266或者其他網絡模塊獲取網絡數據(天氣,時間等),還是挺簡單的,下面我們兩個部分來講解無線以及有線網絡如何獲取天氣預報信息。
01.查找目標服務器
首先找到一個服務器,該服務器具備獲取天氣預報等相關接口,例如:
心知天氣:
https://www.seniverse.com/login
丫丫天氣:http://www.yytianqi.com/
等服務器,這里我們就以丫丫天氣為例來制作本次的實驗。
02.配置服務器
打開丫丫天氣服務器網頁,該網頁地址為http://www.yytianqi.com/,打開之后點擊右上角注冊賬號,如下圖所示:
點擊注冊之后,我們必須填寫郵箱,密碼以及手機號碼相關信息,如下圖所示:
注冊完畢之后,登錄賬號,如下圖所示:
上圖中的key密鑰是我們所需要的,我們先把密鑰拷貝到記事本中。
03.丫丫天氣服務器相關接口信息
打開上方的API介紹我們就知道如何獲取服務器的相關信息了,如下圖所示:
上圖中,API通用格式http://api.yytianqi.com/接口名稱?city=城市ID&key=用戶key就是我們使用無線或者有線網絡所發送的數據包,而這個數據包的接口名稱是下方的字符串,如下圖所示:
API通用格式的城市是根據該頁面下方的圖來獲取,每一個城市都一樣的ID,如下圖所示:
最后我們講解一下該服務器的請求模式以及返回結果,如下圖所示:
從上圖可知:我們可以請求三種模式,第一種使用程序的ID獲取,第二種使用城市的IP獲取,第三種是獲取城市的經緯度信息。本次的實驗我們使用第一種獲取方式。
上圖的下面的內容就是服務器返回的結果,所以我們的代碼必須移植JSON包來解析,根據返回的字符串來獲取數據包的信息。
04.ESP8266配置TCPClient客戶端流程
ESP8266配置TCPClient流程如下圖所示:
上述就是MCU發送到ESP8266的AT指令,這里我們無需過多的講解,下面我們講解如何使用串口發送指令或者數據到ESP8266相關函數:
TCPClient配置源碼編寫:
上述的源碼主要配置ESP8266為TCPClient客戶端以及連接WIFI,最后開啟透傳模式,注意:我們連接的服務器地址為api.yytianqi.com,而端口號為80。
檢測應答函數編寫:
上的源碼就是檢查發送ESP8266指令是否成功,這里我們使用串口3發送。
發送指令函數編寫:
上述函數是發送ESP8266指令函數,如果返回“OK“,則發送成功。
發送數據函數的編寫:
上述的源碼是發送數據的函數,我們可以定時發送HTTPS數據包到丫丫天氣服務器中獲取相關的信息。
05.網絡調式助手模擬實驗
首先在百度搜索“域名解析”,我們把api.yytianqi.com域名解析成IP地址,如下圖所示:
打開網絡調式助手以TCPClient方式連接服務器,如下圖所示:
根據上圖所示,我們發送給HTTPGET請求,該數據包為
GEThttp://api.yytianqi.com/observe?city=CH010100&key=xxx,
注意:xxx為平臺注冊的密鑰。點擊發送該數據包就獲取到相應的信息,如下圖所示:
根據上圖的返回信息,我們可以對比官方提供的返回結果數據包對比,如下所示:
{
"code":1,
"msg":"Sucess",
"counts":2362, //訪問的剩余次數。
"data":{
"cityId":"CH010100", //城市id
"cityName":"北京", //城市名稱
"lastUpdate":"2016-03-0917:10:00", //實況更新時間
"tq":"多云", //天氣現象
"numtq":"01", //天氣現象編碼
"qw":"5.0", //當前氣溫
"fl":"微風", //當前風力
"numfl":"0", //當前風力編碼
"fx":"無持續風向", //當前風向
"numfx":"0", //當前風向編碼
"sd":"10.0" //相對濕度,直接在此數值后添加%即可
}
}
根據上述的源碼和上圖對比,我們就知道各個字符串代表什么內容。
在我們編寫之前,我們必須移植cjSON庫,我們可以調用這個庫提供的函數獲取數據包的信息,如下所示:
定義一個接收數據的結構體:
根據字符串解析數據包的內容:
此函數的第一個形參是接收丫丫天氣服務器的數據包,而第二個形參表示我們存儲數據包解析的內容,比如我們調用函數:
numtq=cJSON_GetObjectItem(data,"numtq")解析數據包的"numtq"字符串的內容,numtq變量就會保存天氣現象的編碼的數據,其他類似操作。
對數據包解析的內容存儲在結構體:
注意事項:
發送一次HTTPGET請求時,服務器返回相應的內容并斷開連接,所以我們不斷請求獲取必須重新連接并發送數據。