用adv_vendor_self_provison中,
// 检查命令执行状态,如果超时未收到应答则打印提示信息 if(val->vendor_model_srv_Hdr.status) { APP_DBG("Timeout opcode 0x%02x", val->vendor_model_srv_Hdr.opcode); return; } // 根据操作码执行相应的操作 if(val->vendor_model_srv_Hdr.opcode == OP_VENDOR_MESSAGE_TRANSPARENT_MSG) { // 接收
其中这段代码val->vendor_model_srv_Hdr.opcode == OP_VENDOR_MESSAGE_TRANSPARENT_MSG
和下面这段代码中return vendor_message_srv_send_trans(¶m, pData, len); 是对应的用于发送透传信息
static int vendor_model_srv_send(uint16_t addr, uint8_t *pData, uint16_t len) { // 发送参数的设定 struct send_param param = { .app_idx = vnd_models[0].keys[0], // 使用的应用密钥索引 .addr = addr, // 发往的目标地址 .trans_cnt = 0x01, // 用户层发送次数 .period = K_MSEC(400), // 消息重传的间隔 .rand = (0), // 发送的随机延时 .tid = vendor_srv_tid_get(), // 消息的事务标识 .send_ttl = BLE_MESH_TTL_DEFAULT, // 消息的TTL值 }; // 发送应答指示消息或透传消息 //return vendor_message_srv_indicate(¶m, pData, len); // 发送应答指示消息,超时默认为2秒 return vendor_message_srv_send_trans(¶m, pData, len); // 发送透传消息,无应答机制 }
由于透传发送信息是无应答机制的,我现在想用应答指示消息vendor_message_srv_indicate(¶m, pData, len);来发送透传消息。我想实现的效果是:AB两个点,当A点给B点发送消息,B点返回一个确认码给A,A收到确认码之后发送信息给节点B。
我具体应该如何修改下面的代码呢?
节点A发送部分代码利用一个测试事件来执行,代码如下:
if (events & APP_NODE_TEST_EVT) { uint8_t status; uint8_t data[4] = { 0, 1, 2, 3 }; // 准备要发送的测试数据 status = vendor_model_srv_send(0x0002, data, sizeof(data)); if (status) // 如果发送失败,打印错误状态 APP_DBG("trans failed %d", status); tmos_start_task(App_TaskID, APP_NODE_TEST_EVT, 4800); }
节点A的接收部分,当节点A接收到节点B发送的信息后,打印两节点之间的RSSI值,然后再定义一个数据发送给节点B。
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; // if(ctx->addr==self_prov_addr) // return; if (ctx->addr == 0x0002) { APP_DBG("DATA---src:0x%04x self_addr:0x%04x rssi:%d", ctx->addr, self_prov_addr, ctx->recv_rssi); // 发送 int status; // 准备发送的数据数组 uint8_t data[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; // 通过自定义模型发送数据到订阅地址 status = vendor_model_srv_send(0x0002, data, 8); if (status) { // 如果发送失败,打印失败信息 APP_DBG("send failed %d", status); } } }
节点B的接收部分,当节点B接收到节点A发送的信息后,打印两节点之间的RSSI值,然后再定义一个数据发送给节点A。
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; // if(ctx->addr==self_prov_addr) // return; if (ctx->addr == 0x0001) { APP_DBG("DATA---src:0x%04x self_addr:0x%04x rssi:%d", ctx->addr, self_prov_addr, ctx->recv_rssi); // 发送 int status; // 准备发送的数据数组 uint8_t data[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; // 通过自定义模型发送数据到订阅地址 status = vendor_model_srv_send(0x0001, data, 8); if (status) { // 如果发送失败,打印失败信息 APP_DBG("send failed %d", status); } } }