技术栈:STM32F407 标准库 · DX-BT24 BLE · ESP8266 AT · 华为云 IoTDA · 微信小程序 Vibe Coding(WorkBuddy / QClaw · GLM-4)
模拟配网流程 · 环境监控 · 远程控制 · 可交互操作
typedef enum { BT_IDLE, WAIT_WIFI_INFO, PARSING, CONFIG_ESP, BT_DONE } BT_State;
typedef enum { WORK_IDLE, MQTT_CONNECT, SUBSCRIBING, RUNNING } Work_State;
BT_State bt_state = BT_IDLE;
Work_State work_state = WORK_IDLE;
void Main_FSM_Tick(void) { // 在 while(1) 中每 10ms 调用一次
uint32_t now = SysTick_GetMs();
/* ── 配网状态机 ── */
switch (bt_state) {
case WAIT_WIFI_INFO:
if (UART1_HasNewFrame()) { bt_state = PARSING; }
break;
case PARSING:
if (Parse_WifiFrame(rx_buf, ssid, pwd)) {
bt_state = CONFIG_ESP;
}
break;
case CONFIG_ESP:
if (ESP_SendAT("AT+CWJAP", ssid, pwd, now)) {
bt_state = BT_DONE;
work_state = WORK_IDLE; // 触发工作状态机
}
break;
default: break;
}
/* ── 工作状态机 ── */
if (bt_state == BT_DONE) {
switch (work_state) {
case WORK_IDLE: work_state = MQTT_CONNECT; break;
case MQTT_CONNECT:
if (MQTT_Connect(now)) { work_state = SUBSCRIBING; }
break;
case RUNNING:
if (now - last_pub > 5000) { MQTT_Publish_Data(); last_pub = now; }
MQTT_Handle_Incoming();
break;
default: break;
}
}
}
你是微信小程序开发专家,使用原生 JS(不用 TypeScript)。
帮我实现一个蓝牙搜索页面,要求如下:
【功能要求】
1. 页面加载时(onLoad)调用 wx.openBluetoothAdapter 初始化蓝牙
2. 点击"搜索"按钮:调用 wx.startBluetoothDevicesDiscovery({allowDuplicatesKey: false})
监听 wx.onBluetoothDeviceFound,将每个发现的设备追加进 data.devices 数组
设备对象结构:{ deviceId, name, RSSI },name 为空时显示"未知设备"
3. 点击"停止"按钮:调用 wx.stopBluetoothDevicesDiscovery
4. 点击列表中某个设备:将 deviceId 和 name 存入 app.globalData,
跳转到连接页面 /pages/connect/connect
5. 页面销毁(onUnload)时必须调用 wx.closeBluetoothAdapter
【代码规范】
- 所有微信异步 API 使用 Promise 封装(success/fail 都处理)
- 不使用 async/await
- wx.showToast 显示错误信息
- 设备列表用 wx-open-data 或普通 view 渲染即可
【输出格式】
输出完整可运行的 4 个文件(不省略任何代码):
index.js / index.wxml / index.wxss / index.json
最后列出"需要人工验证的3个关键点"
在上一步的基础上,继续完成连接页面 /pages/connect/connect,要求:
【上下文】
- app.globalData.deviceId 已存有目标设备 ID(DX-BT24 BLE 模块)
- app.globalData.deviceName 已存有设备名
【功能要求】
1. 页面加载时自动开始连接流程(严格按以下顺序,每步成功才执行下一步):
① wx.createBLEConnection({ deviceId })
② wx.getBLEDeviceServices({ deviceId })
取第一个 serviceId 存入 globalData.serviceId
③ wx.getBLEDeviceCharacteristics({ deviceId, serviceId })
找出 properties.write == true 的 characteristicId
存入 globalData.characteristicId
④ 连接成功后显示"已连接"状态,并自动发送测试字节 [0x41, 0x42, 0x43]
2. 封装函数 sendBytes(uint8Array):
- 参数为 Uint8Array
- 内部将 Uint8Array 转为 ArrayBuffer
- 调用 wx.writeBLECharacteristicValue
- 返回 Promise
3. UI 状态显示:
连接中(转圈)→ 已连接(绿点)→ 发送成功(✓)→ 失败(红叉+错误信息)
【代码规范】
- 全部使用 Promise.then 链(禁止 async/await)
- 每个步骤失败均 wx.showToast 提示
- 输出完整可运行代码,不省略
最后列出"需要人工验证的3个关键点"
在前两步的基础上,在 connect 页面底部添加配网区域,要求:
【上下文】
- globalData.deviceId / serviceId / characteristicId 已就绪
- sendBytes(uint8Array) 函数已封装完毕
【功能要求】
1. 配网表单:
- SSID 输入框(placeholder: "WiFi 名称")
- 密码输入框(type="password",右侧有"显示/隐藏"切换按钮)
- "发送配网指令"按钮
2. 点击按钮时:
① 验证 SSID 和密码不为空,否则 showToast 提示
② 拼接字符串:`$WIFI:${ssid},${password}#`
③ 用 TextEncoder().encode() 转为 Uint8Array
④ 调用 sendBytes 发送
⑤ 发送后按钮置灰,显示"等待 STM32 确认..."
⑥ 调用 wx.notifyBLECharacteristicValueChange 监听 notify
若3秒内收到包含 0xAA 的数据,显示"✅ 配网成功!"
超过3秒未收到,显示"⏱ 超时,请重试"并恢复按钮
3. 配网成功后,在 globalData 中设置 isProvisioned = true
底部显示"前往控制台"按钮,跳转到 /pages/dashboard/dashboard
【代码规范】
- 全部 Promise.then 链
- ArrayBuffer 与 Uint8Array 转换必须正确
- 输出完整可运行代码,不省略
最后列出"需要人工验证的3个关键点"
帮我实现微信小程序的 dashboard 页面,通过华为云 IoTDA 的 MQTT 接收传感器数据
并发送控制指令,要求:
【华为云 MQTT 配置】
- Broker: ${YOUR_IOTDA_ENDPOINT}:1883
- ClientId / Username / Password: 来自华为云设备三元组
- 上行 Topic: $oc/devices/{deviceId}/sys/messages/up
- 下行 Topic: $oc/devices/{deviceId}/sys/messages/down
【功能要求】
1. 页面加载时用 wx.connectSocket 建立 MQTT over WebSocket 连接
连接成功后订阅下行 Topic
2. 收到下行消息时:
解析 payload 字符串,格式为 "$DATA:T=xx.x,H=xx,R=x#"
更新页面:温度数值、湿度数值、继电器状态
3. 继电器开关(toggle 组件):
用户拨动时,构造字符串 "$CMD:RELAY=x#" 通过 wx.sendSocketMessage 发送
同时乐观更新 UI
4. 连接状态指示:顶部圆点绿/红色
【代码规范】
- 不使用第三方 MQTT 库,用原生 WebSocket
- 处理断线重连(3次重试,间隔5秒)
- 页面销毁时 wx.closeSocket
- 输出完整可运行代码
最后列出"需要人工验证的3个关键点"