1. 程式人生 > >全國高校物聯網應用創新大賽--挑戰賽總結

全國高校物聯網應用創新大賽--挑戰賽總結

歷時一週,終於完成了題目!可喜可賀,在這記錄下我崩潰的心情!


這期間的辛酸真是不能言說!

A題是在50個節點中燒錄幾個源節點。通過源節點給一個目標節點發送資訊。目標節點把收到的資訊打印出來!

好吧 首先這道題很簡單,把這些節點分成三種情況,1源節點 2目的節點 3中間結點。分別實現1傳送資料包 2接受並轉發資料包 3接受並列印資料包。

由此分析:(源節點不需要自己寫程式碼 賽方提供!)在收到資料包的時候 判斷一下資料包裡的 源位和目的位 然後分別實現轉存 轉發 列印就好了。

不過還是遇到了坑(後面再說)

B題是50個節點 燒錄同一份程式碼,0,1節點分別把其中最大的10個和最小的10個打印出來。

這個題就比較有意思了。首先,源節點不能一下子就把所有節點收到,因為節點功率只能是一。其次傳送的資料包大小有限制(50個節點 (除了0,1)隨機編號0~255  )那麼就不能把所有節點都儲存到訊息裡。(8位*48個節點)這樣就太大了  當然之前根本就不知道這個事情 我在把所有節點都儲存在訊息裡面之後 自以為一切正常,並且測試時候竟然接收不到資料,並且重新敲了3遍程式碼,梳理了3遍邏輯 逐步debug之後才意識到這個問題(這也是遇到的最大的坑)

剛剛的坑解決之後 又陷入了困境。既然不能把所有節點都儲存到訊息之中,那麼我就只儲存最大的10個 和最小的10個吧。可是什麼時候終止(即怎麼判斷 我找到的就是其中的最大10個和最小的10個呢?!)就想在訊息中加一個標誌 記錄一共找到了多少個節點。然而,這又遇到了一個坑(具體就不詳細寫了)如果同樣的一個數據包 是不是會有可能被同一個節點接收多次呢?這樣那個標誌位就一定是不準確的了!

最終用了取巧的辦法!我把訊息格式改變為 一次傳送10個節點的資訊,加一個記錄儲存了節點數量的標誌位。我把接收到的節點都儲存到本地。這樣,在每接收到一條資料,看看我本地裡是不是都存在過,如果都存在過,那麼就直接輪番傳送我儲存過的節點資訊就好,如果有我這裡沒有接收過的 我就把它加到本地,在輪番傳送本地儲存的就好了。然而這樣也會存在一個問題,我用的肯定是一個全域性的變數,而且傳送資料和接收資料是並行的,那麼就有可能出現(正在傳送),(正在接收),都是共享本地儲存的節點資訊 ! 那麼我在修改的時候,極有可能把我沒修改完的發走了,也就是同步和非同步的問題,於是我又加了一個標誌位(解決這個問題,具體也不詳細寫了。)。

明天還要水一波藍橋杯!那麼去看程式碼了。祝我有個好成績吧。

最後要來一句。。。競賽舉辦方,你們的裝置,軟體,真的太水了,我們根本沒辦法進行測試!能想象到幾十個節點,自己一個一個的插上 燒程式碼 拔下 換另一個 然後重複此動作N多次的絕望心情麼???!!!神坑!!!