https://micropythonos.com/ 默认是有屏幕的，也可以编写无屏幕的service 可以将C编译为.mpy文件给micropython调用 UI界面是集成在S3上的，没有PC端分离界面 当前有700多Star 25年5月的项目，claude居然也有参与 Lua-RTOS-ESP32 https://github.com/whitecatboard/Lua-RTOS-ESP32 这个2016年开始的项目，再2018年已经停止维护了。其开发者网站也已经停止运营了https://ide.whitecatboard.org/ 请注意， ide.whitecatboard.org 服务将于 2026 年 9 月 30 日永久关闭。 从理念上其实是很不错的系统 LuatOS https://github.com/openLuat/LuatOS/ 上海合宙的系统，25年8月开始的项目，Star数500多
一个Thing的流行程度，是其能承载资源的丰富程度。如果没有资源，再牛也是屠龙之技。相反，如果资源丰富，即使技术低下，也能充分流行。
数据库中建立Users数据，每个用户只能有1个，通常通过先查询无此用户再新建的方式。在极低概率下（可能是多端同时登录或者其他情况），会创建多于1个用户。此时为保证只能创建1个，需要在数据库管理端通过索引实现。 以_openid唯一为例，在数据库的“索引管理”中创建一个_openid的索引，并限定唯一即可。创建时，需要先删除旧的非唯一_openid索引。数据库中有重复的_openid数据也需要先删除。 查找重复_openid需要聚合。网上给出的代码（包括千问和google AI）都有错误，正确的如下： db.collection('your_collection_name').aggregate() .group({ _id: '$_openid', // 按 _openid 字段分组 count: $.sum(1) // 统计每组内的记录数量 }) .match({ // 第二步：筛选出数量大于 1 的分组 count: _.gt(1) // AI给出的代码这儿将_误作$ }) .end()
设备 搜索一些价格很便宜性能很强的掌上游戏机就能找到。 RK3326，大约14左右就能买到（AI说8-12元），4xA7@1.5GHz, Mali-G31 MP2，1080p@60fps 硬解（H.264/H.265），代表掌机：R36S，640x480 3.5寸屏。3D模拟器支持到PS1,N64,PSP RK3506，略贵，CPU性能和图形性能都差，但是有集成0.5TOPS算力，代表掌机：H5，720p屏幕，3D模拟器只支持到PS1. OS 说一下支持Arm这种微型设备的操作系统，。 传统的Ubuntu和Debian有些定制版本。 Armbian是针对Debian优化的系统，支持绝大多数的Pi硬件，如树莓派香蕉派橙子派等。 https://armbian.com/ 游戏系统 以下都是游戏系统，没想到有这么多 EmuELEC ,常被称之为EE系统，https://github.com/EmuELEC/EmuELEC/releases ArkOS(Another Rk OS, Rk是Rockchip的CPU前缀) 及其后继版本dArkOS（Debian ArkOS）, https://github.com/christianhaitian/arkos https://github.com/christianhaitian/dArkOS Rocknix https://github.com/ROCKNIX/distribution AmberELEC 基于EmuELEC的Fork版本，似乎有更多升级 https://github.com/AmberELEC/AmberELEC https://amberelec.org/ batocera https://github.com/batocera-linux/batocera.linux Knulli ,是batocera的fork https://knulli.org/ 还有好几个，可以看portmaster支持的系统，都是游戏系统 https://portmaster.games/supported-devices.html portmaster, 简称PortS, 是Linux上运行PC移植游戏的软件，支持ArkOS、AmberELEC 和 uOS, 似乎其他Linux也支持，但需要手动配置。 https://portmaster.games/
Modbus实际上是应用层协议，制定的年代非常早。理论上是不限定物理层的。 最早是从串口协议RS485上发展来的。因为它是可以一主多从，跟RS485的架构刚好相同。现在也支持基于TCP/IP协议，默认端口号是502。但由于502端口在系统保留端口内，所以很多软件是以8502启动的。 Modbus支持的底层协议分为三种。分别是Modbus RTU、Modbus ASCII，Modbus TCP。由于它是上层协议，所以有JavaScript的实现。有两个库，Modbus-Serial和JSModbus。 Modbus分为主机和从机，一个主机最多可以带32个从机。按Client Server架构来分的话，主机Master是Client，从机Slave是Server。 从机分为三级来去读取一个具体的数值。依次是Unit ID、寄存器、地址。 每个从机，也就是Server首先有一个自己的Unit ID。 其次支持四种不同的寄存器。 1，线圈coil，可读可写，布尔类型。 2，离散输入Discrete input，只读布尔类型。 3，输入寄存器Input registers，只读，双字节。 4，保持寄存器Holding registers，可读可写，双字节。 最后，每种寄存器有其自己的地址。地址又分人类可读地址和机器实际地址。人类可读地址以0、1、3、4开头，分别代表线圈和离散输入、输入寄存器、保持寄存器。机器实际地址都是从0开始的。 Modbus的问题就是从机不能主动上报数据，只能主机去轮询。
参考资料： cnblogs上一篇讲解：https://www.cnblogs.com/iini/p/18009504 st matter测试和演示： https://wiki.st.com/stm32mcu/wiki/Connectivity:Matter_test_and_demonstrate esp-matter 文档： https://github.com/espressif/esp-matter csa matter协议： https://csa-iot.org/all-solutions/matter/ 官方matter sdk开源： https://github.com/project-chip/connectedhomeip/blob/master/docs/guides/BUILDING.md#prerequisites 开发工具： esp matter开发需要在linux或者MacOS上安装esp-idf和esp-matter 官方 chip-tool 运行于支持BLE的linux和MacOS上 android上由NXP开发的NXP Matter Tool可以替代chip-tool 配网 Matter的配网又叫commission任命（和provision又不同），过程叫commissioning, 给配网信息的叫任命者commissioner，一般就是controller手机，被任命的叫commissionee,一般就是设备。 matter的设备（不包括设备本身）内有三级结构，分别时node节点->endpoint终端->cluster功能簇，cluster分为server和client，其中server提供attributes, Commands和Events, client可以发起交互命令interactions, 包括 read, write, invoke, subscribe（读/写/调用/订阅） 为了完成配网，commissionee必须提供如下onboarding信息： 16-bit Vendor ID and 16-bit Product ID 12-bit device discriminator 27-bit setup passcode 8-bit Discovery Capabilities Bitmask 通过以上信息可以生成一下两种方式来配网（可以用NXP matter tool来生成）： 手动配对码（Manual Pairing Code） 二维码（QR Code） 如果上述配网流程成功，那么设备将得到如下信息： 由fabric ID(64bit)和node ID（64bit)组成的实例名 Node Operational Certificate(NOC) NOC对应的私钥 Access Control List 操作网络的其他信息 不同的node组成一个group，并用16bit的group id来标识 尝试 我用Esp-matter中example的light项目编译到C3上测试。串口是可以直接回车命令行交互的。输入matter help可以查看。 重要命令： matter ble adv start matter config matter onboardingcodes ble matter device factoryreset 设备不会一直在ble广播commissioning状态，过段时间会退出。 我是用NXP matter tool完成配网后，生成了一个QR码，然后再google home中扫描，然而google home提示必须有支持matter的hub才能控制，包括音箱（google home/mini, next mini, nest audio), 显示屏（nest hub 1代/2代/max), WLAN（nest wifi pro), 流媒体播放器(google tv streamer)。 使用matter device factoryreset后，我用ESP rainmaker home也配网成功，并且“雨作”配网可以自动发送ssid和密码过去（不知道是怎么获取的）。但是NXP就控制不了了。 根据AI的回复，matter优先使用ble配网，局域网控制，部分高级功能才会用到互联网。 并且从google home情况来看，matter可以适配各自的IOT生态，比如google home就要求购买支持matter的hub，而乐鑫和NXP可以直接加入控制。
多种新配网方式WIFI Easy connect(也叫Device Provisioning Protocol)， 乐鑫统一配网（Provisioning），matter测试
DPP WIFI Easy connect(也叫Device Provisioning Protocol)简称DPP，在idf的examples中有个dpp-enrollee目录就是示例。 乐鑫基本全系支持的。我在C3上试运行是可以的。会从串口打印出一个二维码。接下来就遇到问题了，据AI和乐鑫说，Android 10 以上都默认支持，可是我的手机是Android15（IQOO), 却找不到所说的扫码入口 官方文档 https://github.com/espressif/esp-idf/tree/fb14a3e7/examples/wifi/wifi_easy_connect/dpp-enrollee To run the example with an Android 10+ device follow below steps - Compile and flash the example on ESP device, a QR code will appear on your console. Connect your phone to the network, say named "Example-AP". Now go to Settings->WiFi & Internet->Wi-Fi->Example-AP->Advanced->Add Device. Scan QR Code using the scanner, which will make ESP device connect to Example-AP. 然后就此事问了谷歌ai。谷歌说，确实DPP的推广不利，在iOS上根本不被支持。而且苹果不支持WiFi联盟的配网协议，包括上一代配网协议WPS是老传统了。 所以这个网最后也没配起来。 从手机端向设备端传出WiFi信号，走的是专用的一个配网的信道，设备端监听，由手机端发送过去。似乎在二维码中会填写频段和信道，以供手机端发送。 乐鑫的统一配网Provisioning 同样，我在C3上运行起来了，也是通过串口打印了二维码。 通过乐鑫官方的APP ESP BLE Prov也成功配网了。另一个APP ESP Soft AP Prov应该是给没有蓝牙的设备用的。 真的，这个操作略显蛋疼，就是本来通过BluFi已经可以扫描到周围的设备了。统一配网却还需要额外的信道，也就是打印出来二维码，通过摄像头去扫描来传输信息。这整个过程对于生产来说也是很麻烦的。 唯一的好处就是之前我做培训的时候遇到的配网的问题，多个学员同时去做配网的话。配网的话，会扫出来太多的设备，不知道哪个是自己的。不过这种的话也同样可以解决，如果统一配网和DPP可以打印二维码，那我也可以打印，甚至我只需要打印出来MAC地址的尾号就可以。 乐鑫统一配网的示例还不在idf默认的examples里面，而是在 idf-extra-components中， 位置： https://github.com/espressif/idf-extra-components/tree/master/network_provisioning 所以还是不如BluFi好用。 matter 据某个AI说，matter也支持配网，所以想安装matter环境编译试一下。 然而esp-matter仅支持linux和macos， 我在WSL(Ubuntu 24.04)上安装测试，还要先装idf再装matter，安装matter到编译这一步的时候，就会导致wsl崩溃退出。 Done. Made 13083 targets from 819 files in 14765ms ninja: Entering directory /home/a/esp/esp-matter/connectedhomeip/connectedhomeip/out/host' [0/49] c++ obj/examples/common/tracing/commandline.TracingCommandLineArgument.cpp.oTerminated a@J:~/esp/esp-matter$ ninja: build stopped: interrupted by user. 发现是ninja使用了所有CPU内核和内存导致系统卡死被系统杀进程了。每个ninja编译线程占用1个CPU和约1.5~2G内存。如果内存不足，需要限制CPU的核心数。否则几个ninja线程之间抢内存和swap虚拟内存，最后一个都没编译。 在用户目录下修改.wslconfig`, 增加： [wsl2] processors=2 memory=6GB 就可以编译过了。 通过后又遇到ubuntu24不允许pip安装系统包的问题： Installing python dependencies for Matter Installing requirements from requirements.txt error: externally-managed-environment × This environment is externally managed ╰─> To install Python packages system-wide, try apt install python3-xyz, where xyz is the package you are trying to install. If you wish to install a non-Debian-packaged Python package, create a virtual environment using python3 -m venv path/to/venv. Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make sure you have python3-full installed. If you wish to install a non-Debian packaged Python application, it may be easiest to use pipx install xyz, which will manage a virtual environment for you. Make sure you have pipx installed. See /usr/share/doc/python3.12/README.venv for more information. google ai建议： 設定全域允許 pip 安裝（推薦）在終端機執行以下指令，為你的 Linux 用戶建立 pip 設定檔，允許覆蓋系統套件限制： ```bash mkdir -p ~/.config/pip echo -e "[global]\nbreak-system-packages = true" > ~/.config/pip/pip.conf git repo： https://github.com/espressif/esp-matter doc： https://docs.espressif.com/projects/esp-matter/en/latest/esp32/developing.html#host-setup 文档中确实示例了如何配网，并且演示了三种配网方式： Use chip-tool in interactive mode to commission the device: chip-tool interactive start pairing ble-wifi 0x7283 <ssid> <passphrase> 20202021 3840 In the above commands: 0x7283 is the randomly chosen node_id 20202021 is the setup_passcode 3840 is the discriminator Above method commissions the device using setup passcode and discriminator. Device can also be commissioned using manual pairing code or QR code. To Commission the device using manual pairing code 34970112332 pairing code-wifi 0x7283 <ssid> <passphrase> 34970112332 Above default manual pairing code contains following values: Version: 0 Custom flow: 0 (STANDARD) Discriminator: 3840 Passcode: 20202021 To commission the device using QR code MT:Y.K9042C00KA0648G00 pairing code-wifi 0x7283 <ssid> <passphrase> MT:Y.K9042C00KA0648G00
通过MCP实现长调用结果的多次流式返回
要求： 大模型请求1分钟内每10秒钟的温度，MCP server每10秒返回一次温度给大模型。 通过Server Notification的方式返回，MCP Server示例代码如下(这个任务千问3.6没有完成，让google ai完成的)： import asyncio import random from fastmcp import FastMCP, Context 初始化 FastMCP 服務，並為其命名 mcp = FastMCP("TemperatureStreamer") @mcp.tool() async def monitor_temperature(duration_seconds: int = 60, interval_seconds: int = 10, ctx: Context = None) -> str: """ 在指定的時間內，每隔固定秒數監測並返回一次環境溫度。 Args: duration_seconds: 總監測時長（秒），預設 60 秒 interval_seconds: 數據採集間隔（秒），預設 10 秒 """ # 計算總共需要採集幾次數據 total_steps = duration_seconds // interval_seconds temperatures_log = [] print(f"開始溫度監控任務：預計執行 {duration_seconds} 秒，每 {interval_seconds} 秒採集一次...") for step in range(1, total_steps + 1): # 模擬讀取硬體傳感器溫度 current_temp = round(random.uniform(22.0, 28.0), 2) temperatures_log.append(current_temp) # 構造本次採集的進度訊息 status_msg = f"第 {step * interval_seconds} 秒 - 當前實時溫度: {current_temp}°C" print(f"[Server Log] {status_msg}") # 【核心】如果客戶端支持並傳入了 Context，則通過 SSE 通道即時推送進度通知 if ctx: # report_progress 參數: (當前進度值, 總進度值, 附帶的文本訊息) await ctx.report_progress( progress=step, total=total_steps, message=status_msg ) # 異步等待下一次採集 if step < total_steps: await asyncio.sleep(interval_seconds) # 任務結束，返回最終的標準 Response avg_temp = round(sum(temperatures_log) / len(temperatures_log), 2) return f"【監控任務完成】共採集 {total_steps} 次數據。歷史溫度: {temperatures_log}。平均溫度: {avg_temp}°C" if name == "main": 以 sse 傳輸模式啟動服務，默認會掛載在 http://127.0.0 # 備註：新版 FastMCP 也支持 "http" (Streamable HTTP)，兩者在網路層皆可實現流式推送 mcp.run(transport="sse", host="127.0.0.1", port=8000) 在Inpector中，仍然是采用常规的tools调用方式，不同的是，每过10秒在右下角会出现`notifications/progress`的返回结果，例如： ```json { "method": "notifications/progress", "params": { "progress": 1, "total": 6, "message": "第 10 秒 - 當前實時溫度: 23.22°C" } } 在此期间，工具一直是Running状态，在60秒结束后，才会返回正常的结果。
这两天学习了一下YOLO，也就是You Only Look Once。学习这个模型的原因是GitHub上有一个激光打蚊子的项目，有不少的Star数目，就是用的这个模型。这个项目已经好多年没有更新了，使用的还是 YOLO v4 模型。 这个模型是快速的视频实时目标识别的模型，发展至今已经历了很多代。YOLOv4模型使用的是CNN框架，也就是卷积神经网络，基于一个叫做Darknet的神经网络实现。这个版本的模型还有比较多问题，第一，它是有锚框的，也就是Anchor-based，主要是增加了很多运算量，然后无法实时处理特别长或者扁的物体，另外就是只能进行目标识别，不能做其他的工作。第二是建立了NMS非极大值抑制的后处理方式，不要在一个物体上圈好多个框。 在后面的版本 V8 11，26这些版本中都增加了更多的功能，并且从C++转向了PyTorch，维护者也变成了ultralytics。首先就是取消了锚框，变成了无锚框的方式，其次除了目标识别，还增加了图片分类/实例分割（就是把目标抠图出来而不是只画个框）。其次还有多目标检测/姿态检测等。 YOLO26这是一个轻量化的版本，还取消了NMS，进一步降低运算量，使其可以在嵌入式设备上或者说是运算能力比较差的设备上运行。 YOLO模型有不同的规模，从小到大有nano/small/medium/large/extra large。 其中nano只有几兆大，extra large也不到300M，经过FP16或者INT8量化还能进一步降低体积和运算量。 YOLO模型的原始格式是.pt（pytorch），可以导出为不同的格式，最重要的是onnx，这个格式支持openCV中的dnn（深度神经网络）来调取，也支持在浏览器中/ios/android/react native/flutter中调取。最重要的一个项目是微软的https://github.com/microsoft/onnxruntime 跨平台项目，对多端调用提供了可能。 还支持tflite格式，是谷歌tensorflow的一种格式，官方维护了 https://github.com/tensorflow/tfjs 这个js库，支持node和浏览器等环境调用。在安卓手机上由特别的性能优化。 其他巨头也有自己的格式，如英伟达GPU上有TensorRT (.engine 或 .trt）格式，苹果手机上有CoreML (.mlpackage 或 .mlmodel) 格式，Intel有OpenVINO (_openvino_model/)，国产的瑞芯微也有rknn格式。 介绍下原始训练的模型格式，最重要的是pytorch保存的pt模型，以及pytorch延伸框架（如 PyTorch Lightning）的ckpt（checkpoint)模型。 这两种模型除了权重数据还打包了python代码，所以被认为是不安全的，后来huggingface等社区就推出了只有权重数据的safesensor模型，并且做了内存映射，加载更快。