/**
  * @brief 设备取消订阅,TOPIC是TOPIC_TO_UNSUB
  * @param  ctx:上下文变量
  * @retval ret:0,成功,<0 失败
  **/
static int MqttSample_CmdUnsubscribe(struct MqttSampleContext *ctx)
{
    int err;
    int bytes = 0;
    printf("%s %d\n", __func__, __LINE__);
    err = Mqtt_PackUnsubscribePkt(ctx->mqttbuf, PACK_FALG_UNSUB, TOPIC_TO_UNSUB);
    if(err != MQTTERR_NOERROR)
    {
        printf("Critical bug: failed to pack the unsubscribe packet.\n");
        return -1;
    }

    err = Mqtt_AppendUnsubscribeTopic(ctx->mqttbuf, TOPIC_TO_UNSUB);
    if(err != MQTTERR_NOERROR)
    {
        printf("Critical bug: failed to append the topic to the "
               "unsubscribe packet.\n");
        return -1;
    }
    bytes = Mqtt_SendPkt(ctx->mqttctx, ctx->mqttbuf, 0);
    MqttBuffer_Reset(ctx->mqttbuf);
    return 0;
}
/**
  * @brief 设备订阅报文,TOPIC是TOPIC_TO_SUB
  * @param  ctx:上下文变量
  * @retval ret:0,成功,<0 失败
  **/
static int MqttSample_CmdSubscribe(struct MqttSampleContext *ctx)
{
    int err;
    int bytes = 0;
    printf("%s %d\n", __func__, __LINE__);
    err = Mqtt_PackSubscribePkt(ctx->mqttbuf, 1, TOPIC_TO_SUB, MQTT_QOS_LEVEL1);
    if(err != MQTTERR_NOERROR)
    {
        printf("Critical bug: failed to pack the subscribe packet.\n");
        return -1;
    }

    printf("%s %d\n", __func__, __LINE__);
    /* err = Mqtt_AppendSubscribeTopic(ctx->mqttbuf, "433223/Bs04OCJioNgpmvjRphRak15j7Z8=/25267/test-2", MQTT_QOS_LEVEL2); */
    if(err != MQTTERR_NOERROR)
    {
        printf("Critical bug: failed to append the topic to the "
               "subscribe packet.\n");
        return -1;
    }
    bytes = Mqtt_SendPkt(ctx->mqttctx, ctx->mqttbuf, 0);
    MqttBuffer_Reset(ctx->mqttbuf);
    return 0;
}
/**
  * @brief 周期性发布数据,暂时没有使用,因为采用JSON发布,前端暂时不支持Json显示,但可以正常发布
  * @param  ctx:上下文变量
  * @retval ret:0,成功,<0 失败
  **/
static int MqttSample_CmdPublish(struct MqttSampleContext *ctx)
{
    uint8_t cause = 0; //only for test
    int err = 0;
    int bytes = 0;
    static unsigned char count = 0;
    int64_t ts = 0; //no time
    uint16_t temprature[1], rh[1];
    printf("%s %d,count=%d,cause=%d\n", __func__, __LINE__, count, cause);
    // ts = (int64_t)time(NULL) * 1000;

    SHT2x_MeasureHM(SHT20_Measurement_RH_HM, temprature);
    mDelay(1500);
    SHT2x_MeasureHM(SHT20_Measurement_T_HM, rh);

    err |= Mqtt_PackDataPointStart(ctx->mqttbuf, 1, MQTT_QOS_LEVEL2, 0, 1);
    if((count == 0) || (cause == EVENT))
    {
        err |= Mqtt_AppendDPStartObject(ctx->mqttbuf, DS_TO_PUBLISH, ts);
        if(cause == TIME_OUT)
        {
            ir_state = !ir_state;
        }
        if(ir_state == 0x1)
        {
            err |= Mqtt_AppendDPSubvalueString(ctx->mqttbuf, DS_TO_PUBLISH, "设备在位");
        }
        else if(ir_state == 0)
        {
            err |= Mqtt_AppendDPSubvalueString(ctx->mqttbuf, DS_TO_PUBLISH, "设备离位");
        }
        else
        {
            err |= Mqtt_AppendDPSubvalueString(ctx->mqttbuf, DS_TO_PUBLISH, "未知初始状态");
        }
        if(count != 2)
        {
            count++;
        }
    }
    else if(count == 1)
    {
        err |= Mqtt_AppendDPStartObject(ctx->mqttbuf, DS_TO_PUBLISH_T, ts);
        err |= Mqtt_AppendDPSubvalueInt(ctx->mqttbuf, DS_TO_PUBLISH_T, temprature[0]);
        count++;
    }
    else if(count == 2)
    {
        err |= Mqtt_AppendDPStartObject(ctx->mqttbuf, DS_TO_PUBLISH_RH, ts);
        err |= Mqtt_AppendDPSubvalueInt(ctx->mqttbuf, DS_TO_PUBLISH_RH, rh[0]);
        count = 0;

    }
    err |= Mqtt_AppendDPFinishObject(ctx->mqttbuf);
    err |= Mqtt_PackDataPointFinish(ctx->mqttbuf);
    if(err)
    {
        printf("Failed to pack data point package.err=%d\n", err);
        return -1;
    }
    bytes = Mqtt_SendPkt(ctx->mqttctx, ctx->mqttbuf, 0);
    MqttBuffer_Reset(ctx->mqttbuf);
    return 0;
}
/**
  * @brief 周期性发布数据,这里是测试代码,发布温湿度和一个状态信息,三个数据流轮流发布
  * @param  ctx:上下文变量
    * @param  cause:发布原因,TIMEOUT,定时发送,EVENT则是由设备事件触发
  * @retval ret:0,成功,<0 失败
  **/
static int MqttSample_CmdPublishNormal(struct MqttSampleContext *ctx, uint8_t cause)
{
    int err = 0, ir_index = 0;
    int bytes = 0;
    struct MqttExtent *ext;
    unsigned char dis[3][64] = {"未知初始状态", "设备在位", "设备离位"};
    static unsigned char count = 0;
    int64_t ts = 0; //no time
    uint16_t temprature[1], rh[1];
    if(ctx->publish_state != 0)
    {
        printf("publsh busy\n");
        return -1;
    }
    ctx->publish_state = 1;
    printf("%s %d,count=%d,cause=%d\n", __func__, __LINE__, count, cause);
    // ts = (int64_t)time(NULL) * 1000;
    SHT2x_MeasureHM(SHT20_Measurement_RH_HM, temprature);
    mDelay(1500);
    SHT2x_MeasureHM(SHT20_Measurement_T_HM, rh);

    if((count == 0) || (cause == EVENT))
    {
        //no time
        if(cause == TIME_OUT)
        {
            ir_state = !ir_state;
        }
        if(ir_state == 0xff)
        {
            ir_index = 0;
        }
        if(ir_state == 0x1)
        {
            ir_index = 1;
        }
        if(ir_state == 0)
        {
            ir_index = 2;

        }
        if(count != 2)
        {
            count++;
        }
        //append data; String
        printf("pub state\n");
        err |= Mqtt_PackDataPointStartNormal(ctx->mqttbuf, (char *)(DS_TO_PUBLISH), 1, MQTT_QOS_LEVEL2, 0, 1);
        ext = MqttBuffer_AllocExtent(ctx->mqttbuf, 1 + strlen(dis[ir_index]));
        if(!ext)
        {
            return MQTTERR_OUTOFMEMORY;
        }
        ext->payload[0] = 0x84;;
        memcpy(&ext->payload[1], dis[ir_index], strlen(dis[ir_index]));
        MqttBuffer_AppendExtent(ctx->mqttbuf, ext);
    }
    else if(count == 1)
    {
        printf("pub temprature\n");
        err |= Mqtt_PackDataPointStartNormal(ctx->mqttbuf, (char *)(DS_TO_PUBLISH_T), 1, MQTT_QOS_LEVEL2, 0, 1);
        //append data; int32
        ext = MqttBuffer_AllocExtent(ctx->mqttbuf, 1 + sizeof(int));
        if(!ext)
        {
            return MQTTERR_OUTOFMEMORY;
        }
        ext->payload[0] = 0x81;
        ext->payload[1] = 0;
        ext->payload[2] = 0;
        ext->payload[3] = 0;
        ext->payload[4] = temprature[0];
        MqttBuffer_AppendExtent(ctx->mqttbuf, ext);
        count++;
    }
    else if(count == 2)
    {
        printf("rh\n");
        err |= Mqtt_PackDataPointStartNormal(ctx->mqttbuf, (char *)(DS_TO_PUBLISH_RH), 1, MQTT_QOS_LEVEL2, 0, 1);
        //append data; int32
        ext = MqttBuffer_AllocExtent(ctx->mqttbuf, 1 + sizeof(int));
        if(!ext)
        {
            return MQTTERR_OUTOFMEMORY;
        }
        ext->payload[0] = 0x81;;
        ext->payload[1] = 0;
        ext->payload[2] = 0;
        ext->payload[3] = 0;
        ext->payload[4] = rh[0];
        MqttBuffer_AppendExtent(ctx->mqttbuf, ext);
        count = 0;
    }

    if(err)
    {
        printf("Failed to pack data point package.err=%d\n", err);
        return -1;
    }
    err = Mqtt_AppendLength(ctx->mqttbuf, ext->len);
    if(MQTTERR_NOERROR != err)
    {
        return err;
    }

    bytes = Mqtt_SendPkt(ctx->mqttctx, ctx->mqttbuf, 0);
    MqttBuffer_Reset(ctx->mqttbuf);
    return 0;
}
Esempio n. 5
0
 int Send(MqttBuffer *buf, uint32_t offset)
 {
     return Mqtt_SendPkt(m_ctx, buf, offset);
 }