使用RT-Thread通過MQTT連接華為物聯網平台實驗


硬件環境:

(1)開發板:ST官方的stm32wb55-st-nucleo開發板

(2)wifi模塊:esp8266

(3)溫濕度傳感器:DHT22

(4)單色oled屏:主控ssd1306,分辨率126x64

軟件環境:

(1)開發環境:Keil MDK v5.29

(2)RTOS:RT-Thread 4.0.3

實現目標:將溫度、濕度數據上報到華為雲物聯網平台。

 

一、准備工作

(1)安裝ENV工具,參見官方文檔《Env 用戶手冊》:

https://www.rt-thread.org/document/site/#

(2)安裝git下載最新的rt-thread源碼,可到github或碼雲gitee上下載:

git clone https://gitee.com/rtthread/rt-thread.git

(3)查看rt-thread源碼的bsp文件夾內已經適配了stm32wb55-st-nucleo開發板,進入“...\rt-thread\bsp\stm32\stm32wb55-st-nucleo”,打開env運行scons --dist將工程抽離成獨立工程(看個人習慣,喜歡一個項目一個工程文件夾就抽離一下)。

(4)先對工程文件進行編譯,看看有沒有錯誤,理論上官方默認狀態是無錯誤的。打開env再運行:

        pkgs --upgrade

        pkgs --update

        scons --target=mdk5

然后用keil打開工程,編譯0錯誤,0警告。准備工作完成。

二、獲取需要的軟件包

   rt-thread提供非常多的軟件包,主要任務就是怎么把軟件包利用起來。本次操作需要的軟件包:DHT22驅動、ESP8266驅動、MQTT軟件包、json軟件包,另外把oled屏驅動添加到工程。

1. 添加DHT22驅動

(1)DHT22與開發板連接,電源、地、數據就三根線,數據線我連接到開發板的GPIOB 9引腳上,需要查找一下GPIOB 9在rt-thread系統內對應的引腳號(打開drv_gpio.c文件,看到引腳列表pins[]可見對應編號為25),后面需要配置到menuconfig內。(注意:新版驅動去掉了pins[]列表,暫時不知道去哪里查找引腳對應的編號,可能需要在代碼內使用GET_PIN(B,9)獲取了)

(2)添加DHTxx驅動軟件包,工程目錄內打開env,執行menuconfig,開啟軟件包和例程,版本選擇最新,引腳號配置為25:

2. 添加oled顯示屏驅動

(1)在工程目錄內建立user_add_files文件夾,將后期用戶代碼都放在這個文件夾內。並在user_add_files文件夾內新建SConscript文件,內容如下(目的是scons時自動添加文件夾內的所有文件到工程):

  1.  
    import os
  2.  
    from building import *
  3.  
    objs = []
  4.  
    cwd = GetCurrentDir()
  5.  
    list = os.listdir(cwd)
  6.  
     
  7.  
    for item in list:
  8.  
    if os.path.isfile(os.path.join(cwd, item, 'SConscript')):
  9.  
    objs = objs + SConscript( os.path.join(item, 'SConscript'))
  10.  
    Return( 'objs')

(2)在user_add_files文件夾內新建oled_ssd1306_drv文件夾並新建對應的SConscript文件, oled驅動文件放到oled_ssd1306_drv文件夾:

SConscript文件內容:

  1.  
    from building import *
  2.  
    cwd = GetCurrentDir()
  3.  
    src = Glob( '*.c')
  4.  
    CPPPATH = [cwd]
  5.  
    group = DefineGroup( 'oled_ssd1306_drv', src, depend = [''], CPPPATH = CPPPATH)
  6.  
    Return('group')

 

(3)使用scons --target=mdk5重新構建工程,發現oled驅動已添加到工程:

(4)在main.c中添加測試代碼:

  1.  
    #include <rtthread.h>
  2.  
    #include <rtdevice.h>
  3.  
    #include <board.h>
  4.  
    #include "oled.h"
  5.  
    #include "dhtxx.h"
  6.  
    /* defined the LED1 pin: PB5 */
  7.  
    #define LED_G_PIN GET_PIN(B, 0)
  8.  
    #define LED_R_PIN GET_PIN(B, 1)
  9.  
    #define LED_B_PIN GET_PIN(B, 5)
  10.  
    int main(void)
  11.  
    {
  12.  
    /* set LED0 pin mode to output */
  13.  
    rt_pin_write(LED_R_PIN, PIN_LOW);
  14.  
    rt_pin_write(LED_G_PIN, PIN_LOW);
  15.  
    rt_pin_write(LED_B_PIN, PIN_LOW);
  16.  
    rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT);
  17.  
    rt_pin_mode(LED_G_PIN, PIN_MODE_OUTPUT);
  18.  
    rt_pin_mode(LED_B_PIN, PIN_MODE_OUTPUT);
  19.  
    dht_device_t sensor = dht_create(PKG_USING_DHTXX_SAMPLE_PIN);
  20.  
    oled_dev.display_on();
  21.  
    char disp_str[50];
  22.  
    for(;;)
  23.  
    {
  24.  
    rt_thread_mdelay( 3000);
  25.  
    if(dht_read(sensor))
  26.  
    {
  27.  
    rt_int32_t temp = dht_get_temperature(sensor);
  28.  
    rt_int32_t humi = dht_get_humidity(sensor);
  29.  
    rt_kprintf( "Temp: %d, Humi: %d\n", temp, humi);
  30.  
    rt_sprintf(disp_str, "Humi: %d.%d %%",humi/10,humi%10);
  31.  
    oled_dev.show_string( 0,4,(unsigned char *)disp_str,16,1);
  32.  
    rt_sprintf(disp_str, "Temp: %d.%d C",temp/10,temp%10);
  33.  
    oled_dev.show_string( 0,24,(unsigned char *)disp_str,16,1);
  34.  
    oled_dev.refresh();
  35.  
    }
  36.  
    else
  37.  
    {
  38.  
    rt_kprintf( "Read dht sensor failed.\n");
  39.  
    rt_pin_write(LED_R_PIN, PIN_HIGH);
  40.  
    }
  41.  
    }
  42.  
    return RT_EOK;
  43.  
    }

編譯燒錄運行:

 3. 添加ESP8266 WIFI模塊驅動

(1)stm32wb55芯片有兩個串口(lpuart1和uart1,正好一個做控制台、一個連接wifi模塊,配置時注意區分,我將lpuart1作為控制台,uart1連接wifi),在menuconfig下面路徑找到esp8266,開啟並根據實際情況配置wifi密碼和串口號:

(2)保存 --> pkgs --update --> scons --target=mdk5

(3)keil打開工程 --> 編譯 --> 燒錄 --> 運行,打開串口工具,查看信息,已經可以發現wifi正常連接上了。

4. 添加MQTT軟件包,當時有4個MQTT軟件包可選,哪個好用不了解,暫時選擇my mqtt。

利用軟件包自帶的sample進行測試,直接編譯燒錄,控制台輸入mqtt_start:

根據打印信息,可以看出已與服務器連接;之后發布一個消息試試,內容為hello!,由於例程已訂閱的默認主題和發布的默認主題相同,所以如果MQTT運行正常則發布的內容會被原樣接收到,測試如下,說明my mqtt軟件包初步運行正常。

5.因為需要使用json串傳輸數據,所以添加json軟件包。

三、在華為物聯網平台上創建產品

注冊華為雲賬號,在華為物聯網平台上創建產品、建立產品模型、創建設備,具體過程及傳輸的json字符串格式參見官方指導文件《MQTT設備快速接入》文檔:

(https://support.huaweicloud.com/qs-iothub/iot_05_0006.html)

我的產品截圖:

模型定義截圖(只添加溫度和濕度兩個屬性):

四、上傳溫度和濕度數據到華為雲

(1)根據my_mqtt軟件包自帶的sample例程的函數,稍作調整,用於上報數據,mqtt_start函數采用rtthread上電自動運行方式INIT_APP_EXPORT(mqtt_start)。

編寫數據上報函數(JSON串格式參見上面華為MQTT設備快速接入文檔):

  1.  
    /*
  2.  
    * 函數名稱:user_humiture_send_to_server
  3.  
    * 輸入參數:temp 溫度數據,單位0.1C
  4.  
    * humi 濕度數據,單位0.1%
  5.  
    * 返回數據:-1 發送失敗
  6.  
    * 0 發送成功
  7.  
    */
  8.  
    int8_t user_humiture_send_to_server(int temp,int humi)
  9.  
    {
  10.  
    cJSON *root_prop;
  11.  
    cJSON *root_serv;
  12.  
    cJSON *array_serv;
  13.  
    cJSON *root;
  14.  
    char *cjson_str = NULL;
  15.  
    //檢查mqtt連接狀態
  16.  
    if(paho_mqtt_is_connected(&client) == 0) return -1;
  17.  
    //生成json字符串
  18.  
    root_prop = cJSON_CreateObject();
  19.  
    cJSON_AddNumberToObject(root_prop, "humidity", (humi/10) + 0.1 * (humi%10));
  20.  
    cJSON_AddNumberToObject(root_prop, "temperature", (temp/10) + 0.1 * (temp%10));
  21.  
    //
  22.  
    root_serv = cJSON_CreateObject();
  23.  
    cJSON_AddStringToObject(root_serv, "service_id", "humiture");
  24.  
    cJSON_AddItemToObject(root_serv, "properties", root_prop);
  25.  
    cJSON_AddStringToObject(root_serv, "event_time", "NULL"); //"20201207T002920Z"
  26.  
    //
  27.  
    array_serv = cJSON_CreateArray();
  28.  
    cJSON_AddItemToArray(array_serv,root_serv);
  29.  
    //
  30.  
    root = cJSON_CreateObject();
  31.  
    cJSON_AddItemToObject(root, "services", array_serv);
  32.  
    //發布數據
  33.  
    cjson_str = cJSON_PrintUnformatted(root);
  34.  
    mqtt_publish(cjson_str);
  35.  
    //釋放內存
  36.  
    cJSON_Delete(root);
  37.  
    cJSON_free(cjson_str);
  38.  
    return 0;
  39.  
    }

 

(2)在main函數內調用數據上報函數,具體見后面我的實驗工程代碼,編譯燒寫運行程序;登錄華為雲查看設備狀態為在線,可見雲端已收到數據:

(3)數據上報華為雲初步測試成功,我的測試工程代碼:

鏈接:https://pan.baidu.com/s/10I-BtE3UVGmxp7F2TpNxHA

提取碼:38sr


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM