過完年一直沒更新博客,主要還是在繼續研究ESP8266這塊板子的功能。上篇主要是在同一網絡下,使用iOS的Siri調用捷徑控制,其主要原理是用ESP8266做Server端,接收來自iOS的Get HTTP訪問。若是在同一網內,這樣的配置還是挺方便的,但是要在外網進行控制,就必須使用一個內網穿透的軟件,並且該軟件還要運行在同一個網內的設備上,類似有花生殼、網絡通等,對比下來,網絡通給的帶寬大一點,響應比花生殼快,客戶端也更簡潔,不容易掉線。當做測試都可以的。
下面我們主要講一下ESP8266如何做為客戶端,獲取網絡天氣等信息。其實就是將上面講的反過來用,使ESP8266成為一個Client,訪問一些特定的url,基本上都是使用GET和POST方式,剛開始接觸可能有點難,但是弄清原理和結構之后,就簡單了。簡單來說,就是連上網的ESP8266,建立client端,然后client發送GET HTTP的訪問信息,client獲取到的就是反饋的結果。當然,大多數時候Arduino會采用Jason的庫來幫助完成這項工作,因為更加便捷,而且一般API反饋的數據結構也都是Jason的,畢竟和html很像,使用和提取都方便。
天氣api用的心知,萬年歷用的(https://www.timelessq.com/blog/47-cn.html),使用說明也很詳細,文中的第一個api鏈接點進入好像有點問題,用這個https://cos.timelessq.com/api/time/index.php,非常感謝這兩個免費的api接口提供者,以及參考的代碼原作者(https://www.arduino.cn/thread-49411-1-1.html)。
這里說明一下,weather的程序是幾乎用的參考,time的是自己改的。提兩個過程中研究得頭疼的問題,最開始用網絡提供的(https://www.sojson.com/open/api/lunar/json.shtml)api,瀏覽器和網頁get測試都挺好,可client客戶端“死活”不通,一直報301錯誤,其實就是他們改為了https的訪問,一直也沒解決,后來放棄,使用了現在這個。若有同學做通了,還請留言告知,我學習一下呢!后來改成現在這個后,會遇到反饋數據過長,因此weather中用的char就讀不完整,所以改為了readString,后來又因為readString有1s的響應時間,太慢,改為了read。哈哈哈!因為要套用Json的解析,所以對讀取的數據又復制到char* content中,保證傳遞到root的是正確地Jason格式。要保證{}的完整性,不能有多於字符,所以在復制字符過程中,去掉了尾端的空字符,前端補上了‘{’(因為為了截取內容,用到了{,導致line中會沒有,因此在content中補上)。
別的也沒什么了,具體看代碼。下圖是展示,源碼已經傳到我的Github,需要的留言我私信地址。