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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 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
1 2 3 4 5 6 7 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 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 ; } }
Ursprünglicher Autor: Bean
Ursprünglicher Link: http://yoursite.com/2019/09/30/NB-IOT开发笔记/
Copyright-Erklärung: Bitte geben Sie die Quelle des Nachdrucks an.