LCD副屏-CPU,内存,时显,日期显示

 

  • 文章结构:
  •  项目概述
  • 成品预览
  • 项目框架
  • 硬件资料,代码
  • 项目槽点

 

-项目概述-

以前的旧模块搁置很久没用,最近看到圈子很多倒腾电脑副屏的,咱虽然没钱,但是闲啊,刚好手头有这些东西,开干。

目的:

  • 显示电脑CPU占用
  • 内存占用等信息
  • 后台消息屏闪提示
  • 开机自启
  • 显示时间日期
  • 背光可调
  • 蓝牙断线重连

材料清单:LCD一块,HC-04蓝牙模块,10K可调电阻,杜邦线,PC,51单片机最小系统板一块(其余种类也可,有串口即可)

-成品预览-

         

 

-项目框架-

 51单片机的STC8G系列完成硬件逻辑,蓝牙模块负责收发,项目框架如下:

 

 

-硬件资料,代码-

 51接收端资料:

  1 #include <STC8.H>
  2 #include "LCD1602.h"
  3 
  4 // #include "Display1602.h"
  5 
  6 
  7 #define uchar unsigned char
  8 #define uint  unsigned int
  9 
 10 sbit res_vcc = P3^0;
 11 sbit res_gnd = P3^1;
 12 
 13 sbit back1_vcc = P3^2;
 14 sbit back1_gnd = P3^3;
 15 
 16 sbit Time_vcc = P1^0;
 17 sbit Time_gnd = P1^4;
 18 
 19 int Time[3] = {0, 55, 16};  //秒,分,时
 20 uint Data[3] = {20,11,2022};  //年,月,日
 21 uint Week[7] = {0 ,1, 2, 3, 4, 5, 6};
 22 enum WEEK{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
 23 uint count;
 24 uchar num;
 25 char sep = '-';
 26 
 27 uchar i,flag,j,show_time;
 28 uchar Info_buffer[16];
 29 uchar Info_buffer1[16];
 30 
 31 
 32 //uchar DS1302_Time_test[]={27,1,19,12,00,00,1};
 33 //char DS1302_Time_test[] = "27,1,19,12,00,00,1";
 34 uchar code Data_array[10] = "2022-06-14";
 35 uchar code Week_array[3] = "WED";
 36 uchar code Time_array[8] = "11:08:09";
 37 uchar code Word_array[12] = "Starry";
 38 uchar code Tem_array[] = "32.1 C";
 39 
 40 //void Init_Timer0();
 41 //void TimeShow(void);
 42 void DataTransfer();
 43 
 44 void Init_UART()
 45 {
 46     PCON &= 0x7F;        //波特率不倍速
 47     SCON = 0x50;        //8位数据,可变波特率
 48     AUXR &= 0xBF;        //定时器时钟12T模式
 49     AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
 50     TMOD &= 0x0F;        //设置定时器模式
 51     TMOD |= 0x20;        //设置定时器模式
 52     TL1 = 0xFD;        //设置定时初始值
 53     TH1 = 0xFD;        //设置定时重载值
 54     ET1 = 0;        //禁止定时器%d中断
 55     TR1 = 1;        //定时器1开始计时
 56     EA = 1;
 57     ES = 1;
 58 
 59 }
 60 
 61 void main()
 62 {
 63     P1M0 = 0;
 64     P1M1 = 0;
 65     
 66     P3M0 = 0;
 67     P3M1 = 0;
 68     
 69     P2M0 = 0; 
 70     P2M1 = 0;
 71     
 72     res_vcc = 1;
 73     back1_vcc = 1;
 74     Time_vcc = 1;
 75     
 76     res_gnd = 0;
 77     back1_gnd = 0;
 78     Time_gnd = 0;
 79     
 80     
 81     LCD_set();
 82     Init_UART();
 83 //    Init_Timer0();
 84     
 85     while(1)
 86     {
 87         //TimeShow();
 88         LCD_write_Chars(0,0,Info_buffer);
 89         LCD_write_Chars(0,1,Info_buffer1);
 90         
 91         if(flag == 1)
 92         { 
 93             //LCD_write_com(0x01);
 94             LCD_write_Chars(0,0,Info_buffer);
 95             LCD_write_Chars(0,1,Info_buffer1);
 96             for(i=0;i<16;i++)
 97                 Info_buffer[i]=0x00;
 98             for(i=0;i<16;i++)
 99                 Info_buffer1[i]=0x00;
100             flag = 0;    
101         }
102         
103     }
104 }
105 
106 void Init_Timer0()
107 {
108     EA         = 1;
109     ET0     = 1;
110     TMOD     = 0x01;
111     TH0     = (65536-10000)/256;
112     TL0     = (65536-10000)%256;
113     TR0     = 1;
114 }
115 
116 void TimeShow(void)
117 {
118         LCD_writ_Number(0, 1, 2, Time[2]);  // 显示小时
119         lcd_delay(1);
120         
121         LCD_writ_Char(2, 1, '-');
122         lcd_delay(1);
123         
124         LCD_writ_Number(3, 1, 2, Time[1]);  // 显示分钟
125         lcd_delay(1);
126         
127         LCD_writ_Char(5 ,1 , '-');
128         lcd_delay(1);
129         
130         LCD_writ_Number(6, 1, 2, Time[0]);  // 显示秒钟
131         lcd_delay(1);
132 //-----------------------------------------------------
133         LCD_writ_Number(0, 0, 4, Data[2]);  // 显示日期
134         lcd_delay(1);
135         
136         LCD_writ_Char(4, 0, '-');
137         lcd_delay(1);
138         
139         LCD_writ_Number(5, 0, 2, Data[1]);  // 显示月份
140         lcd_delay(1);
141         
142         LCD_writ_Char(7 ,0 , '-');
143         lcd_delay(1);
144         
145         LCD_writ_Number(8, 0, 2, Data[0]);  // 显示年份
146         lcd_delay(1);        
147 }
148 
149 void UART_Interrupt() interrupt 4
150 {
151     ES = 0;
152     for(j=0;SBUF!=0X0A;j++)
153     {
154         while(!RI);
155         if(SBUF==0X0A)
156             goto A;
157         if(j<16)
158                 Info_buffer[j]= SBUF;
159         else
160                 Info_buffer1[j-16]= SBUF;
161         RI = 0;
162     }
163     A:    RI=0;
164     flag = 1;
165     ES = 1;
166 }

 

电脑发送端资料:

  1 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 
  2 #include <stdio.h>  
  3 #include <Windows.h>  
  4 #include<time.h>  
  5 #include <tchar.h>  
  6 #include "readport.h"
  7 
  8 #define DIV 1024  
  9 #define WIDTH 7  
 10 #define GB(x) (((x).HighPart << 2) + ((DWORD)(x).LowPart) / 1024.0 / 1024.0 / 1024.0)  
 11 
 12 #pragma warning(disable: 4996)     
 13 
 14 #define true 1  
 15 typedef unsigned char U_CHAR;
 16 
 17 //获取系统时间  
 18 void getSystemTime(char* buffer) {
 19 
 20     char buf[128];
 21     time_t rawtime;
 22     struct tm * timeinfo;
 23     time(&rawtime);
 24     timeinfo = localtime(&rawtime);
 25     strftime(buf, sizeof(buf), " %m-%d  %H:%M:%S", timeinfo);
 26     strcpy(buffer, buf);
 27 }
 28 
 29 //CPU利用率  
 30 FILETIME m_preidleTime;
 31 FILETIME m_prekernelTime;
 32 FILETIME m_preuserTime;
 33 
 34 __int64 CompareFileTime2(FILETIME time1, FILETIME time2)
 35 {
 36     __int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime;
 37     __int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime;
 38 
 39 
 40     return   b - a;
 41 }
 42 
 43 void GetCpuUseage()
 44 {
 45     GetSystemTimes(&m_preidleTime, &m_prekernelTime, &m_preuserTime);
 46     Sleep(1000);
 47 }
 48 
 49 double CpuUseage()
 50 {
 51     FILETIME idleTime;
 52     FILETIME kernelTime;
 53     FILETIME userTime;
 54     GetSystemTimes(&idleTime, &kernelTime, &userTime);
 55 
 56 
 57     int idle = CompareFileTime2(m_preidleTime, idleTime);
 58     int kernel = CompareFileTime2(m_prekernelTime, kernelTime);
 59     int user = CompareFileTime2(m_preuserTime, userTime);
 60 
 61 
 62     if (kernel + user == 0)
 63         return 0.0;
 64     //(总的时间-空闲时间)/总的时间=占用cpu的时间就是使用率  
 65     double cpu = abs((kernel + user - idle) * 100 / (kernel + user));
 66 
 67     m_preidleTime = idleTime;
 68     m_prekernelTime = kernelTime;
 69     m_preuserTime = userTime;
 70     return cpu;
 71 }
 72 
 73 //读取操作系统的名称  
 74 void GetSystemName(char* osname)
 75 {
 76     char buf[128];
 77     SYSTEM_INFO info;        //用SYSTEM_INFO结构判断64位AMD处理器   
 78     GetSystemInfo(&info);    //调用GetSystemInfo函数填充结构   
 79     OSVERSIONINFOEX os;
 80     os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
 81 
 82     strcpy(buf, "unknown OperatingSystem.");
 83 
 84     if (GetVersionEx((OSVERSIONINFO *)&os))
 85     {
 86         //下面根据版本信息判断操作系统名称   
 87         switch (os.dwMajorVersion)//判断主版本号  
 88         {
 89         case 4:
 90             switch (os.dwMinorVersion)//判断次版本号   
 91             {
 92             case 0:
 93                 if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
 94                     strcpy(buf, "Microsoft Windows NT 4.0"); //1996年7月发布   
 95                 else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
 96                     strcpy(buf, "Microsoft Windows 95");
 97                 break;
 98             case 10:
 99                 strcpy(buf, "Microsoft Windows 98");
100                 break;
101             case 90:
102                 strcpy(buf, "Microsoft Windows Me");
103                 break;
104             }
105             break;
106 
107         case 5:
108             switch (os.dwMinorVersion)  //再比较dwMinorVersion的值  
109             {
110             case 0:
111                 strcpy(buf, "Microsoft Windows 2000"); //1999年12月发布  
112                 break;
113 
114             case 1:
115                 strcpy(buf, "Microsoft Windows XP"); //2001年8月发布  
116                 break;
117 
118             case 2:
119                 if (os.wProductType == VER_NT_WORKSTATION
120                     && info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
121                 {
122                     strcpy(buf, "Microsoft Windows XP Professional x64 Edition");
123                 }
124                 else if (GetSystemMetrics(SM_SERVERR2) == 0)
125                     strcpy(buf, "Microsoft Windows Server 2003"); //2003年3月发布   
126                 else if (GetSystemMetrics(SM_SERVERR2) != 0)
127                     strcpy(buf, "Microsoft Windows Server 2003 R2");
128                 break;
129             }
130             break;
131 
132         case 6:
133             switch (os.dwMinorVersion)
134             {
135             case 0:
136                 if (os.wProductType == VER_NT_WORKSTATION)
137                     strcpy(buf, "Microsoft Windows Vista");
138                 else
139                     strcpy(buf, "Microsoft Windows Server 2008"); //服务器版本   
140                 break;
141             case 1:
142                 if (os.wProductType == VER_NT_WORKSTATION)
143                     strcpy(buf, "Microsoft Windows 7");
144                 else
145                     strcpy(buf, "Microsoft Windows Server 2008 R2");
146                 break;
147             }
148             break;
149         }
150     }//if(GetVersionEx((OSVERSIONINFO *)&os))  
151 
152     strcpy(osname, buf);
153 }
154 
155 int main() {
156 
157     WZSerialPort w;
158     //这里是选择端口号,其他波特率信息可在头文件修改,或者在下面重新赋值。
159     if (w.open("COM6"))
160     {
161         //cout << "打开成功" << endl;
162         //cout << "在这里我发送:恭喜发财" << endl;
163 
164         //w.send("恭喜发财");
165         //w.close();
166     }
167     else
168     {
169         cout << "打开失败" << endl;
170     }
171 
172     //获取系统时间  
173     char buffer[128];
174     getSystemTime(buffer);
175     //puts(buffer);
176 
177     //系统运行时间  
178     clock_t start, finish;
179     double duration;
180 
181     start = clock();
182 
183 
184     //系统版本名称  
185     char osname[20];
186     GetSystemName(osname);
187     //printf("%s\n", osname);
188 
189     while (true)
190     {
191         // 
192 
193         //CPU利用率  
194         U_CHAR  sysStateCpu[5];
195         double cpu = CpuUseage();
196         sprintf((char*)sysStateCpu, "%.lf", cpu);
197         //printf("CPU:%s%%\n", sysStateCpu);
198 
199         //系统时间
200         char buffer[128];
201         getSystemTime(buffer);
202         puts(buffer);
203 
204         // 系统运行时间
205         finish = clock();
206         duration = (double)(finish - start) / CLOCKS_PER_SEC;
207         //printf("%.0f 秒\n", duration);
208 
209         //内存使用率  
210         char bufPreCPU[10];
211         MEMORYSTATUSEX statex;
212         statex.dwLength = sizeof(statex);
213         GlobalMemoryStatusEx(&statex);
214         sprintf(bufPreCPU, "MEM:%ld%% CPU:%2s%% %s%\n", statex.dwMemoryLoad, sysStateCpu, buffer);
215 
216         
217 
218         //puts(bufPreCPU);
219         w.send(bufPreCPU);
220         Sleep(1000);
221     }
222     printf("hello world!\n");
223     system("pause");
224 
225 }

 

项目全部文件:

个人博客下方私信领取

http://potatoworld.top:5800/

-项目槽点-

  • 为了实现开机自启,最开始可谓是煞费苦心,想了很多办法,什么计划任务,看门狗等等......最后,最方便最直接的方法还是把上位机直接扔进开机自启文件夹.....

     启动文件夹开机自启:http://blog.csdn.net/misterdo/article/details/106898689

  • HC-04蓝牙模块在win10系统下,怎么通过程序给它发消息?这个问题加起来快赶上写程序的时间了,网上也没有找到满意的答案。

  

   上述图示过后,得到了蓝牙模块的端口,那就一切好说了,直接电脑打开串口软件,往里面丢东西便是。

  • 串口软件发送hex数据,在选中确认为hex模式后,无需再添加0X,否则会有几个乱码。
  •  如果细心一点,应该能看见图片中蓝牙模块上面有两个二极管......是的,5V转3.3V,我偷懒了,直接接了两个二极管,每个压降0.7V,加起来差不多。nice~

 

 

 

 

 

   

 

本文转载于网络 如有侵权请联系删除

相关文章

  • Flask 学习-35.restful-full 自定义错误内容 error_msg 使用

    前言当接口请求参数不合法的,可以给前端返回报错原因,给个友好的返回消息,在add_argument()中可以通过help参数来定义错误信息每个字段的错误消息可以使用help参数(RequestParser.add_argument)进行自定义。 如果未提供help参数,则该字段的错误消息将是类型错误本身的字符串表示形式。如果help提供,则错误消息将是的值help。classRegister(Resource): @staticmethod defpassword_validate(value,name): iflen(value)<6orlen(value)>16: raiseValueError(name+'lengthmustbe6-16') returnvalue defpost(self): #校验入参 parser=reqparse.RequestParser() parser.add_argument('username',required=True,type=str,nullable=False) parser.a

  • SAP SD基础知识之组织结构

    SAPSD基础知识之组织结构销售相关的组织结构Ø销售组织SalesorganizationØ分销渠道DistributionchannelØ产品组DivisionØ销售范围SalesareaØ销售办公室SalesofficeØ销售组SalesgroupØ销售人员SalespersonØ工厂PlantØ库位Storagelocation销售组织一个销售组织代表一个合法的销售实体。一个销售组织只能分配给一个公司代码。一个销售组织可以分配给多个工厂。每个销售组织有自己的主数据,包括客户主数据、物料主数据以及条件记录。分销渠道在一个销售组织中,客户可以通过一个或多个分销渠道获得服务。可以为销售组织和分销渠道的组合定义不同的主数据。产品组对某一产品组,可以执行统计分析或制定市场战略。销售范围销售范围是销售组织/分销渠道/产品组的组合。销售订单,交货单,开票都分配到某一销售范围。所有的销售流程都发生在某一特定的销售范围。相关的主数据经常维护在销售范围层。应该尽量保持销售范围组织结构越简单越好。销售办公室销售办公室可以分配给一个或多个销售范围;销售组可为每一个产品组或分销渠道定义一个销售组。销售组分

  • SAP CDS view自学教程之三:ABAP Development Tool里的CDS view源代码如何传递到ABAP后台

    Let’sreviewwhatwehavelearnedsofar.ThroughSQLtraceanddebugging,wehavelearnedbelow:(1)WhenweclickactivatebuttoninABAPdevelopmenttool(IcallitEclipsenowinthisblog),thereareseveralcorrespondingABAPobjectsgeneratedandtableentriesinserted.ThroughdebuggingweknowlotsofrelatedlogicareimplementedinpackageSDDL.(2)Whenwetestread&searchfunctionagainsttheodataservicecreatedontopoftheCDSview,theoperationisdelegatedtoCL_SQL_STATEMENT~EXECUTE_QUERY.AndnowIaskmyself,sincewhatwehavetypedinEclipseispuretext,howd

  • Ubuntu安装记录

    一直以来,都是在虚拟机里面使用Linux系统,但随着使用需求的增加,于是直接在笔记本中安装Ubuntu。基本上就是Windows10+Ubuntu18.04LTS双系统共存模式!浅谈很多同学在虚拟机中安装Linux(实际上不仅限于Ubuntu),都会觉得安装很简单,基本上就是一直点下一步之类的,当然了,ArchLinux之流除外哈。不是说ArchLinux不好用(我觉得过渡动画还比较流畅,速度也很快),而是它的安装过程,感觉就是个过滤用户的阴谋?既然要直接在笔记本上安装,那么,肯定会有不少坑的,而且还是双系统共存。最常见的就是分区和假死了吧(卡死在某一界面)。其它的诸如制作镜像,装驱动出现问题,点击现在重启卡死等。我在刚买我的暗影精灵3的时候,就尝试过双系统,然后,你懂的。我直接就留下了心里阴影,因为那时候没做备份,后来我备份的好习惯就是这么被逼出来的?准备工作电脑配置先介绍下我的电脑配置吧。产品名称:OMENbyHPLaptop15-ce0xx BIOS:F.18-11/09/2018 内存总量:16GB 处理器名称:Intel(R)Core(TM)i7-7700HQCPU@2.80

  • 什么是间隙锁?

    什么是间隙锁? 间隙锁是一个在索引记录之间的间隙上的锁。 间隙锁的作用 保证某个间隙内的数据在锁定情况下不会发生任何变化。比如mysql默认隔离级别下的可重复读(RR)。当使用唯一索引来搜索唯一行的语句时,不需要间隙锁定。如下面语句的id列有唯一索引,此时只会对id值为10的行使用记录锁。select*fromtwhereid=10forupdate;//注意:普通查询是快照读,不需要加锁 如果,上面语句中id列没有建立索引或者是非唯一索引时,则语句会产生间隙锁。 如果,搜索条件里有多个查询条件(即使每个列都有唯一索引),也是会有间隙锁的。需要注意的是,当id列上没有索引时,SQL会走聚簇索引的全表扫描进行过滤,由于过滤是在MySQLServer层面进行的。因此每条记录(无论是否满足条件)都会被加上X锁。但是,为了效率考量,MySQL做了优化,对于不满足条件的记录,会在判断后放锁,最终持有的,是满足条件的记录上的锁。但是不满足条件的记录上的加锁/放锁动作是不会省略的。所以在没有索引时,不满足条件的数据行会有加锁又放锁的耗时过程。间隙的范围 根据检索条件向下寻找最靠近检索条件的记录值

  • 2018世界杯数据清单:真球迷看球必备,伪球迷速成指南(附完整赛程)

    导读:每隔4年都有那么1个月,无论是线上还是线下,不管是真球迷还是真球盲,你的社交圈子都会被世界杯话题攻占。每到这个时候,真球迷一言不合就面红耳赤,伪球迷尬聊不超过3句就暴露“球商”……用段子缓解尴尬?本届世界杯没有中国队、没有贝克汉姆、没有科比、没有姚明之类的老梗已经烂大街了,完全笑不出来好吗?还能不能愉快玩耍了?能啊!你聊数据啊!如果要段子,你可以这样:拥有“混凝土式防守”的意大利队,世界杯总失球数已经达到77个,而中国队只有9个!中国队跟德国队一样,从未输过点球大战!除了段子,你甚至可以像解说嘉宾一样专业:德国是成绩最稳定的球队,从1954年起至今的16届世界杯,德国都至少进入了8强。中国没出线?没关系,我们2002年毕竟成功过。而卢森堡队从1934年第2届世界杯起就开始参加预选赛,至今从未入围决赛圈。英格兰3次参加点球大战,3次全都输了……德国和阿根廷已经在世界杯赛场上7次交手,并且3次是在决赛,真是冤家路窄。大热必死!新世纪的4届世界杯,有3次卫冕冠军都未能小组出线。怎么样?从热门话题到冷知识,不管怎么聊都无懈可击!如果你想制造一款能跟真球迷愉快聊球的AI,你需要喂给它的数据

  • 【快报】英伟达加强与德国AI研究所关系 | 丰田预计5年后推出智能汽车,能自动避免事故发生

    1Anki推出玩具机器人Cozmo,定位智能教育平台初创公司Anki昨天发布了一款名叫Cozmo的智能玩具机器人,外观造型将赛车与机器人结合在一起,拥有着人脸识别系统和情感引擎,能够模仿像人类一样丰富的情感。公司将Cozmo定位于面向儿童的教育机器人平台进行推广。Cozmo上运行的人工智能系统,每秒钟都要完成上千次不同的决定。但Cozmo本身的运算能力不强,需要与Android、iOS设备配对使用,让智能手机承担重要的运算任务。Anki计划逐步开放Cozmo系统,并发布软件开发套装。公司还与卡耐基梅隆大学合作,教学生编写Cozmo能用的游戏。Cozmo预计今年10月份上市,预订价格为180美元(约合人民币1200元)。 Anki公司成立于2010年,由CMU的3个机器人博士毕业生共同创办。A轮融资的投资人为著名的A16Z,最近一轮融资为2014年9月的5500亿美金的C轮融资。来源:geekwire2英伟达加强与德国AI研究所联系,谷歌也曾投资为了拓展市场并保持技术优势,英伟达与德国人工智能研究中心(DFKI)进一步加强合作,将DFKI定为GPU研究中心。英伟达方面表示,GPU研究中心

  • 利用转录组数据构建预后模型的8分+发文技巧

    大家好!今天给大家介绍一篇2022年4月发表在eBioMedicine(IF:8.143)上的一篇文章。作者基于LGG患者的转录组数据构建可以准确预测患者预后的模型-APOLLO。APOLLO:Anaccurateandindependentlyvalidatedpredictionmodeloflower-gradegliomasoverallsurvivalandacomparativestudyofmodelperformanceAPOLLO:可以准确预测低级别胶质瘤患者总生存期的预后模型摘要背景:目前还没有准确稳定预测低级别胶质瘤(LGG)患者生存期的预后模型,本研究旨在结合临床数据,基因互作信息和转录生物标志物构建LGG患者的预后模型。方法:基于6个LGG患者的1420例转录组数据集构建可以准确预测LGG患者总生存期的预后模型-APOLLO,并将APOLLO模型与现有预测模型进行比较。结果:APOLLO可以准确鉴定死亡率较高的患者,APOLLO可以准确预测6个独立数据集的36个月和60个月的生存率,AUC分别为0.901和0.843。此外,APOLLO可以有效筛选死亡敏感性患

  • .NET Core 微服务之grpc 初体验(干货)

      Grpc介绍   GitHub: https://github.com/grpc/grpc   gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(ProtocolBuffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。 gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前,在GitHub上已提供了C版本grpc、Java版本grpc-java和Go版本grpc-go,其它语言的版本正在积极开发中,其中grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java已经支持Android开发。 gRPC已经应用在Google的云服务和对外提供的API中,其主要应用场景如下: 低延

  • 云原生 - Why is istio(二)

    出处:https://cizixs.com/2018/08/26/what-is-istio 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。 前言 随着微服务架构的流行,服务网格技术获得了业界的广泛关注,作为实现云原生的重要积木,各大厂商也纷纷开始布局,Amazon在2019年4月份推出了AppMesh;Google、IBM、Lyft联合开发了Istio。 Istio作为下一代服务网格的整体解决方案,得到了业界的普遍认可,站在kubernetes巨人的肩膀上,极大地提升了分布式微服务应用的研发和运维效率。 2020是云原生普及的一年,如何部署、使用、运维Istio将是必须要学习的知识。 什么是istio? 官方对istio的介绍浓缩成了一句话: Anopenplatformtoconnect,secure,controlandobserveservices. 翻译过来,就是”连接、安全加固、控制和观察服务的开放平台“。开放平台就是指它本身是开源的,服务对应的是微服务,也可以粗略地理解为单个应用。中间的四个动词就是istio的主要功能,官方也各有一句

  • 大小青龙汤

    引:伤寒论第40条,伤寒表不解,心下有水气,干呕发热而咳,或渴,或判,或噎,或小便不利,少腹满,或喘者,小青龙汤主之。麻黄(去节)芍药 细辛 干姜 甘草(炙) 桂枝(各三两,去皮) 五味子(半升) 半夏(半升,洗)  他说,人得了感冒,伤寒证,喝药还是没有好,心下有水气,就是肚子里有水,涨涨的。干呕发热而咳,病人发烧,胃里面有水,停水,所以干呕反胃,像怀孕妇女一样反胃,不想吃饭。 他又咳了,因为胃里面的水会往肺走,肺里也有水了,可能会流鼻涕的,影响了呼吸了,才咳。或渴,或利,或噎,因为胃里有停水,胃里津液没有了,会感到口渴,昨天,我们讲过了,胃中的停水,它和津液是不同的。停水为邪,津液为正,津液属血液的一部分。或利,因为胃肠中有水,所以他会拉稀,胃中有水,胃也一定很寒的。胃受凉,也会拉稀。或小便不利,胃中有水,肯定是小便不利了。小便正常的话,胃中不会有积水的。所以,病人描述他拉稀时,我们就会知道,他小便不利,水走胃肠了。少腹满,胃肠里有水,小肚子也有点涨了。或喘者,可能胃中积水上行入肺,影响呼吸,引起哮喘。

  • 用户论坛访问习惯调查结果分析,原来大家都爱这样逛论坛

    通过对部分在职员工进行抽样调查,我们得出一些关于访问习惯的数据,下面就跟随小编一起来看看有没有什么有意思的人群或现象。 此次被调查者百分之六十以上工作经验为0~3年,3~6年与6年以上工作经验的各占百分之十左右。看来被调查者当中以小白居多,反映出现在互联网行业的一大问题,会做的很多,但做好且资深的较少。   被调查者平时主要浏览的网站以资讯新闻类为主,比重占到了三分之一,IT技术类与娱乐八卦类各占四分之一。由此可见被调查者平日仍然最关注时事新闻及话题性事件,果然无论是何种职业新闻与娱乐是最吸引眼球的,毕竟大家忙了一天都想放松一下。 果不其然,中午吃饭和下班回家是逛论坛的高峰期,周末大家都到户外运动社交,很好的生活习惯嘛。不过。。。四分之一的人上班逛论坛?喂,快回头!你老板过来了~   在现阶段互联网的大趋势下,开发、产品、运营三大岗位总共占到了60%以上,真的是感叹科技的力量。 可见谷歌一下、百度一下仍是大多数人寻求解决方案的主要手段,向同事寻求帮助的人也占到四分之一,而在网上发帖求解答的人相对较少,主要是由于时效性的原因,从发帖寻求帮助到解决问题需要一段

  • qt5.9.8 编译到 海思3536

    参考文章: https://blog.csdn.net/litao31415/article/details/100144400?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.baidujs&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.baidujs /////////////////////////////////////////#解压xz-dqt-everywhere-opensource-src-5.9.8.tar.xztar-xfqt-everywhere-opensource-src-5.9.8.tar #进入平台配置目录cdqt-everywhere-opensource-src-5.9.8/qtbase/mk

  • PointGNN未修改之前的结果 ---行人,骑行者

    dl 18  23    

  • js 不同时间格式介绍以及相互间的转换

    首先必须要提到的是Date对象,它用来处理时间和日期。 使用newDate()语句可创建Date对象,创建出来的时间格式如下(后面提到的标准时间都是指该格式): WedJul17201913:59:21GMT+0800(中国标准时间) Date对象有以下几种创建方式: 1.letdate=newDate();2.letdate=newDate(milliseconds);3.letdate=newDate(dateString);4.letdate=newDate(year,month,day,hours,minutes,seconds); 解释: 1.不传参,获取的是当前时间; 2.传时间戳,时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,由10位数字组成(毫秒是13位),这里传10位13位都可以; 3.传时间的字符串形式,如'2019/7/1714:40:30'或'2019-7-17',这里我试了一下以'/'和'-'为年月日分隔符都是可以的,空格和逗号不行,年月日要完整,时分秒可不用写全; 4.传以

  • 云呐统一运维一体机|监控PHP应用程序的端对端可见性

    云呐|原标题:监控PHP应用程序|php网站监控系统源码 1、PHP应用程序的端对端可见性 利用APM应用性能视角的PHPAPM监控代理监视PHP性能,并评估终端用户对你的应用程序的体验。你可以根据APDEX评分判断用户满意程度。响应时间、吞吐量和异常等重要参数能够揭示大量PHP服务器及其应用的信息;通过这些信息可以优化性能,并提高APDEX得分。 2、根因分析 APM应用性能视角的PHP应用监测代理可以提供关于应用程序中发生的所有事务的大量信息。您可以对web事务、后台事务和数据库事务的详细信息进行处理;这样可以避免无法识别的错误,并且可以帮助确定错误的来源。     3、标识资料库呼叫速度缓慢 云呐设备运行监控盒的PHP应用性能监控工具提供了关于数据库操作的详细信息,比如数据库事务的响应时间、调用次数以及吞吐量细节等。你能够轻易地识别出需要很长时间来完成的操作,并且在必要时终止这些操作。PHP性能监视器代理还提供了关于SQL交易的信息,您也可以通过它来识别缓慢的SQL查询。 4、调试PHP应用的跟踪 交易追踪提供了PHP应用中每个交易的简要信息。他们主要用

  • listview滚动时背景闪烁,背景黑或白问题解决

    android在使用listview时出现滚动时背景闪烁,变成背景黑或白的问题这样处理: 1:在布局文件中listview标签中加入: android:cacheColorHint="#00000000" "#00000000"为透明的黑色 2:在java代码中这样设置: listview.setCacheColorHint(intcolor);   文章作者:沦落凡间 ,作者微博:@沦落凡间 出处:http://www.cnblogs.com/homg 版权所有©如需转载,请以链接形式注明原始出处和作者,谢绝不尊重版权者抄袭!

  • 小齐读者拿到快手、百度、网易等 offer 的独门秘籍!

    小齐说: 这篇文章来自读者冰红茶,他刚结束了秋招,拿了很多家offer。 和他聊完之后,我觉得他的备考思路也完全适用于美国的面试,只是分值要调整一下,但是具体每一块的内容,地球村通用。所以分享给大家一起学习一下~ 长达一年的实习、秋招之路终于落下了尾声,我最终收获了快手、百度、网易等互联网大厂的开发岗offer。 大学我学的专业是通信工程,也算是半个非科班出身,一路走就像是打怪升级的过程,不断地纠错尝试,一点经验分享给准备参加秋招的你。 大学时候每次期末考试我们都会等老师划重点,目的就是想确认考试的范围和形式以及各部分出题的分值,做到心里有数、合理分配时间。 我认为其实秋招面试的本质和平时期末考试是一回事。秋招考什么(考试范围)、秋招有哪些题型(考试形式)、以及各部分出题分值(考试各部分比重)? 我自己常常把秋招面试考察范围划分为三个部分,算法题、基础知识题、过硬的项目或实习经历。 一、算法(40分) 分值说明: 以我熟悉的开发岗位来说,对于大厂面试,我觉得算法题占了40分。 这个分数很微妙,你会发现再需要20分就可以及格了,能勉强通过这次考试。但是如果40分完全丢掉那么靠其他方面力

  • 面向对象的逻辑

    面向对象的概述          面向对象是以人的思想去模拟现实的世界,用到的东西主要包括抽象、封装、继承、多态。      一、面向对象的族谱图        二、面向对象过程的定义介绍 面向对象:以人的思想对现实世界进行模拟和思考,归述行为和特征 面向对象的核心是可扩展性,将经常变化的地方进行设计 面向过程:面向过程是机械式的思想,需要考虑到每个阶段的输入和输出。 接口:即互相的面,接口是定义一组相关功能点定义的集合。 抽象类:抽象类只能用于继承,不能被实例化为对象,基于类的抽象。 接口强调方法的相似性,而抽象类强调的是事务的相似性,包括属性和方法 抽象:抽取相同对象的的共有行为和特点,作用是划分类别,目的是隔离关注点,降低复杂度。 封装:隔离复杂度,保护隐私数据。(操作类中的属性强制出一套规范) 继承:继承父类中的属性和方法,主要是行为和特征上的继承。类似于生物学上的遗传,有变异,java

  • 【NOIP2009 T3】 最佳贸易 (双向SPFA)

    C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为1条。C国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。商人阿龙来到 C国旅游。当他得知同一种商品在不同城市的价格可能会不同这一信息之后,便决定在旅游的同时,利用商品在不同城市中的差价赚回一点旅费。设C国n个城市的标号从1~n,阿龙决定从1号城市出发,并最终在n号城市结束自己的旅行。在旅游的过程中,任何城市可以重复经过多次,但不要求经过所有n个城市。阿龙通过这样的贸易方式赚取旅费:他会选择一个经过的城市买入他最喜欢的商品——水晶球,并在之后经过的另一个城市卖出这个水晶球,用赚取的差价当做旅费。由于阿龙主要是来 C 国旅游,他决定这个贸易只进行最多一次,当然,在赚不到差价的情况下他就无需进行贸易。假设C国有5个大城市,城市的编号和道路连接情况如下图,单向箭头表示这条道路为单向通行,双向箭头表

  • MongDB常用操作

    MongDB常用操作 MongoDB安装 mac安装brewsearchmongodb#查询能安装的版本 brewinstallmongodb-community@4.2#安装4.2版本的mongodb 复制ubuntu安装apt-getinstallmongodb 复制 配置 mac配置systemLog: destination:file #日志路径 path:/usr/local/var/log/mongodb/mongo.log logAppend:true storage:#存储路径 dbPath:/usr/local/var/mongodb net: bindIp:127.0.0.1 复制ubuntu配置#存储 storage: dbPath:/var/lib/mongodb journal: enabled:true #日志 systemLog: destination:file logAppend:true path:/var/log/mongodb/mongod.log #ip和端口 net: port:27017 bindIp:127.0.0.1 #

相关推荐

推荐阅读