您好,登錄后才能下訂單哦!
如何將數(shù)據(jù)發(fā)送到Google表格,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
在夏天的一個(gè)愉快的周末,我沒(méi)有去海灘或其他地方,而是呆在家里,想知道是否可以使用我最喜歡的MicroPython從ESP板發(fā)送數(shù)據(jù)到Google表格。假設(shè)它可以發(fā)送由DHT22傳感器測(cè)量的溫度和濕度。這就是項(xiàng)目的開(kāi)始。
在谷歌上快速搜索后顯示,這不是一個(gè)新想法,并且已經(jīng)有人實(shí)施從ESP板發(fā)送數(shù)據(jù)到Google表格。我讀了幾篇關(guān)于這個(gè)主題的文章,我發(fā)現(xiàn)了所有項(xiàng)目做了兩件事:要么項(xiàng)目需要在互聯(lián)網(wǎng)上公開(kāi)發(fā)布Google表格,要么項(xiàng)目使用PushingBox或IFTTT等中間件將數(shù)據(jù)插入表格。
但是Google表格提供了很棒的HTTP API,為什么我們不能只發(fā)送一個(gè)POST請(qǐng)求來(lái)將數(shù)據(jù)插入到工作表中?原因是Google表格API關(guān)注安全性并需要身份驗(yàn)證。特別是,Google Sheet API支持兩種身份驗(yàn)證方法:API密鑰和OAuth3令牌。使用API密鑰聽(tīng)起來(lái)很簡(jiǎn)單:我們可以在Google IAM控制臺(tái)中創(chuàng)建一個(gè)API密鑰,在我們的ESP板上編碼,忘記旋轉(zhuǎn)密鑰和安全性,并永遠(yuǎn)使用密鑰。不幸的是(或者說(shuō)幸運(yùn)的是)它不會(huì)起作用。Google Sheet API僅允許API鍵進(jìn)行讀取操作。如果要寫入工作表,則必須使用OAuth3。
這里出現(xiàn)了問(wèn)題。首先,您需要在Google IAM控制臺(tái)中創(chuàng)建一個(gè)服務(wù)帳戶,然后為該服務(wù)帳戶創(chuàng)建一個(gè)私有RSA密鑰。好的,那并不難。然后,您的ESP板必須構(gòu)建一個(gè)JWT請(qǐng)求,將當(dāng)前時(shí)間戳放入其中,并使用RSA-SHA256簽名算法使用密鑰對(duì)請(qǐng)求進(jìn)行簽名。接下來(lái),板子必須將簽名的JWT請(qǐng)求發(fā)送到Google OAuth3服務(wù),該服務(wù)最終返回OAuth3令牌。最后使用令牌來(lái)調(diào)用Google表格API。
讓我快速總結(jié)一下ESP板能夠在Google表格中插入一行需要的內(nèi)容:HTTP客戶端、JSON解析器、具有正確時(shí)間的實(shí)時(shí)時(shí)鐘或NTP客戶端,以及RSA-SHA256簽名的實(shí)現(xiàn)算法。幸運(yùn)的是,MicroPython提供了除RSA-SHA256簽名之外的大部分內(nèi)容。確切地說(shuō),MicroPython可以計(jì)算SHA256哈希,但不能使用RSA算法對(duì)數(shù)據(jù)進(jìn)行簽名。此外,RSA簽名是一項(xiàng)昂貴的操作,可能需要相當(dāng)多的時(shí)間和內(nèi)存,但ESP板并不像PC那么強(qiáng)大,也沒(méi)有太多的內(nèi)存。
我猜想Google身份驗(yàn)證帶來(lái)的復(fù)雜性以及缺少M(fèi)icroPython的RSA,讓人們使用了一個(gè)公開(kāi)的表單或一個(gè)可以實(shí)現(xiàn)認(rèn)證過(guò)程的中間件服務(wù)。當(dāng)然,作為一名安全工程師,我無(wú)法接受一個(gè)包含公共可用表格的解決方案,其中包含我房間內(nèi)溫度和濕度等敏感數(shù)據(jù)。因?yàn)槲沂且幻踩こ處?,所以我不喜歡中間件。最后,唯一的選擇是以某種方式在ESP板上實(shí)現(xiàn)上述認(rèn)證過(guò)程。
正如我之前提到的,MicroPython已經(jīng)提供了大部分必需的東西:
ujson允許解析JSON
ntptime.py提供NTP客戶端
uhashlib可以計(jì)算SHA256哈希值
http.client提供了一個(gè)HTTP客戶端
唯一缺少的部分是RSA簽名。密碼學(xué)的一個(gè)主要規(guī)則是:不要自己實(shí)現(xiàn)任何加密算法,而是使用現(xiàn)有的算法。我知道這個(gè)規(guī)則,并發(fā)現(xiàn)python-rsa包在純Python中實(shí)現(xiàn)了RSA算法。除了使用RSA進(jìn)行簽名之外,該庫(kù)還支持其他操作,例如驗(yàn)證簽名,加密和解密,加載和存儲(chǔ)密鑰等。這個(gè)庫(kù)對(duì)于一個(gè)小型的ESP板來(lái)說(shuō)負(fù)擔(dān)太重了,我決定只保留RSA簽名的實(shí)現(xiàn)并刪除剩下的代碼。我甚至刪除了以PKCS1格式加載RSA密鑰的代碼,因?yàn)樗枰浦惨粋€(gè)不小的pyasn1包。我還必須基于從右到左的二進(jìn)制方法和其他一些操作來(lái)實(shí)現(xiàn)模塊化求冪,因?yàn)槭聦?shí)證明它們不是由MicroPython提供的。它產(chǎn)生了一個(gè)新的micropython-rsa簽名庫(kù)。
我使用ESP8266和MicroPython以前的一個(gè)項(xiàng)目作為起點(diǎn)。在實(shí)施身份驗(yàn)證過(guò)程并在我的筆記本電腦上進(jìn)行測(cè)試后,我終于成功用ESP8266主板運(yùn)行了代碼。不幸的是我發(fā)現(xiàn)代碼運(yùn)行得很慢,主要問(wèn)題是ESP8266主板沒(méi)有足夠的內(nèi)存來(lái)完成RSA簽名。我嘗試了一些優(yōu)化,甚至嘗試將應(yīng)用程序代碼嵌入到MicroPython固件中,但沒(méi)有任何幫助。
最后的希望是在ESP32上運(yùn)行代碼。我之前沒(méi)有用過(guò)ESP32,于是訂購(gòu)了我的第一個(gè)ESP32開(kāi)發(fā)板。幸運(yùn)的是,它成功了!應(yīng)用程序不再抱怨內(nèi)存不足,事實(shí)上它運(yùn)行得更快了。
該代碼可在GitHub上獲得。README簡(jiǎn)要描述了如何構(gòu)建項(xiàng)目。我還在Hackaday.io上創(chuàng)建了一個(gè)項(xiàng)目。我希望我能找到一些時(shí)間在后續(xù)帖子中提供更多細(xì)節(jié)。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。