NB-IOT 溫溼度資料上報及IOT平臺數據下發(STM32L4,電信Oceanconnect, COAP協議)
阿新 • • 發佈:2019-02-16
在裝置側,智慧裝置採用了NB-IOT晶片,它和中國電信物聯網開放平臺之間通過CoAP協議通訊。CoAP報文的payload裡是裝置的應用資料。
應用server通過http/https協議和平臺通訊,通過呼叫平臺的開放API來控制裝置,平臺把裝置上報的資料推送給應用伺服器。平臺支援對裝置資料進行協議解析,轉換成標準的json格式資料。
圖1 組網圖
應用功能很簡單,溫溼度資料上報,主要通過低功耗STM32L系列MCU通過COAP上報感測器資料,其中,電信雲的profile及外掛開發如下:
通過檢測端注網,COAP 傳送資料:
void CDP_Init(void)//COAP伺服器配置初始化 { printf("AT\r\n"); Delay(300); strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK Clear_Buffer(); while(strx==NULL) { Clear_Buffer(); printf("AT\r\n"); Delay(300); strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK } BC95_Status.netstatus=1;//閃爍沒註冊網路 printf("AT+NBAND?\r\n");//獲取頻段號 Delay(300); strx=strstr((const char*)RxBuffer,(const char*)"+NBAND:5");//返回5 電信 返回8是移動 Clear_Buffer(); while(strx==NULL) { Clear_Buffer(); printf("AT+NBAND?\r\n");//獲取頻段號 Delay(300); strx=strstr((const char*)RxBuffer,(const char*)"+NBAND:8");//返回OK } printf("AT+CIMI\r\n");//獲取卡號,類似是否存在卡的意思,比較重要。 Delay(300); strx=strstr((const char*)RxBuffer,(const char*)"46011");//返46011 Clear_Buffer(); while(strx==NULL) { Clear_Buffer(); printf("AT+CIMI\r\n");//獲取卡號,類似是否存在卡的意思,比較重要。 Delay(300); strx=strstr((const char*)RxBuffer,(const char*)"46011");//返回OK,說明卡是存在的 } printf("AT+CFUN=0\r\n");//關閉射頻 Delay(300); strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK while(strx==NULL) { strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK } Clear_Buffer(); printf("AT+NCDP=180.101.147.115,5683\r\n");//配置CDP伺服器地址電信平臺的 Delay(300); strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK while(strx==NULL) { strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK } Clear_Buffer(); printf("AT+NRB\r\n");//對模組進行重啟 Delay(2000); //延時2s printf("AT+CIMI\r\n");//獲取卡號,確認模組重啟正常 Delay(300); strx=strstr((const char*)RxBuffer,(const char*)"46011");//返46011 Clear_Buffer(); while(strx==NULL) { Clear_Buffer(); printf("AT+CIMI\r\n");//獲取卡號,確認模組重啟正常 Delay(300); strx=strstr((const char*)RxBuffer,(const char*)"46011");//返回OK,說明卡是存在的 } }
void BC95_SendCOAPdata(uint8_t *len,uint8_t *data) { printf("AT+NMGS=%s,%s\r\n",len,data);//傳送COAP資料 Delay(300); strx=strstr((const char*)RxBuffer,(const char*)"OK");//返回OK if(strx)//表明傳送正確,平臺收到資料 { Uart1_SendStr("SEND DATA OK!\r\n"); Clear_Buffer(); } else//如果返回error 一般是第一次與平臺握手問題或者是CDP伺服器配置問題。使用者可以查詢下 AT+NMSTATUS? 列印到顯示端進行檢視 { printf("AT+NMSTATUS?\r\n");//判斷當前模組與平臺之間的連線關係,一般未發資料之前都是INIITIALISED,如果正常傳送到資料到平臺之後是MO_DATA_ENABLED Delay(300); strx=strstr((const char*)RxBuffer,(const char*)"+NMSTATUS:MO_DATA_ENABLED");//檢視是否返回是這個資料, if(strx) { Uart1_SendStr("Connect OK!\r\n"); //表明連線上正常的,待下次再發資料就可以了 } Clear_Buffer(); //列印平臺的返回值 } Clear_Buffer(); }
登入電信Oceanconnect: https://180.101.147.208:8093(通過微信申請賬號),可以看到監測到的資料,並實時重新整理: