用adv_vendor_self_provison例程问题

用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(&param, 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(&param, pData, len);  // 发送应答指示消息,超时默认为2秒
    return vendor_message_srv_send_trans(&param, pData, len); // 发送透传消息,无应答机制
}

由于透传发送信息是无应答机制的,我现在想用应答指示消息vendor_message_srv_indicate(&param, 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);
            }
        
        }
        }


您好,节点往外发包,直接调用vendor_model_srv_send函数即可,待发送的包会进入发包队列,排队发出;

收到包进回调后,可以在接收回调中调用tmos_start_task安排事件;如果与接收回调结合的逻辑比较多,建议在回调函数中增加一个标志变量,在主循环中查变量来安排接下来的事件。

image.png


您好,请问能提供一下类似的例程代码参考一下吗?


没有现成的例程。您之前的内容中已经正确找到了接收回调函数、发包函数的,可以参考下篇博客自拟TMOS事件。

安排TMOS事件的参考:在TMOS系统的main.c中添加事务处理代码 - JayWell - 博客园 (cnblogs.com)

image.png


感谢


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