feat(boards): 物联网 分类下添加 TinyWebDB 分类

This commit is contained in:
王立帮
2025-09-28 21:33:18 +08:00
parent c66edf6dd9
commit cd884aa1b3
21 changed files with 772 additions and 88 deletions

View File

@@ -1,6 +1,5 @@
import time
import usocket as socket
import urequests as requests
import ustruct as struct
from machine import unique_id
from ubinascii import hexlify
@@ -41,8 +40,9 @@ def image_base64(path="mixly.jpg"):
return b'data:image/jpg;base64,' + b64encode(path)
def ntp(url='mixio.mixly.cn'):
import urequests
try:
results=eval(requests.get('http://{}/time.php'.format(url)).text)
results=eval(urequests.get('http://{}/time.php'.format(url)).text)
except Exception as e:
raise RuntimeError("API request failed or WiFi is not connected",e)
return results
@@ -72,6 +72,7 @@ class MQTTClient:
port = 8883 if ssl else 1883
self.client_id = client_id
self.sock = None
self.server = server
self.addr = socket.getaddrinfo(server, port)[0][-1]
self.ssl = ssl
self.ssl_params = ssl_params
@@ -86,7 +87,6 @@ class MQTTClient:
self.lw_retain = False
self._on_message_filtered = MQTTMatcher()
self._star_time = time.ticks_ms()
self._tiny_web_db = TinyWebDB("", username, password)
def _send_str(self, s):
self.sock.write(struct.pack("!H", str_len(s)))
@@ -343,85 +343,5 @@ class MQTTClient:
self.ping()
return self.wait_msg()
def tiny_web_db_update(self, url, key, value):
self._tiny_web_db.set_url(url)
return self._tiny_web_db.update(key, value)
def tiny_web_db_get(self, url, key):
self._tiny_web_db.set_url(url)
return self._tiny_web_db.get(key)
def tiny_web_db_count(self, url):
self._tiny_web_db.set_url(url)
return self._tiny_web_db.count()
def tiny_web_db_search(self, url, no=1, count=1, tag='', dtype='both'):
self._tiny_web_db.set_url(url)
return self._tiny_web_db.search(no, count, tag, dtype)
def tiny_web_db_delete(self, url, key):
self._tiny_web_db.set_url(url)
return self._tiny_web_db.delete(key)
class TinyWebDB:
def __init__(self, url, username, password):
self._api_url = ""
self._username = username
self._password = password
self.set_url(url)
def update(self, key, value):
key = str(key)
value = str(value)
result = self._request("update", "tag={}&value={}".format(key, value))
if result["status"] == "error":
raise RuntimeError(result["message"])
def get(self, key):
key = str(key)
result = self._request("get", "tag={}".format(key))
if result["status"] == "error":
raise RuntimeError(result["message"])
return result["value"]
def count(self):
result = self._request("count")
if result["status"] == "error":
raise RuntimeError(result["message"])
return int(result["count"])
def search(self, no=1, count=1, tag='', dtype='both'):
no = str(no)
count = str(count)
result = self._request("search", "no={}&count={}&tag={}&type={}".format(no, count, tag, dtype))
if result["status"] == "error":
raise RuntimeError(result["message"])
return result["data"]
def delete(self, key):
key = str(key)
result = self._request("delete", "tag={}".format(key))
if result["status"] == "error":
raise RuntimeError(result["message"])
def set_url(self, url):
if url[-1] != '/':
url += '/'
self._api_url = url
def _request(self, op, param=""):
data = "user={}&secret={}&action={}".format(self._username, self._password, op)
if param:
data += '&' + param
try:
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
response = requests.post(self._api_url, data=data, headers=headers)
result = {}
if response.status_code == 200:
result = response.json()
response.close()
return result
except Exception as e:
raise RuntimeError("API request failed or WiFi is not connected", e)
def get_server_info(self):
return (self.server, self.username, self.password)

View File

@@ -0,0 +1,72 @@
import urequests as requests
class TinyWebDB:
def __init__(self, url, username, password):
self._api_url = ""
self._username = username
self._password = password
self.set_url(url)
def __init__(self, mqtt_client):
self._api_url = ""
url, username, password = mqtt_client.get_server_info()
self.set_url('https://{}:443'.format(url))
self._username = username
self._password = password
def update(self, key, value):
key = str(key)
value = str(value)
result = self._request("update", "tag={}&value={}".format(key, value))
if result["status"] == "error":
raise RuntimeError(result["message"])
def get(self, key):
key = str(key)
result = self._request("get", "tag={}".format(key))
if result["status"] == "error":
raise RuntimeError(result["message"])
return result["value"]
def count(self):
result = self._request("count")
if result["status"] == "error":
raise RuntimeError(result["message"])
return int(result["count"])
def search(self, no=1, count=1, tag='', dtype='both'):
no = str(no)
count = str(count)
result = self._request("search", "no={}&count={}&tag={}&type={}".format(no, count, tag, dtype))
if result["status"] == "error":
raise RuntimeError(result["message"])
return result["data"]
def delete(self, key):
key = str(key)
result = self._request("delete", "tag={}".format(key))
if result["status"] == "error":
raise RuntimeError(result["message"])
def set_url(self, url):
if url[-1] != '/':
url += '/'
self._api_url = url
def _request(self, op, param=""):
data = "user={}&secret={}&action={}".format(self._username, self._password, op)
if param:
data += '&' + param
try:
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
response = requests.post(self._api_url, data=data, headers=headers)
result = {}
if response.status_code == 200:
result = response.json()
response.close()
return result
except Exception as e:
raise RuntimeError("API request failed or WiFi is not connected", e)