一、簡述
麒麟座開發板代碼例程由OneNET-基礎例程、OneNET-進階例程、OneNET-RTOS例程組成,由淺入深地演示如何接入OneNET,從最基本的上傳數據點,命令接收處理,到網絡維持,平臺連接維持,到最后的網絡錯誤處理,一步一步演示如何處理這些事情。
下面先以OneNET-基礎例程為例,講解如何接入OneNET。
二、OneNET-基礎例程模塊分析
1. 代碼框架說明
2. 代碼功能簡述
演示如何接入OneNET,如何處理OneNET推送的數據。
不具備網絡維持能力,掉網后無法處理。
3. 初始化開發板外圍硬件-Hardware_Init()函數
根據不同功能所需要用到的外圍硬件不同,可根據自己使用的例程查看相應的硬件驅動代碼,這里以為例說明
麒麟座使用的STM32F103RET6單片機,mini板使用STM32F103C8T6單片機,都是F1系列,編程方式完全一致。
-
先配置單片機的中斷分組,采用2:2配置;
-
然后初始化systick用來做阻塞延時;
-
然后初始化串口1和串口2,串口1用來調試打印,串口2和網絡模組通信;
-
然后就是初始化LED,蜂鳴器,按鍵,主要就是GPIO的配置;
-
最后打印一下,提示硬件初始化完成。
4. 初始化網絡模組-ESP8266_Init()函數
WIFI模組的初始化比較簡單:
-
先初始化相關控制的GPIO。
-
然后先發送AT,測試通信是否OK。
-
然后就是設置WIFI工作模式、登錄路由、連接IP。
-
如果是GSM模組,前兩步相同,初始化控制GPIO、發送AT測試通信。然后是注冊、激活網絡、連接IP。
5.登錄OneNET -OneNet_DevLink()函數
主要流程就是獲取登錄數據,然后發送出去,等待返回。
獲取登錄數據:
EDP_PacketConnect1(DEVID, APIKEY,256, &edpPacket)
根據devid和apikey通過sdk生成登錄數據,保存在edpPacket里邊。
發送:
ESP8266_SendData(edpPacket._data,edpPacket._len);
指明要發送的數據和長度即可,調用此函數就會發送到OneNET接入機。
等待結果
ESP8266_GetIPD(250):從硬件層判斷時間是否收到
EDP_UnPacketRecv(dataPtr) ==CONNRESP:
EDP_UnPacketConnectRsp(dataPtr):
從軟件層解析是否接入成功。
6. 執行相關上下行數據處理
上行數據
執行OneNet_SendData()函數,會調用相關上傳功能。
166行,是封裝一個json,把要上傳的內容寫在里邊
170行,根據devid、json格式和json封裝協議包
175行,將協議包上傳。
簡單看看166行的內容
其中led_status.xxx,就是我們要上傳的數據,按照json格式寫好即可,如果新增數據點,復制高亮三行的任意一行加以擴展,然后把箭頭的buf緩存開大一點即可。
下行數據
先判斷驅動層是否收到數據,有則調用OneNet_Re**taPtr)函數解析相關功能。
判斷是否是下發命令,是則回復這個命令,然后做相關命令的處理
三、OneNET-RTOS例程模塊分析
1. 代碼框架說明
-
初始化開發板外圍硬件;如LED、蜂鳴器、按鍵等。
-
初始化網絡模組;開發板板載GSM模組-M6312,可插拔的WIFI-ESP8266-01模組。
-
登錄OneNET。
-
執行相關上下行數據處理。
-
網絡維持,網絡監測、錯誤處理。
2.代碼功能簡述
完整的開發板功能體驗,所有傳感器數據均上傳,并包含一些監測類變量;完備的網絡維持、監測、錯誤處理機制。
后文以與OneNET通訊、網絡監測、錯誤處理為重點進行分析。
3.初始化開發板外圍硬件-Hardware_Init()函數--main.c
基本流程和基礎例程類似,初始化板載硬件,單片機片內外設等。
這里多了一個功能,將登陸的devid和apikey保存在eeprom里邊,可以通過串口1按照資料中的格式進行更改而無需重新下載代碼。
4.初始化網絡模組- NET_DEVICE_Init ()函數--net_task.c
這個函數不連接具體的ip,僅僅只是讓網絡模組具備網絡接入能力即可。
5. 登錄OneNET- -net_task.c
OneNET_GetLinkIP:獲取該協議當前資源最優的接入ip和port。
OneNET_ConnectIP:連接ip和port。
OneNET_DevLink:根據devid和apikey 或者 proid和auth_info登錄OneNET設備。
6.執行相關上下行數據處理--net_task.c
上行數據
在net_task.c-- NET_**_Task任務里,紅框處,是定時上傳的內容,這個任務以50ms周期執行一次,當累計300次-約15s時,可自行更改,觸發一次上傳數據的標志,箭頭所指處。
然后在net_task.c--DATA_P_Task任務里判斷到標志置位,執行OneNET_SendData(…)函數根據當前的data_stream值去打包一個待上傳的數據包,但此時并不上傳,而是放入一個單向鏈表里,原因稍后分析,如果上傳成功,則返回值會改變onenet_info.send_data的值,如果錯誤,則會間隔一段時間后繼續回來打包數據。
最終將數據發送出去的的是net_task.c--DATA_S_Task任務判斷表頭是否為空,且網絡連接正常,然后獲取表里數據和對應長度,吧數據發往OneNET。
簡單說一下,為什么上傳一包數據,分了三個步驟(觸發、打包、發送),因為這樣可以在其他地方方便地上傳數據,只需要改變一個變量值即可,而不用調用復雜的打包、發送函數,對函數堆棧要求降低很多;然后發送作為一個單獨的任務是為了網絡模組穩定性,wifi和gsm發送數據的時間間隔不同,wifi可以快一點,當短時間內有很多包大小不同的數據包待上傳時,發送必須要穩定,所以OneNET_SendData(…)只是打包放入鏈表,發送函數以一個穩定的時間間隔來一包包的發出去。
下行數據
在net_task.c-- RECV_Task任務里邊,只有一個函數OneNET_CmdHandle
先是調用NET_DEVICE_Read()函數判斷驅動層是否收到數據。
然后調用NET_DEVICE_GetIPD(dataPtr)判斷是否具有IPD頭,這里說明一下,在絕大多數網絡模組里,在指令模式下,如果收到一幀網絡數據,則會以IPD標識(不同網絡模組這個頭可能不一樣),如果帶有IPD頭,則說明收到OneNET推來的數據,進入OneNET_RevPro(ipdPtr)函數進行處理。
處理函數里邊先通過EDP_UnPacketRecv(cmd)判斷推送數據的類型,以EDP為例,有連接響應、命令下發、數據轉發、心跳回復等,然后各自處理即可。
最后具體說說命令下發的處理機制。
先調用EDP_UnPacketCmd(…)函數解析出uuid、uudi長度、命令、命令長度。
然后是調用EDP_PacketCmdResp(…)函數打包命令回復的內容。
然后是調用CALLBACK_Execute(...)函數處理命令,在cmd_callback.c里邊可以找到處理的過程
調用CALLBACK_Find_CallBack(…)找到紅框處XXX的內容,這是是命令體,后邊YYY是命令值,后邊會用到
然后根據命令體對應的回調函數,執行響應的動作,比如redled,
調用CALLBACK_Find_Value(…)函數找到命令參數YYY
調用CALLBACK_Str2Dec(…)函數轉為數值形式,方便執行開關處理。
大家在添加自己的命令和處理內容的時候添加兩個地方
命令體和命令回調對應表
然后編寫命令回調函數即可。
繼續回到下行數據處理上來,處理完命令之后,就是釋放相關內存,然后調用NET_DEVICE_AddDataSendList(…)函數吧命令回復的內容加入鏈表,最后置位一下onenet_info.send_data上傳一次數據,以更新OneNET設備上的數據。
7. 網絡維持—net_task.c
在NET_**_Task任務里邊,和數據上傳一樣的流程,定時發送心跳,然后等待心跳返回正確的結果,以此判斷網絡是否通暢
同樣的,在DATA_P_Task任務里邊調用OneNET_SendData_Heart()函數打包心跳數據并清除心跳標志,在DATA_S_Task任務里真正發送出去,在OneNET_RevPro()函數里邊解析心跳數據,收到則置位心跳標志,然后在OneNET_Check_Heart()來檢測心跳標志。
如果在規定時間內檢測不到心跳標志,則會檢測當前模組狀態,根據狀態分配錯誤等級,然后會進入相關錯誤處理。
8. 網絡監測、錯誤處理
7中說到,心跳標志檢測不到,會進入錯誤處理,先看看錯誤等級處理都干了什么:
fault.c--NET_Fault_Process
將相關標志位清零,在任務里邊檢查到標志位變化,會執行對應功能,錯誤等級為1,只是負責重新連接一下ip。
錯誤等級2就是走初始化流程,去重新初始化一下網絡模組了。
錯誤等級3是復位網絡模組。
錯誤等級4是給網絡模組斷電后,等待一會,再打開。
那么錯誤等級如何確定,下面一一截圖說明
NET_FAULT_LEVEL_1的場景:
net_task.c--OS_TimerCallBack
在網絡定時檢測回調里,發送數據未得到回應次數超過規定次數時。
onenet.c--OneNET_CmdHandle
當收到網絡模組返回的連接關閉提示時。
onenet.c-- OneNET_Check_Heart
心跳標志接收超時,且網絡模組具備網絡能力時。
NET_FAULT_LEVEL_3的場景:
錯誤2和3通暢搭配使用,在重新初始化之前,先復位一下。
net_task.c--OS_TimerCallBack
當網絡斷開超過規定時間時。
onenet.c-- OneNET_Check_Heart
心跳標志接收超時,且網絡模組不具備網絡能力時。
fault.c
在錯誤等級1下,在規定次數內還未連接成功時。
可以看到,在例程里邊有很多地方都在保障網絡的通暢性,一旦發生網絡錯誤,則會根據響應狀態制定錯誤處理,爭取用最高效的方式重新接入OneNET。
-
物聯網
+關注
關注
2909文章
44560瀏覽量
372800 -
開發板
+關注
關注
25文章
5032瀏覽量
97375 -
麒麟
+關注
關注
1文章
223瀏覽量
13643 -
OneNET
+關注
關注
1文章
51瀏覽量
12800 -
中移物聯網
+關注
關注
0文章
27瀏覽量
4843
原文標題:中移物聯網麒麟座開發板代碼模塊分析
文章出處:【微信號:雨飛工作室,微信公眾號:雨飛工作室】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論