
1. 项目概述与核心价值在户外探险或者看护重要物品时我们常常面临一个两难困境智能手机功能强大但其定位和通信能力严重依赖蜂窝网络信号和电池续航。一旦进入深山、荒漠或地下车库等信号盲区或者手机电量耗尽我们与外界的关键联系就可能被切断。这正是我们设计并制作“Scoutify”这款便携式智能GPS追踪器的初衷。它不是一个简单的概念而是一个我们亲手从电路设计、PCB打样、3D打印外壳到代码编写、全栈开发一步步实现出来的完整产品。Scoutify的核心设计理念是独立、可靠与低功耗。它不依赖于用户手机的蜂窝网络而是内置了独立的GSM/GPRS通信模块它不依赖手机GPS而是拥有自己的卫星定位天线它由一块专用的锂电池供电续航以天为单位计算。其工程价值在于它巧妙地整合了ESP32C3这款性价比极高的物联网微控制器以及Ai-Thinker A9G这款集成了GSM、GPRS、GPS甚至语音功能的“All-in-One”通信模组构建了一个功能完备且成本可控的硬件平台。配合上我们使用Flutter开发的跨平台移动应用和Google Firebase提供的实时数据库与后端服务形成了一套从硬件感知、云端同步到手机端可视化的完整物联网解决方案。这个项目非常适合那些对嵌入式系统、物联网全栈开发感兴趣的朋友。无论你是想深入学习如何让硬件“说话”如何设计一个稳定可靠的产品级PCB还是想了解如何将硬件数据与手机App和云端无缝对接这个项目都能提供一次绝佳的实战机会。接下来我将抛开论文式的陈述以一名开发者的视角带你深入每个环节分享我们踩过的坑和总结的经验。2. 核心硬件选型与设计思路解析为什么是ESP32C3和A9G这个组合这是项目伊始我们争论最久的问题。市面上有更简单的方案比如直接用一款集成了MCU和通信功能的模块也有更强大的方案比如用树莓派。我们的选择基于以下几个核心考量。2.1 主控芯片Seeed Studio XIAO ESP32C3的取舍ESP32系列芯片选择众多我们最终锁定ESP32C3并选用Seeed Studio的XIAO封装版本主要基于以下几点性价比与功耗平衡ESP32C3是一款基于RISC-V架构的单核芯片相比双核的ESP32-S3它在保持Wi-Fi和蓝牙连接能力的同时功耗更低成本也更优。对于我们这个以户外、低功耗为核心场景的设备续航是生命线。ESP32C3在深度睡眠模式下的电流可以低至5μA左右这对于定期唤醒采集并上报数据的场景至关重要。接口与尺寸XIAO封装将ESP32C3的核心功能浓缩到一个指甲盖大小的开发板上自带USB-C接口便于编程和调试引出脚位也足够我们连接显示屏、按钮和与A9G通信。其小巧的尺寸为我们后续设计紧凑的便携式外壳奠定了基础。开发生态得益于乐鑫官方的支持ESP32C3在Arduino框架和ESP-IDF下都有良好的支持。我们选择使用PlatformIO基于VSCode进行开发库资源丰富社区活跃遇到问题容易找到解决方案。注意ESP32C3的GPIO数量相对有限在规划外设显示屏、按钮、与A9G的串口、状态指示灯等时需要仔细分配避免冲突。我们最初就曾因为引脚复用问题导致调试异常。2.2 通信与定位核心Ai-Thinker A9G模块详解A9G模块是这个项目的“通信心脏”。它本质上是一个集成了GSM/GPRS2G、GPS/北斗定位、甚至一个简单MCU和音频编解码器的模块。选择它我们主要看中其“一体化”解决方案带来的优势功能集成度高一颗模块解决了移动网络通信和卫星定位两大核心需求省去了分别连接GSM模块和GPS模块的复杂布线、天线设计和兼容性调试工作极大简化了硬件设计和软件驱动。成本与功耗可控对于主要发送短信和少量GPRS数据的应用场景2G网络在多数地区覆盖依然广泛且模块成本和通信资费都远低于4G Cat.1或NB-IoT方案。A9G支持多种省电模式PSM、eDRX我们可以通过AT指令精细控制其工作状态例如仅在需要发送数据时才唤醒GPRS。备用语音通道模块内置的麦克风输入和音频输出接口为我们实现“隐蔽通话”功能提供了硬件可能。虽然本项目未深度开发此功能但它预留了重要的扩展性。关键设计考量A9G模块与ESP32C3通过串口UART进行AT指令通信。这里有一个重要细节A9G的工作电压是3.3V-4.2V而ESP32C3的GPIO也是3.3V电平两者可以直接连接无需电平转换。我们使用ESP32C3的一组硬件串口例如UART1与A9G的TX/RX相连并额外使用一个GPIO控制A9G的PWR_KEY引脚以实现软件开关机这对于彻底断电省电至关重要。2.3 电源系统设计稳定供电是基石硬件设计中最容易忽视但问题最多的往往是电源部分。我们的设备由单节3.7V/550mAh的锂聚合物电池供电但系统中不同部件需要不同的电压ESP32C3工作电压3.3V。A9G模块峰值发射电流可达2A电压范围3.3V-4.2V。ST7735 TFT屏幕通常需要3.3V或5V供电取决于具体型号。如果直接用电池的3.7V满电约4.2V欠压约3.0V直接供电在电池电压下降时系统会不稳定。因此我们引入了MT3608升压Boost转换器。升压方案选择MT3608是一款常用、高效的同步整流升压芯片能将最低2V的输入电压升至最高28V。我们将其配置为输出稳定的5.0V。为什么是5V首先它为屏幕提供了稳定电压其次5V再通过一个低压差线性稳压器LDO如AMS1117-3.3为ESP32C3和A9G的逻辑部分提供更纯净、更稳定的3.3V。这种“先升压后降压”的方案确保了在整个电池放电周期内核心元件都能获得稳定电压。功耗管理除了硬件上的电源路径设计软件上的功耗管理同样关键。我们的策略是ESP32C3大部分时间处于深度睡眠模式每2分钟可配置定时器唤醒一次。唤醒后它先读取GPS数据然后通过串口唤醒A9G建立GPRS连接上传数据到Firebase之后迅速让A9G进入睡眠ESP32C3自身也再次进入深度睡眠。只有按下紧急按钮SOS时才会立即全速运行并发送短信。3. 电路设计与PCB制作实战有了核心器件的选型下一步就是把它们可靠地连接在一起。我们使用EasyEDA进行原理图设计和PCB布局并决定自己动手热转印制作双面板这对精度和耐心都是考验。3.1 原理图Schematic设计要点画原理图不仅仅是连线更是对系统电气关系的梳理。我们遵循了以下原则电源路径清晰在原理图中我们用粗线明确标出了从电池接口-开关-MT3608升压电路-5V电源网络-LDO-3.3V电源网络的完整路径。在每个芯片的电源引脚附近都放置了去耦电容通常为100nF和10uF并联以滤除高频和低频噪声这是保证系统稳定运行的基础尤其是对于A9G这种大电流射频器件。信号线分类将电源、数字信号如SPI用于屏幕、模拟信号预留、高速信号射频天线在图纸上分区布局避免交叉混乱。UART、I2C等总线加上拉电阻我们用了10kΩ。预留测试点我们在关键位置如电池电压检测点、3.3V/5V输出点、主控的串口引脚旁都放置了过孔或焊盘作为测试点。这在后期调试时用万用表或示波器进行测量变得极其方便。接口定义明确为屏幕、电池、A9G的外接天线SMA接口等都设计了标准的连接器或焊盘并在旁边清晰标注引脚定义。3.2 PCB布局与布线经验将原理图转化为实际的PCB板是硬件设计从图纸走向实物的关键一步。我们设计的是双面板以减小面积。布局优先遵循“先大后小先关键后一般”的原则。首先放置连接器电源接口、天线接口、屏幕排针这些位置通常由外壳结构决定。然后放置核心芯片ESP32C3和A9G确保它们之间的距离适中便于走线。接着放置MT3608等电源芯片及其电感、电容这些元件应尽量靠近回路面积要小以减少电磁干扰EMI。布线规则电源线加粗主电源路径电池输入、5V输出我们使用了0.8mm甚至1mm的线宽以承载更大电流。信号线等长与间距对于SPI等稍高速的信号线尽量保持走线长度相近并与其他线保持一定距离避免串扰。我们使用了0.4mm的线宽和间距在保证可靠性的前提下最大化利用空间。射频线处理A9G的GPS天线和GSM天线输出是射频信号对阻抗非常敏感。我们使用了微带线计算工具将连接到SMA接口的这段走线控制为50欧姆阻抗。虽然自制PCB的精度无法与工厂相比但遵循规则能极大提高成功率。走线要短、直下方有完整的地平面作为参考。地平面Ground Plane在PCB的底层Bottom Layer我们尽可能保留了大面积的铜皮作为地平面并通过大量过孔与顶层地连接。完整的地平面是抑制噪声、提供稳定参考电位的关键。3.3 热转印制作双面板的挑战由于是原型验证我们选择了成本较低的热转印Toner Transfer法自制PCB。这个过程需要极大的耐心和细心。打印与转印使用激光打印机将PCB图层Top和Bottom分别打印在光滑的转印纸上。将覆铜板裁剪合适大小并清洁。用热转印机或家用熨斗我们用的是熨斗加热将墨粉转印到铜板上。核心技巧加热要均匀、压力要足够、冷却后再慢慢揭下转印纸。如果线条有缺损立即用油性记号笔修补。腐蚀Etching我们使用环保的过氧化氢双氧水盐酸混合溶液进行腐蚀。比例约为双氧水盐酸水 1:1:4。在通风处操作佩戴防护装备。将板子放入不断摇晃直到非线路部分的铜被完全腐蚀掉。时间不宜过长否则会产生“侧蚀”导致细线条断开。钻孔与过孔金属化这是自制双面板最麻烦的一步。Top层和Bottom层的定位孔必须对齐。我们先用小钻头0.8mm在所有过孔和焊盘中心打定位孔然后再用合适尺寸的钻头扩孔。对于需要电气连接的双面过孔我们采用了一个“土办法”在孔中插入一小段元件剪下的引脚然后在两面焊接实现连通。焊接与调试焊接时先焊接高度最低的器件如电阻、电容再焊接芯片和连接器。对于ESP32C3和A9G这类QFN或LCC封装的模块需要使用热风枪和焊膏。务必先给PCB焊盘上锡并处理好然后对准位置用热风枪均匀加热直至焊锡融化。焊接完成后先用万用表检查所有电源与地之间是否短路再上电测试。4. 嵌入式软件设计与实现硬件是躯体软件是灵魂。Scoutify的固件运行在ESP32C3上负责协调所有硬件、处理数据并与云端通信。我们采用PlatformIO作为开发框架它比原生Arduino IDE更专业库管理更方便。4.1 系统状态机与主循环设计对于一个低功耗物联网设备不能使用简单的delay()而必须采用非阻塞和状态机State Machine的设计模式。// 伪代码示例说明主循环逻辑 void loop() { unsigned long currentMillis millis(); // 状态机处理 switch (systemState) { case STATE_DEEP_SLEEP: // 由定时器或外部中断唤醒后进入其他状态 break; case STATE_GET_GPS: if (getGPSData(lat, lon)) { systemState STATE_CONNECT_FIREBASE; } else if (currentMillis - gpsStartTime GPS_TIMEOUT) { // GPS获取超时记录错误或尝试下次 systemState STATE_SLEEP_PREPARE; } break; case STATE_CONNECT_FIREBASE: if (connectWiFiAndFirebase()) { uploadDataToFirebase(lat, lon); systemState STATE_SLEEP_PREPARE; } break; case STATE_SLEEP_PREPARE: // 关闭外设设置唤醒源进入深度睡眠 enterDeepSleep(120); // 睡眠120秒 break; case STATE_SOS_TRIGGERED: // 紧急按钮按下立即获取GPS并发送短信 sendEmergencySMS(); systemState STATE_SLEEP_PREPARE; // 发送后恢复常规循环 break; } // 处理串口接收的A9G响应 processA9GResponse(); }这种设计使得CPU在等待GPS定位、网络连接等耗时操作时不会阻塞其他任务如监听按钮中断并且能清晰地管理各个状态之间的转换。4.2 与A9G模块的AT指令通信与A9G的所有交互都通过UART发送AT指令完成。编写一个健壮的AT指令驱动层至关重要。指令发送与响应解析我们封装了一个sendATCommand函数它发送指令后会等待一个预设的超时时间并从串口缓冲区中读取A9G的响应。响应解析需要处理多行回复和最终结果码如OK或ERROR。关键流程实现开机与初始化通过PWR_KEY引脚拉低一定时间如1秒来开机。开机后发送AT测试指令然后依次设置短信格式(ATCMGF1)、启用网络注册状态提示(ATCREG?)等。获取GPS数据发送ATLOCATION2指令A9G会返回包含经纬度、时间、速度的字符串。解析这个字符串是重点需要处理各种格式和可能的错误。发送短信在SOS模式下使用ATCMGS8613800138000指令随后输入短信内容我们格式化为一个Google Maps链接最后以CtrlZASCII 26结束。GPRS数据传输为了上传数据到Firebase需要先激活PDP上下文(ATCGACT1,1)然后建立TCP连接(ATCIPSTARTTCP,your-server,port)发送数据最后关闭连接。注意我们实际项目中使用的是Firebase的REST API通过HTTPS发送这要求A9G支持SSL过程更复杂。另一种更常见的做法是让ESP32C3通过Wi-Fi连接Firebase而A9G仅负责短信和GPS。我们的设计让ESP32C3同时处理Wi-Fi和A9G逻辑更集中。错误处理与重试网络环境不稳定AT指令可能失败。我们的代码中对关键指令如获取GPS、发送短信加入了重试机制。例如如果发送短信失败会等待几秒后重试最多3次。4.3 数据上传与Firebase集成我们选择Google Firebase Realtime Database作为云端数据库因为它实时同步的特性非常适合做轨迹展示且与Flutter和ESP32客户端库集成良好。ESP32 Firebase客户端库我们使用了Firebase-ESP-Client库。需要在代码中配置Wi-Fi凭证、Firebase项目API Key和数据库URL。数据结构设计在Firebase中我们为每个设备创建了一个唯一的节点通常用设备ID或手机号标识。其下存储每次上报的数据结构如下devices: { 6285811096232: { // 设备SIM卡号作为ID latest: { latitude: -6.123456, longitude: 106.789012, timestamp: 2023-10-27T08:30:00Z, battery: 85, sos: false }, history: { key_auto_generated_1: { ... }, key_auto_generated_2: { ... } } } }latest节点始终更新为最新位置用于App实时显示history节点使用Firebase的push()方法自动生成唯一键用于存储历史轨迹。安全规则务必在Firebase控制台设置数据库安全规则。我们设置为仅允许已验证用户读写或者在原型阶段可以临时设置为true用于测试但上线前必须收紧规则。5. 移动应用Flutter与云端联动手机App是用户与Scoutify设备交互的窗口。我们使用Flutter开发实现了一套界面主要功能是显示设备的实时位置和历史轨迹。5.1 Flutter与Firebase实时数据同步这是App的核心功能。我们使用firebase_database插件来监听Firebase中特定设备latest节点的变化。// 示例代码片段 DatabaseReference _locationRef FirebaseDatabase.instance .ref(devices) .child(widget.deviceId) .child(latest); // 监听实时更新 _locationRef.onValue.listen((DatabaseEvent event) { final data event.snapshot.value as Mapdynamic, dynamic?; if (data ! null) { double lat double.parse(data[latitude].toString()); double lng double.parse(data[longitude].toString()); // 更新地图上的标记 _updateMarkerOnMap(lat, lng); // 将新点加入轨迹线 _addToPath(LatLng(lat, lng)); } });当ESP32设备每2分钟上传一次新位置时App端会立即收到更新并平滑地移动地图上的标记点同时绘制出轨迹线。这种实时性带来了很好的用户体验。5.2 地图集成与轨迹绘制我们选择了google_maps_flutter插件来集成谷歌地图在国内可能需要替换为高德或百度地图SDK。地图显示初始化地图并以设备最新位置为中心。标记Marker用一个自定义图标比如一个圆点或设备图标表示设备的实时位置。当收到新的位置更新时通过MarkerId更新该标记的位置并可以添加动画效果实现平滑移动。折线Polyline用于绘制历史轨迹。我们将从Firebasehistory节点获取的一系列经纬度点存储在一个ListLatLng中然后创建一个Polyline对象并添加到地图上。可以设置折线的颜色、宽度等属性。历史轨迹查询App提供一个界面让用户选择日期范围然后我们从Firebase中查询对应时间段内的history数据并将其绘制为一条完整的轨迹线。5.3 设备管理与一键呼叫在App的“设备管理”页面我们列出了所有绑定的Scoutify设备通过SIM卡号识别。点击一个设备除了查看实时位置还有一个重要功能是一键呼叫。这个功能利用了Flutter的url_launcher插件。当用户点击设备对应的手机号时App会发起一个系统电话呼叫请求launchUrl(Uri(scheme: tel, path: phoneNumber));由于A9G模块本身支持语音通话设备端在收到来电时会振铃或根据设置静音。这个功能设计用于紧急情况下的双向语音沟通虽然简单但在特定场景下非常有用。6. 外壳设计与3D打印一个好的产品离不开好的外观和结构设计。我们使用SolidWorks为Scoutify设计了分体式外壳并使用PLA材料进行3D打印。6.1 结构设计考量紧凑与坚固外壳尺寸严格围绕PCB和电池的尺寸设计内部通过卡槽和支柱固定PCB避免晃动。外壳壁厚设置为1.5mm-2mm在保证强度的同时控制重量。天线预留外壳顶部为GPS外接天线和GSM天线预留了SMA接口的开孔。非常重要的一点GPS陶瓷天线需要面向天空且上方不能有金属遮挡因此我们将这个接口设计在设备顶部。按钮与屏幕开孔为两个静音按钮和TFT屏幕精确开孔。按钮周围设计了防误触的凹槽。屏幕开窗略小于显示区域并用透明亚克力板覆盖保护。散热与防水在底部和侧面设计了一些细小的通风孔帮助A9G模块散热。虽然未达到IP防水等级但通过上下盖的紧密咬合可以防止日常灰尘和水溅。6.2 3D打印与后处理切片设置使用Cura进行切片。层高我们选择0.2mm以获得较好的表面质量。填充率设为20%网格填充在保证结构强度的同时节省材料和打印时间。对于支撑我们只在悬垂角度大于60度的地方生成以减少后期清理的麻烦。打印过程PLA材料打印温度设置为205°C喷嘴62°C热床。第一层的附着至关重要需要确保平台平整、洁净。我们打印了外壳的上盖、下盖、按钮等几个部分。后处理与组装打印完成后小心去除支撑。用砂纸打磨结合面和毛刺确保上下盖能紧密闭合。使用螺丝或卡扣我们设计的是卡扣进行组装。将屏幕、按钮先安装到外壳上再放入PCB最后合盖。7. 系统集成测试与问题排查将所有部分组装在一起后全面的测试是确保项目成功的关键。我们制定了从单元到整体的测试流程。7.1 分模块测试电源测试不接主控先上电测试MT3608输出是否为稳定的5VLDO输出是否为3.3V。测量静态电流应在极低水平。核心功能测试ESP32C3基础测试烧录一个简单的Blink程序测试GPIO和串口打印是否正常。A9G模块测试编写一个简单的测试程序让ESP32通过串口向A9G发送AT指令并打印回显确认通信链路畅通。GPS测试在户外开阔地带测试ATLOCATION指令是否能正确返回经纬度数据。短信测试编写代码触发短信发送功能确认目标手机能收到包含位置链接的短信。Wi-Fi与Firebase测试在代码中配置好Wi-Fi和Firebase测试ESP32能否成功连接并写入测试数据。7.2 整机联调与常见问题在整合测试中我们遇到了几个典型问题这里分享排查思路问题现象可能原因排查步骤与解决方案设备无法开机1. 电池电量耗尽或接反。2. 电源开关故障或焊接不良。3. MT3608或LDO损坏。4. 存在短路。1. 用万用表测量电池电压检查极性。2. 测量开关通断检查焊接点。3. 测量MT3608输入/输出LDO输入/输出。4. 断电用万用表蜂鸣档检查5V/3.3V对地是否短路。GPS长时间无法定位1. 在室内或信号遮挡严重。2. GPS天线未接好或损坏。3. A9G模块GPS部分故障。4. AT指令格式或解析错误。1.移至户外开阔地这是最常见原因。2. 检查SMA接头是否拧紧天线线缆是否完好。3. 发送ATLOCATION?测试指令看模块是否响应。4. 检查代码中解析GPS数据字符串的逻辑确保能处理各种返回格式如无定位时返回0.000000。无法发送短信1. SIM卡未插好、欠费或未开通短信功能。2. 网络信号弱CSQ值低。3. 短信中心号码设置错误部分地区需要。4. AT指令序列错误或超时。1. 检查SIM卡发送ATCSQ查询信号强度应大于10。2. 发送ATCMGF1设置文本模式再手动发一条短信测试。3. 查询并设置短信中心号码ATCSCA?/ATCSCA号码。4. 在代码中增加AT指令响应日志查看具体在哪一步出错。Firebase数据上传失败1. Wi-Fi连接失败。2. Firebase API Key或数据库URL配置错误。3. 网络时间未同步Firebase要求有效时间戳。4. 数据库安全规则限制。1. 检查ESP32的Wi-Fi连接状态打印。2. 仔细核对Firebase项目设置中的信息。3. 确保代码中使用了NTP客户端同步网络时间。4. 暂时将Firebase数据库规则改为公开读写进行测试。电池续航远低于预期1. 软件未进入深度睡眠或唤醒过于频繁。2. 外设如屏幕背光未在睡眠时关闭。3. 电源路径存在漏电如某元件损坏。1. 用电流表串联测量睡眠时的整机电流应低于1mA理想情况100μA。2. 在代码中确保睡眠前调用display.sleep()并关闭A9G模块通过PWR_KEY。3. 逐一断开外设排查漏电元件。7.3 功耗优化实战对于便携设备功耗优化是永恒的主题。我们通过以下手段显著提升了续航最大化深度睡眠ESP32C3在深度睡眠下仅消耗约5μA电流。我们使用其内置的定时器RTC作为唤醒源每120秒唤醒一次。在唤醒期间快速完成GPS获取、数据上传等任务然后立即返回睡眠。外设电源管理A9G模块是耗电大户。我们不仅通过AT指令让其进入睡眠模式ATCGSLP更彻底的是在ESP32进入深度睡眠前通过一个GPIO控制一个MOSFET开关物理切断A9G模块的电源输入非VCC而是其使能引脚或通过MOSFET控制主供电。这能将静态功耗降至几乎为零。屏幕与背光控制ST7735屏幕在显示完信息如电量后立即调用tft.sleep()函数将其置于睡眠模式并关闭背光通过PWM控制背光引脚为低电平。降低工作频率在ESP32代码中可以通过setCpuFrequencyMhz()函数降低CPU主频如降至80MHz在满足计算需求的同时降低动态功耗。经过优化我们的设备在每2分钟上报一次数据的典型工作模式下配合550mAh电池可以实现约5-7天的续航这对于多数户外短途活动已经足够。8. 项目总结与扩展思考回顾整个Scoutify项目的开发过程它不仅仅是一个GPS追踪器的制作更是一次完整的物联网产品开发实践涵盖了硬件选型、电路设计、嵌入式编程、云端服务和移动应用开发的全链路。我个人最深的一点体会是“简单可靠”远比“功能炫酷”更重要。在初期我们曾设想加入更多传感器如加速度计检测跌落、更复杂的通信协议如MQTT over TLS。但很快发现每增加一个功能就引入了一份不稳定因素和功耗负担。最终我们回归核心需求——在没网、没电的环境下可靠地报告位置。于是短信成了最可靠的备用通信通道定期休眠成了保障续航的铁律。这种对核心需求的聚焦是项目能成功跑起来的关键。对于想要复现或改进这个项目的朋友这里有几个可行的扩展方向太阳能充电为外壳增加一小块太阳能电池板配合TP4056等充电管理芯片可以实现理论上的永久续航非常适合长期户外部署。离线位置缓存与补报在完全无网络的情况下设备可以将定位到的坐标存储在ESP32的SPIFFS或外置EEPROM中。一旦重新进入有网区域自动将历史位置批量上报到云端。地理围栏Geofencing在设备端或App端设定一个安全区域。当设备移动超出此区域时自动触发警报App推送通知或发送短信。这需要设备端具备一定的计算逻辑或在云端实现。更换通信方案如果2G网络在您所在的区域逐步退网可以考虑升级到NB-IoT或4G Cat.1模块。这些模块功耗同样很低但需要相应的SIM卡和资费支持。硬件连接和AT指令驱动的思路是相通的。这个项目所有的硬件设计文件原理图、PCB、3D打印模型、嵌入式代码和Flutter App代码我们都已开源。希望我们的经验和踩过的坑能为你点亮一盏灯。物联网的世界很大从一个小设备开始亲手让它连接上云端看到数据在指尖流动这种成就感是无可替代的。如果你在制作过程中遇到任何问题欢迎在社区分享我们一起探讨解决。