RT-Thread中NB-IoT上传数据云平台没有数据流

用RT-Thread Studio做的一个RT-Thread+NB-IoT+ds18b20的一个工程数据上传出错
数据上传至浙江ONENET云平台,设备显示在线但是没有数据流
核心代码如下:
//ds18b20  线程 入口函数
static void read_temp_entry(void *parameter)
{
    rt_device_t dev = RT_NULL;
    struct rt_sensor_data sensor_data;
    rt_size_t res;

    dev = rt_device_find(parameter);
    if (dev == RT_NULL)
    {
        rt_kprintf("Can't find device:%s\n", parameter);
        return;
    }

    if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)
    {
        rt_kprintf("open device failed!\n");
        return;
    }
    rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)100);

    while (1)
    {
        res = rt_device_read(dev, 0, &sensor_data, 1);
        if (res != 1)
        {
            rt_kprintf("read data failed!size is %d\n", res);
            rt_device_close(dev);
            return;
        }
        else
        {
            if (sensor_data.data.temp >= 0)
            {
                rt_kprintf("temp:%3d.%dC\n",
                           sensor_data.data.temp / 10,
                           sensor_data.data.temp % 10
                           );
            }
            else
            {
                rt_kprintf("temp:-%2d.%dC\n",
                           abs(sensor_data.data.temp / 10),
                           abs(sensor_data.data.temp % 10)
                           );
            }
            //DS18B20 温度    发送到     消息队列 t1_mq
            if (rt_mq_send(t1_mq, &sensor_data.data.temp, sizeof(sensor_data.data.temp)) != RT_EOK)
            {
                rt_kprintf("rt_mq_send_hum ERR\n");
            }
        }
        rt_thread_mdelay(3000);
    }
}

//ds18b20进行初始化
static int rt_hw_ds18b20_port(void)
{
    struct rt_sensor_config cfg;
    cfg.intf.user_data = (void *)DS18B20_DATA_PIN;
    rt_hw_ds18b20_init("ds18b20", &cfg);       // 对ds18b20进行初始化   、 并注册 ds18b20 设备。

    return RT_EOK;
}
INIT_ENV_EXPORT(rt_hw_ds18b20_port); /*该函数  启动时    自动执行  */

//mqtt 初始化  ,   必须要
static void mqtt_init(void *parameter)
{
    uint8_t onenet_mqtt_init_failed_times;
    while(1)
    {
        if(!onenet_mqtt_init())   // mqtt 初始化
        {
        rt_sem_release(mqttinit_sem);  //  释放  信号量  ,同步作用  即  先初始化 后上传
        return;
        }
        rt_thread_mdelay(100);
        rt_kprintf("onenet mqtt init failed %d times",onenet_mqtt_init_failed_times++);
    }
}

//数据上传线程的  入口 函数
static void onenet_upload_entry(void *parameter)
{
    char upload_buf[16] = {0};
    uint8_t   r1_queue;
    rt_err_t uwRet = RT_EOK;

// 接收 信号量
    if(rt_sem_take(mqttinit_sem,RT_WAITING_FOREVER)== RT_EOK)  //  收到 则   ?
    {
        rt_sem_delete(mqttinit_sem);
    }

// 如果  未收到信号量 ,后边的应该不执行  ????
    while (1)
    {
        // t1_mq 队列读取(接收),等待时间为一直等待
        uwRet = rt_mq_recv(t1_mq,   /* 读取(接收)队列的ID(句柄) */
                           &r1_queue,          /* 读取(接收)的数据保存位置 */
                           sizeof(r1_queue),       /* 读取(接收)的数据的长度 */
                           RT_WAITING_FOREVER);    /* 等待时间:一直等 */
        if(RT_EOK == uwRet)
        {
            rt_kprintf("3:%d\n",r1_queue);
        }
        else
        {
            rt_kprintf("数据接收出错,错误代码: 0x%lx\n",uwRet);
        }
        rt_thread_delay(200);
        rt_sprintf(upload_buf, "%3d.%2dC",r1_queue/10,r1_queue%10);  // 控制  要   显示小数值
       //  按照 格式  把数据 r1_queue/10,r1_queue%10 保存到  数组UPLOAD_BUF中,以便上传到ONENET
        if (onenet_mqtt_upload_string("temperature2022",upload_buf) < 0) //调用onenet_mqtt_upload_string函数  上传数据  ,函数在onenet_mqtt.c中定义的+++++++++++++++
        {
            LOG_E("upload has an error, stop uploading");
            break;
        }
        else
        {
            LOG_D("buffer : {\"temperature\":%s}", upload_buf);
        }

        rt_thread_delay(rt_tick_from_millisecond(5 * 1000));
    }
}


int main(void)
{
    rt_thread_t   ds18b20_thread; //线程控制块   指针

    rt_thread_t  mqtt_init_thread ;
    onenet_mqtt_init();  //   必须要

    // 创建信号量:  mqtt初始化之后  才能上传发送数据
    mqttinit_sem=rt_sem_create("mqttinit_sem",// 信号量
                                0,
                                RT_IPC_FLAG_FIFO);

    //创建一个消息队列t1_mq
    t1_mq = rt_mq_create("t1_mq",/* 消息队列名字 */
                          4,     /* 消息的最大长度  4字节 */
                          100,    /* 消息队列的最大容量     100个消息     */
                          RT_IPC_FLAG_FIFO);/* 队列模式 FIFO(0x00)*/
    if (t1_mq != RT_NULL)
        rt_kprintf("消息队列创建成功!\n\n");

    //创建     mqtt初始化   线程
    mqtt_init_thread= rt_thread_create("mqtt_init_thread",//
                                     mqtt_init,
                                     RT_NULL,
                                     1024,
                                     RT_THREAD_PRIORITY_MAX/2-1,
                                     20);
    if(mqtt_init_thread != RT_NULL)
    {
        rt_thread_startup(mqtt_init_thread);
    }

    //创建    ds18b20 线程
    ds18b20_thread = rt_thread_create("18b20tem",
                                       read_temp_entry,
                                       "temp_ds18b20",
                                       640,
                                       RT_THREAD_PRIORITY_MAX / 2,
                                       20);
    //"temp_ds18b20",  传入的参数,用于识别ds18b20
    if (ds18b20_thread != RT_NULL)
    {
        rt_thread_startup(ds18b20_thread);
    }

    //创建   数据上传 线程
    rt_thread_t upload_thread;
    upload_thread = rt_thread_create("onenet_send",
                                   onenet_upload_entry,  //线程 入口函数 名字
                                   RT_NULL,
                                   2 * 1024,
                                   RT_THREAD_PRIORITY_MAX / 3 - 1,
                                   5);
            if (upload_thread)
            {
                rt_thread_startup(upload_thread);
            }

    return RT_EOK;
}
串口报错如下:

img


其中报错execute command (AT+IPSTART=0,"TCP","112.13.167.63",6002) failed!就很奇怪,如果这句都没有执行成功为什么设备会显示在线?

希望得到解答,解决数据流上传的问题!

谢邀,连接错误了。你看日志

img

AT指令执行错误了,看看端口 ip都对着没,本地ping onenet试试

img

建议:
1.检查网络连接的配置,确保所有参数都是正确的,包括 IP 地址、端口号、APN 等,具体配置可以参考使用的NB-IoT模块的文档

2.检查网络连接状态,确保设备已经连接到了网络。

3.检查数据发送过程中是否出现错误。可以检查日志记录或者调试信息,看看具体问题出在哪里。

4.重新启动设备或者重启网络模块,确保网络连接是稳定的。

5.如果这些都无法解决问题,可以试试重新编译项目
仅供参考,望采纳,谢谢。

嗯,最好是抓包看下具体原因
当然抓包前,我们首先排查下设备的网络和设置是否有问题
其次才是看下是否是数据丢失

可能是由于网络连接问题或者云平台配置问题导致的。建议检查网络连接,确认云平台配置是否正确,并检查是否有防火墙或安全组限制了数据流量。