Web Bluetooth向ESP32发送WiFi凭证时JSON无效问题求助
Web Bluetooth向ESP32 BLE设备发送WiFi凭证时JSON解析失败问题
尝试通过Web Bluetooth向Olimex ESP32-WROOM-32F BLE设备发送WiFi凭证,无论调整JSON结构(如{ssid:'',pass:''}等多种格式)、使用writeValue/writeValueWithResponse/writeValueWithoutResponse任一写入方法,设备始终返回“Received invalid JSON”错误。
Web Bluetooth代码
const connectToDeviceAndSubscribeToUpdates = async () => { const device = await navigator.bluetooth.requestDevice({ // filers: ["ESP32-E89F6DD0DF34"], acceptAllDevices: true, optionalServices: ["0000aaaa-ead2-11e7-80c1-9a214cf093ae"], }); let server = await device.gatt.connect(); const service = await server.getPrimaryService( "0000aaaa-ead2-11e7-80c1-9a214cf093ae" ); let characteristic = await service.getCharacteristic( "00005555-ead2-11e7-80c1-9a214cf093ae" ); console.log(characteristic); var thing = await characteristic.readValue(); var encoder = new TextEncoderStream(); let data = { ssidPrim: "", pwPrim: "", ssidSec: "", pwSec: "" }; await characteristic.writeValueWithoutResponse( encoder.encode(JSON.stringify(data)) ); console.log(response); }; document.getElementById("connect").addEventListener("click", (e) => { connectToDeviceAndSubscribeToUpdates(); });
Windows PowerShell串口读取脚本
function read-com { $port= new-Object System.IO.Ports.SerialPort COM8,115200,None,8,one $port.Open() do { $line = $port.ReadLine() Write-Host $line } while ($port.IsOpen) }
设备串口日志
ets Jul 29 2019 12:21:46 rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:1 load:0x3fff0030,len:1344 load:0x40078000,len:13836 load:0x40080400,len:3608 entry 0x400805f0 Build: Feb 22 2023 22:32:28 Read from preferences: primary SSID: hhhh password: hhhh secondary SSID: eeee password: tttttttt BLE advertising using ESP32-E89F6DD0DF34 Start scanning for networks Found AP: UPC1690653 RSSI: -42 Found AP: UPC5088637 RSSI: -71 Found AP: Wi-Free #InternetUPCNajszybszy RSSI: -71 Found AP: UPC1690653_EXT RSSI: -73 Found AP: UPC3006601 RSSI: -77 Found AP: Wi-Free #InternetUPCNajszybszy RSSI: -77 Found AP: UPC244036972 RSSI: -83 Found AP: Wi-Free #InternetUPCNajszybszy RSSI: -85 Found AP: UPC4415581 RSSI: -85 Found AP: UPCA1C5DBA RSSI: -86 Found AP: NETIASPOT-72E0C0 RSSI: -86 Found AP: Wi-Free #InternetUPCNajszybszy RSSI: -87 Found AP: UPC1369909 RSSI: -88 Found AP: UPC1176318 RSSI: -90 Found AP: Apartamentowiec Bonczyka_25 RSSI: -91 Found AP: Wi-Free #InternetUPCNajszybszy RSSI: -91 Found AP: [air purifier]_E30AJT1003236X RSSI: -95 Found AP: Wi-Free #InternetUPCNajszybszy RSSI: -95 Found AP: UPC245739629 RSSI: -95 Found AP: UPC5562094 RSSI: -97 Found AP: Wi-Free #InternetUPCNajszybszy RSSI: -97 Could not find any AP ################################## Internal Total heap 258752, internal Free Heap 151220 SPIRam Total heap 0, SPIRam Free Heap 0 ChipRevision 3, Cpu Freq 240, SDK Version v4.4.3 Flash Size 4194304, Flash Speed 80000000 ################################## BLE client connected BLE onRead request Stored settings: {"ssidPrim":"hhhh","pwPrim":"hhhh","ssidSec":"eeee","pwSec":"tttttttt"} BLE client disconnected BLE client connected BLE onRead request Stored settings: {"ssidPrim":"hhhh","pwPrim":"hhhh","ssidSec":"eeee","pwSec":"tttttttt"} Received over BLE: {"information":{"ssidPrim":"UPC1690653","pwPrim":"******"}} Received invalid JSON
排查思路
- 匹配ESP32端期望的JSON结构:从日志看设备存储的格式是顶层直接包含
ssidPrim等字段,但收到的是嵌套在information对象中的JSON,确认ESP32端是否要求非嵌套的结构。 - 更换编码方式:用
TextEncoder替代TextEncoderStream,避免流处理可能导致的数据分段,代码改为new TextEncoder().encode(JSON.stringify(data))。 - 启用带响应的写入:使用
writeValueWithResponse,确保设备完整接收数据后返回确认,排查无响应模式下的数据丢失问题。 - 验证发送的JSON字符串:在发送前用
console.log(JSON.stringify(data))输出,确认生成的JSON语法完全合规(键和值均用双引号,无语法错误)。 - 检查ESP32端的BLE接收逻辑:
- 确认BLE特征的MTU值,若JSON长度超过MTU,需在ESP32端实现分段数据拼接逻辑,确保完整接收后再解析。
- 检查ESP32端的JSON解析代码,是否在解析前去除了多余的空白字符或控制字符(如换行、回车)。
内容的提问来源于stack exchange,提问作者adam
相关产品推荐
相关产品推荐

