ESP32 和 Node 客户端上的 CoAP 服务器

CoAP server on ESP32 and Node client

我正在尝试用 ESP32 和一些传感器构建一个系统。我使用 this 库在 ESP32 上创建了 CoAP 服务器。我用 mint 上的 coap-client 和安装在 chrome 上的 copper 测试了服务器,在这两种情况下,GET 都获得了我所期望的。 当尝试按照示例使用 this lilbrary 调用 GET 时,请求到达服务器,但节点位似乎没有收到任何响应。 这是节点位

const req = coap.request('coap://192.168.1.229/sensor/info')

req.on('response', (res) => {
    res.pipe(process.stdout)
    res.on('end', () => {
    process.exit(0)
    })
})
req.end()

基本上就是示例,这是 GET

的 ESP32 回调
void callback_coap_info(CoapPacket &packet, IPAddress ip, int port){
    Serial.println("Coap request in info");
    coap.sendResponse(ip, port, packet.messageid, buffer_id);
}

buffer_id 是在 JSON 中格式化的响应,从 coap-client 看起来像 json response.

编辑:我被要求提供一个捕获,所以这里有一个 wireshark capture 用于我的 ESP32 的 IP。前两行是使用 libCOAP 创建的请求(与另一个屏幕中使用的相同)和对此的响应,而其他行是使用上面发布的 coap 请求创建的。在我看来,ESP32 收到了请求,而答案与 libCOAP 中收到的类似。

好吧,Achim Kraus 让我进行数据包捕获,实际上帮助了我很多。分析用 js 位发送的请求,可以看到正在使用的字段令牌,我在发回答案时没有考虑到这一点。 我更新了 ESP 中的回调,现在代码看起来像这样

void callback_coap_info(CoapPacket &packet, IPAddress ip, int port){
    Serial.println("Coap request in info");
    coap.sendResponse(ip, port, packet.messageid, buffer_temp_hum, 
        strlen(buffer_temp_hum), COAP_CONTENT, COAP_TEXT_PLAIN, 
        packet.token, packet.tokenlen);
}

库有不同版本的 sendResponse,在这种情况下需要的是设置了所有可能字段的版本,可以在其中指定令牌。这现在适用于 libCOAP 和提供的 js 代码。 非常感谢您提供捕获数据包的想法。