MicroPython三行代码实现物联网通知:IFTTT Webhook与MCU的极简集成
1. 项目概述当MCU遇上IFTTT三行代码打通物联网通知在嵌入式物联网开发里我们总想让手头的ESP8266、ESP32这些小家伙能干点“大事”——比如当温度传感器读数超标时手机立刻收到一条告警或者门磁开关被触发时家里的智能灯自动亮起。这种设备感知世界并自动触发一连串云端或本地动作的场景正是物联网的魅力所在。然而从零开始实现设备到云再到客户端的完整链路往往涉及复杂的网络协议、认证和API调用对很多开发者尤其是刚入门的朋友来说是个不小的门槛。今天要聊的就是一个能极大简化这个过程的“利器”通过MicroPython结合一个名为MyREST_IFTTT的专用库让你用区区两到三行代码就能让微控制器MCU变身成一个高效的IFTTT触发器。IFTTTIf This Then That是一个知名的自动化平台它允许你将不同的网络服务连接起来创建自动化工作流Applet。而我们的目标就是让MCU成为这个工作流中的“This”触发器。想象一下你不再需要写几十行HTTP客户端代码去处理请求头、JSON格式和错误重试只需要像调用一个普通函数一样把数据“扔”出去剩下的推送通知到LINE、发送邮件到Gmail、记录数据到Google Sheets等复杂操作就全部交给IFTTT云端去优雅地完成。这套方案的核心价值在于“封装”和“解耦”。MyREST_IFTTT库帮你封装了与IFTTT Webhook服务通信的所有底层细节包括RESTful API的调用、数据格式的封装以及网络连接的管理。作为开发者你只需要关心三件事你的IFTTT账号的API Key、你创建好的事件Event名称以及你想要发送的数据内容。这使得你的MCU端代码极其简洁、专注只负责采集和发送核心数据而将复杂的业务逻辑和通知呈现交给了更擅长此道的云端平台和移动应用。无论是做环境监控、安防报警还是简单的状态上报这套组合都能让你快速搭建起一个可用的原型非常适合创客、物联网爱好者和需要快速验证想法的产品经理。2. 核心思路与方案选型为什么是MicroPython IFTTT Webhook在深入代码之前我们有必要先拆解一下这个方案背后的技术逻辑理解为什么这个组合能如此高效。这不仅仅是“用什么”更是“为什么用”和“相比其他方案好在哪”。2.1 技术栈解析MicroPython的轻量与IFTTT的易用首先看MicroPython。对于ESP8266/ESP32这类资源受限的微控制器传统的C/C开发虽然性能极致但网络通信、JSON解析等高级功能的实现相对繁琐。MicroPython作为Python 3的精简实现其最大优势在于高级语言的易用性和丰富的内置库。它原生支持socket、urequests或类似库进行HTTP通信支持json模块处理数据这让实现一个HTTP客户端变得和你在电脑上写Python脚本一样简单。虽然牺牲了一点运行效率和内存但对于大多数物联网应用数据上报频率不高、逻辑不复杂来说开发效率的提升是巨大的。再看IFTTT。它本质上是一个“胶水”平台通过Webhook作为通用触发器连接了数百个不同的互联网服务。Webhook是一种基于HTTP的回调机制IFTTT为你提供了一个唯一的URL任何能发送HTTP请求的设备或服务只要向这个URL发送一个符合格式的POST请求就能触发你预设的自动化流程。这意味着你的MCU不需要知道LINE的API怎么调用、Gmail的SMTP如何配置它只需要学会“如何向一个特定的网址发送一条消息”。这种设计完美地实现了关切的分离设备端只负责触发和传递最小必要信息复杂的服务联动和用户交互由云端平台负责。2.2 方案对比自建服务器 vs. 使用成熟云平台你可能会问为什么不自己搭个服务器用MQTT或者直接调用各服务的API这里做一个简单的对比自建服务器MQTT 后端服务优点数据完全自主可控定制性极强可以构建非常复杂的业务逻辑。缺点成本高需要服务器、域名、可能还需要备案维护复杂要保证服务高可用、处理安全漏洞开发周期长。你需要编写后端API、设计数据库、实现消息队列并为每一个通知渠道如微信、短信、邮件单独集成SDK或API。使用IFTTT等云平台优点接近零成本基础功能免费零运维极速集成。IFTTT已经为你准备好了与LINE、Telegram、Twitter、Google Drive等服务的连接器你只需要在网页上点选配置即可。开发工作被缩减到只剩设备端的HTTP触发。缺点依赖第三方服务存在服务不可用或API变更的风险虽然IFTTT非常稳定自定义能力受平台限制数据流转过程不完全透明免费版可能有调用频率限制。对于原型验证、个人项目、中小型非核心业务场景IFTTT方案的优势是压倒性的。它让你在几分钟内就能看到物联设备“动起来”的效果这种快速反馈对学习和创新至关重要。2.3MyREST_IFTTT库的角色从复杂到简单的关键一跃即使知道了MicroPython和IFTTT Webhook手动实现每一次调用仍然需要编写固定的URL、设置正确的请求头Content-Type: application/json、将数据封装成特定的JSON格式{“value1”: “xxx”, “value2”: “yyy”, “value3”: “zzz”}、处理网络连接和可能的异常。这些代码虽然不长但重复编写令人厌倦且容易出错。MyREST_IFTTT库的作用就是把这套固定的、模板化的操作抽象成一个简洁的类。你看到的myIFTTT(YOUR_API_KEY, YOUR_EVENT)和send()方法背后就是在帮你完成上述所有步骤。它还可能内置了重试机制、连接状态检查等增强鲁棒性的代码。使用这个库你的心智负担从“如何实现HTTP请求”降低到了“我要发送什么数据”聚焦于业务本身。这就是库和框架的价值——将通用复杂性封装起来暴露简单接口。3. 前期准备账户、设备与库文件在写下那三行神奇的代码之前我们需要做好三方面的准备云端配置、硬件设备设置和库文件部署。这个过程就像做饭前备菜准备好了下锅就快。3.1 IFTTT云端配置获取你的“通行证”IFTTT端是整个流程的接收方和指挥中枢。你需要在这里创建一个Webhook Applet并拿到关键的API Key和Event Name。注册与登录访问IFTTT官网用邮箱注册并登录。整个过程非常直观。创建Applet点击右上角你的头像选择“Create”。进入创建页面后点击“If This”开始设置触发器。选择Webhook服务在搜索框输入“webhook”选择“Webhooks”服务。然后点击“Receive a web request”这个触发器。定义事件名称Event Name这是最关键的一步你需要为这个触发器起一个唯一的名字比如esp32_temperature_alert。这个名字将作为MCU代码中YOUR_EVENT的值。请使用英文、数字和下划线避免空格和特殊字符例如door_opened、plant_need_water。记下这个名字。设置“Then That”动作点击“Then That”选择你想要执行的动作。例如搜索并选择“LINE”然后选择“Send message”。你可以按照提示关联你的LINE账号并自定义消息格式。在消息内容中你可以使用{{Value1}}、{{Value2}}、{{Value3}}这三个占位符它们将对应MCU发送过来的三个数据字段。获取Webhook密钥API Key完成Applet创建后需要找到你的Webhook专属密钥。访问 IFTTT Webhook 设置页面 通常官网有入口或直接搜索“IFTTT Webhook settings”。点击“Documentation”按钮。页面顶部会显示一个URL格式类似于https://maker.ifttt.com/trigger/{event}/with/key/{your_key}其中{your_key}这一长串字符就是你的YOUR_API_KEY。请妥善保管此密钥它相当于你的IFTTT账户的万能钥匙。注意一个API Key对应你的整个IFTTT账户可以用于触发账户下所有使用Webhook的Applet。而Event Name则对应到具体的某一个Applet。这意味着你可以用同一个API Key通过发送不同的事件名来触发不同的自动化流程。3.2 硬件与MicroPython环境搭建硬件方面任何支持MicroPython并具备网络连接能力Wi-Fi的开发板都可以最常用的就是ESP8266如NodeMCU、Wemos D1和ESP32系列。固件烧录如果你的板子还没有MicroPython固件需要先烧录。前往MicroPython官网下载对应型号如esp8266或esp32的最新稳定版固件。使用esptool.py工具进行烧录。命令通常如下esptool.py --chip esp8266 --port /dev/ttyUSB0 erase_flash esptool.py --chip esp8266 --port /dev/ttyUSB0 --baud 460800 write_flash 0x0 firmware.bin请将/dev/ttyUSB0替换为你的实际串口firmware.bin替换为你的固件文件名。连接与测试烧录完成后使用串口工具如PuTTY、VS Code的Serial Monitor扩展、或picocom连接到板子的串口。你会看到MicroPython的REPL交互式解释器提示符。输入print(‘Hello, IoT!’)测试环境是否正常。连接Wi-Fi在REPL中你可以手动输入代码连接Wi-Fi但更常见的做法是将Wi-Fi配置写在主程序里。一个基本的连接示例如下import network import time ssid ‘你的Wi-Fi名称’ password ‘你的Wi-Fi密码’ wlan network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print(‘connecting to network…’) wlan.connect(ssid, password) while not wlan.isconnected(): time.sleep(1) print(‘.’, end’’) print(‘\nnetwork config:’, wlan.ifconfig())连接成功后wlan.ifconfig()会返回板子获取到的IP地址。3.3 库文件上传与管理根据原始资料我们需要三个库文件MyREST.py、MyREST_IFTTT.py和可选的MyWifi.py。通常这些文件需要从作者的仓库或社区获取。假设你已经下载到了本地。将文件上传到MCU板载文件系统的方法有多种使用ampy或rshell工具这是命令行方式非常高效。# 使用 ampy ampy –port /dev/ttyUSB0 put MyREST.py ampy –port /dev/ttyUSB0 put MyREST_IFTTT.py ampy –port /dev/ttyUSB0 put MyWifi.py使用Thonny IDE对于初学者非常友好。打开Thonny在右下角选择对应的MicroPython解释器和串口。连接后左侧会出现“设备”和“本机”两个文件浏览器。直接将本地文件拖拽到“设备”区域即可上传。使用WebREPL如果已启用通过网页界面上传文件。上传完成后你可以在MCU的REPL里使用import os; os.listdir()命令来确认文件是否已存在。实操心得建议将所有这些依赖库文件一次性上传完毕。对于稳定的库甚至可以将其上传到板子的/lib目录下如果存在这样它们在导入路径中拥有更高的优先级。另外在上传任何用户代码如main.py之前先测试一下from MyREST_IFTTT import myIFTTT是否成功可以避免因库文件缺失导致的主程序无法启动的“黑屏”问题。4. 核心代码拆解与实战演练万事俱备现在让我们聚焦到最核心的几行代码看看它们是如何运作的以及在实际项目中我们该如何灵活运用。4.1 三行代码的逐行深度解析让我们重温一下这个经典片段from MyREST_IFTTT import myIFTTT # 第1行 my_ifttt myIFTTT(YOUR_API_KEY, YOUR_EVENT) # 第2行 my_ifttt.send([“2020-04-12 19:00:00-2020-04-13 21:00:00”, “22-37”, “Very Hot”]) # 第3行第1行导入from MyREST_IFTTT import myIFTTT。这行代码从MyREST_IFTTT.py文件中导入myIFTTT这个类。这意味着MyREST_IFTTT.py文件必须存在于MCU的当前工作目录或MicroPython的模块搜索路径中。MyREST_IFTTT库内部很可能又依赖了MyREST.py这个更基础的RESTful客户端库所以两个文件缺一不可。第2行实例化my_ifttt myIFTTT(YOUR_API_KEY, YOUR_EVENT)。这里创建了一个myIFTTT类的实例对象命名为my_ifttt。构造函数需要两个参数YOUR_API_KEY替换为你从IFTTT Webhook设置页面获取的那一串密钥。YOUR_EVENT替换为你在创建Webhook Applet时定义的事件名称例如esp32_alert。 这一步的本质是对象内部根据你的API Key和Event Name拼接出了最终要请求的完整URLhttps://maker.ifttt.com/trigger/YOUR_EVENT/with/key/YOUR_API_KEY。同时它可能也初始化了一些网络连接所需的参数。第3行发送数据my_ifttt.send([“val1”, “val2”, “val3”])。这是执行动作的一行。send方法接受一个包含最多三个元素的列表或元组。这三个元素会分别被赋值给value1、value2、value3然后被库内部封装成一个JSON对象{“value1”: “val1”, “value2”: “val2”, “value3”: “val3”}最后通过HTTP POST请求发送到上面拼接好的URL。IFTTT的Webhook服务收到这个请求后就会去触发对应Event Name的Applet并将这三个值填充到你在Applet动作中设置的{{Value1}}、{{Value2}}、{{Value3}}占位符里。4.2 构建一个完整的温湿度监控示例现在我们将这三行代码嵌入到一个真实的场景中使用DHT11温湿度传感器当温度超过30度时通过IFTTT发送LINE通知。硬件连接ESP32开发板DHT11传感器数据线接GPIO 4VCC接3.3VGND接GND代码实现 (main.py)import dht import machine import time import network from MyREST_IFTTT import myIFTTT # —– 1. 网络连接 (可替换为使用MyWifi库) —– def connect_wifi(ssid, pwd): wlan network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print(‘Connecting to WiFi…’) wlan.connect(ssid, pwd) while not wlan.isconnected(): time.sleep(0.5) print(‘.’, end’’) print(‘\nWiFi Connected! IP:’, wlan.ifconfig()[0]) return wlan WIFI_SSID “Your_WiFi_SSID” WIFI_PASS “Your_WiFi_Password” connect_wifi(WIFI_SSID, WIFI_PASS) # —– 2. 传感器初始化 —– dht_pin machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_UP) sensor dht.DHT11(dht_pin) # —– 3. IFTTT配置 —– IFTTT_API_KEY “dpxxx…xxx” # 替换为你的真实密钥 IFTTT_EVENT_NAME “esp32_dht11_alert” # 与IFTTT中创建的Event名称一致 ifttt_sender myIFTTT(IFTTT_API_KEY, IFTTT_EVENT_NAME) # —– 4. 主循环 —– ALERT_TEMP 30.0 # 温度报警阈值 last_alert_time 0 # 上次报警时间 ALERT_INTERVAL 300 # 报警最小间隔单位秒防止刷屏5分钟 while True: try: sensor.measure() temp sensor.temperature() humi sensor.humidity() print(f“Temperature: {temp}°C, Humidity: {humi}%”) current_time time.time() # 检查温度是否超限且距离上次报警时间已超过最小间隔 if temp ALERT_TEMP and (current_time – last_alert_time ALERT_INTERVAL): print(“Temperature too high! Sending alert…”) # 构造发送的数据列表 # value1: 时间戳 # value2: 温度值 # value3: 湿度值 data_to_send [ “2023-10-27 14:30:00”, # 这里可以替换为从RTC获取的真实时间或使用 time.localtime() 格式化 f“{temp:.1f}°C”, f“{humi:.1f}%” ] # 核心的三行代码之一发送 ifttt_sender.send(data_to_send) last_alert_time current_time # 更新上次报警时间 print(“Alert sent successfully.”) except OSError as e: print(“Failed to read sensor:”, e) time.sleep(10) # 每10秒读取一次传感器代码要点解析Wi-Fi连接我们定义了一个connect_wifi函数来管理连接。在实际项目中你可能需要增加更完善的错误处理和重连机制。传感器读取使用dht模块读取DHT11的数据。注意DHT11读取可能失败所以用try…except包裹起来。防刷屏逻辑这是非常重要的实践经验如果没有last_alert_time和ALERT_INTERVAL的控制当温度持续高于阈值时程序会在每个循环10秒都发送一条通知导致你的手机被消息轰炸。我们通过记录上次发送时间并强制间隔至少300秒5分钟来避免这个问题。数据格式化在data_to_send列表中我们精心组织了要发送的数据。value1可以放一个时间字符串value2和value3放格式化的温湿度读数。这样在IFTTT的LINE消息模板里你可以设置为“警报于 {{Value1}} 检测到环境异常。温度{{Value2}} 湿度{{Value3}}”。消息会非常清晰。4.3 IFTTT动作端配置优化回到IFTTT的Applet设置在“Then That”的LINE消息动作中你可以这样配置消息内容⚠️ 环境温度警报 时间{{Value1}} 当前温度{{Value2}} 当前湿度{{Value3}} 已超过设定阈值请及时处理这样当ESP32触发事件后你收到的LINE消息就会是结构化的报警信息而不仅仅是三个杂乱的值。注意事项IFTTT免费账户对Webhook的调用频率是有限制的通常每分钟最多几十次。我们的代码中已经通过sleep(10)和报警间隔控制了频率这完全在限制范围内。但对于需要高频上报数据的场景如每秒一次你需要考虑升级IFTTT Pro账户或改用其他方案。同时敏感信息如API Key不要硬编码在代码中对于开源项目应将其存储在单独的配置文件如config.py中并通过.gitignore避免上传到公开仓库。5. 进阶应用与模式探讨掌握了基础用法后我们可以看看如何将这套简单的机制玩出更多花样适应更复杂的场景。5.1 发送不同类型的数据与结构化消息send方法虽然只接受三个字符串参数但我们可以通过编码将更复杂的信息塞进去。例如如果你想发送一个设备的综合状态报告# 假设我们读取了多个传感器 cpu_temp 45.6 free_mem 12345 status “normal” # 方法1用分隔符组合信息 data [ time.strftime(“%Y-%m-%d %H:%M:%S”), f“CPU:{cpu_temp}|MEM:{free_mem}”, # value2 包含多个信息 status ] ifttt_sender.send(data) # 在IFTTT端你需要对{{Value2}}进行字符串分割解析如果后续动作支持。 # 方法2发送JSON字符串更推荐结构化好 import json sensor_data { “cpu_temp”: cpu_temp, “free_memory_kb”: free_mem, “internal_status”: status } data [ time.strftime(“%Y-%m-%d %H:%M:%S”), “Device_Status_Report”, json.dumps(sensor_data) # 将字典转换为JSON字符串放入value3 ] ifttt_sender.send(data)在IFTTT端如果你后续连接的动作是“Google Sheets”添加一行到电子表格那么{{Value3}}这个JSON字符串会被当作一个文本单元格存入。如果你连接的是“Make (Integromat)”或“Azure Functions”这类更强大的自动化平台它们可以解析这个JSON从而进行更复杂的处理。5.2 一个设备触发多个IFTTT事件你完全可以用同一个myIFTTT实例通过改变事件名来触发不同的Applet。更常见的做法是为不同的功能创建不同的实例。# 初始化不同的IFTTT触发器 alert_sender myIFTTT(API_KEY, “high_temp_alert”) # 高温报警 log_sender myIFTTT(API_KEY, “daily_status_log”) # 每日状态日志 button_sender myIFTTT(API_KEY, “button_pressed”) # 按钮按下事件 # 在不同的条件分支中调用 if temp 30: alert_sender.send([str(temp), str(humi), “High temp!”]) elif some_button.is_pressed(): button_sender.send([“Button1”, “pressed”, “”])5.3 错误处理与网络鲁棒性增强在实际部署中网络是不稳定的IFTTT服务也可能暂时不可用。原始的send方法内部可能已经有一些错误处理但我们可以在外部再包裹一层增加重试和日志记录。def send_with_retry(ifttt_instance, data, max_retries3): for attempt in range(max_retries): try: ifttt_instance.send(data) print(f“Data sent successfully on attempt {attempt1}.”) return True except Exception as e: print(f“Attempt {attempt1} failed: {e}”) if attempt max_retries – 1: time.sleep(2 ** attempt) # 指数退避等待1, 2, 4秒… else: print(“All retries failed. Giving up.”) # 这里可以添加降级方案比如将数据存入本地文件系统如果有 # with open(‘/failed_data.txt’, ‘a’) as f: # f.write(str(data) ‘\n’) return False # 使用增强的发送函数 if temp ALERT_TEMP: if not send_with_retry(ifttt_sender, data_to_send): print(“Critical: Failed to send alert after retries!”) # 可以触发本地报警如点亮一个LED alarm_led.on()这段代码实现了一个简单的指数退避重试机制。第一次失败后等1秒第二次失败后等2秒第三次失败后等4秒。如果所有重试都失败则记录日志或触发本地降级方案。这对于提高物联网设备在恶劣网络环境下的可靠性非常有帮助。6. 常见问题排查与调试技巧即使按照步骤操作也难免会遇到问题。下面是一些常见坑点及其解决方法很多都是我亲自踩过的。6.1 问题速查表问题现象可能原因排查步骤与解决方案导入库失败ImportError: no module named ‘MyREST_IFTTT’1. 库文件未上传到MCU。2. 库文件上传到了错误目录。3. 文件名或类名拼写错误。1. 使用os.listdir()确认文件是否存在。2. 确保文件在主程序同一目录或/lib目录下。3. 检查from MyREST_IFTTT import myIFTTT中的文件名和类名是否与上传的文件完全一致大小写敏感。发送成功但收不到LINE/邮件通知1. IFTTT Applet未启用默认是关闭的。2. IFTTT动作服务如LINE未正确授权/连接。3.Event Name拼写错误。4.{{Value1}}等占位符在动作中未使用或拼写错误。1. 登录IFTTT进入“My Applets”找到对应的Applet确保开关是绿色的已启用。2. 检查动作服务如LINE旁边是否有“Connected”字样如果没有点击重新连接。3. 仔细核对代码中的YOUR_EVENT和Applet创建时输入的“Event Name”必须一字不差。4. 检查动作配置确保消息体中使用了正确的{{Value1}}、{{Value2}}、{{Value3}}。MCU程序运行但无任何反应网络似乎未连接1. Wi-Fi SSID/密码错误。2. 路由器设置了MAC过滤或仅允许特定设备连接。3. 网络信号太弱。4. 代码中Wi-Fi连接部分有逻辑错误在连接失败后陷入死循环。1. 在REPL中手动运行Wi-Fi连接代码打印wlan.status()查看状态码3表示已连接。2. 检查路由器后台将ESP板的MAC地址加入白名单如果需要。3. 将设备靠近路由器或检查是否有防火墙规则阻止了MCU的接入。4. 在连接Wi-Fi的循环中增加超时机制避免无限等待。例如timeout 20 # 秒start time.time()while not wlan.isconnected() and (time.time() – start timeout):发送请求后MCU重启或报内存错误1. 网络操作如socket连接未正确关闭导致内存泄漏。2. 在循环中频繁创建myIFTTT实例未复用。3. 发送的数据量过大。1. 确保使用的网络库如urequests或MyREST正确关闭了连接。可以在send方法后手动执行gc.collect()进行垃圾回收。2.最佳实践在循环外只实例化一次myIFTTT对象在循环内反复调用其send方法而不是每次都new一个。3. IFTTT Webhook的value1/2/3每个字段理论上可以很长但过长的字符串会占用更多内存。尽量精简数据。能收到通知但内容是[object Object]或乱码数据格式问题。IFTTT期望的是三个纯字符串字段。如果你发送了一个Python列表或字典对象它会被转换成字符串表示形式在JSON中可能无法正确解析。确保传递给send()方法的是一个包含三个字符串的列表。对于数字用str()转换对于复杂结构先json.dumps()成字符串再发送。参考5.1节的方法。6.2 高级调试模拟请求与日志查看有时候问题出在网络请求本身。我们可以绕过MyREST_IFTTT库直接用最原始的方法发送一个HTTP请求来测试这能帮我们定位是库的问题还是配置的问题。在电脑上用Python测试确保电脑能上网import requests import json url “https://maker.ifttt.com/trigger/YOUR_EVENT_NAME/with/key/YOUR_API_KEY” data {“value1”: “test1”, “value2”: “test2”, “value3”: “test3”} headers {‘Content-Type’: ‘application/json’} response requests.post(url, datajson.dumps(data), headersheaders) print(“Status Code:”, response.status_code) print(“Response Text:”, response.text)如果返回200和“Congratulations! You’ve fired the xxx event”说明你的IFTTT配置完全正确。如果失败根据错误信息如404 Not Found检查事件名403 Forbidden检查API Key进行排查。在MCU上使用urequests库手动测试 如果你的MCU已经安装了urequestsMicroPython的requests简化版可以在REPL里测试import urequests import json url “https://maker.ifttt.com/trigger/test_event/with/key/xxx” data {“value1”: “manual”, “value2”: “test”, “value3”: “from REPL”} resp urequests.post(url, jsondata) print(resp.status_code) print(resp.text) resp.close() # 重要记得关闭连接这个方法能验证MCU的网络连通性和基础HTTP功能是否正常。实操心得在开发阶段强烈建议在代码中添加详细的打印print语句特别是在send方法调用前后、Wi-Fi连接成功时。例如打印出拼接的URL注意隐藏API Key的关键部分、发送的数据、以及HTTP响应的状态码。这些日志对于在串口监视器中快速定位问题至关重要。一旦项目稳定可以考虑将这些调试信息关闭或写入到文件系统中。