This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LAUNCHXL-CC26X2R1:停止发送 CoAP 消息

Guru**** 2459220 points
Other Parts Discussed in Thread: CC1352P, CC2652R7

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1276506/launchxl-cc26x2r1-coap-messages-are-stopped-sending

器件型号:LAUNCHXL-CC26X2R1
主题中讨论的其他器件:CC2652R7CC1352P

大家好、我在这个问题上花了很长时间。 从头开始设置 OTBR。 我将设备连接到网络,有一段时间一切正常,但经过一段时间后,发送 POST 消息停止。 GET 将继续处理、但 POST 不会。 我已经晕头转向、不知道该深入研究什么以及看什么。 我非常希望社区的帮助。 我将随附 oubr 日志以及来自 ubiqua 的软件包日志和固件本身的代码。 事实上、固件是一个转换型温度传感器示例、

#include <assert.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <openthread/coap.h>
#include <openthread/ip6.h>
#include <openthread/link.h>
#include <openthread/thread.h>
#include <utils/uart.h>
#include <sched.h>
#include <pthread.h>
#include <mqueue.h>
#include <ti/drivers/GPIO.h>
#include <ti/drivers/apps/LED.h>
#include <ti/drivers/apps/Button.h>
#include <ti/display/Display.h>
#include <ti/drivers/Watchdog.h>
#include "otsupport/otrtosapi.h"
#include "otsupport/otinstance.h"
#include "ti_drivers_config.h"
#include "tempsensor.h"
#include "utils/code_utils.h"
#include "otstack.h"
#include "task_config.h"
#include "tiop_config.h"
#include "I2cSensor.h"
#include "disp_utils.h"

Watchdog_Handle watchdogHandle;
#define TIMEOUT_MS 30000

#define TIOP_TEMPSENSOR_REPORTING_INTERVAL 10000


#define DEFAULT_COAP_HEADER_TOKEN_LEN      2


#define TEMPSENSOR_PROC_QUEUE_MAX_MSG     (11)

struct TempSensor_procQueueMsg {
    TempSensor_evt evt;
};


static timer_t reportTimerID;

static otIp6Address multicastAddress;

static otIp6Address reportingAddress;

static char eui64[20] = {'\0'};

static uint16_t peerPort = OT_DEFAULT_COAP_PORT;

const char TempSensor_procQueueName[] = "ts_process";
static mqd_t TempSensor_procQueueDesc;

static char stack[TASK_CONFIG_TEMPSENSOR_TASK_STACK_SIZE];

static char data[40] = {'\0'};

static bool serverSetup;

//FROM CUI
void updateLedsWithChangeRole(otDeviceRole role);
static LED_Handle redLedHandle;
static LED_Handle greenLedHandle;
static Button_Handle rightButtonHandle;

static void *TempSensor_task(void *arg0);

static void reportingTimeoutCB(union sigval val);

static void configureReportingTimer(void) {
    struct sigevent event = {
            .sigev_notify_function = reportingTimeoutCB,
            .sigev_notify          = SIGEV_SIGNAL,
    };

    timer_create(CLOCK_MONOTONIC, &event, &reportTimerID);
}

static void startReportingTimer(uint32_t timeout) {
    struct itimerspec newTime = {0};
    struct itimerspec zeroTime = {0};
    struct itimerspec currTime;
    newTime.it_value.tv_sec = (timeout / 1000U);
    newTime.it_value.tv_nsec = ((timeout % 1000U) * 1000000U);
    timer_gettime(reportTimerID, &currTime);
    if ((currTime.it_value.tv_sec != 0) || (currTime.it_value.tv_nsec != 0)) {
        timer_settime(reportTimerID, 0, &zeroTime, NULL);
    }
    timer_settime(reportTimerID, 0, &newTime, NULL);
}

static void reportingTimeoutCB(union sigval val) {
    TempSensor_postEvt(TempSensor_evtReportTemp);
    (void) val;
}

void myServerIpHandler(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo, otError aResult) {
    DISPUTILS_SERIALPRINTF(0, 0, "request handler called\n");
    if(data[0] == '\0'){
        uint16_t offset = otMessageGetOffset(aMessage);
        uint16_t read = otMessageRead(aMessage, offset, data, 40 - 1);
        data[read] = '\0';
    DISPUTILS_SERIALPRINTF(0, 0, "server ip setted ip: %s\n", data);
    }
}

static void tempSensorReport(void) {


    otError error = OT_ERROR_NONE;
    otMessage *requestMessage = NULL;
    otMessageInfo messageInfo;
    otMessageInfo putMessageInfo;
    otInstance *instance = OtInstance_get();

    DISPUTILS_SERIALPRINTF(0, 0, "start reporting function first symbol ip: %c\n", data[0]);
    if(data[0] == '\0'){
        DISPUTILS_SERIALPRINTF(0, 0, "Starting request server IP\n");
        otExtAddress extAddress;
        OtRtosApi_lock();
        otLinkGetFactoryAssignedIeeeEui64(OtInstance_get(), &extAddress);
        OtRtosApi_unlock();
        sprintf(eui64, "0x%02x%02x%02x%02x%02x%02x%02x%02x",
                extAddress.m8[0], extAddress.m8[1], extAddress.m8[2],
                extAddress.m8[3], extAddress.m8[4], extAddress.m8[5],
                extAddress.m8[6], extAddress.m8[7]);
        eui64[19] = '\0';
        OtRtosApi_lock();
        requestMessage = otCoapNewMessage(instance, NULL);
        otEXPECT_ACTION(requestMessage != NULL, error = OT_ERROR_NO_BUFS);
        otCoapMessageInit(requestMessage, OT_COAP_TYPE_NON_CONFIRMABLE, OT_COAP_CODE_GET);
        otCoapMessageGenerateToken(requestMessage, DEFAULT_COAP_HEADER_TOKEN_LEN);
        error = otCoapMessageAppendUriPathOptions(requestMessage,
                                                  GET_SERVER_IP_URI);
        OtRtosApi_unlock();
        otEXPECT(OT_ERROR_NONE == error);
        OtRtosApi_lock();
        otCoapMessageSetPayloadMarker(requestMessage);
        OtRtosApi_unlock();
        OtRtosApi_lock();
        error = otMessageAppend(requestMessage, eui64,
                                strlen(eui64));
        OtRtosApi_unlock();
        memset(&messageInfo, 0, sizeof(messageInfo));
        OtRtosApi_lock();
        otIp6AddressFromString("FF03::2", &multicastAddress);
        OtRtosApi_unlock();
        messageInfo.mPeerAddr = multicastAddress;
        messageInfo.mPeerPort = peerPort;

        OtRtosApi_lock();
        error = otCoapSendRequest(instance, requestMessage, &messageInfo, &myServerIpHandler,
                                  NULL);
        DISPUTILS_SERIALPRINTF(0, 0, "IP requested\n");
        OtRtosApi_unlock();
    } else {
        DISPUTILS_SERIALPRINTF(0, 0, "Starting sending report\n");
        float temperatureValue = 0.0;
        float humidityValue = 0.0;
        Watchdog_clear(watchdogHandle);
        DISPUTILS_SERIALPRINTF(0, 0, "watchdog restarted\n");
//        getTemperature(&temperatureValue);
//        getHumidity(&humidityValue);
        DISPUTILS_SERIALPRINTF(0, 0, "readed values t: %2.1f, h: %2.0f\n", temperatureValue, humidityValue);
        OtRtosApi_lock();
        requestMessage = otCoapNewMessage(instance, NULL);
        otEXPECT_ACTION(requestMessage != NULL, error = OT_ERROR_NO_BUFS);
        otCoapMessageInit(requestMessage, OT_COAP_TYPE_NON_CONFIRMABLE, OT_COAP_CODE_POST);
        otCoapMessageGenerateToken(requestMessage, DEFAULT_COAP_HEADER_TOKEN_LEN);
        error = otCoapMessageAppendUriPathOptions(requestMessage,
                                                  PUT_SENSOR_DATA_URI);
        OtRtosApi_unlock();
        OtRtosApi_lock();
        otIp6AddressFromString(data, &reportingAddress);
        OtRtosApi_unlock();
        OtRtosApi_lock();
        otCoapMessageSetPayloadMarker(requestMessage);
        OtRtosApi_unlock();

        char str[200] = {'\0'};
        sprintf(str, "{\"eui64\":\"%s\", \"params\": [{\"name\": \"TEMPERATURE\", \"value\": %2.1f}, {\"name\":\"HUMIDITY\", \"value\": %2.0f}]}",
                eui64, temperatureValue, humidityValue);

        OtRtosApi_lock();
        error = otMessageAppend(requestMessage, str,
                                strlen(str));
        OtRtosApi_unlock();
        memset(&putMessageInfo, 0, sizeof(putMessageInfo));
        putMessageInfo.mPeerAddr = reportingAddress;
        putMessageInfo.mPeerPort = peerPort;
        OtRtosApi_lock();
        error = otCoapSendRequest(instance, requestMessage, &putMessageInfo, NULL,
                                  NULL);
        OtRtosApi_unlock();
        char ip[40];
        OtRtosApi_lock();
        otIp6AddressToString(&reportingAddress, ip, 40);
        OtRtosApi_unlock();
        DISPUTILS_SERIALPRINTF(0, 0, "Data sended. data: %s, ip: %s:\n", eui64, ip);
    }
    startReportingTimer(TIOP_TEMPSENSOR_REPORTING_INTERVAL);
    exit:
    if (error != OT_ERROR_NONE && requestMessage != NULL) {
        OtRtosApi_lock();
        otMessageFree(requestMessage);
        OtRtosApi_unlock();
    }
}

static otError setupCoap(otInstance *aInstance) {
    otError error = OT_ERROR_NONE;
    OtRtosApi_lock();
    error = otCoapStart(aInstance, OT_DEFAULT_COAP_PORT);
    OtRtosApi_unlock();
    otEXPECT(OT_ERROR_NONE == error);
    exit:
    return error;
}

static void processOtStackEvents(uint8_t event, void *aContext) {
    (void) aContext;
    switch (event) {
        case OT_STACK_EVENT_NWK_JOINED: {
            TempSensor_postEvt(TempSensor_evtNwkJoined);
            break;
        }
        case OT_STACK_EVENT_NWK_JOINED_FAILURE: {
            TempSensor_postEvt(TempSensor_evtNwkJoinFailure);
            break;
        }
        case OT_STACK_EVENT_NWK_DATA_CHANGED: {
            TempSensor_postEvt(TempSensor_evtNwkSetup);
            break;
        }
        case OT_STACK_EVENT_DEV_ROLE_CHANGED: {
            TempSensor_postEvt(TempSensor_evtDevRoleChanged);
            break;
        }
        default: {
            break;
        }
    }
}

static void processEvent(TempSensor_evt event) {
    switch (event) {
        case TempSensor_evtReportTemp: {
            tempSensorReport();
            break;
        }
        case TempSensor_evtNwkSetup: {
            if (false == serverSetup) {
                serverSetup = true;
                (void) setupCoap(OtInstance_get());
                TempSensor_postEvt(TempSensor_evtAddressValid);
            }
            break;
        }
        case TempSensor_evtKeyRight: {
            if ((!otDatasetIsCommissioned(OtInstance_get())) &&
                (OtStack_joinState() != OT_STACK_EVENT_NWK_JOIN_IN_PROGRESS)) {
                DISPUTILS_SERIALPRINTF(0, 0, "Joining Nwk ...\n");

                OtStack_joinConfiguredNetwork();
            }
            break;
        }
        case TempSensor_evtNwkJoined: {
            DISPUTILS_SERIALPRINTF(0, 0, "Joinied Nwk\n");
            (void) OtStack_setupNetwork();
            break;
        }
        case TempSensor_evtNwkJoinFailure: {
            DISPUTILS_SERIALPRINTF(0, 0, "Join Failure\n");
            break;
        }
        case TempSensor_evtAddressValid: {
            startReportingTimer(TIOP_TEMPSENSOR_REPORTING_INTERVAL);
            break;
        }
        case TempSensor_evtDevRoleChanged: {
            OtRtosApi_lock();
            otDeviceRole role = otThreadGetDeviceRole(OtInstance_get());
            OtRtosApi_unlock();
            updateLedsWithChangeRole(role);
            break;
        }
        default: {
            break;
        }
    }
}


void otPlatUartReceived(const uint8_t *aBuf, uint16_t aBufLength) {
    (void) aBuf;
    (void) aBufLength;
}

void otPlatUartSendDone(void) {

}

void TempSensor_postEvt(TempSensor_evt event) {
    struct TempSensor_procQueueMsg msg;
    int ret;
    msg.evt = event;
    ret = mq_send(TempSensor_procQueueDesc, (const char *) &msg, sizeof(msg), 0);
    assert(0 == ret);
    (void) ret;
}

void TempSensor_taskCreate(void) {
    pthread_t thread;
    pthread_attr_t pAttrs;
    struct sched_param priParam;
    int retc;
    retc = pthread_attr_init(&pAttrs);
    assert(retc == 0);
    retc = pthread_attr_setdetachstate(&pAttrs, PTHREAD_CREATE_DETACHED);
    assert(retc == 0);
    priParam.sched_priority = TASK_CONFIG_TEMPSENSOR_TASK_PRIORITY;
    retc = pthread_attr_setschedparam(&pAttrs, &priParam);
    assert(retc == 0);
    retc = pthread_attr_setstack(&pAttrs, (void *) stack,
                                 TASK_CONFIG_TEMPSENSOR_TASK_STACK_SIZE);
    assert(retc == 0);
    retc = pthread_create(&thread, &pAttrs, TempSensor_task, NULL);
    assert(retc == 0);
    retc = pthread_attr_destroy(&pAttrs);
    assert(retc == 0);
    (void) retc;
}

void processKeyChangeCB(Button_Handle _buttonHandle, Button_EventMask _buttonEvents) {
    if (_buttonHandle == rightButtonHandle && _buttonEvents & Button_EV_CLICKED) {
        TempSensor_postEvt(TempSensor_evtKeyRight);
    }
}

void initButtonsAndLeds() {
    Button_Params bparams;
    LED_Params ledParams;
    Button_Params_init(&bparams);
    bparams.buttonEventMask = Button_EV_CLICKED;
    rightButtonHandle = Button_open(CONFIG_BTN_RIGHT, &bparams);
    if (!GPIO_read(((Button_HWAttrs *) rightButtonHandle->hwAttrs)->gpioIndex)) {
        OtRtosApi_lock();
        otInstanceFactoryReset(OtInstance_get());
        OtRtosApi_unlock();
    }
    Button_setCallback(rightButtonHandle, processKeyChangeCB);
    greenLedHandle = LED_open(CONFIG_LED_GREEN, &ledParams);
    redLedHandle = LED_open(CONFIG_LED_RED, &ledParams);
}

void updateLedsWithChangeRole(otDeviceRole role) {
    switch (role) {
        case OT_DEVICE_ROLE_DISABLED: {
            LED_setOff(greenLedHandle);
            LED_setOff(redLedHandle);
            break;
        }
        case OT_DEVICE_ROLE_DETACHED: {
            LED_setOff(greenLedHandle);
            LED_setOn(redLedHandle, LED_BRIGHTNESS_MAX);
            break;
        }
        case OT_DEVICE_ROLE_CHILD: {
            LED_setOn(greenLedHandle, LED_BRIGHTNESS_MAX);
            LED_setOff(redLedHandle);
            break;
        }
        case OT_DEVICE_ROLE_ROUTER: {
            LED_setOn(greenLedHandle, LED_BRIGHTNESS_MAX);
            LED_setOff(redLedHandle);
            break;
        }
        case OT_DEVICE_ROLE_LEADER: {
            LED_setOn(greenLedHandle, LED_BRIGHTNESS_MAX);
            LED_setOn(redLedHandle, LED_BRIGHTNESS_MAX);
            break;
        }
    }
}
void watchdogCallback(uintptr_t watchdogHandle)
{
    while (1) {}
}
void *TempSensor_task(void *arg0) {
    Watchdog_Params params;
    uint32_t reloadValue;
    Watchdog_Params_init(&params);
    params.callbackFxn    = (Watchdog_Callback)watchdogCallback;
    params.debugStallMode = Watchdog_DEBUG_STALL_ON;
    params.resetMode      = Watchdog_RESET_ON;
    watchdogHandle = Watchdog_open(CONFIG_WATCHDOG0, &params);
    reloadValue = Watchdog_convertMsToTicks(watchdogHandle, TIMEOUT_MS);
    if (reloadValue != 0)
    {
        Watchdog_setReload(watchdogHandle, reloadValue);
    }

    struct mq_attr attr;
    bool commissioned;
    mqd_t procQueueLoopDesc;
    attr.mq_curmsgs = 0;
    attr.mq_flags = 0;
    attr.mq_maxmsg = TEMPSENSOR_PROC_QUEUE_MAX_MSG;
    attr.mq_msgsize = sizeof(struct TempSensor_procQueueMsg);
    TempSensor_procQueueDesc = mq_open(TempSensor_procQueueName,
                                       (O_WRONLY | O_NONBLOCK | O_CREAT),
                                       0, &attr);
    procQueueLoopDesc = mq_open(TempSensor_procQueueName, O_RDONLY, 0, NULL);
    DispUtils_open();
    OtStack_taskCreate();
    OtStack_registerCallback(processOtStackEvents);
    OtRtosApi_lock();
    otLinkSetPollPeriod(OtInstance_get(), TIOP_CONFIG_POLL_PERIOD);
    OtRtosApi_unlock();
    initButtonsAndLeds();
    OtRtosApi_lock();
    commissioned = otDatasetIsCommissioned(OtInstance_get());
    OtRtosApi_unlock();
    if (true == commissioned) {
        OtStack_setupInterfaceAndNetwork();
    }
    configureReportingTimer();
    /* process events */
    while (true) {
        DISPUTILS_SERIALPRINTF(0, 0, "main while\n");
        struct TempSensor_procQueueMsg msg;
        ssize_t ret;
        ret = mq_receive(procQueueLoopDesc, (char *) &msg, sizeof(msg), NULL);
        if (ret < 0 || ret != sizeof(msg)) {
            continue;
        }
        processEvent(msg.evt);
    }
    return NULL;
}

日志和监听

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    最后一条成功消息是在15:35:51 (普遍适用时间是 UTC、因此监听器日志中将显示12:35)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Aleksey:

    请向我们提供有关您的设置的更多信息:

    • 您使用的是哪个 SimpleLink CC13XX/CC26XX SDK 版本?
    • 默认 tempsensor 项目是否能够重现此问题?
    • 您要使用 TI EVM 或定制 PCB 进行评估吗?
    • 您的 OTBR 硬件和软件是什么?
    • 什么是 otCoapSendRequest 在 TempSensorReport 中的回报?
    • 复位后是否可以恢复器件(按钮或下电上电)?

    不幸的是、我无法访问您的 OneDrive 文件夹来获取监听器和设备日志。

    此致、
    瑞安

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alexsey:

    帖子的目标地址可能已更改。

    您是否可以尝试将目标地址更改为广播地址?
    tempsensor.c 使用的默认值为 #define TIOP_TEMPSENSOR_Reporting _ADDRESS "FF02::1"。

    谢谢。
    托比

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好。  我检查了地址、它没有改变。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、一段时间后、该器件完全退出网络、成为主设备

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您使用的是哪个 SimpleLink CC13XX/CC26XX SDK 版本?
    simplelink_cc13xx_cc26xx_sdk_7_10_01_24

    默认 tempsensor 项目是否能够重现此问题?
    是的、经过2-3天的工作后、会发生相同的情况

    您要使用 TI EVM 或定制 PCB 进行评估吗?
    我使用的是 CC26x2R1 Launchpad

    您的 OTBR 硬件和软件是什么?
    来自正式 openthread 库的主分支。 Raspberry PI 4B (基于建议的提交失败且失败且出现错误) RCP CC26x2R1 Launchpad

    什么是 otCoapSendRequest 在 TempSensorReport 中的回报?
    第一个调用返回服务器 IP、第二个直接发送数据的调用不返回任何内容

    复位后是否可以恢复器件(按钮或下电上电)?
    只有在关闭和打开电源后、通过看门狗重新启动才会有所帮助

    不幸的是、我无法访问您的 OneDrive 文件夹来获取监听器和设备日志。
    上传到 Google Drive: 日志和监听

    感谢您的参与)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此类数据包会周期性地显示在 Wireshark 中:
    828 1220.546064 B2:6F:0b:5e:4D:6e:C6:BA Broadcast IEEE 802.15.4 114数据、dst:broadcast、src:B2:6F:0b:5e:4d:6e:C6:BA、BAD FCS

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们最近发现了一个问题、该问题似乎与您在此处观察到的情况相符。

    此处可以引用我们应用的修复方法:
    https://github.com/TexasInstruments/ot-ti/compare/a9dd46d64f7279974d3fd7b077e22aaf663d1460...e61f379de62125e407568056cde58c876f22ce27?diff=split

    您能否尝试将这些更改应用到 radio.c 的本地副本、然后重新运行测试以查看是否有改进?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您提供 Aleksey 更新、我可以使用 Google Drive 链接查看日志。  我建议您遵循托比的指示、并尽可能更新结果。

    此致、
    瑞安

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢、我一定会尝试并提供反馈。 但是、由于故障的表现是不可预见的:可能在5分钟后或1-2天后、我会在几天后进行回写、那时我可以可靠地验证一切是否稳定运行

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很遗憾、错误再次出现。 附件是 otbr 和 Wireshark 日志。 他们还提出了这样一个问题:将设备连接到 USB (内置在插座中)后、错误会非常快地发生、但是如果我将它连接到 USB 连接器(位于计算机上)、那么该设备的工作稳定得多。 这可能是个问题,但如果是,有什么办法呢?  日志

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我无法在 Wireshark 中弄清楚时序。 但在最后一次成功的 CoAP /PUB 之后、日志的末尾可以看到错误

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    而一个非常奇怪的情况是,看门狗按预期重启设备,但这不能恢复操作,只有当它从电源断开并再次打开设备时,才能将设备返回到网络,这是不是很方便的:)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    进行了另一个实验:我向网络中介绍了两个具有相同固件的器件。 他们同时失去了网络。 这可能是 RCP 问题吗? 我试图用 RCP radio.c 替换它、但 openthread 无法看到它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    RCP 缺少所需的功能:ACK-TIMEOUT TX-RETRIES CSMA-退避

    10月 4日15:47:10 ubuntu otbr-agent[114414]:51D.20:54:59.233 [C]平台----- : CheckRadioCapabilities()在 radio_spinel_impl.HPP:396: RadioSpinelIncompatible

    Oct  4 15:47:10 ubuntu systemd[1]:otbr-agent.service:主进程已退出,代码=已退出,状态=3/NOTIMPLEMENTED

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Aleksey:

    感谢您的更新。

    将设备连接到 USB (内置在插座中)后,错误会很快发生,但如果我将其连接到 USB 连接器(位于计算机上),则设备的工作时间将稳定得多[/报价]

    现在、让我们继续使用已知良好的电源(笔记本电脑的 USB 端口)、并避免使用插座的 USB 端口。

    一个非常奇怪的情况,看门狗按预期重新启动设备,但这不能恢复操作,它只能在设备断开电源并再次打开时帮助将设备恢复到网络,这不是很方便:)[/报价]

    在本例中是否连接了调试器?
    根据 TRM:
    '看门狗在系统中引起热复位。 此热复位可以被 ICEPick 阻止、对于调试很有用。 当 ICEPick 被置为有效时、热复位被阻止进入系统的其余部分;然而、安全装置本身被复位。"

    进行了另一个实验:我向网络中引入了两个具有相同固件的设备。 他们同时失去了网络。 这可能是 RCP 问题吗? 我试图用 rcp radio.c 替换它,但 openthread 看不到它。[/报价]

    如果同时发生、则问题可能出在 RCP/otbr 侧。

    您能否使用随附的 RCP 副本尝试一下?

    e2e.ti.com/.../4670.rcp_5F00_CC26X2R1_5F00_LAUNCHXL_5F00_tirtos_5F00_ticlang.out

    谢谢。
    托比

    [/quote]
    [/quote][/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果同时发生、则问题可能出在 RCP/otbr 侧。

    您能否使用随附的 RCP 副本尝试一下?

    4670.rcp_CC26X2R1_LAUNCHXL_tirtos_ticlang.out

    [/报价]

    我会在早上试一下、谢谢!

    是否在这种情况下连接了调试器?
    根据 TRM:
    '看门狗在系统中引起热复位。 此热复位可以被 ICEPick 阻止、对于调试很有用。 当 ICEPick 被置为有效时、热复位被阻止、无法与系统的其余部分进行通信;但是、看门狗本身被复位。"

    不、没有安装断点、我从第一个请求的频率就知道了这一点、但第二个请求没有执行。 也就是说、电路板重新启动、但未恢复正常、如果电源失真、则该行为会得到纠正。

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能否为1352P-4构建 RCP 固件? 对于 RCP、我必须使用我最新的 CC265x2R、现在我没有监听器)、并且我无法在1352P-4上运行监听器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请尝试在此处构建它: https://github.com/TexasInstruments/ot-ti

    请使用 "./script/build CC1352P_4_LAUNCHXL"代替/script/build ".CC2652R7"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    起初我收到错误


    CMAKE_C_COMPILER:
    /opt/gcc-arm-none-eabi-9-2020-q2-update/bin/arm-none-eabi-gcc


    我猜是因为我已经安装了 ARM 工具链
    我在./script/build 中将到 CMAKE_C_COMPILER 的路径更改为
    /Applications/ArmGNUToolchain/12.3.rel1/arm-none-eabi


    之后、我运行命令./script/build CC1352P_2_LAUNCHXL


    我得到错误:


    source/ti/drivers/cmaakeLists.txt 中的 CMake 错误:
    目标"tfm_dependencies_cc26x4"接口_include_directories 属性
    包含路径:
    "/opt/ot-ti/third_party/ti_simplelink_sdk/repo_cc13xx_cc26xx/tfm_s/cc26x4/build_dependencies "

    它以源目录为前缀。

    是否有可能在装有 MacOS 苹果硅的计算机上制作一个构建? 我感到困惑、我需要1352P_2上的 RCP、但我无法做到。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的工作 PC 有一些限制、导致我无法构建... (我之前分享的图像是我以前构建的图像)。

    您是否可以尝试设置 Linux 虚拟机并在该环境中进行构建?
    developer.apple.com/.../creating_and_running_a_linux_virtual_machine

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    新错误)


    /opt/gcc-arm-none-eabi-9-2020-q2-update/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../.. arm-none-eabi/bin/ld:bin/ot-NCP-FTD.out section `rodata' will not fit in region ` flash'
    /opt/gcc-arm-none-eabi-9-2020-q2-update/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../.. arm-none-eabi/bin/ld:section .ccfg lma [000000057fa8000000057fff]已重叠 section .rodata lma [0000000000055,850,00000005aeb3]
    /opt/gcc-arm-none-eabi-9-2020-q2-update/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../.. arm-none-eabi/bin/ld:区域`闪存'溢出32856字节
    collect2:错误:LD 返回1个退出状态

    同时、如果您汇编编译 LP_CC2652R7、则一切都将顺利进行

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我设法构建了固件、但它也不起作用。 我删除了 CLI 示例、只留下 RCP。 输出文件经无错误汇编、但与您的固件不同。 首先:红色 LED 不闪烁。 其次、OTbr 启动、但设备连接到网络几秒钟后立即断开

    PS: 我想我找到了其中一个解决方案。 以前、我更换了整个 radio.c 文件、而不是只添加一个提交。 现在、我仅添加了您向其发送链接的少数几行。 RCP 已启动、现在我正在等待、检查网络的稳定性。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先:红色 LED 不闪烁

    正确、当我们转至轮询 方法(APP_MAIN --> otTaskletsProcess)与中断方法(OtStack_task --> mq_receive)时、LED 切换似乎被排除 。

    第二,otbr 启动,但设备连接到网络几秒钟后立即断开连接

    您是否可以共享一个捕获此行为的日志?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我目前正在当前版本的 RCP 上检查系统的稳定性。 如果再次出现故障、或者经过几天的稳定运行后、我一定会再次使用 ot-ti 中的版本更新固件并发送日志。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    新日志 

    我的 RCP 仍然一样不稳定。 我正在附加包含来自 ot-ti 存储库的固件的日志

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有些数据包已加密。

    Thread 网络密钥是什么?
    您可以在 otbr CLI 命令: openthread.io/.../dataset 中找到它

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有效时间戳:1

    频道:15

    通道掩码:0x07fff800

    外部 PAN ID:5151515151515151

    网格本地前缀:fdec:c3b4:7831:a109:::/64

    网络密钥:00112233445566778899aabbccddeff

    网络名称:OTDev

    PAN ID:0x5151

    PSKc:5825fe6760e0319189b38260891b2f3f

    安全策略:672 onrc 0

    我没有更换钥匙、默认情况下是标准的。

    在 Wireshark 中指定了它

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能否告诉我固件的制作方法、以及他们为我发送 CC26x2R1的链接? 我会尝试为 CC1352P_2_LAUNCHXL 组装相同的代码。 因为我不知道如何才能制作一个稳定版本的 RCP :(我真的不想切换到其他制造商的设备,因为这么小的事情。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否有其他信息?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以告诉我您是如何制作固件的,以及他们为我发送的 CC26x2R1链接吗?

    它是使用 SDK 并 使用较新的提交覆盖 sources\third_party\openthread 的组合。
    这是一段时间以前的情况、因此我认为与我之前的方法相比、使用 GitHub 更有意义。

    另一种方法可能是为 CC1352P4构建监听器固件。
    位于以下位置的参考 CCS 项目: C:\Program Files (x86)\Texas Instruments\SmartRF Tools\SmartRF Packet Sniffer 2\Sniffer_FW_IDE

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是使用 SDK 和 用更新的提交覆盖 sources\third_party\openthread 的组合。
    [/报价]

    我做出了同样的决定并再次尝试、现在我启动了网络并正在等待结果

    这是一段时间过去了,因此我认为使用 GitHub 比我以前的方法更有意义。

    这个解决方案对我不起作用。 网络已创建、但设备连接1-2秒并断开网络。 我在上面写了这篇文章

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我决定再次尝试,现在我启动了网络并正在等待结果

    感谢您的更新。 我们将等待听到未来的结果。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    RCP 运行稳定、网络似乎没有中断。 非常感谢您的帮助。  如果问题再次出现,我一定会写。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您发送编修。

    对于社区、您是否可以分享您在 RCP 上使用的 openthread 的哪个提交?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用了 ot-ti 库中的主分支