मैं nRF9160 DK पर एक CoAP क्लाइंट विकसित कर रहा हूं, जो Zephyr RTOS चला रहा है। मुझे लंबे समय तक प्रॉक्सी-यूआरआई के साथ परेशानी हो रही है; लघु यूआरआई (268 वर्ण और नीचे) ठीक काम करते हैं और कोप संदेश अपेक्षित रूप से सर्वर तक पहुंचता है। हालांकि, लंबे समय तक प्रॉक्सी-यूआरआई (269 वर्ण और अधिक) वाले संदेश किसी कारण से विफल हो जाते हैं। उदाहरण के लिए, निम्नलिखित आरंभीकरण के साथ:

uint8_t tx_coap_buf[2048];
err = coap_packet_init(&request, tx_coap_buf, sizeof(tx_coap_buf), APP_COAP_VERSION, COAP_TYPE_CON, sizeof(next_token), (uint8_t *) &next_token, COAP_METHOD_POST, next_id);
if (err < 0) {
    LOG_DBG("Failed to create CoAP request, %d", err);
    return err;
}

नीचे (लघु) ठीक काम करता है

char * proxy_uri = "http://127.0.0.1:3000/abc/europe-xyz1/coap-abc/abc-device/publishEvent?jwt=eyJ0eXAiO";
ssize_t proxy_uri_len = strlen(proxy_uri);
err = coap_packet_append_option(&request, COAP_OPTION_PROXY_URI, proxy_uri, proxy_uri_len);
if (err < 0) {
    LOG_DBG("Failed to create CoAP request, %d", err);
    return err;
}

लेकिन यह एक (लंबा) नहीं है, भले ही गलती 0 के रूप में वापस आती है।

char * proxy_uri = "http://127.0.0.1:3000/abc/europe-xyz1/coap-abc/abc-device/publishEvent?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJhaXPocmlzIiwiaXNzJjoiYXV0aDAiLCJleHTiOjE2MDk0Nzc1NTUsImlhdCI6MTYwOTQ2Njc1MX2.RBs-SSa8x9VpyvBRw_EA2CUihgle5yGDJa8f2DUoGXe8d1Vah6bABILZuuyFQXcEg0Mh1BLn1p6qmbwb8BnsNg";
ssize_t proxy_uri_len = strlen(proxy_uri);
err = coap_packet_append_option(&request, COAP_OPTION_PROXY_URI, proxy_uri, proxy_uri_len);
if (err < 0) {
    LOG_DBG("Failed to create CoAP request, %d", err);
    return err;
}

...और जब मैं Wireshark का उपयोग करके CoAP संदेश का निरीक्षण करता हूं, तो Proxy-URI विकल्प में चेतावनी होती है: विशेषज्ञ जानकारी (चेतावनी/विकृत): पैकेज से अधिक लंबा विकल्प

मैंने अतिरिक्त Zephyr CoAP कॉन्फ़िगरेशन को निम्नानुसार सेट करने का प्रयास किया

CONFIG_COAP_EXTENDED_OPTIONS_LEN=y
CONFIG_COAP_EXTENDED_OPTIONS_LEN_VALUE=800

...लेकिन कोई किस्मत नहीं थी।

क्या किसी को पता चलेगा कि मुझे क्या याद आ रहा है? क्या कोई CoAP कॉन्फिग है जिसका डिफ़ॉल्ट मान मुझे ओवरराइड करने की आवश्यकता है ताकि लंबे समय तक प्रॉक्सी-यूआरआई विकल्पों को समायोजित किया जा सके?

धन्यवाद।

0
Michael-7 8 जिंदा 2021, 05:18

3 जवाब

सबसे बढ़िया उत्तर

समझ गया! संस्करण 1.4.1, coap.c, लाइन 221, "len_size" के बजाय "delta_size" का उपयोग करता है।

if (len_size == 1U) {
    res = append_u8(cpkt, (uint8_t)len_ext);
    if (!res) {
        return -EINVAL;
    }
} else if (delta_size == 2U) {
    res = append_be16(cpkt, len_ext);
    if (!res) {
        return -EINVAL;
    }
}

मैं इसे फोरम में आपके प्रश्न में जोड़ता हूं।

और https://github.com/zephyrproject-rtos/zephyr/issues/31206

2
Achim Kraus 10 जिंदा 2021, 13:29

सीमा २६८/२६९ दहलीज है, जहां विकल्प की लंबाई १/२ बाइट्स के साथ एन्कोडेड है। हो सकता है, यह वहां इस्तेमाल की गई लाइब्रेरी में ऐसे "बड़े विकल्प" के साथ सिर्फ एक बग है।

जैसे प्रयोग (यह उस ट्यूटोरियल में आपके द्वारा उपयोग किए गए प्रॉक्सी के साथ अंततः काम नहीं करता है), COAP_OPTION_PROXY_SCHEME (http) के संयोजन "विशाल" COAP_OPTION_PROXY_URI के बजाय उपयोग करने का प्रयास करें और शेष url को COAP_OPTION_URI_HOST, COAP_OPTION_OPTION_QUI_PATH, COAP_OPTION_OPTION_QUI_PATH, COAP_OPTION_OPTION_URI_PATH में विभाजित करें। . इसके परिणामस्वरूप 269 (उम्मीद है) से छोटे विकल्प होने चाहिए। इसके साथ, जांचें कि वायरशार्क क्या प्रदर्शित करता है। यदि वायरशर्क ठीक है, तो उस संकेत को नॉर्डिक फ़ोरम में प्रश्न में विकल्प लंबाई के साथ जोड़ें। यदि आपको अभी भी वहां कोई उत्तर नहीं मिलता है, तो कृपया एक्लिप्स/कैलिफ़ोर्निया में एक समस्या खोलें और मैं देखूंगा कि उस ट्यूटोरियल के क्लाउड एपीआई के लिए काम करने के लिए वर्तमान प्रॉक्सी 2 कार्यान्वयन के लिए क्या आवश्यक होगा।

(नोट: URI "http://127.0.0.1:3000/abc/europe-xyz1/coap-abc/abc-device/publishEvent?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJhaXPocmlzIiwiaXNzJjoiYXV0aDAiLCJleHTiOjE2MDk0Nzc1NTUsImlhdCI6MTYwOTQ2Njc1MX2.RBs-SSa8x9VpyvBRw_EA2CUihgle5yGDJa8f2DUoGXe8d1Vah6bABILZuuyFQXcEg0Mh1BLn1p6qmbwb8BnsNg" तो हो जाएगा:

COAP_OPTION_PROXY_SCHEME=http
COAP_OPTION_URI_HOST=127.0.0.1
COAP_OPTION_URI_PORT=3000
COAP_OPTION_URI_PATH=abc
COAP_OPTION_URI_PATH=europe-xyz1
COAP_OPTION_URI_PATH=coap-abc
COAP_OPTION_URI_PATH=abc-device
COAP_OPTION_URI_PATH=publishEvent
COAP_OPTION_URI_QUERY=jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJhaXPocmlzIiwiaXNzJjoiYXV0aDAiLCJleHTiOjE2MDk0Nzc1NTUsImlhdCI6MTYwOTQ2Njc1MX2.RBs-SSa8x9VpyvBRw_EA2CUihgle5yGDJa8f2DUoGXe8d1Vah6bABILZuuyFQXcEg0Mh1BLn1p6qmbwb8BnsNg

)

2
Achim Kraus 9 जिंदा 2021, 18:50

CoAP संदेश आम तौर पर अनुप्रयोग के बफ़र द्वारा आकार में सीमित होते हैं, और व्यावहारिक रूप से एक MTU तक सीमित होते हैं (क्योंकि IP विखंडन का उपयोग CoAP के साथ शायद ही कभी किया जाता है)। संदेश के पेलोड के विपरीत, एक विकल्प को ब्लॉक-वार स्थानांतरण का उपयोग करके कई संदेशों में विभाजित नहीं किया जा सकता है। Zephyr की ओर, त्रुटि पर किसी का ध्यान नहीं गया क्योंकि आपने coap_packet_append_option परिणाम कोड को छोड़ दिया था।

इस यूआरआई के ठोस मामले के लिए, आप एक बड़े संदेश बफर का उपयोग करके सीमा के आसपास काम कर सकते हैं (यह कैसे किया जाता है इस पर निर्भर करता है कि आपने request को पहली जगह कैसे शुरू किया)।


ध्यान दें कि प्रमाणीकरण उद्देश्यों के लिए यूआरआई में एक जेडब्ल्यूटी परिवहन करना यह नहीं है कि आमतौर पर सीओएपी अनुप्रयोगों में प्रमाणीकरण कैसे किया जाता है। यदि आपका HTTP सर्वर CWTs के बजाय TLS क्लाइंट प्रमाणपत्र स्वीकार करता है, तो आप एक उपयुक्त क्लाइंट प्रमाणपत्र के साथ प्रॉक्सी का प्रावधान करने पर विचार कर सकते हैं (जब CoAP क्लाइंट को ठीक से प्रमाणित किया जाता है, उदाहरण के लिए DTLS या OSCORE का उपयोग करके), और फिर केवल लगभग उचित रूप से उपयोग करें टोकन रहित पथ का आकार।


[प्रश्न स्पष्टीकरण के बाद संपादित करें]

त्रुटियों की कमी Zephyr कोड में एक दोष को इंगित करती है, या तो Zephyr स्वयं या कंक्रीट नेटवर्क इंटरफ़ेस का उपयोग किया जाता है (जो कि OS को बताए बिना आउटगोइंग संदेशों को चुपचाप नहीं काटना चाहिए), और Zephyr इश्यू ट्रैकर के अंदर सबसे अच्छा संबोधित किया जाएगा।

0
chrysn 9 जिंदा 2021, 13:26