NBIOT 移远BC28模块+stm32开发板例程、教程(打通TCP、COAP协议)
生活随笔
收集整理的這篇文章主要介紹了
NBIOT 移远BC28模块+stm32开发板例程、教程(打通TCP、COAP协议)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為了開發者能夠快速入門BC28的開發,加快開發者的項目進度,開發出此款針對BC28的stm32開發板和完善的發送網絡數據的示例程序(TCP協議、COAP協議),程序流程邏輯清楚,注釋完善,上手就可以玩轉開發自己的BC28應用程序。
MUC使用STM32L051C8T6型號。這款型號小巧靈活,特別適合用作為產品開發的型號,價格相對偏低同時又可以滿足產品開發需求。我們的板子上使用stm32的低功耗串口(DMA傳輸)和BC28通信,有32.768kHz的RTC外部晶振,同時有一些常見的傳感器和蜂鳴器、LED指示燈可以提示程序運行狀態。預留出一路串口和很多IO口作為開發者擴展應用。使用SWD下載接口,支持STlink、Jlink下載調試工具。
大白為開發者提供680mA的可充電鋰電池,電池上自帶充電和短路保護電路,同時stm32板子上已經做好了電池的充放電管理程序。
1、供電說明:
在接入電池后,系統不會自動開機,需要短按key1(S1)按鍵才會開機。
在不接入電池時,可以直接用stm32板的MicroUSB線供電,插入MicroUSB線后,系統會自動上電開機。
2、開關機邏輯:
??開機:短按key1(S1)按鍵,系統會開機,蜂鳴器會響0.3s,5個LED燈全亮0.3s,隨后系統運行指示燈LED1以1Hz的頻率閃爍
??關機:長按key1(S1)按鍵1s以上,蜂鳴器會響1s左右,蜂鳴器鳴響結束后松開key1(S1)按鍵,系統會自動關機
3、電池管理任務:
??充電:充電的時候電量指示燈LED5會1s閃爍一次,充滿電后LED5常亮并且蜂鳴器鳴響5次提示
??放電:放電的時候
?????? 電池電量 >= 10% : LED5熄滅
??? 7% <= 電池電量 < 10%? : LED5以5Hz頻率閃爍,并且蜂鳴器以5Hz頻率報警
?????? 電池電量 < 7%?? : 蜂鳴器響1s后自動關機
4、傳感器:
?光敏:當g_lightValue > 700時(光線越暗g_lightValue數值越大),蜂鳴器響
?溫度:當溫度值g_Sht20Temp > 31攝氏度時(g_Sht20Temp的數值就是表示實際的溫度),蜂鳴器響
?濕度:當濕度值g_Sht20RH > 70時(濕度越大g_Sht20RH的數值就越大),蜂鳴器響
5、按鍵和燈接口:
?key4(S4)按鍵是MCU的復位按鍵。
?key1(S1)、key2(S2)、key3(S3)都可以作為MCU的按鍵輸入接口來使用
?當key2(S2)、key3(S3)不作為MCU的按鍵接口使用時,可當作普通的IO口來使用
?
?LED5作為電池電量和充電相關的指示燈,請勿用這個燈作為其他狀態的指示
?LED1、LED2、LED3、LED4用戶可以用來自定義狀態指示燈。
?當LED1、LED2、LED3、LED4不作為MCU的LED燈接口來使用時,可以當作普通的IO口來使用
6、TCP網絡連接:
?本例程提供的是:使用AT指令,讓BC28通過TCP協議連接大白的測試服務器,發送數據,
?服務器收到后返回發送出去的數據。
?網絡傳輸數據操作步驟:
?1、BC28核心板插入NB物聯網卡,核心板插入STM32板底座。
?2、插入STM32板的MicroUSB線,電腦打開串口助手,選擇這個USB的串口號和波特率(115200bps),
?打開此串口,這個串口可以看到單片機向BC28核心板發送的數據和核心板返回的數據。
?3、系統開機后,短按一下key1(S1)按鍵,
??程序會自動初始化BC28模塊,并且自動進行以下流程的操作:
??(1)、讀取sim卡信息。?
????命令:AT+CIMI
??(2)、查看網絡附著狀態,如果沒有網絡信號,會每秒鐘自動查看網絡狀態,連續查看十次。
????命令:AT+CGATT?
??(3)、如果入網成功,下一步會自動查看信號強度。
????命令:AT+CSQ
??(4)、查看信號質量沒問題后,開始創建TCP Socket。
????命令:AT+NSOCR=STREAM,6,56000,1
??(5)、連接大白自己搭建的TCP服務器。
????命令:AT+NSOCO=1,123.206.108.227,9099
??(6)、發送TCP數據。? ???
????命令:AT+NSOSD=1,9,4461426169494F5400? ("DaBaiIOT"字符串的十六進制顯示為:4461426169494F5400)
??(7)、讀取發送的數據。
????命令:AT+NSORF=1,9
??(8)、關閉TCP連接。
???? 命令:AT+NSOCL=1 7、基于coap協議的網絡連接: 我們的Coap示例連接的是華為IOT平臺。 小貼士:華為的IOP平臺連接之前,需要將移遠模塊屏蔽罩上印的IMEI號綁定到華為的IOT平臺,平臺才會接收模塊發過來的數據。
????我們默認發貨都是幫親們綁定好的,并且測試沒問題的。
????
????1、在DaBai_rtc.c文件中的HAL_RTC_AlarmAEventCallback函數里設置了每隔10分鐘發送一次coap數據到IOT平臺。
????數據格式為:
?數據???? m_batVol? m_temp??? mRH?????? m_light?? m_longitude?? m_latitude?? g_USB_insert? Reserve
?數據類型? Uint8_t?? Int16_t?? Int16_t?? Uint16_t? Uint32_t????? Uint32_t???? Uint8_t?????? Uint8_t
?
?系統開機后,會自動建立coap的連接,然后每隔10分鐘上傳一次板子上的傳感器數據。
?(注意:剛開機的時候信號不是很穩定,需要等待幾十秒后才可能有信號,注冊到網絡。) 數據是上傳到華為的IOT平臺上的,大白在華為的IOT平臺上獲取到板子上的傳感器數據后,做了一個上位機軟件將傳感器信息描繪成實時變化的曲線。 下圖為stm32的microUSB接口上實時顯示單片機的串口操作和BC28的串口回復: 電池電量和溫度的實時變化曲線: 開發板詳細介紹點擊打開鏈接 下面是大白開發的主程序流程: [cpp]?view plain?copy<code?class="language-cpp">int?main(void)?? {?? ????static??uint32_t?start_tick?=?0;?? ????static?uint32_t?cur_tick?=?0;?? ??? ??HAL_Init();?? ??SystemClock_Config();?? ????MX_TIM_Init();?? ????MX_GPIO_Init();?? ????MX_I2C2_Init();?? ????MX_ADC_Init();?? ????MX_USART1_UART_Init();?? ????MX_LPUART1_UART_Init();?? ????MX_RTC_Init();?? ?????? ????NBModule_open(&nb_config);?? ??//APP_STATE?=?NB_NONE;?? ????APP_STATE?=?NB_CoAP_SEVER;?? ????start_tick?=?HAL_GetTick();?? ????while((HAL_GetTick()-?start_tick)?<300)?? ????{?? ????????//?power?on?beep?remind?? ????}?? ??????/*?Configure?RTC?Alarm?*/?? ??RTC_AlarmConfig();?? ?????? ????LED1_OFF;?? ????LED2_OFF;?? ????LED3_OFF;?? ????LED4_OFF;?? ????CHG_LED5_OFF;?? ????printf("\r\nDaBai?Init?OK?\r\n");?? ?????? ??/*?Infinite?loop?*/?? ??while?(1)?? ??{??? ????????HAL_UART_Poll();?? ????????NBModule_Main(&nb_config);?? ????MX_TimerPoll();?? ?????????? ????????if(g_TaskTime10ms?>?TASKTIME_10MS)?? ????????{?? ????????????g_TaskTime10ms?=?0;?? ????????????DaBai_10msTask();?? ????????}?? ????????if(g_TaskTime100ms?>?TASKTIME_100MS)?? ????????{?? ????????????g_TaskTime100ms?=?0;?? ????????????DaBai_100msTask();?? ????????}?? ?????????? ????????if(g_TaskTime500ms?>?TASKTIME_500MS)?? ????????{?? ????????????g_TaskTime500ms?=?0;?? ????????????g_BeepFreq?=?0;?? ????????????DaBai_500msTask();?? ????????}?? ????????if(g_TaskTime1000ms?>?TASKTIME_1000MS)?? ????????{?? ????????????g_TaskTime1000ms?=?0;?? ????????????DaBai_1000msTask();?? ?????????????//RTC_TimeShow(aShowTime);?? ????????}?? ????????if(g_TaskTime1min?>?TASKTIME_1MIN)?? ????????{?? ????????????g_TaskTime1min?=?0;?? ????????????//DaBai_1MinTask();?? ????????}?? ?????????? ????????if(g_TaskTime10min?>?TASKTIME_10MIN)?? ????????{?? ????????????g_TaskTime10min?=?0;?? ????????????//DaBai_10MinTask();?? ????????}?? ????????if(g_RTCAlarmFlag?==?1)?? ????????{?? ????????????g_RTCAlarmFlag?=?0;?? ????????????APP_STATE?=?NB_CoAP_ST;?? ????????}?? ????????switch(APP_STATE)?? ????{?? ????case?NB_NONE:?? ??????{?? ?????????? ??????}?? ??????break;?? ????case?NB_INIT:?? ??????{?? ????????printf("\r\n<----BC28?Init---->\r\n");?? ????????NBModule_Init(&nb_config);?? ????????APP_STATE?=?NB_END;?? ??????}?? ??????break;?? ????case?NB_SIGN:?? ??????{?? ?????????printf("\r\n<----BC28?get?signal---->\r\n");?? ?????????NBModule_Sign(&nb_config);?? ?????????APP_STATE?=?NB_END;?? ??????}?? ??????break;?? ????case?NB_MODULE:?? ??????{?? ????????printf("\r\n<----Module?info?---->\r\n");?? ????????NBModule_Info(&nb_config);?? ????????APP_STATE?=?NB_END;?? ??????}?? ??????break;?? ????case?NB_TCP_CR:?? ??????{?? ????????printf("\r\n<----Create?tcp?---->\r\n");?? ????????NBModule_CreateTCP(&nb_config);?? ????????APP_STATE?=?NB_END;?? ??????}?? ??????break;?? ????case?NB_TCP_CL:?? ??????{?? ????????printf("\r\n<----Close?tcp?---->\r\n");?? ????????NBModule_CloseTCP(&nb_config);?? ????????APP_STATE?=?NB_END;?? ??????}?? ??????break;?? ????case?NB_TCP_CNT:?? ??????{?? ????????printf("\r\n<----?Connect?tcp?---->\r\n");?? ????????NBModule_ConnectTcp(&nb_config);?? ?????????? ????????APP_STATE?=?NB_END;?? ??????}?? ??????break;?? ????????case?NB_TCP_ST:?? ??????{?? ????????printf("\r\n<----?Send?tcp?---->\r\n");?? ????????char*?userPacket?=?"DaBaiIOT";?? ????????NBModule_SendTcpData(&nb_config,sizeof("DaBaiIOT"),userPacket);?? ?????????? ????????APP_STATE?=?NB_END;?? ??????}?? ??????break;?? ????case?NB_TCP_RE:?? ??????{?? ????????//do?nothing?? ????????APP_STATE?=?NB_END;??? ??????}?? ??????break;?? ????????case?NB_CoAP_SEVER:?? ????????????{?? ????????????????printf("\r\n<----?CoAP?Server?set?---->\r\n");?? ????????????????NBModule_CoAPServer(&nb_config,1,NULL);?? ????????????????APP_STATE?=?NB_END;?? ????????????}?? ????????break;?? ????case?NB_CoAP_ST:?? ??????{?? ????????????????uint8_t??m_batVol;?? ????????????????int16_t?m_temp,m_RH;?? ????????????????uint16_t?m_light;?? ????????????????uint32_t?m_longitude,m_latitude;?? ?????????????????? ????????????????m_batVol?=?g_BatVoltage;?? ????????????????m_temp?=?(int16_t)g_Sht20Temp;?? ????????????????m_RH???=?(int16_t)g_Sht20RH;?? ????????????????m_light?=?g_lightValue;?? ????????????????m_longitude?=?(uint32_t)g_longitude*1000000;?? ????????????????m_latitude??=?(uint32_t)g_latitude*1000000;??? ?????????????????? //??????????????m_batVol?=?1;?? //??????????????m_temp?=?-2;?? //??????????????m_RH???=?0x03;?? //??????????????m_light?=?0x04;?? //??????????????m_longitude?=?0x05;?? //??????????????m_latitude??=?0x06;?? ?????????????????? ????????????????userPacket[0]?=?m_batVol;?? ????????????????Fill_int16_To_int8(m_temp,&userPacket[1],&userPacket[2]);?? ????????????????Fill_int16_To_int8(m_RH,&userPacket[3],&userPacket[4]);?? ????????????????Fill_u16_To_u8(m_light,&userPacket[5],&userPacket[6]);?? ????????????????Fill_u32_To_u8(m_longitude,&userPacket[7],&userPacket[8],&userPacket[9],&userPacket[10]);?? ????????????????Fill_u32_To_u8(m_latitude,&userPacket[11],&userPacket[12],&userPacket[13],&userPacket[14]);??????? ????????????????userPacket[15]?=????g_USB_insert;?? ?????????????? ????????????????bc95_coapSendMsg(&nb_config,sizeof(userPacket),userPacket);?? ????????APP_STATE?=?NB_END;?? ??????}?? ??????break;?? ????case?NB_CoAP_RE:?? ??????{?? ?????????? ??????}?? ??????break;?? ????default:?? ??????{?? ?????????? ??????}?? ??????break;?? ????}?? ?????????? ????????SetBeepFreq(g_BeepFreq);?? ?? ??}?? ?????? }</code>
在接入電池后,系統不會自動開機,需要短按key1(S1)按鍵才會開機。
在不接入電池時,可以直接用stm32板的MicroUSB線供電,插入MicroUSB線后,系統會自動上電開機。
2、開關機邏輯:
??開機:短按key1(S1)按鍵,系統會開機,蜂鳴器會響0.3s,5個LED燈全亮0.3s,隨后系統運行指示燈LED1以1Hz的頻率閃爍
??關機:長按key1(S1)按鍵1s以上,蜂鳴器會響1s左右,蜂鳴器鳴響結束后松開key1(S1)按鍵,系統會自動關機
3、電池管理任務:
??充電:充電的時候電量指示燈LED5會1s閃爍一次,充滿電后LED5常亮并且蜂鳴器鳴響5次提示
??放電:放電的時候
?????? 電池電量 >= 10% : LED5熄滅
??? 7% <= 電池電量 < 10%? : LED5以5Hz頻率閃爍,并且蜂鳴器以5Hz頻率報警
?????? 電池電量 < 7%?? : 蜂鳴器響1s后自動關機
4、傳感器:
?光敏:當g_lightValue > 700時(光線越暗g_lightValue數值越大),蜂鳴器響
?溫度:當溫度值g_Sht20Temp > 31攝氏度時(g_Sht20Temp的數值就是表示實際的溫度),蜂鳴器響
?濕度:當濕度值g_Sht20RH > 70時(濕度越大g_Sht20RH的數值就越大),蜂鳴器響
5、按鍵和燈接口:
?key4(S4)按鍵是MCU的復位按鍵。
?key1(S1)、key2(S2)、key3(S3)都可以作為MCU的按鍵輸入接口來使用
?當key2(S2)、key3(S3)不作為MCU的按鍵接口使用時,可當作普通的IO口來使用
?
?LED5作為電池電量和充電相關的指示燈,請勿用這個燈作為其他狀態的指示
?LED1、LED2、LED3、LED4用戶可以用來自定義狀態指示燈。
?當LED1、LED2、LED3、LED4不作為MCU的LED燈接口來使用時,可以當作普通的IO口來使用
6、TCP網絡連接:
?本例程提供的是:使用AT指令,讓BC28通過TCP協議連接大白的測試服務器,發送數據,
?服務器收到后返回發送出去的數據。
?網絡傳輸數據操作步驟:
?1、BC28核心板插入NB物聯網卡,核心板插入STM32板底座。
?2、插入STM32板的MicroUSB線,電腦打開串口助手,選擇這個USB的串口號和波特率(115200bps),
?打開此串口,這個串口可以看到單片機向BC28核心板發送的數據和核心板返回的數據。
?3、系統開機后,短按一下key1(S1)按鍵,
??程序會自動初始化BC28模塊,并且自動進行以下流程的操作:
??(1)、讀取sim卡信息。?
????命令:AT+CIMI
??(2)、查看網絡附著狀態,如果沒有網絡信號,會每秒鐘自動查看網絡狀態,連續查看十次。
????命令:AT+CGATT?
??(3)、如果入網成功,下一步會自動查看信號強度。
????命令:AT+CSQ
??(4)、查看信號質量沒問題后,開始創建TCP Socket。
????命令:AT+NSOCR=STREAM,6,56000,1
??(5)、連接大白自己搭建的TCP服務器。
????命令:AT+NSOCO=1,123.206.108.227,9099
??(6)、發送TCP數據。? ???
????命令:AT+NSOSD=1,9,4461426169494F5400? ("DaBaiIOT"字符串的十六進制顯示為:4461426169494F5400)
??(7)、讀取發送的數據。
????命令:AT+NSORF=1,9
??(8)、關閉TCP連接。
???? 命令:AT+NSOCL=1 7、基于coap協議的網絡連接: 我們的Coap示例連接的是華為IOT平臺。 小貼士:華為的IOP平臺連接之前,需要將移遠模塊屏蔽罩上印的IMEI號綁定到華為的IOT平臺,平臺才會接收模塊發過來的數據。
????我們默認發貨都是幫親們綁定好的,并且測試沒問題的。
????
????1、在DaBai_rtc.c文件中的HAL_RTC_AlarmAEventCallback函數里設置了每隔10分鐘發送一次coap數據到IOT平臺。
????數據格式為:
?數據???? m_batVol? m_temp??? mRH?????? m_light?? m_longitude?? m_latitude?? g_USB_insert? Reserve
?數據類型? Uint8_t?? Int16_t?? Int16_t?? Uint16_t? Uint32_t????? Uint32_t???? Uint8_t?????? Uint8_t
?
?系統開機后,會自動建立coap的連接,然后每隔10分鐘上傳一次板子上的傳感器數據。
?(注意:剛開機的時候信號不是很穩定,需要等待幾十秒后才可能有信號,注冊到網絡。) 數據是上傳到華為的IOT平臺上的,大白在華為的IOT平臺上獲取到板子上的傳感器數據后,做了一個上位機軟件將傳感器信息描繪成實時變化的曲線。 下圖為stm32的microUSB接口上實時顯示單片機的串口操作和BC28的串口回復: 電池電量和溫度的實時變化曲線: 開發板詳細介紹點擊打開鏈接 下面是大白開發的主程序流程: [cpp]?view plain?copy
總結
以上是生活随笔為你收集整理的NBIOT 移远BC28模块+stm32开发板例程、教程(打通TCP、COAP协议)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个完整的DS1302时钟在STM32上
- 下一篇: 移远NB-IOT模块的BC28与M26与