//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;
}
谢邀,连接错误了。你看日志
AT指令执行错误了,看看端口 ip都对着没,本地ping onenet试试
建议:
1.检查网络连接的配置,确保所有参数都是正确的,包括 IP 地址、端口号、APN 等,具体配置可以参考使用的NB-IoT模块的文档
2.检查网络连接状态,确保设备已经连接到了网络。
3.检查数据发送过程中是否出现错误。可以检查日志记录或者调试信息,看看具体问题出在哪里。
4.重新启动设备或者重启网络模块,确保网络连接是稳定的。
5.如果这些都无法解决问题,可以试试重新编译项目
仅供参考,望采纳,谢谢。
嗯,最好是抓包看下具体原因
当然抓包前,我们首先排查下设备的网络和设置是否有问题
其次才是看下是否是数据丢失
可能是由于网络连接问题或者云平台配置问题导致的。建议检查网络连接,确认云平台配置是否正确,并检查是否有防火墙或安全组限制了数据流量。