蓝牙mesh问题

采用三个蓝牙节点,使用自配网例程。

节点2收到1的消息后转发给节点3,但是有个问题是:节点1发送两次消息,节点1第一次消息发送后,节点2收到消息后打印,节点3却没有收到并打印,节点1发送第二次消息后,节点3才收到节点1第一次发送的消息。

代码如下:

   if(val->vendor_model_srv_Hdr.opcode == OP_VENDOR_MESSAGE_TRANSPARENT_MSG)

    {

        // 接收

        struct bt_mesh_msg_ctx *ctx = (struct bt_mesh_msg_ctx *)val->mydata;

        // 当接收到来自0x0001节点的信息后,会向0x0003节点发送信息

        if(ctx->addr==0x0001)

        {

            // 自定义随机数据发送版本

            uint8_t *received_data = val->vendor_model_srv_Event.trans.pdata;

            int len = val->vendor_model_srv_Event.trans.len;


            if(len >= 4)  // 假设数据至少有4字节

            {

                // 解析数据

                char dataStr[254];

                int offset = sprintf(dataStr, "data={");

                for(int i = 0; i < len; i++) {

                    offset += sprintf(dataStr + offset, "%d", received_data[i]);

                    if(i < len - 1)

                        offset += sprintf(dataStr + offset, ",");

                }

                sprintf(dataStr + offset, "},src:0x%04x", ctx->addr);

                APP_DBG("%s\n", dataStr);


                // 发送数据

                uint8_t status = vendor_model_srv_send(0x0003, received_data, len);

                if(status)

                    APP_DBG("trans failed %d", status);

            }

            else

            {

                APP_DBG("Received data is too short.");

            }


            // 休眠处理

            PRINT("sleep mode sleep \n");

            tmos_stop_task(halTaskID, HAL_REG_INIT_EVENT);  //默认2分钟一次的校准先暂停

            DelayMs(5);


    //        RTC_TMRFunCfg(Period_16_S);/* 定时1s的RTC闹钟 */

            RTC_TRIGFunCfg(32768*10);

            PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_RTC_WAKE, Long_Delay);/* 使能RTC中断唤醒源 */


            PFIC_EnableIRQ(RTC_IRQn);/* 使能RTC中断 */

            /* 注意当主频为80M时,Sleep睡眠唤醒中断不可调用flash内代码 */

//            LowPower_Idle();

//            LowPower_Halt();

            LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K); /* 只保留30+2K SRAM 供电 */

//            LowPower_Shutdown(0);

            HSECFG_Current(HSE_RCur_100); /* 降为额定电流(低功耗函数中提升了HSE偏置电流) */

            PFIC_DisableIRQ(RTC_IRQn);


            DelayMs(5);

            PRINT("wake.. \n");

            DelayMs(20);

            tmos_set_event(halTaskID, HAL_REG_INIT_EVENT);      //先校准RF,再开广播

        }


        // 当接收到来自0x0003节点的信息pdata后,会向0x0001节点发送该pdata信息

        if(ctx->addr==0x0003)

        {

            // 确保接收到的数据长度至少为5个字节

            if(val->vendor_model_srv_Event.trans.len >= 5) {

                // 解析数据

                uint16_t src_addr = val->vendor_model_srv_Event.trans.pdata[0] + (val->vendor_model_srv_Event.trans.pdata[1] << 8);

                uint16_t my_addr = val->vendor_model_srv_Event.trans.pdata[2] + (val->vendor_model_srv_Event.trans.pdata[3] << 8);

                int8_t rssi = val->vendor_model_srv_Event.trans.pdata[4];


                // 打印解析后的数据

                APP_DBG("src: 0x%04x, my_addr: 0x%04x, rssi: %d", src_addr, my_addr, rssi);


                // 将该解析数据pdata发送给0x0001

                uint8_t status;

                // 准备要发送的数据

                uint8_t sendData[5]; // 2 bytes for src_addr, 2 bytes for my_addr, and 1 byte for rssi

                // 打包数据

                // 注意: 这里假设系统为小端字节序,如果是大端字节序需要调整

                memcpy(sendData, &src_addr, 2); // 复制ctx->addr

                memcpy(sendData + 2, &my_addr, 2); // 复制my_addr

                // 由于rssi是int8_t,直接将其值赋给数组的相应位置

                sendData[4] = rssi; // 复制ctx->recv_rssi

                status=vendor_model_srv_send(0x0001,sendData,sizeof(sendData));

                if(status) // 如果发送失败,打印错误状态

                    APP_DBG("trans failed %d", status);


            } else {

                APP_DBG("Received data is too short.");

            }

        }


代码中有手动调用休眠?休眠期间节点是收不到包的。

对比测试一下,如果不休眠,是不是节点3可以立即收到节点1的第一个包。


您好,我测试了一下,关闭休眠后。1号节点发送信息后,2号和3号节点都是同时收到的。


请问这个问题该怎么解决呢


期望能收到包,就不可以休眠。休眠期间32M晶振停止工作,无法接收无线数据。

mesh组网有一套低功耗解决方案,是通过“朋友节点”协助低功耗节点收包,可以做低功耗节点的双向通信。

image.png


只有登录才能回复,可以选择微信账号登录