当前位置:首页 > 公众号精选 > 嵌入式云IOT技术圈
[导读]点击上方嵌入式开发圈 记得关注我们哦! 项目最终效果,大家可以根据API的去实现自己的业务需求。 程序设计结构体,存储获取模组的相关信息 typedef struct NETWORK_INFO{ //初始化NB模块的状态 u8 Init_NB_Status ; //NB模块的信号强度 u8 signalCSQ ; //IME

点击上方嵌入式开发圈 记得关注我们哦!


项目最终效果,大家可以根据API的去实现自己的业务需求。

程序设计结构体,存储获取模组的相关信息

typedef struct NETWORK_INFO{ //初始化NB模块的状态 u8 Init_NB_Status ; //NB模块的信号强度 u8 signalCSQ ; //IMEI卡号 char IMEI[16]; //IMSI卡号 char IMSI[16]; //注网标志位 bool Register_NetWork_Flag ; //服务器连接标志位 bool Connect_Server_Flag ;
} NETWORK_DEVICE_INFO;extern NETWORK_DEVICE_INFO NBIOT_MODULE_INFO ;

    下面实现操作NB的方法,首先是最核心的NB指令发送函数,有了这样一个函数,后面的应用才能写,这里用的是中断采集的方式,后续可以更改成DMA接收,传输效率会更高一些,等下次更新一个新的版本,附带完整的测试工程。

/* * 函数名:NBIOT_Cmd * 描述 :对NBIOT模块发送AT指令 * 输入 :cmd,待发送的指令 * reply1,reply2,期待的响应,为NULL表不需响应,两者为或逻辑关系 * waittime,等待响应的时间 * 返回 : 1,指令发送成功 * 0,指令发送失败 * 调用 :被外部调用 */bool NBIOT_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime ){ bool status = false ; USART4_RX_STA = 0; //从新开始接收新的数据包 NB_FramLength = 0 ; memset(RXBuffer, 0, RXBUFFER_LEN); //清空接收缓冲 u4_printf("%s\r\n", cmd);
if ( ( reply1 == 0 ) && ( reply2 == 0 ) ) //不需要接收数据 return true;
Delay_ms ( waittime ); //延时 RXBuffer[NB_FramLength] = '\0'; printf("RXBuffer:%s\n", RXBuffer); if(strstr((char *)RXBuffer, reply2) != NULL) { printf("ackerror:%s\n", reply2); return false ; } if(strstr((char *)RXBuffer, reply1) != NULL) { printf("acksuccess:%s\n", RXBuffer); //如果匹配到断连标志,就重新建立连接 if(strstr((char *)RXBuffer, "+NSOCLI: 1") != NULL) { status = NB_Create_TCP("120.78.136.134", 9002); if(false == status) { printf("重新创建TCP连接失败\n"); return -1 ; } else { printf("重新创建TCP连接成功\n"); } } return true ; }
return false ;}

    根据实现的发送函数,下面来实现驱动NB模块的接口以及整套初始化流程,可以减少开发者的负担。

一、判断BC28模块是否在线

    在对NB模块的编程中,其实就是对串口操作,通常我们会有一个与模块的应答指令,寻问模块是否在线,进而来判断模块是否硬件是否已经连接正确或者模块是否损坏。

//检查模组是否在线bool checkNBIOT(void){ return NBIOT_Cmd("AT", "OK", NULL, 100);}

    当发出AT时,模组应给主机回复OK作为应答,这样主机就和模组建立通信。


二、BC28基础配置(打开自动寻网、频段设置、优码控制)

    根据前面写过的一篇文章,我们还要对BC28做一系列的适配操作,比如,使能自动寻网、设置频段(电信为5,移动为8)、打开优码控制选项第二项、第三项。

//NBIOT基础配置===>band 5 ==> 电信卡 8===>移动卡bool BASE_Config_NBIOT(int band){ char buffer[50] = {0}; bool status = true ; //设置频段 sprintf(buffer, "AT+NBAND=%d", band); status = NBIOT_Cmd(buffer, "OK", NULL, 100); //自动寻网 status = NBIOT_Cmd("AT+NCONFIG=AUTOCONNECT,TRUE", "OK", NULL, 100); //打开优码控制2,3项 status = NBIOT_Cmd("AT+NCONFIG=CR_0354_0338_SCRAMBLING,TRUE", "OK", NULL, 100); status = NBIOT_Cmd("AT+NCONFIG=CR_0859_SI_AVOID,TRUE", "OK", NULL, 100); return status ;}
三、IMSI、IMEI号获取

3.1 IMSI 设备识别码

    NB模块或者其它的一些通信模块,它都会有一个独有的IMEI号,它是模块生产厂家指定的一个设备识别码,通过指令AT+CGSN=1来获取,功能函数如下:

bool Get_IMEI(void){ bool status = true ; status = NBIOT_Cmd("AT+CGSN=1", "OK", "ERROR", 100);
if(status == true) { memcpy((char *)NBIOT_MODULE_INFO.IMEI, RXBuffer + 8, 15); return true ; }
return false ;}

3.2 IMSI 国际移动用户识别码

通常该码存储在SIM卡中,我们可以使用AT+CIMI这条指令来获取,这样可以知道卡到底有没有插好或者是否存在,功能编写如下:

//获取IMSIbool Get_IMSI(void){ bool status = true ; status = NBIOT_Cmd("AT+CIMI", "OK", "ERROR", 2000);
if(status == true) { memcpy((char *)NBIOT_MODULE_INFO.IMSI, RXBuffer + 2, 15); return true ; }
return false ;}
四、获取注网状态

    模块注册相应的运行商成功,就会收到相应的标志,标志已经注册成功,功能编写如下:

//获取入网状态bool Get_Enter_Net_Status(void){ int status = 0 ; bool cmd_status = false ; char buffer[30] = {0}; cmd_status = NBIOT_Cmd("AT+CGATT?", "OK", "ERROR", 5000); memcpy(buffer, RXBuffer + 9, 1); status = atoi(buffer);
if(1 == status) return true; else return false ;}
五、获取模组信号强度

    BC28的模组信号级别是0-31,返回99则可能模块还没有初始化完毕,或者信号异常。低于10可以认为信号为低,一般别的通信模组(比如4G,WIFI等)如果低于这个级别,数据可能出现丢包状态,但NB模块号称只要大于8,即可无丢损数据,实现函数如下:

//获取信号强度int Get_CSQ(void){ int signal_value = -1; bool status = true ; char csq_buffer[50] = {0}; status = NBIOT_Cmd("AT+CSQ", "+CSQ", NULL, 100);
if(status == true) { memcpy(csq_buffer, RXBuffer + 7, 2); signal_value = atoi(csq_buffer); return signal_value ; } return 99 ;}
五、TCP-IP的创建

    这里一定要注意一点,模组刷写的固件带ONT版本的,是不能把数据传到私有的服务器的,只有不带ONT的才可以,版本可以通过AT指令的ATI查看。

    如果版本是带ONT,而你又想传数据到自己的后台,那就请你连接移远的FAE,提供最新的固件和固件烧写工具给你,如图所示,利用软件对NB模组进行固件更新。

//创建TCP Socket===>成功返回1,失败返回0u8 NB_Create_TCP(const char *server_ip, int port){ char buffer[50] = {0}; bool status = true ; //1.创建一个TCP Socket status = NBIOT_Cmd("AT+NSOCR=STREAM,6,56000,1", "OK", NULL, 2000); //如果创建成功,则连接远程服务器和端口号 if(true == status) { sprintf(buffer, "AT+NSOCO=1,%s,%d", server_ip, port); status = NBIOT_Cmd(buffer, "OK", NULL, 2000); if(true == status) return 1 ; else return 0 ; } return 0 ;}
//关闭Socket连接bool Close_Socket(void){ bool status = true ; status = NBIOT_Cmd("AT+NSOCL=0", "OK", NULL, 2000); return status ;}
六、发送数据到TCP服务器
//NBIOT发送数据到后台服务器/* Data_Length:要发送到后台的原始数据的长度 hex_data:要发送到后台的,但必须将原始数据转换成十六进制编码的数据*/
bool NB_Send_Data_To_Server(int Data_Length, char *hex_data){ bool status = true ; char data_buffer[1024] = {0}; sprintf(data_buffer, "AT+NSOSD=1,%d,%s", Data_Length, hex_data); printf("数据上传:\n"); printf("%s\n", data_buffer); status = NBIOT_Cmd(data_buffer, "OK", "ERROR", 5000); return status ;}
七、模组重启复位

    通常给模组复位,一般是设置完参数后,手册要求要进行复位操作,复位大概需要5s的时间,模组才会稳定下来,所以Delay_ms(5000)最好不要丢掉,否则其它的指令可能出现设置失败的情况。

//复位NBIOT模组bool NB_RESET(void){ bool status = true ; status = NBIOT_Cmd("AT+NRB", "OK", NULL, 10000); return status ;}
八、初始化流程编写
/** * 功能:初始化NBIOT * 参数:None * 返回值:初始化结果,非0为初始化成功,0为失败 */int initNBIOT(void){ bool status_return = false ;
while(1) { switch(NBIOT_MODULE_INFO.Init_NB_Status) { //1、检查NBIOT模块是否在线 case 0: status_return = checkNBIOT();
if(false == checkNBIOT) { printf("NB模块硬件故障..\n"); return 0 ; } else { printf("NB模块正常连接\n"); NBIOT_MODULE_INFO.Init_NB_Status = 1 ; }
break ;
//2、进行NBIOT的基础配置 case 1: status_return = BASE_Config_NBIOT(5);
if(false == status_return) { NBIOT_MODULE_INFO.Init_NB_Status = 0 ; printf("配置自动寻网与优码控制第2、3项失败\n"); } else { NBIOT_MODULE_INFO.Init_NB_Status = 2 ; printf("配置自动寻网与优码控制第2、3项成功\n"); }
break ;
//3、复位模组 case 2: status_return = NB_RESET();
if(false == status_return) { printf("模组复位失败\n"); NBIOT_MODULE_INFO.Init_NB_Status = 0 ; } else { printf("模组复位成功\n"); Delay_ms(2000); NBIOT_MODULE_INFO.Init_NB_Status = 3 ; }
break ;
//4、获取NB模组号 case 3: status_return = Get_IMEI();
if(false == status_return) { printf("没有模组卡号,模块故障\n"); NBIOT_MODULE_INFO.Init_NB_Status = 0 ; break ; } else { NBIOT_MODULE_INFO.Init_NB_Status = 4 ; printf("模组号:%s\n", NBIOT_MODULE_INFO.IMEI); }
break ;
//获取SIM卡卡号,确认设备是否已经插卡 case 4: status_return = Get_IMSI();
if(false == status_return) { printf("没有插SIM卡,模块无法连接网络\n"); NBIOT_MODULE_INFO.Init_NB_Status = 0 ; break ; } else { printf("SIM卡号:%s\n", NBIOT_MODULE_INFO.IMSI); NBIOT_MODULE_INFO.Init_NB_Status = 5 ; }
break ;
//查看注网状态 case 5: status_return = Get_Enter_Net_Status();
if(false == status_return) { printf("入网失败,请重新复位模块\n"); NBIOT_MODULE_INFO.Init_NB_Status = 5 ; break ; } else { printf("模组入网成功..\n"); NBIOT_MODULE_INFO.Init_NB_Status = 6 ; }
break ;
//获取信号强度 case 6: NBIOT_MODULE_INFO.signalCSQ = Get_CSQ();
if(99 == NBIOT_MODULE_INFO.signalCSQ) { printf("设备无信号....\n"); NBIOT_MODULE_INFO.Init_NB_Status = 5 ; } else { printf("信号级别:%d\n", NBIOT_MODULE_INFO.signalCSQ); NBIOT_MODULE_INFO.Init_NB_Status = 7 ; }
break ;
default: break ; }
if(7 == NBIOT_MODULE_INFO.Init_NB_Status) { break ; } } return 1;}
嵌入式韦东山视频





商务合作

支持我请给我在看!
“阅读原文”一起来充电吧!


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

随着科技的飞速发展,电子产品在我们日常生活中扮演着越来越重要的角色。而在这些电子产品中,接口作为连接设备与外部设备的桥梁,其重要性不言而喻。其中,Type-C接口作为一种新型的接口标准,因其独特的优势,逐渐成为了众多电子...

关键字: 电子产品 Type-C 接口

随着电动汽车的普及,充电桩作为电动汽车的重要基础设施,越来越受到人们的关注。然而,对于许多电动汽车用户来说,直流充电桩和交流充电桩的接口和区别仍然是一个令人困惑的问题。本文将从接口和区别两个方面,详细探讨直流充电桩和交流...

关键字: 电动汽车 接口 充电桩

武汉2023年9月19日 /美通社/ -- 目前,在国家政策和市场需求双重驱动下,国内数据库行业呈现出百花齐放的态势。充分竞争的市场环境下,达梦数据连续数年保持中国数据库管理系统市场占有率前列地位,成为当之无愧的国产数据...

关键字: DM DSC 国家电网 接口

深圳2023年9月15日 /美通社/ -- 9月14-15日,2023全球AI芯片峰会(GACS 2023)在深圳正式举行。峰会以【AI 大时代 逐鹿芯世界】为主题,共探AI芯片的产学研用,邀请了清华大学教授、中国半导体...

关键字: 接口 芯科 内存 AC

(全球TMT2023年8月24日讯)第三十届北京国际广播电影电视展览会(BIRTV2023)正在北京如火如荼地进行中。在展会上,成都索贝数码科技股份有限公司与深圳市洲明科技股份有限公司宣布签署战略合作协议,双方将携手布...

关键字: 模型 TV 编写 网络视频

Type-C接口已经成为当今市场上备受青睐的接口之一。它以其小巧轻便、高速传输、支持多种协议等特点,吸引了越来越多的关注。

关键字: Type-C 接口 USB

USB-C和Type-C是两种不同的USB接口类型,它们在外观、结构和功能上有一些区别。下面将详细介绍这两种接口类型的区别和特点,帮助大家更好地了解和认识它们。

关键字: usb-c type-c 接口

USB接口是现代电子设备中常用的接口之一,它具有通用性强、传输速度快、易于使用等特点。USB接口的应用范围非常广泛,从智能手机、笔记本电脑到电脑外设、智能家居等都可以看到它的身影。在USB接口的发展历程中,出现了多种不同...

关键字: USB 接口

USB接口是一种常见的串行接口,它的全称是Universal Serial Bus,由USB Implementers Forum制定。USB接口具有通用性强、传输速度快、支持多种设备同时连接等优点,因此在现代电子设备中...

关键字: USB 接口 串行接口

总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。

关键字: 总线 计算机 接口
关闭
关闭