将 Esp32(Micropython) 中的内容发布到 firebase 时出错

Error while posting something from Esp32(Micropython) to firebase

我正在尝试将 firebase 与 Micropython 结合使用。不管我这样做多少次 print(firebase.get(URL))。如果我使用 firebase.put(URL, datas)firebase.patch(URL, datas) 那么它会成功发布该数据,但是如果我尝试读取数据 print(firebase.get(URL)) 然后会弹出此错误。

Firebase 库:https://github.com/vishal-android-freak/firebase-micropython-esp32

代码:

import network
import ufirebase as firebase
from time import sleep

URL = 'https://xxxxxxxxxxxxxxxx.firebaseio.com/'

wlan = network.WLAN(network.STA_IF)
if not wlan.active() or not wlan.isconnected():
    wlan.active(True)
    print('connecting to: xxxx')
    wlan.connect('xxxx', 'xxxxxxxxx')
    while not wlan.isconnected():
        pass
print('network config:', wlan.ifconfig())
datas = {'Shape': {'hos': 'fse', 'xxe': 'ter'}, 'Wps': 'Wps'}

firebase.put(URL, datas)
sleep(5)
print(firebase.get(URL))

错误:

Traceback (most recent call last):
  File "main.py", line 21, in <module>
  File "ufirebase.py", line 124, in get
  File "urequests.py", line 116, in get
  File "urequests.py", line 62, in request
OSError: [Errno 12] ENOMEM
MicroPython v1.18 on 2022-01-17; 4MB/OTA module with ESP32
Type "help()" for more information.

您正在调用 firebase.get(URL) 并遇到内存不足错误。

此调用returns数据库的全部内容。显然这超过了 MicroPython 可用的 RAM 数量(不是很多)。 ENOMEM 表示“无内存”- Python 有 运行 内存不足。

您需要将调用更改为仅请求您要获取的内容。在这种情况下,您可以尝试

print(firebase.get(URL + 'Shape'))
print(firebase.get(URL + 'Was'))

您可以参考the library's documentation了解如何更好地使用get()方法。

知道了 urequests 库的问题,如果您可以切换回 usocket 并在超时之前关闭套接字,则可以正常工作。对于 urequests 你需要有一个板与 spiram。对于基于 non-spiram 的主板,这里有一个很好的基于套接字的 firebase 库 micropython-firebase-realtime-database