NB-IOT開發筆記
名詞解釋:
南向設備:開發者自行開發的終端硬件設備(包含多個傳感器和MCU)。
北向應用:開發者自行開發的服務端應用(基於華爲OceanConnect物聯網平臺提供的RESTful接口)。
NB-IoT:窄帶物聯網,華爲等公司主推的物聯網通訊用蜂巢網絡。
NB芯片/模組:類似於3G/4G通信模組,將設備端數據打包發送到指定平臺的硬件模塊。
SoftRadio:用於模擬NB模組、基站、核心網的PC端軟件,可用於在缺乏NB模組和NB實網環境時的設備對接調試。
OceanConnect:華爲物聯網全聯接平臺,南向設備和北向應用通過該平臺交換數據和信令。
設備Profile文件:描述設備“是什麼”、“能幹什麼”的json格式文件,上傳到OceanConnect平臺(上傳時是zip包格式),設備綁定平臺和提供服務的關鍵配置文件。
編解碼插件:用來對NB設備上報的數據進行解碼,同時對下發給NB設備的信令進行編碼的插件,對接前需上傳到OceanConnect平臺。
測試環境
華爲雲平臺,NB-iot,EVB-m1開發板,智慧路燈項目
出現的問題
-
華爲IoT平臺北向JAVA API Demo導入
導入src包後,沒有消失報錯
使用JAVA 1.8 新建工程即可解決
-
Keil5編譯失敗
超出內存
破解程序不完全導致使用受限制
破解時,註冊機和keil5都要用管理員權限打開
開發筆記
工程目錄
下面介紹用到的主要文件:
main.c 地球人都知道啥意思
bc95.c bc95的AT操作函數,封裝好的,直接用
los_nb_api.c NB做好的api ,可以調用bc95.c函數,使用更方便
nb_iot_demo.c 接收數據,控制硬件
nb_iot_cmd_ioctl.c 採集數據,發送數據
主要函數:
main.c
creat_main_task() //調用初始化
VOID main_task(VOID) //執行初始化
{
user_hw_init(); //用戶設備初始化
#if defined USE_NB_NEUL95
#define AT_DTLS 0
#if AT_DTLS
sec_param_s sec;
sec.pskid = "8677250300xxxxx"; ////你自己的
sec.psk = "d1e1be0c05ac5b8c78ce1xxxxxxxxxx"; ////你自己的
#endif
printf("\r\n=====================================================");
printf("\r\nSTEP1: Init NB Module( NB Init )");
printf("\r\n=====================================================\r\n");
#if AT_DTLS
los_nb_init((const int8_t*)"49.4.85.xxx",(const int8_t*)"5684",&sec); ////你自己的平臺
#else
los_nb_init((const int8_t*)"49.4.85.xxx",(const int8_t*)"5683",NULL); ////你自己的平臺
#endif
los_nb_notify("+NNMI:",strlen("+NNMI:"),nb_cmd_data_ioctl,OC_cmd_match); ////接受數據的函數
LOS_TaskDelay(3000); ////接受時延
printf("\r\n=====================================================");
printf("\r\nSTEP3: Report Data to Server( NB Report )");
printf("\r\n=====================================================\r\n");
nb_iot_entry();// 開始採集數據,上傳數據
#endif
}
los_nb_api.c
int los_nb_notify(char* featurestr,int cmdlen, oob_callback callback, oob_cmd_match cmd_match)
//接受數據
{
if(featurestr == NULL ||cmdlen <= 0 || cmdlen >= OOB_CMD_LEN - 1)
return -1;
return at.oob_register(featurestr,cmdlen, callback,cmd_match);
}
nb_iot_cmd_ioctl.c
int32_t nb_cmd_data_ioctl(void* arg, int8_t * buf, int32_t len) //控制燈
{
int readlen = 0;
char tmpbuf[1064] = {0};
if (NULL == buf || len <= 0)
{
AT_LOG("param invailed!");
return -1;
}
sscanf((char *)buf,"\r\n+NNMI:%d,%s\r\n",&readlen,tmpbuf);
memset(bc95_net_data.net_nmgr, 0, 30);
if (readlen > 0)
{
HexStrToStr((const unsigned char *)tmpbuf, (unsigned char *)bc95_net_data.net_nmgr,readlen*2);
}
AT_LOG("cmd is:%s\n",bc95_net_data.net_nmgr);
if(strcmp(bc95_net_data.net_nmgr,"ON")==0) //開燈
{
HAL_GPIO_WritePin(Light_GPIO_Port,Light_Pin,GPIO_PIN_RESET); //輸出低電平
}
if(strcmp(bc95_net_data.net_nmgr,"OFF")==0) //關燈
{
HAL_GPIO_WritePin(Light_GPIO_Port,Light_Pin,GPIO_PIN_SET); // 輸出高電平
}
}
nb_iot_demo.c
VOID data_collection_task(VOID)
{
UINT32 uwRet = LOS_OK;
short int Lux;
Init_BH1750(); //初始化傳感器
OLED_ShowString(30,2,"Lux:",16);
while (1)
{
printf("This is data_collection_task !\r\n");
Lux=(int)Convert_BH1750(); //採集傳感器信息
printf("\r\n******************************BH1750 Value is %d\r\n",Lux);
sprintf(BH1750_send.Lux, "%5d", Lux); //把數據放到結構體
OLED_ShowString(60,2,(uint8_t*)BH1750_send.Lux,16);
uwRet=LOS_TaskDelay(1000);
if(uwRet !=LOS_OK)
return;
}
}
VOID data_report_task(VOID)
{
UINT32 uwRet = LOS_OK;
while(1)
{
if(los_nb_report((const char*)(&BH1750_send),sizeof(BH1750_send))>=0)
//發送數據到平臺
printf("ocean_send_data OK!\n");
else
{
printf("ocean_send_data Fail!\n");
}
uwRet=LOS_TaskDelay(1000);
if(uwRet !=LOS_OK)
return;
}
}
void nb_iot_entry(void) //調用採集數據
{
UINT32 uwRet = LOS_OK;
uwRet = creat_data_collection_task();
if (uwRet != LOS_OK)
{
return ;
}
uwRet = creat_data_report_task();
if (uwRet != LOS_OK)
{
return ;
}
}