1. 程式人生 > >NB-IOT 溫溼度資料上報及IOT平臺數據下發(STM32L4,電信Oceanconnect, COAP協議)

NB-IOT 溫溼度資料上報及IOT平臺數據下發(STM32L4,電信Oceanconnect, COAP協議)

在裝置側,智慧裝置採用了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(通過微信申請賬號),可以看到監測到的資料,並實時重新整理: