OneNET NB 學習筆記三 接收數據處理與回覆過程

本文分析基於固件OneNET-Demo_v5(適配M5310sp3)

//main函數中,循環調用
int main()
{
// 省略一段.........

    do
    {
        ret = nbiot_device_step( dev, 1);   // 處理上下行數據的總入口
        if ( ret )
            printf( "device step error, code = %d.\r\n", ret );

        res_update(30);     // 30s

    } while(1);

// 省略一段.........
}
void res_update(time_t interval)//interval 時間間隔 單位 s
{
    SHT20_INFO sht20;
    if(cur_time >= last_time + interval)
    { 
        cur_time = 0;
        last_time = 0;

        temp.flag |= NBIOT_UPDATED;
        humi.flag |= NBIOT_UPDATED;

        sht20 = SHT20_GetValue();
        temp.value.as_float = sht20.tempreture;
        humi.value.as_float = sht20.humidity;   // .as_float 爲 double 類型

        illumi.flag |= NBIOT_UPDATED;   // 0x8
        BH1750_test();
        illumi.value.as_float = result_lx;
    }
    else if(cur_time == 0 && last_time == 0)
    {
        cur_time = nbiot_time();
        last_time = cur_time;
    }
    else
    {
       cur_time = nbiot_time();

    }
}
int nbiot_device_step( nbiot_device_t *dev,int timeout )
{
    time_t last;
    time_t curr;
    uint8_t buffer[NBIOT_SOCK_BUF_SIZE];
    last = nbiot_time();
    do
    {
        int buffer_len = nbiot_recv_buffer( buffer, sizeof(buffer) );
        if ( buffer_len > 0 )
        {
              nbiot_handle_buffer( dev,         // 判斷平臺發來的數據是否是read write execute等請求,如果是則進行反饋
                                   buffer,
                                   buffer_len,
                                   sizeof(buffer) );
        }
        memset(buffer,0,sizeof(buffer));
        curr = nbiot_time();  

        nbiot_register_step( dev,       // nbiot_register_start 註冊設備:dev->state = STATE_REGISTERED ......
                             curr,
                             buffer,
                             sizeof(buffer));
        if (dev->state == STATE_REGISTERED ||
            dev->state == STATE_REG_UPDATE_NEEDED ||
            dev->state == STATE_REG_UPDATE_PENDING||
            dev->state == STATE_DEREG_PENDING||
            dev->state == STATE_REG_PENDING||
            dev->state == STATE_REG_FAILED  ){

            nbiot_transaction_step( dev,
                                    curr,
                                    buffer,
                                    sizeof(buffer));                      
        }            
        if ( dev->state == STATE_REGISTERED||dev->state == STATE_REG_UPDATE_PENDING||dev->state == STATE_REG_UPDATE_NEEDED ){                                       
            nbiot_observe_step( dev,
                                curr,
                                buffer,
                                sizeof(buffer) );
        }                             
        nbiot_sleep(10);

    } while ( curr <= last + timeout );
    return 0;
   // return STATE_ERROR( dev );
}

這裏寫圖片描述
nbiot_device_step循環,先進行② fifo_get()讀取fifo中的數據(fifo_put過程點此),再進行第③步判斷接收的數據是否是read write execute等請求,如果是則進行反饋。
其中m5310_notify_upload是數據上傳更新,AT+MIPLNOTIFY=0
m5310_read_upload回覆平臺讀操作,AT+MIPLREAD=0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章