【RT-Thread】 RT-Thread上傳DS18B20溫度值到OneNet
阿新 • • 發佈:2020-07-26
<一> 新增雲平臺產品和裝置
進入https://open.iot.10086.cn/官網登入開發者中心。
在全部產品中選擇多協議接入,因為RT-Thread的軟體包支援的時舊版MQTT,如果使用MQTT物聯網套件需要修改RT-Thread軟體包的部分內容,這裡為了方便,使用的是舊版的MQTT,而且僅僅只是為了學習,新版與舊版也就差了一個鑑權資訊的不同。新版需要計算。
點選 新增產品
填入對應的資訊
新增裝置,需要填入相關資訊。
裝置新增完成後如下,可以點選詳情看一下裝置資訊:注意裝置ID和鑑權資訊,連線雲時需要使用:
注意產品ID和Master-APIkey,連線雲時需要使用。
至此,雲平臺這邊已經設定完了,記住幾個RT-Thread 的oneNet軟體包需要的引數資訊:裝置ID,鑑權資訊,產品ID,Master-APIKey。
<二> RT-Thread Studio 工程建立
esp8266的聯網可以參考日記ota升級,連結:https://www.cnblogs.com/Raowz/p/13276647.html中有這部分操作。
在對應的引數欄中填入在雲平臺註冊道德裝置引數資訊。
此時,裝置已經可以登入到oneNet雲平臺,編譯下載到開發板上。
測試如下:
下面新增DS18B20測量的溫度資料到oneNet:
ds18b20的新增檢視日記連結: https://www.cnblogs.com/Raowz/p/13131841.html。
需要修改一點程式碼。將測量的得到的溫度通過郵箱傳送給oneNet上傳資料的執行緒。
建立mb
ds18b20傳送mb。oneNet接收mb。
static void read_temp_entry(void *parameter) { rt_device_t dev = RT_NULL; struct rt_sensor_data sensor_data; rt_size_t res; rt_err_t result ; rt_mailbox_t rb = (rt_mailbox_t)rt_object_find("temperature", RT_Object_Class_MailBox); if(RT_NULL == rb) { rt_kprintf("not exist %s mailbox \n","temperature"); return; } 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 { result = rt_mb_send(rb, (rt_ubase_t)sensor_data.data.temp); if(result != 0) { rt_kprintf("rt_mb_send failed\n"); rt_device_close(dev); rt_mb_delete(rb); return; }else{ if (sensor_data.data.temp >= 0) { rt_kprintf("temp:%3d.%dC, timestamp:%5d\n", sensor_data.data.temp / 10, sensor_data.data.temp % 10, sensor_data.timestamp); } else { rt_kprintf("temp:-%2d.%dC, timestamp:%5d\n", abs(sensor_data.data.temp / 10), abs(sensor_data.data.temp % 10), sensor_data.timestamp); } } } rt_thread_mdelay(7000); } }
/* upload random value to temperature*/ static void onenet_upload_entry(void *parameter) { int value = 0; rt_err_t result; char upload_buf[16] = {0}; rt_mailbox_t rb = (rt_mailbox_t)rt_object_find("temperature", RT_Object_Class_MailBox); if(RT_NULL == rb) { rt_kprintf("not exist %s mailbox \n","temperature"); return; } while (1) { result = rt_mb_recv(rb,(rt_ubase_t *) &value, RT_WAITING_FOREVER); if(result != 0) { rt_kprintf("rt_mb_recv failed\n"); rt_mb_delete(rb); return; } rt_sprintf(upload_buf, "%3d.%2dC",value/10,value%10); if (onenet_mqtt_upload_string("temperature", upload_buf) < 0) { 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)); } }
結果圖: