




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于OpenHarmony的嵌入式开发
第八章轻量系统应用开发[8.1.1]项目的硬件组成
Hi3861
SoC模块:Hi-12F-Kit显示屏幕:OLED
128×64(I2C接口)空气质量检测传感器
Hi3861内部没有包含温湿度、PM2.5等传感器,需要使用外部传感器
PTQS1005多合一气体传感器模组,如下特性:
①激光散射原理测量颗粒物浓度;
②半导体原理测量TVOC(TotalVolatileOrganicCompounds,有机气态物质);
③红外非分光原理测量二氧化碳;
④内部集成温湿度一体检测芯片;
⑤多种传感器统一风道,优化空间和反应速度。安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发2先看功能[8.1.1]项目的硬件组成空气质量检测传感器PTQS1005安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发3参数类别部分参数参数值或范围颗粒物PM2.5标准值测量范围0~500(μg/m3)分辨率1(μg/m3)工作电流45~75(mA)TVOCTVOC有效量程0~10(ppm)TVOC分辨率0.01(ppm)工作电流60(mA)HOCOHOCO有效量程0~1(mg/m3)HOCO分辨率0.01(mg/m3)CO2有效量程400~3000(ppm)分辨率1(ppm)工作电流30~150(mA)温湿度温度测量范围-30~99(℃)温度测量分辨率0.1(℃)湿度测量范围0~99(%RH)湿度测量分辨率0.1(%RH)模块本体直流供电电压标准5.0V,4.5~5.5(V)平均工作电流≤200(mA)再看参数[8.1.1]项目的硬件组成空气质量检测传感器PTQS1005安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发4引脚序号功能标号说明模块连接PIN1VCC电源正(+5V)+5VPIN2GND电源负(0V/GND)GNDPIN3SET高电平或悬空为正常工作状态悬空PIN4RXD/SCL串口接收/I2C时钟(3.3V)TXD1PIN5TXD/SDA串口发送/I2C数据(3.3V)RXD1PIN6RESET低电平复位,不使用应悬空悬空PIN7SEL高电平或悬空为UART,低电平为I2C悬空PIN8NC悬空悬空再看引脚和通信协议可以设置使用UART或I2C两种接口常见传感器通信接口:UART、I2C、CAN和SPI等[8.1.2]项目实现过程
①创建项目,同7.1节,略
②OLED的功能支持:7.4.1小节示例的功能过于简单使用功能更丰富的第三方库,扩展OLED
128×64的显示特性
U8g2:Libraryformonochromedisplays,version2,
U8g2isamonochromegraphicslibraryforembeddeddevices.U8g2supportsmonochromeOLEDsandLCDs,whichincludethefollowingcontrollers:SSD1305,SSD1306……
Includesallgraphicsprocedures(line/box/circledraw).
Supportsmanyfonts.(Almost)norestrictiononthefontheight.
Requiressomememoryinthemicrocontrollertorenderthedisplay.下载U8g2,解压缩到项目目录下,将文件夹名称更改为u8g2即可
本示例实际使用的是纯文本的U8x8库(包含在U8g2中)安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发5[8.1.2]项目实现过程
②OLED的功能支持:在BUILD.gn中增加U8g2支持安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发6sources=["u8g2/csrc/u8x8_setup.c","u8g2/csrc/u8x8_u8toa.c","u8g2/csrc/u8g2_d_memory.c","u8g2/csrc/u8g2_selection_list.c","u8g2/csrc/u8g2_hvline.c","u8g2/csrc/u8x8_message.c","u8g2/csrc/u8g2_kerning.c","u8g2/csrc/u8x8_input_value.c","u8g2/csrc/u8g2_polygon.c","u8g2/csrc/u8g2_input_value.c","u8g2/csrc/u8x8_8x8.c","u8g2/csrc/u8x8_debounce.c","u8g2/csrc/u8g2_setup.c",
"u8g2/csrc/u8x8_display.c","u8g2/csrc/u8g2_box.c","u8g2/csrc/u8x8_selection_list.c","u8g2/csrc/u8x8_byte.c",
"u8g2/csrc/u8log.c",
"u8g2/csrc/u8log.c","u8g2/csrc/u8log_u8x8.c","u8g2/csrc/u8g2_message.c","u8g2/csrc/u8g2_line.c","u8g2/csrc/u8g2_intersection.c","u8g2/csrc/u8g2_fonts.c","u8g2/csrc/u8g2_cleardisplay.c","u8g2/csrc/u8g2_font.c","u8g2/csrc/u8x8_cad.c","u8g2/csrc/u8x8_string.c","u8g2/csrc/u8g2_ll_hvline.c","u8g2/csrc/u8x8_fonts.c","u8g2/csrc/u8log_u8g2.c","u8g2/csrc/u8g2_circle.c","u8g2/csrc/u8g2_buffer.c","u8g2/csrc/u8g2_bitmap.c","u8g2/csrc/u8x8_gpio.c",
"u8g2/csrc/u8g2_d_setup.c",
"u8g2/csrc/u8x8_u16toa.c",
"u8g2/csrc/u8x8_capture.c","u8g2/csrc/u8g2_button.c","u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c",...]include_dirs=["u8g2/csrc",...]要注意的文件[8.1.2]项目实现过程
②OLED的功能支持:工程源码文件内容
U8g2重点:实现U8g2(U8x8)中的相关功能函数(Setup)安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发7#include"iot_i2c.h"#include"u8g2.h"新增加的头文件voidu8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2_t*u8g2,constu8g2_cb_t*rotation,
u8x8_msg_cbbyte_cb,u8x8_msg_cbgpio_and_delay_cb){uint8_ttile_buf_height;uint8_t*buf;u8g2_SetupDisplay(u8g2,u8x8_d_ssd1306_128x64_noname,u8x8_cad_ssd13xx_fast_i2c,byte_cb,gpio_and_delay_cb);buf=u8g2_m_16_8_f(&tile_buf_height);u8g2_SetupBuffer(u8g2,buf,tile_buf_height,u8g2_ll_hvline_vertical_top_lsb,rotation);}I2C,128×64,无名厂商,1KB缓存byte_cb:回调函数,与OLED通信相关的功能的实现,如I2C的通信过程、数据发送等gpio_and_delay_cb:回调函数,主要与延时相关的功能的实现[8.1.2]项目实现过程
②OLED的功能支持:工程源码文件内容
byte_cb:回调函数(u8x8_byte_hw_i2c):switch-case
U8X8_MSG_BYTE_INIT:用来初始化GPIOU8X8_MSG_BYTE_SEND:用来发送数据(复制数据到Buffer)
U8X8_MSG_BYTE_SET_DC:在I2C中不使用(SPI:Data/Cmd)U8X8_MSG_BYTE_START_TRANSFER:开始传输数据U8X8_MSG_BYTE_END_TRANSFER:结束传输数据
gpio_and_delay_cb:回调函数(u8x8_gpio_and_delay)
U8X8_MSG_GPIO_AND_DELAY_INIT:初始化IO,在BYTE_INIT已完成
U8X8_MSG_DELAY_NANO:在I2C中不使用,延时1纳秒
U8X8_MSG_DELAY_MILLI:延时1微秒安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发8[8.1.2]项目实现过程
②OLED的功能支持:工程源码文件内容:两个回调函数(部分源码)安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发9uint8_tu8x8_byte_hw_i2c(u8x8_t*u8x8,uint8_tmsg,uint8_targ_int,void*arg_ptr){
……
switch(msg){
caseU8X8_MSG_BYTE_SEND:data=(uint8_t*)arg_ptr;while(arg_int>0){buffer[buf_idx++]=*data;data++;arg_int--;}break;
caseU8X8_MSG_BYTE_INIT://GPIO0复用为I2C1SDAIoTGpioInit(0);IoTGpioSetFunc(0,IOT_GPIO_FUNC_GPIO_0_I2C1_SDA);IoTGpioSetDir(0,IOT_GPIO_DIR_OUT);//GPIO1复用为I2C1SCLIoTGpioInit(1);IoTGpioSetFunc(1,IOT_GPIO_FUNC_GPIO_1_I2C1_SCL);IoTGpioSetDir(1,IOT_GPIO_DIR_OUT);intret=IoTI2cInit(1,400000);//初始化I2C1速率400kbpsif(ret!=IOT_SUCCESS){
printf(“FailedtoinitI2C!Error=%d\n”,ret);
return0;
}break;
……[8.1.2]项目实现过程
②OLED的功能支持:工程源码文件内容:两个回调函数(部分源码)安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发10uint8_tu8x8_gpio_and_delay(u8x8_t*u8x8,uint8_tmsg,uint8_targ_int,void*arg_ptr){uint8_ti;
switch(msg){
caseU8X8_MSG_GPIO_AND_DELAY_INIT:break;
caseU8X8_MSG_DELAY_NANO:usleep(1);break;
caseU8X8_MSG_DELAY_MILLI:usleep(arg_int*1000);break;default:return0;}return1;}或者留空不写[8.1.2]项目实现过程
③Hi3861与PTQS1005的通信,选择使用UART:9600,8N1
PTQS1005有很多数据,可以选择性地读取,指令与格式如下:例如:0x42,0x4D,0xAB,0x00,0x00,0x01,0x3A安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发11字节0123456含义0x420x4D指令数据H数据L校验H校验L指令码数据H数据L说明0xABXX读取一般数据0xACXX读取颗粒物完整数据0xADXX读取颗粒物TSI模式数据0xF4X00-待机模式01-正常模式待机模式控制0xAC和0xAD指令不能读取温湿度信息[8.1.2]项目实现过程
③Hi3861与PTQS1005的通信,选择使用UART:9600,8N1使用读取一般数据方式读取PTQS1005安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发12字节示例说明00x42特征字节110x4D特征字节220x00长度码高8位30x14长度码低8位,长度码=数据段长度+校验字节(2字节)4
PM2.5(标准颗粒物CF=1)数值高8位5
PM2.5(标准颗粒物CF=1)数值低8位,单位μg/m36
TVOC数值高8位7TVOC数值低8位,单位PPM
字节示例说明8
-9
HCHO数值高8位10
HCHO数值低8位,单位mg/m311
-12
CO2数值高8位13
CO2数值低8位,单位PPM14
温度数值高8位15
温度数值低8位。实际温度值=16bit的温度值/1016
湿度数值高8位字节示例说明17
湿度数值低8位。实际湿度值=16bit的湿度值/1018
-19
-20
-21
版本号22
校验字高8位23
校验字低8位,16bit校验字=除校验字本身前面所有字节累加和[8.1.2]项目实现过程
③Hi3861与PTQS1005的通信,选择使用UART:9600,8N1首先,配置Hi3861的UART1接口,9600,8N1模式,参考第七章其次,完成发送指令的函数:读取一般数据SendCommand()
安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发13intSendCommand(uint8_tcmd,uint16_tdata){uint8_tbuffer[7]={0x42,0x4D,cmd,(data&0xFF00)>>8,data&0xFF};uint16_tchecksum=0;
//计算校验和
for(inti=0;i<5;i++)checksum+=buffer[i];buffer[5]=(checksum&0xFF00)>>8;buffer[6]=checksum&0xFF;returnIoTUartWrite(IOT_UART,buffer,sizeof(buffer));
//通过串口1发送指令}[8.1.2]项目实现过程
③Hi3861与PTQS1005的通信,选择使用UART:9600,8N1再次,接收数据、解析数据安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发14//传感器数据结构体typedefstruct{intpm2_5;
//PM2.5,单位ug/m³intco2;
//CO2,单位PPMfloattemperature;
//温度
floathumidity;
//湿度}SENSOR_DATA;intReceiveData(SENSOR_DATA*data){uint8_tbuffer[24]={0};intret=IoTUartRead(IOT_UART,buffer,sizeof(buffer));//通过串口1接收数据
if(buffer[0]!=0x42||buffer[1]!=0x4D)return-1;data->pm2_5=buffer[4]<<8|buffer[5];
//解析数据
data->co2=buffer[12]<<8|buffer[13];data->temperature=(buffer[14]<<8|buffer[15])/10.0f;data->humidity=(buffer[16]<<8|buffer[17])/10.0f;
……//后面还有校验,不在此列出[8.1.2]项目实现过程
③Hi3861与PTQS1005的通信,选择使用UART:9600,8N1最后,初始化OLED屏幕,将数据展示在OLED屏幕上安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发15//定义u8g2全局变量u8g2_tu8g2;...u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2,U8G2_R0,u8x8_byte_hw_i2c,u8x8_gpio_and_delay);u8g2_InitDisplay(&u8g2);
//初始化屏幕u8g2_SetPowerSave(&u8g2,0);
//唤醒屏幕u8g2_SetFont(&u8g2,u8g2_font_6x12_mr);
//设置字体u8g2_ClearBuffer(&u8g2);
//清空缓冲区charstr[20];u8g2_DrawStr(&u8g2,0,12,“Airquality”);
//绘制文字snprintf(str,sizeof(str),"PM2.5:%dug/m3",data.pm2_5);u8g2_DrawStr(&u8g2,0,24,str);snprintf(str,sizeof(str),"CO2:%dPPM",data.co2);u8g2_DrawStr(&u8g2,0,36,str);……u8g2_SendBuffer(&u8g2);
//绘制缓冲区[8.1.2]项目实现展示电气连接示意图安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发16Hi3861模块
PTQS1005传感器GPIO0/I2C0_SDAGPIO1/I2C0_SCL3.3VGNDRXDTXD5VOLED屏幕SDASCL3.3VGNDTXDRXD5VGND[8.1.0]项目实现总结与展望接口方面:同时使用了Hi3861的UART和I2C通信方面:基于U8g2实现了与OLED屏幕的通信,自定义了显示的内容基于PTQS1005的协议要求实现了与PTQS1005的通信,获取并解析了目标数据工作总结:实现了一个数据采集和数据展示的本地终端分析展望:可扩展实现:历史数据的本地存储、基于Wi-Fi的MQTT平台接入*参考《Hi3861V100/Hi3861LV100MQTT开发指南》可扩展实现:多网络终端(WEB、移动端)的感知数据获取安全边距8.1空气质量监测仪项目基于OpenHarmony的嵌入式开发17gitee:dawningw仓库[8.2.0]项目硬件组成安全边距8.2节点互联的交通灯系统基于OpenHarmony的嵌入式开发18Hi3861模块(AP主模块)控制从模块Hi3861模块(STA从模块2)Hi3861模块(STA从模块1)Hi3861模块(STA从模块3)模块上的RGB
LED
R:红色交通灯
G:绿色交通灯
B:黄色交通灯模块上的Wi-Fi
AP:1个主节点
STA:3个从节点采用UDP通信[8.2.1]项目的LED控制
LED:Hi3861模块板载:GPIO13红、GPIO12蓝、GPIO9绿安全边距8.2节点互联的交通灯系统基于OpenHarmony的嵌入式开发19//初始化GPIO13IoTGpioInit(13);IoTGpioSetFunc(13,IOT_GPIO_FUNC_GPIO_13_GPIO);
//GPIO模式IoTGpioSetDir(13,IOT_GPIO_DIR_OUT);
//输出模式……//GPIO12和GPIO9略//type为0时红灯亮,为1时黄灯亮/实际为蓝灯,为2时绿灯亮voidSetLight(inttype){IoTGpioSetOutputVal(13,IOT_GPIO_VALUE0);
//先关闭所有LEDIoTGpioSetOutputVal(12,IOT_GPIO_VALUE0);IoTGpioSetOutputVal(9,IOT_GPIO_VALUE0);
switch(type){default:case0:IoTGpioSetOutputVal(13,IOT_GPIO_VALUE1);break;
//红亮case1:IoTGpioSetOutputVal(9,IOT_GPIO_VALUE1);break;
//蓝亮(替代黄色,不是红绿混)case2:IoTGpioSetOutputVal(12,IOT_GPIO_VALUE1);break;
//绿亮}}[8.2.2]创建Wi-Fi通信网络主节点:开启AP模式从节点:STA模式,连接热点安全边距8.2节点互联的交通灯系统基于OpenHarmony的嵌入式开发20HotspotConfigconfig={0};strcpy_s(config.ssid,sizeof(config.ssid),“Hi3861”);
//热点:Hi3861strcpy_s(config.preSharedKey,sizeof(config.preSharedKey),“1234567890”);
//密码:1234567890config.securityType=WIFI_SEC_TYPE_PSK;
//认证:PSKconfig.band=HOTSPOT_BAND_TYPE_2G;
//频段:2.4GHzconfig.channelNum=7;
//信道:7printf("Startinghotspot...\n");WifiErrorCodeerrCode=StartHotspot(&config);printf("StartHotspot:%d\n",errCode);sleep(5);WifiDeviceConfigconfig={0};strcpy_s(config.ssid,sizeof(config.ssid),“Hi3861”);
//同上,才能连接!strcpy_s(config.preSharedKey,sizeof(config.preSharedKey),"1234567890");config.securityType=WIFI_SEC_TYPE_PSK;printf("Connectingwifi...\n");intnetId=ConnectToHotspot(&config);printf("ConnectToHotspot:%d\n",netId);sleep(5);[8.2.3]创建Wi-Fi通信网络主节点AP:客户端,发送广播安全边距8.2节点互联的交通灯系统基于OpenHarmony的嵌入式开发21//创建Socketintfd=socket(PF_INET,SOCK_DGRAM,0);if(fd<0){printf("Socketallocatefailed,errno=%d\n",errno);return;}intopt=1;//设置该套接字为广播类型if(setsockopt(fd,SOL_SOCKET,SO_BROADCAST,(char*)&opt,sizeof(opt))<0){printf("Setsocketbroadcastfailed\n");lwip_close(fd);return;}structsockaddr_inaddr={0};addr.sin_family=AF_INET;
//IPv4addr.sin_addr.s_addr=htonl(INADDR_BROADCAST);
//广播,55addr.sin_port=htons(3861);
//端口,3861[8.2.3]创建Wi-Fi通信网络从节点Station:服务端,接收广播安全边距8.2节点互联的交通灯系统基于OpenHarmony的嵌入式开发22//填充sockaddr_in结构体structsockaddr_inserver_addr;bzero(&server_addr,sizeof(structsockaddr_in));server_addr.sin_family=AF_INET;
//IPv4server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
//任意地址,server_addr.sin_port=htons(3861);
//监听端口,3861//创建Socketintfd=socket(PF_INET,SOCK_DGRAM,0);if(fd<0){printf(“Socketallocatefailed,errno=%d\n”,errno);
return;
}intopt=1;//设置该套接字为广播类型if(setsockopt(fd,SOL_SOCKET,SO_BROADCAST,(char*)&opt,sizeof(opt))<0){printf("Setsocketbroadcastfailed\n");lwip_close(fd);return;
}//开始监听if(bind(fd,(structsockaddr*)&server_addr,sizeof(server_addr))!=0){printf("Socketbindfailed\n");lwip_close(fd);return;
}printf("Socketlistening\n");[8.2.4]信号灯状态切换与同步主节点:设定为红30秒→黄3秒→绿30秒→黄3秒→红30秒……安全边距8.2节点互联的交通灯系统基于OpenHarmony的嵌入式开发23while(1){charbuffer;SetLight(0);//变为红灯
buffer='R';//发送信号灯状态
if(sendto(fd,&buffer,sizeof(buffer),0,(structsockaddr*)&addr,sizeof(addr))<0){printf("Sendbroadcastfailed!\n");}sleep(30);
//等待30秒
SetLight(1);//变为黄灯
buffer='Y';//发送信号灯状态
if(sendto(fd,&buffer,sizeof(buffer),0,(structsockaddr*)&addr,sizeof(addr))<0){printf("Sendbroadcastfailed!\n");}sleep(3);
//等待3秒
SetLight(2);//变为绿灯
buffer='G';//发送信号灯状态
if(sendto(fd,&buffer,sizeof(buffer),0,(structsockaddr*)&addr,sizeof(addr))<0){
printf("Sendbroadcastfailed!\n");}sleep(30);
//等待30秒
SetLight(1);//变为黄灯
buffer='Y';//发送信号灯状态
if(sendto(fd,&buffer,sizeof(buffer),0,(structsockaddr*)&addr,sizeof(addr))<0){
printf("Sendbroadcastfailed!\n");}sleep(3);
//等待3秒}[8.2.4]信号灯状态切换与同步从节点:根据接收的信息,切换信号灯状态(对向问题)安全边距8.2节点互联的交通灯系统基于OpenHarmony的嵌入式开发24#defineNODE_ID1
//节点编号(偶数亮的灯相同,奇数亮的灯相反)structsockaddr_inaddr;bzero(&addr,sizeof(structsockaddr_in));addr.sin_family=AF_INET;addr.sin_addr.s_addr=htonl(INADDR_ANY);addr.sin_port=htons(3861);intaddr_len=sizeof(addr);while(1){charmessage;intret=recvfrom(fd,&message,sizeof(message),0,(structsockaddr*)&addr,(socklen_t*)&addr_len);if(ret<0){
printf("recvfromfailed,ret=%d!\n",ret);continue;}switch(message){default:case'R':SetLight(NODE_ID%2==0?0:2);break;case'Y':SetLight(1);break;case'G':SetLight(NODE_ID%2==0?2:0);break;}usleep(1000);}主从1从2从3R
GRGG
RGRYYYY[8.2.0]项目实现总结与展望外设方面:同时使用了Hi3861的Wi-Fi和GPIO通信方面:一主三从,一个客户端发送三个服务端侦听接收一主控制切换、发送UDP报文,三从根据自己的ID切换状态工作总结:实现了一个数据发送和接收的本地局域网分析展望:系统缺陷分析:切换完全依赖与主节点的通信,UDP不可靠,网络可能断开可扩展实现:改为时间同步方式,让节点根据时间自主控制交通灯切换可扩展实现:*MESH组网《Hi3861V100/Hi3861LV100Mesh软件开发指南》安全边距8.2节点互联的交通灯系统基于OpenHarmony的嵌入式开发25[8.3.0]项目功能简介互联网信息获取与展示:http
+
json
+
OLED,流程如下:
Hi3861连接到有效的热点(具备互联网能力)注册互联网气象数据网站(获取私钥以便获取气象数据)通过LwIP的HTTP客户端获取气象数据解析JSON数据,获得气象数据的有效数值将数据显示在OLED屏幕上安全边距8.3
基于互联网信息的天气预报项目基于OpenHarmony的嵌入式开发26[8.3.1]连接到Wi-Fi热点
Hi3861工作在STA模式下,实验环境有Wi-Fi热点
Wi-Fi网络无二次认证,网络DHCP正常、DNS正常安全边距8.3
基于互联网信息的天气预报项目基于OpenHarmony的嵌入式开发27#include"wifi_connecter.h"//所需头文件...WifiDeviceConfigconfig={0};strcpy_s(config.ssid,sizeof(config.ssid),“SSID”);
//热点SSIDstrcpy_s(config.preSharedKey,sizeof(config.preSharedKey),"PASSWORD");//热点密码config.securityType=WIFI_SEC_TYPE_PSK;intnetId=ConnectToHotspot(&config);[8.3.2]获取天气预报数据互联网信息获取与展示:注册数据来源网站数据来源:互联网数据网站:注册并获取私钥安全边距8.3
基于互联网信息的天气预报项目基于OpenHarmony的嵌入式开发28[8.3.2]获取天气预报数据互联网信息获取与展示:HTTP客户端获取数据
LwIP内置的HTTP客户端登陆网站获取数据(1)进行DNS域名解析,获取主机名对应的IP地址;(2)创建sockaddr_in结构体,填入IP地址和端口号;(3)创建Socket;(4)设置接收超时时间以及其他参数(如果需要的话);(5)连接Socket;(6)创建HTTP请求头并发送HTTP请求;(7)读取HTTP响应并返回。安全边距8.3
基于互联网信息的天气预报项目基于OpenHarmony的嵌入式开发29[8.3.2]获取天气预报数据互联网信息获取与展示:HTTP获取数据-DNS解析安全边距8.3
基于互联网信息的天气预报项目基于OpenHarmony的嵌入式开发30if(hostname[0]<'0'||hostname[0]>'9'){
g_got_ip=0;ip_addr_tipaddr;intret=dns_gethostbyname(hostname,&ipaddr,dns_found,NULL);if(ret!=ERR_OK&&ret!=ERR_INPROGRESS){printf("DNSfailed,errno=%d\n",ret);return-1;}while(g_got_ip==0)sleep(1);ip=ip_ntoa(&g_dns_addr);
printf("DNSgetip:%s\n",ip);}voiddns_found(constchar*name,ip_addr_t*ipaddr,void*callback_arg){if(ipaddr){g_got_ip=1;ip_addr_copy(g_dns_addr,*ipaddr);}}dns_gethostbyname(constchar*hostname,ip_addr_t*addr,
dns_found_callbackfound,void*found);hostname:待解析的域名addr:解析返回的IP地址指针found:回调函数[8.3.2]获取天气预报数据互联网信息获取与展示:HTTP获取数据-创建Socket连接安全边距8.3
基于互联网信息的天气预报项目基于OpenHarmony的嵌入式开发31structsockaddr_inaddr={0};
//填充sockaddr_in结构体addr.sin_family=AF_INET;addr.sin_addr.s_addr=inet_addr(ip);addr.sin_port=PP_HTONS(port);intfd=socket(AF_INET,SOCK_STREAM,0);
//创建Socketif(fd<0){printf("Socketallocatefailed,errno=%d\n",errno);return-1;}structtimevalreceiving_timeout={0};receiving_timeout.tv_sec=TIMEOUT;
//设置接收超时时间if(setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&receiving_timeout,sizeof(receiving_timeout))<0){printf(“Setsocketreceivingtimeoutfailed\n”);
//设置套接字描述符的属性lwip_close(fd);return-1;}printf("Socketallocated\n");[8.3.2]获取天气预报数据互联网信息获取与展示:HTTP获取数据-Socket连接+HTTP请求安全边距8.3
基于互联网信息的天气预报项目基于OpenHarmony的嵌入式开发32if(connect(fd,(structsockaddr*)&addr,sizeof(addr))!=0){
//连接Socketprintf("Socketconnectfailed,errno=%d\n",errno);lwip_close(fd);return-1;}printf("Socketconnected\n");charsend_buf[512];staticconstchar*g_request_header="GET%sHTTP/1.1\r\n"\"User-Agent:OpenHarmony/Hi3861\r\n"\"Accept:*/*\r\n"\"Host:%s\r\n"\"Connection:Close\r\n"\"\r\n";intlen=snprintf(send_buf,512,g_request_header,url,hostname);if(lwip_write(fd,send_buf,len)<0){
//发送HTTP请求
lwip_close(fd);return-1;}printf("Socketsendhttpheadersuccess\n");[8.3.2]获取天气预报数据互联网信息获取与展示:HTTP获取数据-读取响应数据调用http_get,并过滤内容安全边距8.3
基于互联网信息的天气预报项目基于OpenHarmony的嵌入式开发33memset_s(recv_buf,max_length,0,max_length);
//读取HTTP响应intlength=0,r=0;do{r=lwip_read(fd,recv_buf+length,max_length-length-1);if(r>0)length+=r;}while(r>0);printf("Receivedfromsocket,ret=%derrno=%d\n",r,errno);lwip_close(fd);returnstrlen(recv_buf);charresponse[4096];intlength=http_get("",80,"/v3/weather/daily.json?key={此处填写私钥}&location=beijing&language=en&days=1",response,sizeof(response));char*body=response+4;while(*body!=‘\0’&&strncmp(body-4,“\r\n\r\n”,4)!=0)
//过滤方法不做讲述body++;参数名称类型默认值必填备注keyString无是用户API密钥locationLocation无是所查询的位置languageLanguagezh-Hans否语言unitUnitc否单位startStart0否起始时间daysInt权限允许天数否天数[8.3.3]
解析JSON获得数据天气数据的JSON的格式安全边距8.3
基于互联网信息的天气预报项目基于OpenHarmony的嵌入式开发34{"results":[{"location":{"id":”………………","name":"北京","country":"CN","path":"北京,北京,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},“daily”:[{
//返回指定days天数的结果
“date”:“2023-09-20”,
//日期(该城市的本地时间)
“text_day”:“多云”,
//白天天气现象文字
“code_day”:“4”,
//白天天气现象代码
“text_night”:“晴”,
//晚间天气现象文字
“code_night”:“0”,
//晚间天气现象代码
“high”:“26”,
//当天最高温度
“low”:“17”,
//当天最低温度
“precip”:“0”,
//降水概率,范围0~100,单位百分比
“wind_direction”:“”,
//风向文字
“wind_direction_degree”:“255”,
//风向角度,范围0~360“wind_speed”:“9.66”,
//风速,单位km/h(当unit=c时)、mph(当unit=f时)
“wind_scale”:“”,
//风力等级
“rainfall”:“0.0”,
//降水量,单位mm“humidity”:“76”
//相对湿度,0~100,单位为百分比
},{...
//更多返回结果
}],“last_update”:“2015-09-20T18:00:00+08:00”
//数据更新时间(该城市的本地时间)
}]}[8.3.3]
解析JSON获得数据利用cJSON库来完成解析,在BUILD.gn中增加cJSON库安全边距8.3
基于互联网信息的天气预报项目基于OpenHarmony的嵌入式开发35#include“cJSON.h”
//包含头文件typedefstruct{
//天气预报数据结构体,
chardate[11];
//日期
charday[20];
//早间天气
charnight[20];
//晚间天气
int8_thigh;
//最高气温
int8_tlow;
//最低气温
int8_thumidity;
//湿度}WEATHER_DATA;...WEATHER_DATAdata;cJSON*root=cJSON_Parse(response);cJSON*result=cJSON_GetArrayItem(cJSON_GetObjectItem(root,"results"),0);cJSON*daily=cJSON_GetArrayItem(cJSON_GetObjectItem(result,"daily"),0);strcpy(data.date,cJSON_GetStringValue(cJSON_GetObjectItem(daily,"date")));strcpy(data.day,cJSON_GetStringValue(cJSON_GetObjectItem(daily,"text_day")));strcpy(data.night,cJSON_GetStringValue(cJSON_GetObjectItem(daily,"text_night")));data.high=atoi(cJSON_GetStringValue(cJSON_GetObjectItem(daily,"high")));data.low=atoi(cJSON_GetStringValue(cJSON_GetObjectItem(daily,"low")));data.humidity=atoi(cJSON_GetStringValue(cJSON_GetObjectItem(daily,"humidity")));cJSON_Delete(root);[8.3.0]项目实现总结与展望接口方面:使用了Hi3861的Wi-Fi通信方面:建立了互联网连接,进行了DNS解析,HTTP通信工作总结:实现了基于HTTP的互联网数据的获取,基于cJSON的数据解析分析展望:可以尝试与其他气象数据网站之间的对接数据的友好显示可以提升用户体验,可以尝试改进屏幕上的数据展示方式安全边距8.3
基于互联网信息的天气预报项目基于OpenHarmony的嵌入式开发36[8.4.1]项目概述与硬件组成项目目的:小车(Hi3861和执行结构等)为执行端、计算机为控制端项目硬件小车:基于润和Pegasus小车套件控制核心:Hi3861显示器件:OLED电机驱动*:L9110S测距模块*:HC-SR04系统供电:18650安全边距8.4
无线遥控小车项目基于OpenHarmony的嵌入式开发37[8.4.1]项目概述与硬件组成-电机驱动L9110S电机驱动板板载两片L9110S驱动芯片,分别驱动左右轮电机驱动板四个输入端:电机1的IA(GPIO0)和IB(GPIO1)电机2的IA(GPIO9)和IB(GPIO10)驱动板四个输出端:电机1的OA和OB、电机2的OA和OB安全边距8.4
无线遥控小车项目基于OpenHarmony的嵌入式开发38IA电平IB电平电机旋转方向HL正转(假定)LH与正转相反方向LL停止(刹车)HH停止(刹车)两片L9110S[8.4.1]项目概述与硬件组成-电机驱动L9110SHC-SR04超声波传感器:依靠电平直接控制的控制端口Trig(GPIO7)和Echo(GPIO8
),超声波波束的宽度约为15度
Trig端口给传感器一个超过10us的高电平触发信号后,传感器开始工作,通过T端向外发射8个40KHz的方波并不断通过R端检测是否有信号返回,若R端有信号返回则表示传感器收到了被测物体的反射回波,并通过Echo端口输出一段高电平信号,高电平信号的持续时间就是超声波脉冲从发射到返回的时间,则可计算出超声波的传输距离,即传感器到被测物体距离的二倍安全边距8.4
无线遥控小车项目基于OpenHarmony的嵌入式开发39[8.4.2]小车的运动控制控制本质:GPIO的组合对电机正反转的简单控制对四个GPIO的初始化操作安全边距8.4
无线遥控小车项目基于OpenHarmony的嵌入式开发40#defineGPIO0
0#defineGPIO1
1#defineGPIO9
9#defineGPIO10
10...IoTGpioInit(GPIO0);
//初始化电机1的IA,G
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 助力备考2025年注册会计师考试资源试题及答案
- 高性能轿车短期出租协议
- 2025年注册会计师考试应对压力的有效方法试题及答案
- 财务分析在决策中的重要性试题及答案
- 加强新员工融入的工作措施计划
- 国际金融理财师考试另类投资方式试题及答案
- 注会考试中案例题的解析技巧与试题及答案
- 证券从业资格证的复习试题及答案
- 解析交易规则的证券从业资格证考试试题及答案
- 证券从业资格证考试体系化整合知识试题及答案
- 广东省2024-2025学年佛山市普通高中教学质量检测物理试卷及答案(二)高三试卷(佛山二模)
- 防水工程施工方案屋面防水施工的施工工艺
- 【9数一模】2025年安徽合肥市第四十五中学九年级中考一模数学试卷(含答案)
- 国家民政部所属单位招聘笔试真题2024
- 2024年安徽马鞍山技师学院专任教师招聘真题
- 2025年济源职业技术学院高职单招语文2019-2024历年真题考点试卷含答案解析
- 专题03 古今中外科技成就(测试)(解析版)
- 设计服务费用合同(2025年版)
- 广数980TDA详细说明书
- 2025年安徽国际商务职业学院单招职业适应性测试题库完整版
- 2024年新高考广西高考生物真题试卷及答案
评论
0/150
提交评论