采用三个蓝牙节点,使用自配网例程。
节点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.");
}
}