版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章物联网应用引言本章学习目标了解物联网技术在日常生活的实际应用理解开发板中各个电路部分在实验中所起到的作用2掌握各个实例的实验原理,提高实验设计思维熟练运用前面所学到的知识,与本章实例进行结合,以提高学习能力010203049.1智能家居9.2智能交通9.3智能医疗9.4智能安防CONTENTS9.1.1项目框架4本项目使用的是华为云平台作为中间服务器,在设备端(Hi3861):首先进行连接附近的WiFi热点,与华为云平台建立MQTT连接,并且使用JSON格式数据进行交互数据;在应用端(微信小程序):使用HTTP协议与华为云平台进行连接,调用相关API,调用成功之后,会返回JSON格式的数据。在设备端,在连接不上附近WiFi热点的时候,会在OLED显示屏上显示,连接WiFi热点失败的提示信息,此时我们可以使用微信小程序上的NFC烧写界面,将WiFi名称和密码进行烧写开发板上的NFC标签,然后再重新开发板进行重新连接新的WiFi热点。连接成功之后,可以按下开发板上的按键进行切换照明灯的工作模式,每次切换模式都会向华为云平台发送一次数据,在MQTT接收任务中,当接收到云平台接收到数据之后,会进行解析正确的JSON数据包,根据JSON数据包中的命令进行控制本系统中的相关变量。在应用端,首先进行获取项目的Token秘钥信息,获取到Token秘钥信息之后,再去使用“获取设备镜像API”,才能知道当前设备是否在线状态。当同时满足以上两种情况的时候,就可以进行下发指令控制设备端。此外,我们还需要再华为云平台中进行配置相关的基础数据和控制数据格式,配置完成之后,才可以进行通信使用。它的整体框架图如下所示:9.1.1项目框架561.主控部分本项目使用的是WF-H861-RTA1模组作为主控,此模组是基于Hi3861V100芯片设计的,该芯片是一款高度集成的2.4GHz芯片,集成了IEEE802.11b/g/n基带和RF电路,包括功率放大器PA、低噪声放大器LNA、RFbalun、天线开关以及电源管理模块等。它支持20MHz标准带宽和5MHz/10MHz窄带宽,提供最大72.2Mbit/s物理层速率。并且集成了高性能32位微处理器,提供SPI、UART、I2C、I2S、PWM、GPIO以及多路ADC模拟输入等丰富的外设接口,同时支持SDIO2.0接口,时钟最高支持50MHz。主控部分原理图如下图所示:9.1.2硬件设计72.三色灯部分RGB灯部分所使用的是AW2013控制芯片进行驱动和共阳极的三色LED灯,此芯片支持淡入淡出效果和直接PWM控制模式和一次编程模式,使用的I2C端口与主控芯片进行通信,它可以驱动3个单独的LED灯或一组RGB灯。亮度可以使用PWM进行设置,输出电流可配置4级(0A、5mA、10mA、15mA)。原理图如下图所示:9.1.2硬件设计83.NFC部分NFC通信使用的是NT3H1101芯片,此芯片支持I2C通信,支持可配置的现场检测引脚,内部配备有EEPROM存储芯片,允许在RF和I2C之间快速传出数据,不收EEPROM内存的写入周期进行限制。原理图如图所示:9.1.2硬件设计94.OLED显示屏部分采用SSD1306芯片进行驱动0.96寸OLED显示屏,本显示屏使用黄+蓝屏幕进行显示。点阵数量为128*64。9.1.2硬件设计9.1.3程序设计10该项目的主程序代码如下,首先定义了三个线程ID,分别用于MQTT数据发布、接收和传感器数据采集。定义了smartLamp_Project_example函数,作为该项目的主要入口函数。设置MQTT客户端的订阅回调函数,当接收到消息时会调用这个回调。接着初始化全局变量,设置RGB灯的亮度值为100%,初始化各种外设,包括按键、三色LED灯、三合一传感器、OLED显示屏和NFC模块。externmsg_data_tsys_msg_data;osThreadId_tmqtt_send_task_id;//mqtt发布数据任务IDosThreadId_tmqtt_recv_task_id;//mqtt接收数据任务IDosThreadId_tsensor_collect_task_id;//传感器采集任务IDstaticvoidsmartLamp_Project_example(void){console_log_info("EntersmartLamp_Project_example()!");p_MQTTClient_sub_callback=&mqttClient_sub_callback;//全局变量的初始化sys_msg_data.led_light_value=100;//RGB灯的亮度值为100%的状态//外设的初始化KEY_Init();//按键初始化9.1.3程序设计11AW2013_Init();//三色LED灯的初始化AW2013_Control_RGB(0,0,0);AP3216C_Init();//三合一传感器初始化SSD1306_Init();//OLED显示屏初始化SSD1306_CLS();//清屏nfc_Init();sleep(2);#if1//通过NFC芯片进行连接WiFiuint8_tndefLen=0;//ndef包的长度uint8_tndef_Header=0;//ndef消息开始标志位uint32_tresult_code=0;//函数的返回值//读整个数据的包头部分,读出整个数据的长度if(result_code=NT3HReadHeaderNfc(&ndefLen,&ndef_Header)!=true){console_log_error("NT3HReadHeaderNfcisfailed.result_code=%d",result_code);return;}ndefLen+=NDEF_HEADER_SIZE;//加上头部字节uint8_t*ndefBuff=(uint8_t*)malloc(ndefLen+1);9.1.3程序设计12if(ndefBuff==NULL){console_log_error("ndefBuffmallocisFalied!");return;}if(result_code=get_NDEFDataPackage(ndefBuff,ndefLen)!=HI_ERR_SUCCESS){console_log_error("get_NDEFDataPackageisfailed.result_code=%d",result_code);return;}console_log_info("startprintndefBuff.");for(size_ti=0;i<ndefLen;i++){printf("0x%x",ndefBuff[i]);}CONNECT_WIFI:9.1.3程序设计13if(NFC_configuresWiFiNetwork(ndefBuff)!=WIFI_SUCCESS){console_log_error("nfcconnectwifiisfailed!");oled_consle_log("wifino.");sleep(1);SSD1306_CLS();//清屏gotoCONNECT_WIFI;}else{console_log_info("nfcconnectwifiisSUCCESS");oled_consle_log("wifiyes.");sleep(1);}#endif#if0CONNECT_WIFI://手动输入WiFi信息,连接WiFi9.1.3程序设计14if(WiFi_connectHotspots("AI_DEV","HQYJ12345678")!=WIFI_SUCCESS){console_log_error("connectWiFiHotspots");oled_consle_log("wifino.");sleep(1);SSD1306_CLS();//清屏gotoCONNECT_WIFI;}else{console_log_info("connectWiFiHotspots");oled_consle_log("wifiyes.");sleep(1);}#endifCONNECT_MQTT_SERVER://连接MQTT服务器9.1.3程序设计15if(MQTTClient_connectServer(SERVER_IP_ADDR,SERVER_IP_PORT)!=0){console_log_error("mqttClient_connectServer");oled_consle_log("mqttserno.");sleep(1);SSD1306_CLS();//清屏gotoCONNECT_MQTT_SERVER;}else{console_log_info("mqttClient_connectServer");oled_consle_log("mqttseryes.");sleep(1);}CONNECT_MQTT_CLIENT://初始化MQTT客户端9.1.3程序设计16if(MQTTClient_init(MQTT_CLIENT_ID,MQTT_USER_NAME,MQTT_PASS_WORD)!=0){console_log_error("mqttClient_init");oled_consle_log("mqttclino.");sleep(1);SSD1306_CLS();//清屏gotoCONNECT_MQTT_CLIENT;}else{console_log_info("mqttClient_init");oled_consle_log("mqttcliyes.");sleep(1);}CONNECT_MQTT_SUB://订阅主题9.1.3程序设计17if(MQTTClient_subscribe(MQTT_TOPIC_SUB_COMMANDS)!=0){console_log_error("mqttClient_subscribe");oled_consle_log("mqttsubno.");sleep(1);SSD1306_CLS();//清屏gotoCONNECT_MQTT_SUB;}else{console_log_info("mqttClient_subscribe");oled_consle_log("mqttsubyes.");sleep(1);}SSD1306_CLS();//清屏9.1.3程序设计18定义线程属性,并创建三个线程,分别用于MQTT数据发送、接收和传感器数据采集。最后启动整个项目的运行。osThreadAttr_toptions;="mqtt_send_task";options.attr_bits=0;options.cb_mem=NULL;options.cb_size=0;options.stack_mem=NULL;options.stack_size=1024*5;options.priority=osPriorityNormal;mqtt_send_task_id=osThreadNew((osThreadFunc_t)mqtt_send_task,NULL,&options);if(mqtt_send_task_id!=NULL){console_log_info("ID=%d,Createmqtt_send_task_idisOK!",mqtt_send_task_id);}9.1.3程序设计19="mqtt_recv_task";options.stack_size=1024*5;mqtt_recv_task_id=osThreadNew((osThreadFunc_t)mqtt_recv_task,NULL,&options);if(mqtt_recv_task_id!=NULL){console_log_info("ID=%d,Createmqtt_recv_task_idisOK!",mqtt_recv_task_id);}="sensor_collect_task";options.stack_size=1024*5;sensor_collect_task_id=osThreadNew((osThreadFunc_t)sensor_collect_task,NULL,&options);if(sensor_collect_task_id!=NULL){console_log_info("ID=%d,Createsensor_collect_task_idisOK!",sensor_collect_task_id);}}9.1.4实验结果20在烧写程序前,需要到华为云平台进行设备信息的配置,以便开发板与华为云平台进行连接。云平台配置成功后,将程序编译烧写进开发板,按下开发板的复位按钮,当成功连接WiFi后,会在OLED显示屏界面中会显示当前设备连接附近WiFi热点的提示信息和连接华为云平台服务器的信息,直到在界面中显示如下图所示,说明连接华为云成功。连接成功之后,我们需要打开微信小程序,在小程序中界面中,我们可以点击开关按钮,进行下发指令让设备中RGB灯进行点亮和熄灭操作,还可以进行调整当前RGB灯的颜色值,并且可以调整当前RGB灯的亮度值。010203049.1智能家居9.2智能交通9.3智能医疗9.4智能安防CONTENTS9.2.1项目框架22本项目实现的主要内容:实时监测超声波测距传感器返回的数据;将检测到的数据显示在OLED显示屏上;与障碍物距离小于50cm的时候,进行报警提示。项目整体框架图如下所示。9.2.2硬件设计23本项目模块的整体硬件电路如图所示,硬件部分包含了依然采用了基于Hi3861V100芯片设计的WF-H861-RTA1模组作为主控、AP3216C为核心的传感器模块、蜂鸣器模块以及与SSD1306芯片驱动的0.96寸OLED显示屏等作为主要模块,且全都直接使用I2C总线进行控制。9.2.3程序设计24本项目主要实现了一个智能倒车雷达系统的核心功能,包括串口通信、数据处理、用户界面显示等。通过解析外部设备发送的距离信息,系统可以实时显示距离,并根据距离的远近控制RGB灯和蜂鸣器,提醒驾驶员注意安全距离。首先使用uart_init函数来初始化串口并设置串口2的波特率、数据位、停止位和校验位。随后配置GPIO引脚作为串口的发送和接收引脚。voiduart_init(void){uint32_tret=0;//初始化串口hi_io_set_func(HI_IO_NAME_GPIO_11,HI_IO_FUNC_GPIO_11_UART2_TXD);hi_io_set_func(HI_IO_NAME_GPIO_12,HI_IO_FUNC_GPIO_12_UART2_RXD);hi_uart_attributeuart_param={.baud_rate=115200,.data_bits=8,.stop_bits=1,.parity=0,};ret=hi_uart_init(HI_UART_IDX_2,&uart_param,NULL);if(ret!=HI_ERR_SUCCESS){console_log_error("hiuartinitisfaild.");}}9.2.3程序设计25使用show_page函数:显示智能距离测量的页面,根据传入的距离值val,控制RGB灯闪烁和蜂鸣器音响。并使用parse_json_data函数解析接收到的JSON格式的数据包。voidshow_page(uint16_tval){SSD1306_ShowStr(0,0,"SmartDistance",16);if(val<=50)//5cm{rgb_val^=0xFF;AW2013_Control_Red(rgb_val);//红灯闪烁sys_msg_data.pcf8574_io.bit.p1^=0x01;//蜂鸣器滴滴响PCF8574_Write(sys_msg_data.pcf8574_io.all);}else9.2.3程序设计26{rgb_val=0;AW2013_Control_Red(rgb_val);//红灯灭sys_msg_data.pcf8574_io.bit.p1=1;//蜂鸣器关PCF8574_Write(sys_msg_data.pcf8574_io.all);}//显示数字uint8_tx=val/1000;//显示数字的千位SSD1306_DrawBMP(bmp_number_1.left,bmp_number_1.top,16,32,bmp_16X32_number[x]);x=val/100%10;//显示数字的百位SSD1306_DrawBMP(bmp_number_2.left,bmp_number_2.top,16,32,bmp_16X32_number[x]);x=val/10%10;//显示数字的十位SSD1306_DrawBMP(bmp_number_3.left,bmp_number_3.top,16,32,bmp_16X32_number[x]);x=val%10;//显示数字的个位SSD1306_DrawBMP(bmp_number_4.left,bmp_number_4.top,8,16,bmp_8X16_number[x]);//显示小数点SSD1306_DrawBMP(bmp_dian.left,bmp_dian.top,16,16,bmp_16X16_dian);//显示cmSSD1306_DrawBMP(bmp_danwei.left,bmp_danwei.top,32,32,bmp_32X32_cm);}9.2.3程序设计27voidparse_json_data(void){if(strlen((char*)recvBuff)<=3)return;
cJSON*json_root=cJSON_Parse((constchar*)recvBuff);if(json_root){console_log_success("json_root");cJSON*json_status=cJSON_GetObjectItem(json_root,"status");if(json_status){console_log_success("json_status");cJSON*json_distance=cJSON_GetObjectItem(json_status,"distance");if(json_distance){sys_msg_data.distance=json_distance->valueint;show_page(sys_msg_data.distance);//显示温度页面}json_distance=NULL;}json_status=NULL;cJSON_Delete(json_root);}json_root=NULL;}9.2.3程序设计28voiduart_recv_task(void){hi_u8uart_buff[20]={0};hi_u8last_len=0;uart_init();//串口2初始化while(1){//阻塞接收hi_u32len=hi_uart_read(HI_UART_IDX_2,uart_buff,sizeof(uart_buff));if(len>0){//printf("uart_buff:%s\n",uart_buff);memcpy((char*)pbuff,(char*)uart_buff,len);pbuff+=len;if(len<last_len){pbuff=recvBuff;//回到recvBuff的头位置//printf("buff:%s\n",recvBuff);parse_json_data();memset((char*)recvBuff,0,sizeof(recvBuff));}last_len=len;memset((char*)uart_buff,0,sizeof(uart_buff));}}}9.2.3程序设计29使用主函数,初始化IO扩展芯片、RGB灯和OLED显示屏。创建线程,用于处理串口接收任务。staticvoidReversingRadar_main(void){console_log_info("EnterReversingRadar_main()!");//外设的初始化PCF8574_Init();//初始化IO扩展芯片sys_msg_data.pcf8574_io.bit.p1=1;//关闭蜂鸣器PCF8574_Write(sys_msg_data.pcf8574_io.all);AW2013_Init();//AW2013初始化AW2013_Control_RGB(0,0,0);SSD1306_Init();//OLED显示屏初始化SSD1306_CLS();//清屏SSD1306_ShowStr(0,0,"SmartDistance",16);usleep(200*1000);//创建线程osThreadAttr_toptions;="uart_recv_task";options.attr_bits=0;options.cb_mem=NULL;options.cb_size=0;options.stack_mem=NULL;9.2.3程序设计30options.stack_size=1024*5;options.priority=osPriorityNormal1;uart_recv_task_id=osThreadNew((osThreadFunc_t)uart_recv_task,NULL,&options);if(uart_recv_task_id!=NULL){console_log_info("ID=%d,Createuart_recv_task_idisOK!",uart_recv_task_id);}}SYS_RUN(ReversingRadar_main);9.2.4实验结果31设备端烧写程序成功之后,按下“复位”按键之后,可以看到OLED显示屏上显示检测到的距离,并且当有障碍物遮挡的时候,蜂鸣器和红灯亮起,如下图所示:010203049.1智能家居9.2智能交通9.3智能医疗9.4智能安防CONTENTS9.3.1项目框架33本项目实现将要实现的内容有:实时监测空气中当前的温湿度值;将监测到的信息显示在OLED显示屏上;并根据当前的温湿度值改变表情。项目框架图如下图所示。9.3.2硬件设计34模块整体的硬件设计如图所示,电路中包括了基于Hi3861V100芯片设计的WF-H861-RTA1模组作为主控电路、SSD1306芯片驱动的0.96寸OLED显示屏电路以及SHT20温湿度传感器电路。该传感器配有一个全新设计的CMOSens®芯片、一个经过改进的电容式湿度传感元件和一个标准的能隙温度传感元件,其性能已经大大提升甚至超出了前一代传器(SHT1x和SHT7x)的可靠性水平。且使用I2C总线进行通讯。9.3.3程序设计35本项目主要是实现一个简单的温湿度监控系统,因此本项目代码实现的功能便是读取传感器数据并OLED屏幕上交替显示温度和湿度信息,同时根据温湿度的不同范围显示不同的图标。项目的主体代码如下所示。整个程序的流程是:初始化传感器和OLED屏幕,并创建一个任务来周期性地读取温湿度值,最终在OLED屏幕上交替显示这些值。voidshow_temp_page(floatval){SSD1306_CLS();//显示标题中间居中显示SSD1306_ShowStr(temp_title.left,temp_title.top,"Temperature",16);intx=(val*100)/1000;SSD1306_DrawBMP(number_1.left,number_1.top,16,32,bmp_16X32_number[x]);//显示数字的十位x=((int)(val*100))/100%10;SSD1306_DrawBMP(number_2.left,number_2.top,16,32,bmp_16X32_number[x]);//显示数字的个位SSD1306_DrawBMP(dian.left,dian.top,16,16,bmp_16X16_dian);//显示小数点SSD1306_DrawBMP(danwei.left,danwei.top,16,16,bmp_16X16_sheShiDu);//显示℃符号x=((int)(val*100))/10%10;SSD1306_DrawBMP(number_3.left,number_3.top,8,16,bmp_8X16_number[x]);//数字小数位//适宜温度0~30℃9.3.3程序设计36if(val<0)SSD1306_DrawBMP(image.left,image.top,48,48,bmp_48X48_5_ku_qi);elseif(val>=0&&val<6)SSD1306_DrawBMP(image.left,image.top,48,48,bmp_48X48_5_ku_qi);elseif(val>=6&&val<12)SSD1306_DrawBMP(image.left,image.top,48,48,bmp_48X48_4_nan_guo);elseif(val>=12&&val<18)SSD1306_DrawBMP(image.left,image.top,48,48,bmp_48X48_2_wei_xiao);elseif(val>=18&&val<24)SSD1306_DrawBMP(image.left,image.top,48,48,bmp_48X48_1_mi_yan_xiao);elseif(val>=24)SSD1306_DrawBMP(image.left,image.top,48,48,bmp_48X48_3_wu_biao_qing);}9.3.3程序设计37voidshow_humi_page(floatval){//显示标题中间居中显示SSD1306_CLS();SSD1306_ShowStr(humi_title.left,humi_title.top,"Humidity",16);intx=(val*100)/1000;SSD1306_DrawBMP(number_1.left,number_1.top,16,32,bmp_16X32_number[x]);//显示数字的十位x=((int)(val*100))/100%10;SSD1306_DrawBMP(number_2.left,number_2.top,16,32,bmp_16X32_number[x]);//显示数字的个位SSD1306_DrawBMP(dian.left,dian.top,16,16,bmp_16X16_dian);//显示小数点SSD1306_DrawBMP(danwei.left,danwei.top,16,16,bmp_16X16_baifenhao);//显示%符号x=((int)(val*100))/10%10;SSD1306_DrawBMP(number_3.left,number_3.top,8,16,bmp_8X16_number[x]);//数字小数位//范围:0~100%9.3.3程序设计38if(val>=0&&val<20)SSD1306_DrawBMP(image.left,image.top,48,48,bmp_48X48_5_ku_qi);elseif(val>=20&&val<40)SSD1306_DrawBMP(image.left,image.top,48,48,bmp_48X48_4_nan_guo);elseif(val>=40&&val<60)SSD1306_DrawBMP(image.left,image.top,48,48,bmp_48X48_3_wu_biao_qing);elseif(val>=60&&val<80)SSD1306_DrawBMP(image.left,image.top,48,48,bmp_48X48_2_wei_xiao);elseif(val>=80)SSD1306_DrawBMP(image.left,image.top,48,48,bmp_48X48_1_mi_yan_xiao);}9.3.3程序设计39voidTask1(void*argument){(void)argument;u8x=0,y=0;while(1){floattemp_val,humi_val;SHT20_ReadData(&temp_val,&humi_val);//读取温湿度传感器的值printf("temp_val:%.2fhumi_val:%.2f\r\n",temp_val,humi_val);show_temp_page(temp_val);//显示温度页面sleep(3);show_humi_page(humi_val);//显示湿度页面sleep(3);}}9.3.3程序设计40staticvoidsmartTemp_demo(void){printf("EntersmartTemp_demo()!");SHT20_Init();//SHT20初始化SSD1306_Init(); //初始化OLEDSSD1306_CLS();//清屏osThreadAttr_toptions;="Task1";//任务的名字options.attr_bits=0;//属性位options.cb_mem=NULL;//堆空间地址options.cb_size=0;//堆空间大小options.stack_mem=NULL;//栈空间地址options.stack_size=1024*5;//栈空间大小单位:字节options.priority=osPriorityNormal;//任务的优先级Task1_ID=osThreadNew((osThreadFunc_t)Task1,NULL,&options);//创建任务1if(Task1_ID!=NULL){printf("ID=%d,CreateTask1_IDisOK!\n",Task1_ID);}}SYS_RUN(smartTemp_demo);9.3.4实验结果41烧写程序成功之后,按下开发板的“复位”按键之后,可以看到OLED显示屏上显示当前温湿度的内容,如下图所示:010203049.1智能家居9.2智能交通9.3智能医疗9.4智能安防CONTENTS9.4.1项目框架43本项目使用的是华为云物联网平台作为中间服务器,在设备端(Hi3861),首先进行连接附近的WiFi热点,与华为云物联网平台建立MQTT连接,并且使用JSON格式数据进行交互数据;在应用端(微信小程序),使用HTTP协议与华为云物联网平台进行连接,使用华为云物联网平台相关的API进行交互数据。在设备端,在连接不上附近WiFi热点的时候,会在OLED显示屏上显示,连接WiFi热点失败的提示信息,此时我们可以使用微信小程序上的NFC烧写界面,将WiFi名称和密码进行烧写开发板上的NFC标签,然后再重新开发板进行重新连接新的WiFi热点。设备端在空闲的时候,监听订阅的主题中是否接收到云平台转发下来的数据,如果接收到了,进行JSON的数据解析,然后控制相关设备。本项目主要实现以下功能,整体框架图如图所示:9.4.1项目框架449.4.2硬件设计45模块的整体硬件电路的设计如下图所示,电路中包括了基于Hi3861V100芯片设计的WF-H861-RTA1模组作为主控电路、SSD1306芯片驱动的0.96寸OLED显示屏电路、蜂鸣器连接电路、NFC近场通讯电路以及AP3216C传感器电路,在本实验中,使用I2C总线与AP3216C三合一传感器进行通信,读取当前的光照强度、红外、接近的数据。9.4.3程序设计46本项目主要是实现一个智能安防报警系统,该项目的主体代码框架涵盖了从系统初始化、外设配置、网络连接、MQTT通信设置到多任务创建的全过程。这些部分共同构成了智能安全防护系统的核心功能。首先定义了系统的主函数smartSecurityDefense_main,这个函数包含了整个智能安全系统的逻辑。包含了外设初始化,OLED显示和NFC操作以及使用NFC数据配置WiFi网络。staticvoidsmartSecurityDefense_main(void){console_log_info("EntersmartSecurityDefense_main()!");p_MQTTClient_sub_callback=&mqttClient_sub_callback;//外设的初始化KEY_Init();//按键初始化PCF8574_Init();//初始化IO扩展芯片sys_msg_data.pcf8574_io.bit.p1=1;//关闭蜂鸣器PCF8574_Write(sys_msg_data.pcf8574_io.all);AP3216C_Init();//三合一传感器初始化SSD1306_Init();//OLED显示屏初始化SSD1306_CLS();//清屏SSD1306_ShowStr(0,0,"SmartSecurity",16);nfc_Init();usleep(200*1000);//初始化NFC模块,并延时200ms9.4.3程序设计47#if1//通过NFC芯片进行连接WiFiuint8_tndefLen=0;//ndef包的长度uint8_tndef_Header=0;//ndef消息开始标志位-用不到uint32_tresult_code=0;//函数的返回值oled_consle_log("===startnfc===");//读整个数据的包头部分,读出整个数据的长度if(result_code=NT3HReadHeaderNfc(&ndefLen,&ndef_Header)!=true){console_log_error("NT3HReadHeaderNfcisfailed.result_code=%d",result_code);return;}ndefLen+=NDEF_HEADER_SIZE;//加上头部字节//为NDEF数据包分配内存uint8_t*ndefBuff=(uint8_t*)malloc(ndefLen+1);if(ndefBuff==NULL){console_log_error("ndefBuffmallocisFalied!");return;}//从NFC读取数据包到分配的内存中9.4.3程序设计48if(result_code=get_NDEFDataPackage(ndefBuff,ndefLen)!=HI_ERR_SUCCESS){console_log_error("get_NDEFDataPackageisfailed.result_code=%d",result_code);return;}console_log_info("startprintndefBuff.");for(size_ti=0;i<ndefLen;i++){printf("0x%x",ndefBuff[i]);}oled_consle_log("===endnfc===");usleep(200*1000);oled_consle_log("==startwifi==");//WiFi连接的开始,使用goto可以跳回此标签重试CONNECT_WIFI:if(NFC_configuresWiFiNetwork(ndefBuff)!=WIFI_SUCCESS)//使用NFC配置WiFi网络9.4.3程序设计49{console_log_error("nfcconnectwifiisfailed!");oled_consle_log("===wifino===");usleep(200*1000);SSD1306_CLS();//清屏gotoCONNECT_WIFI;}else{console_log_info("nfcconnectwifiisSUCCESS");oled_consle_log("===wifiyes===");usleep(200*1000);}#endifoled_consle_log("===endwifi===");//如果WiFi连接成功,打印成功信息并延时9.4.3程序设计50接着尝试连接MQTT服务器,如果失败则重试,随后初始化MQTT客户端,并订阅所需的主题,及从NV中读取配置信息,最后创建线程,运行整个代码。CONNECT_MQTT_SERVER://连接MQTT服务器if(MQTTClient_connectServer(SERVER_IP_ADDR,SERVER_IP_PORT)!=0){console_log_error("mqttClient_connectServer");oled_consle_log("==mqttserno==");usleep(200*1000);SSD1306_CLS();//清屏gotoCONNECT_MQTT_SERVER;}else{console_log_info("mqttClient_connectServer");oled_consle_log("==mqttseryes=");usleep(200*1000);}9.4.3程序设计51CONNECT_MQTT_CLIENT://初始化MQTT客户端if(MQTTClient_init(MQTT_CLIENT_ID,MQTT_USER_NAME,MQTT_PASS_WORD)!=0){console_log_error("mqttClient_init");oled_consle_log("==mqttclino==");usleep(200*1000);SSD1306_CLS();//清屏gotoCONNECT_MQTT_CLIENT;}else{console_log_info("mqttClient_init");oled_consle_log("==mqttcliyes=");usleep(200*1000);}9.4.3程序设计52CONNECT_MQTT_SUB://订阅主题if(MQTTClient_subscribe(MQTT_TOPIC_SUB_COMMANDS)!=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (2026年)中医护理工作计划一
- 混凝土搅拌站实验室质量管理手册
- (2026版)术前讨论制度(含培训与试卷)
- 钻床工岗前沟通技巧考核试卷含答案
- 电子电气产品安全检验员常识考核试卷含答案
- 转化膜工安全理论水平考核试卷含答案
- 铸管退火工10S执行考核试卷含答案
- 铁合金炉料烧结工创新方法竞赛考核试卷含答案
- 客运计划员岗前应急预案考核试卷含答案
- 硅料腐蚀工岗中责任考核试卷含答案
- 2026秋新教材统编版九年级上册历史全册教案
- 2026年省级检察院遴选公务员面试真题(附答案)
- 2026年国企办公室文秘招聘笔试真题
- 月子中心母婴营养餐专项承包协议
- 2026瑞众人寿保险有限责任公司校园招聘笔试历年难易错考点试卷带答案解析
- 中国广电考试题库
- 2025年四川省党政领导干部政治理论水平考试(理论测试)历年参考题库含答案详解
- 2025年营口市辅警招聘考试真题(附答案)
- OC人设表模板下载-包含外貌性格背景完整设计要素
- 人教版六年级语文文学常识汇编
- 2025年浙银金租笔试真题及答案
评论
0/150
提交评论