最新发布
-
接入每天60S看世界API Timeline {% timeline 更新日志 %} 文章发布 将XMLHttpRequest替换为fetch,增加打字机效果 {% endtimeline %} 前言 目前在网上已经有很多博主出了对博客引入这个API的教程,内容也已经比较详细,但是很多通过直接获取整张图片的形式;这样做省去了很多不必要的麻烦,只是图片在加载的时候会比较缓慢,而且在静态博客框架下开启图片懒加载后有几率发生图片加载失败的情况。还有一些博主也使用了直接请求文字内容的教程,而这些很多都是针对基于PHP搭建的博客,不能用于静态博客。 XMLHttpRequest求情Http XMLHttpRequest是JavaScript中自带Http请求函数,可以快速调出浏览器调试界面发请求。在小规模的情况下可以有效减少其他依赖快速的接入接口。 方法描述open("method","URL",[asyncFlag],["userName"],["password"])建立对服务器的调用。method参数可以是GET、POST或PUT。url参数可以是相对URL或绝对URL。这个方法还包括3个可选的参数,是否异步,用户名,密码setRequestHeader("header", "value")把指定首部设置为所提供的值。在设置任何首部之前必须先调用open()。设置header并和请求一起发送 ('post'方法一定要 )send(content)向服务器发送请求在代码中主要值使用了XMLHttpRequest中的这几个方法,更多方法可以到 (XMLHttpRequest - Web API 接口参考 | MDN (mozilla.org) 中查看更多方法使用技巧 开始引入 注册ALAPI 账号获取Token 注册账号后到用户管理界面获取Token并保存,在后面的代码部分会使用到 代码部分 <div> <div style="display: flex;flex-direction: column;align-items: center;"> <h1 style="color: red;font-size: 2.5em;">每天60s看世界</h1> <img id="head-img" src="" alt=""> <p id="news" style="width:90%; color: blue;font-size: 1.4em;">新闻正在加载</p> </div> <script> (() => { const news = document.querySelector('#news') const headImg = document.querySelector('#head-img') var xhr = new XMLHttpRequest() fetch('https://v2.alapi.cn/api/zaobao', { method: "POST", // or 'PUT' headers: { "Content-Type": "application/json", }, body: JSON.stringify({ token: 'wNj349sLbMqqUaew', format: 'json', }), }).then(res => res.json()).then(ori => { var text = ori.data.news var str = '' for (let i = 0; i < text.length; i++) { str += text[i] + '<br>' } // news.innerHTML = str; headImg.src = ori.data.head_image let i = 0; let str_ = '' let timer = setInterval(() => { if (str_.length < str.length) { str_ += str[i++] news.innerHTML = '<p>' + str_ + '_</p>' //打印时加光标 } else { clearInterval(timer) news.innerHTML = '<p>' + str_ + '</p>' } }, 50) }) })() </script> </div>找到代码中xhr.send('token=粘贴刚刚获取到的Token&format=json');部分,将刚刚获取到的Token粘贴到中文标注部分。 引入到博客中 将html代码整个的粘贴到新建页面或者其他要添加的地方。 image-20220422205402441图片 -
树莓派搭建文件共享系统(samba) 前引 在不久之前,为了不让{% label 昂贵 red %}的树莓派不吃灰,尝试了一次将树莓派作为云盘服务器的文章 {% link 搭建个人云盘,,https://www.mstzf.cn/posts/private_cloud_disk/ %} 在试用了一段时间后,使用感受并不是很好。 首先,nextcloud修改默认存储位置比较麻烦,云盘的主要目的就是要将资料存储在便于移动、扩展的U盘、硬盘上,而不是直接利用插入的TF卡或者是树莓派自身的内存空间内,这样不仅存储空间比较小而且对自身存储器也是一种损耗。 其次,云盘以网页的方式发布 ,内网穿透比较麻烦。 设备清单 树莓派 移动硬盘(U盘也可) 网络环境 挂载硬盘 查看硬盘 $sudo fdisk -l 如果设备被识别成功,在执行命令后可以查看到类似如下的结果image-20220409211212249图片 不同设备会有不同,类似/dev/hda, /dev/hdb, /dev/sda, /dev/sdb,这些不同的代号,而这些不同的代号又代表着什么?hda一般是指IDE接口的硬盘,hda指第一块硬盘,hdb指第二块硬盘,等等;sda一般是指SATA接口的硬盘,sda指第一块硬盘,sdb指第二块硬盘,等等。 挂载硬盘 {% tabs %} 临时挂载非常简单,只需要一个mount 命令即可 $ sudo mount [参数] [挂载对象(/dev/sda)] [挂载点(新建文件夹来挂载)] # 新建文件夹(挂载点) $ sudo mkdir Disk取消挂载 $ sudo umount [挂载对象] [挂载点]对于mount的参数可以省略,如果又特殊需求可以通过百度来查找mount 参数 所谓的永久挂载其实也就是开机自动挂载,开机自动挂载硬盘不需要在每次开机后都通过命令的方式去挂载硬盘,相对来说比较方便,但是这种方法挂载硬盘后如果没有插入硬盘可能会出现不能引导开机的问题,解决方法这里就不细说了,网上的教程还是比较丰富的。 查看硬盘的UUID $ sudo blkidimage-20220409214826591图片 将获取的UUID复制下来,待会要用 # 新建挂载点(在当前目录下) $ sudo mkdir Disk #编辑fstab加入硬盘信息 $ sudo vim /etc/fstab #在文件最后输入硬盘信息 UUID="刚刚复制的UUID" /home/pi/Disk ext4 defaults 0 1image-20220409215353270图片 测试: # 重启树莓派 $ sudo reboot # 查看挂载情况 $ sudo df -limage-20220409215732729图片 {% endtabs %} 配置samba 按照惯例安装软件之前先update和upgrade一波 # 凑个字数 $ sudo apt update $ sudo apt upgrade # 安装samba sudo apt install samba samba-common-bin -y 配置samba控制文件,指定共享的文件 # 通过vim打开控制文件 $ sudo vim /etc/samba/smb.conf添加文件目录和控制信息,在最后面添加如下内容 [NAS] comment = NAS Storage path = /home/pi/Disk/ browseable = yes read only = no writable = yes valid users = pi create mask = 0775 directory mask= 0775 guest ok = yes{% label path后面的文件路径根据自己的需要来修改,我的路径就是硬盘的挂载地址 blue %} 如果不想共享home下的文件目录,可以找到文件中[home]的部分,将那部分全部注释掉 image-20220409221417876图片 重启samba服务 $ sudo /etc/init.d/samba restart $ sudo systemctl restart samba $ sudo samba restart # 这三个都试试看吧,都是重启服务的命令,我只成功了最后那个 添加默认用户到samba $ sudo smbpasswd -a pi # 输入密码确认即可image-20220409223723986图片 本地连接共享测试 之前将树莓派作为一个软路由来使用,现在电脑和手机都有连接着树莓派的WIFI,所以只需要直接访问树莓派的固定IP就能实现对树莓派共享文件的访问。开热点方法可以参考我之前写的这篇文章。 {% flink %} class_name: class_desc: link_list: name: 树莓派开启个人热点 link: https://www.mstzf.cn/02-09/startAP/ avatar: https://pic.teohzy.com/blog/202202091916889.png descr: {% endflink %} Windows 测试访问共享文件 在文件资源管理器中直接输入\\IP地址 即可访问共享文件 image-20220409223310023图片 还可以映射为本地驱动器,在Network右键->映射网络驱动器 image-20220409223950512图片 Android 如果默认文件管理器可以访问网络存储的话就按照官方教程来使用,如过默认文件管理器不能访问,则要下载其他文件管理器 我目前使用的是文件管理器(File Manager Plus) image-20220409224651643图片 使用体验还是比较不错的 image-20220409224741807图片 内网穿透 这里推荐一个很好用,还免费的内网穿透平台{% label (非广告) red %}。 {% flink %} class_name: class_desc: link_list: name: SAKURA FRP link: https://www.natfrp.com/ avatar: https://nyat-static.globalslb.net/natfrp/index/bg2.jpg descr: " " {% endflink %} 如果需要远程访问到共享文件,就需要内网穿透,安装配置文档已经非常完善,可自行到官网查看安装配置方法。samba占用的是139端口,在创建隧道的时候端口选择139就行。 {% label 如果选择了内网穿透了,一定要设置好密码和保护好隧道信息...不让很容易信息泄露 red %} -
Java面向对象 Java是一种相对比较成熟的面向对象编程语言。面向对象是一种较为符合人类思维习惯的编程思想。在Java中一切皆可有对象,我们把具有相同性质、特点的事物抽象成一个类,而每一个具有这些性质、特点的事物就是这个类的一个对象。 没对象" style="zoom: 70%;" /> 面向对象与面向过程 面向过程: 面向过程就是分析出解决问题的一个个步骤,在程序中的提现就是写好的一个个执行不同目的的函数,在解决问题的时候,就再一个一个的调用这些步骤(函数)。 就比如说洗衣服这件事,在面向过程的时候,就会被拆分成:放入衣服、加入洗衣液、加入适量水、启动洗衣、排水、甩干、晾衣服。这一些列的过程,最终达到洗衣服的目的。 面向对象: 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。 再以洗衣服这件事为例,在面向对象的时候洗衣粉主要就被分为了两类对象,第一类对象——人,主要有放入衣服、加入水、晾衣服等属性;第二类对象——洗衣机,主要有洗衣服、甩干衣服等属性。面向对象主要是划分了问题而不是步骤。 面向对象与面向过程的优缺点 面向过程: 优点: 流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果,具体步骤清楚,便于节点分析。 效率高,面向过程强调代码的短小精悍,善于结合数据结构来开发高效率的程序。比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 缺点:代码重用性低,扩展能力差,后期维护难度比较大。 面向对象 优点: 结构清晰,程序是模块化和结构化,更加符合人类的思维方式;易扩展,代码重用率高,可继承,可覆盖,可以设计出低耦合的系统;由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 缺点: 开销大,当要修改对象内部时,对象的属性不允许外部直接存取,所以要增加许多没有其他意义、只负责读或写的行为。这会为编程工作增加负担,增加运行开销,并且使程序显得臃肿。 性能低,由于面向更高的逻辑抽象层,使得面向对象在实现的时候,不得不做出性能上面的牺牲,计算时间和空间存储大小都开销很大。 面向对象的基本特性 封装: 是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。 良好的封装能够使程序更高效安全。 继承: 继承是Java程序设计中的一项核心技术。继承的基本思想是使用已经存在类中的属性和方法去创建新的类,在新类中可以添加心得属性和方法,让新的类能够适应心得情况而不用重写已经存在的属性方法。 多态: 多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。 对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。(解释来自 -
DHT11温湿度模块部分代码实例 产品概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度 复合传感器。应用专用的数字模块采集技术和温湿度传感技术,可以将获取到的环境温湿度信号通过单总线传输;信号中携带有校验码,一定程度上保证了数据的准确性。 性能指标 参数最小最大温度范围-20℃60℃湿度范围5%RH95%RH电压3.3V5.5V电流0.06mA1.0mA参数精确度温度±2℃湿度±5%RH引脚说明: VDD 供电3.3~5.5V DC DATA 串行数据,单总线 NC 空脚 GND 接地,电源负极 工作原理 数据时序图 image-20220318152411531图片 起始信号:微处理器把数据总线(SDA)拉低一段时间至少 18ms(最大不得超过 30ms),在拉高20us-40us,通知传感器准备数据。 响应信号:传感器把数据总线(SDA)拉低 83µs,再拉高 87µs 以响应主机的起始信号。 数据格式:收到主机起始信号后,传感器一次性从数据总线(SDA)串出 40 位数据,高位先出 image-20221126205849766图片 image-20221126205921333图片 当检测到这一位数据的高电平后,我们要看这段高电平究竟会持续多长时间,0信号的高电平持续26-28us,1信号则持续70us。所以在上一步检测到高电平之后我们不妨等一等,等个30us看看高电平是不是还是存在,若还是高电平,那这一位信号就是1信号,若已经变低了,就是0信号,将这个1或0赋值给一个变量。 温度:温度高位为温度整数部分数据,温度低位为温度小数部分数据,且温度低位 Bit8 为 1 则表示负温度,否则 为正温度 湿度:湿度高位为湿度整数部分数据,湿度低位为湿度小数部分数 校验位:校验位=湿度高位+湿度低位+温度高位+温度低位 以上内容来自奥松电子DHT11官方文档,详细内容请查看文档 代码实例 树莓派Python3代码实例 #!/usr/bin/python3 coding=utf-8 import RPi.GPIO as GPIO import time data = 18 # DHT11的data引脚连接到的树莓派的GPIO引脚,使用BCM编号 tmp=[] # 用来存放读取到的数据 a,b=0,0 def delayMicrosecond(t): # 微秒级延时函数 start,end=0,0 # 声明变量 start=time.time() # 记录开始时间 t=(t-3)/1000000 # 将输入t的单位转换为秒,-3是时间补偿 while end-start<t: # 循环至时间差值大于或等于设定值时 end=time.time() # 记录结束时间 def DHT11(): GPIO.setmode(GPIO.BCM) # 设置为BCM编号模式 GPIO.setwarnings(False) del tmp[0:] # 删除列表 time.sleep(1) # 延时1秒 GPIO.setup(data, GPIO.OUT) # 设置GPIO口为输出模式 #GPIO.output(data,GPIO.HIGH) # 设置GPIO输出高电平 #delayMicrosecond(10*1000) # 延时10毫秒 GPIO.output(data,GPIO.LOW) # 设置GPIO输出低电平 delayMicrosecond(25*1000) # 延时25毫秒 GPIO.output(data,GPIO.HIGH) # 设置GPIO输出高电平 GPIO.setup(data, GPIO.IN) # 设置GPIO口为输入模式 a=time.time() # 记录循环开始时间 while GPIO.input(data): # 一直循环至输入为低电平 b=time.time() # 记录结束时间 if (b-a)>0.1: # 判断循环时间是否超过0.1秒,避免程序进入死循环卡死 break # 跳出循环 a=time.time() while GPIO.input(data)==0: # 一直循环至输入为高电平 b=time.time() if (b-a)>0.1: break a=time.time() while GPIO.input(data): # 一直循环至输入为低电平 b=time.time() if (b-a)>=0.1: break for i in range(40): # 循环40次,接收温湿度数据 a=time.time() while GPIO.input(data)==0: #一直循环至输入为高电平 b=time.time() if (b-a)>0.1: break delayMicrosecond(28) # 延时28微秒 if GPIO.input(data): # 超过28微秒后判断是否还处于高电平 tmp.append(1) # 记录接收到的bit为1 a=time.time() while GPIO.input(data): # 一直循环至输入为低电平 b=time.time() if (b-a)>0.1: break else: tmp.append(0) # 记录接收到的bit为0 humidity_bit=tmp[0:8] # 分隔列表,第0到7位是湿度整数数据 humidity_point_bit=tmp[8:16]# 湿度小数 temperature_bit=tmp[16:24] # 温度整数 temperature_point_bit=tmp[24:32] # 温度小数 check_bit=tmp[32:40] # 校验数据 humidity_int=0 humidity_point=0 temperature_int=0 temperature_point=0 check=0 for i in range(8): # 二进制转换为十进制 humidity_int+=humidity_bit[i]*2**(7-i) humidity_point+=humidity_point_bit[i]*2**(7-i) temperature_int+=temperature_bit[i]*2**(7-i) temperature_point+=temperature_point_bit[i]*2**(7-i) check+=check_bit[i]*2**(7-i) humidity=humidity_int+humidity_point/10 temperature=temperature_int+temperature_point/10 check_tmp=humidity_int+humidity_point+temperature_int+temperature_point if check==check_tmp and temperature!=0 and temperature!=0: # 判断数据是否正常 print("Temperature is ", temperature,"℃\nHumidity is ",humidity,"%")# 打印温湿度数据 else: print("error") while True: DHT11() GPIO.cleanup() time.sleep(5)树莓派C语言代码实例 // //mydht11.c //gcc dht11.c -o dht11 -lwiringPi //代码非原创,已经找不到原作者了,感谢大佬 // #include <wiringPi.h> #include <stdio.h> #include <stdlib.h> typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uint32; #define HIGH_TIME 32 int pinNumber = 1; //use gpio1 to read data uint32 databuf; uint8 readSensorData(void) { uint8 crc; uint8 i; pinMode(pinNumber,OUTPUT); // set mode to output digitalWrite(pinNumber, 1); // output a low level delayMicroseconds(4); digitalWrite(pinNumber, 0); // output a high level delay(25); digitalWrite(pinNumber, 1); // output a low level delayMicroseconds(60); pinMode(pinNumber, INPUT); // set mode to input pullUpDnControl(pinNumber,PUD_UP); if(digitalRead(pinNumber)==0) //SENSOR ANS { while(!digitalRead(pinNumber)); //wait to high delayMicroseconds(80); for(i=0;i<32;i++) { while(digitalRead(pinNumber)); //data clock start while(!digitalRead(pinNumber)); //data start delayMicroseconds(HIGH_TIME); databuf*=2; if(digitalRead(pinNumber)==1) //1 { databuf++; } } for(i=0;i<8;i++) { while(digitalRead(pinNumber)); //data clock start while(!digitalRead(pinNumber)); //data start delayMicroseconds(HIGH_TIME); crc*=2; if(digitalRead(pinNumber)==1) //1 { crc++; } } return 1; } else { return 0; } } int main (void) { if (-1 == wiringPiSetup()) { //printf("Setup wiringPi failed!"); return 1; } pinMode(pinNumber, OUTPUT); // set mode to output digitalWrite(pinNumber, 1); // output a high level //while(1) //{ pinMode(pinNumber,OUTPUT); // set mode to output digitalWrite(pinNumber, 1); // output a high level //delay(3000); if(readSensorData()) { printf("OK!\n"); printf("RH:%d.%d\n",(databuf>>24)&0xff,(databuf>>16)&0xff); printf("TMP:%d.%d\n",(databuf>>8)&0xff,databuf&0xff); databuf=0; } else { printf("Error!\n"); databuf=0; } //} return 0; }ESP32C语言代码实例(ESP-IDF官方编译烧写工具) #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "sdkconfig.h" #define DHT11_PIN (15) //可通过宏定义,修改引脚 #define DHT11_CLR gpio_set_level(DHT11_PIN, 0) //设为低电平 #define DHT11_SET gpio_set_level(DHT11_PIN, 1) //设为高电平 #define DHT11_IN gpio_set_direction(DHT11_PIN, GPIO_MODE_INPUT) //设为输入模式 #define DHT11_OUT gpio_set_direction(DHT11_PIN, GPIO_MODE_OUTPUT) //设为输出模式 uint8_t DHT11Data[4] = {0}; uint8_t Temp, Humi; // us延时函数,误差不能太大 void DelayUs(uint32_t nCount) { ets_delay_us(nCount); } //DHT11初始化 void DHT11_Start(void) { /*************************** * * 主机发送给DHT11复位信号 * * 首先主机拉低总线至少 18ms,然后再拉高总线,延时 20~40us,取中间值 30us,此时复位信号发送完毕。 * * **********************************/ DHT11_OUT; //设置端口方向 DHT11_CLR; //拉低端口 DelayUs(19 * 1000); // vTaskDelay(19 * portTICK_RATE_MS); //持续最低18ms; DHT11_SET; //主机拉高端口 DelayUs(30); //总线由上拉电阻拉高,主机延时30uS; /******************************** * DHT11发送响应信号 * * DHT11 检测到复位信号后,触发一次采样, * 并拉低总线 80us 表示响应信号,告诉主机数据已经准备好了; * 然后 DHT11 拉高总线 80us, * 之后开始传输数据。如果检测到响应信号为高电平, * 则 DHT11 初始化失败, * 请检查线路是否连接正常。 * *******************************/ DHT11_IN; //设置端口方向 while (!gpio_get_level(DHT11_PIN)) ; // DHT11等待80us低电平响应信号结束 while (gpio_get_level(DHT11_PIN)) ; // DHT11 将总线拉高80us } uint8_t DHT11_ReadValue(void) { uint8_t i, sbuf = 0; for (i = 8; i > 0; i--) { sbuf <<= 1; while (!gpio_get_level(DHT11_PIN)) ; DelayUs(40); // 延时 30us 后检测数据线是否还是高电平 if (gpio_get_level(DHT11_PIN)) { sbuf |= 1; } else { sbuf |= 0; } while (gpio_get_level(DHT11_PIN)) ; } return sbuf; } uint8_t DHT11_ReadTemHum(uint8_t *buf) { uint8_t check; buf[0] = DHT11_ReadValue(); buf[1] = DHT11_ReadValue(); buf[2] = DHT11_ReadValue(); buf[3] = DHT11_ReadValue(); check = DHT11_ReadValue(); if (check == buf[0] + buf[1] + buf[2] + buf[3]) return 1; else return 0; } void app_main(void) { // printf("ESP32 DHT11 TEST:%s,%s!\r\n", __DATE__, __TIME__); gpio_pad_select_gpio(DHT11_PIN); while (1) { DHT11_Start(); if (DHT11_ReadTemHum(DHT11Data)) { Temp = DHT11Data[2]; Humi = DHT11Data[0]; printf("ESP32 DHT11 TEST:%s,%s!\r\n", __DATE__, __TIME__); printf("Temp=%d.%d, Humi=%d.%d\r\n", Temp,DHT11Data[3],Humi,DHT11Data[1]); } else { printf("DHT11 Error!\r\n"); } vTaskDelay(5000 / portTICK_PERIOD_MS); } } 附录: 树莓派GPIO -
Windows安装ESP-IDF官方工具 官方文档 ESP官方 在Windows上的安装流程已经非常完善了,但是ESP-IDF 工具安装器在国内由于一些众所周知的原因下载速度会比较慢 下载ESP-IDF工具安装器 ESP-IDF工具安装器 最好选择离线安装器,在线安装器安装的速度是真心慢(能科学上网的请自便)。 image-20220307215551250图片 如果安装工具下载太慢,可以使用我在阿里云盘提前下载好的,「esp-idf-tools-setup-offline-4.4.exe」https://www.aliyundrive.com/s/W1D4qpuJVSx 到2022/03/07 为止还是最新的4.4版本。 离线安装 开始的几个步骤一般都不会出现错误,一直往下就行。 image-20220307220151437图片 安装前检查,若出现错误可以使用应用修复,没错误继续下一步 image-20220307220418927图片 下载或使用ESP-IDF,第一次安装选择下载ESP-IDF就行,如果之前有安装使用过,要在先前的基础上安装就选择使用现有的ESP-IDF目录 image-20220307221000905图片 更改安装路径,C盘较大的可以忽略,若C盘空间不足一定要更改安装路径 image-20220307221026246图片 ESP-Tool会安装ESP在编译和烧录软件时必要的各种软件,和安装目录一样可以根据自己的需要修改路径 image-20220307221631603图片 ESP-IDF 工具安装器会下载 Github 发布版本中附带的一些工具,如果访问 Github 较为缓慢,可以选择使用Espressif,从而优先选择 Espressif 的下载服务器进行 Github 资源下载。 image-20220307221803588图片 image-20220307221918096图片 个人感觉这里安装还是比较快的 image-20220307233119122图片 安装完成 image-20220307233221626图片 弹出的命令行不要关闭,等待安装完成后再关闭 添加环境变量 新建环境变量,可以为当前用户添加也可以添加到系统的环境变量中 在Path中添加 image-20220308231635909图片 可以直接在Path中添加绝对路径,也可以新建一个变量,变量格式如下,在Path中将绝对路径中与变量值相同的部分用%IDF_PATH%代替 变量名:IDF_PATH 变量值:指定到安装目录下的Espressif(也可能是.espressif) image-20220308104400515图片 在找到环境变量中的Path,打开并新建环境变量 配置VScode 在扩展中搜索ESP-IDF,选择红色图标那个安装 image-20220308115335519图片 安装好扩展后,按F1,输入esp-idf configure image-20220308115458760图片 image-20220308115634938图片 由于之前已经配置过,选择第三个:使用现有位置等待安装完成 image-20220308115923581图片 然后就可以USB连接ESP32芯片,再通过F1 输入new project创建自己的新项目 IMG_20220308_120208图片 -
git简明使用教程 创建本地仓库 git init · 将所在目录设置为git仓库 git init -bare <文件名> 新建一个裸仓库 拷贝远程仓库到本地 git clone <链接> 拷贝仓库 添加文件到版本库 git add . 添加所有文件 git add <文件名> 添加指定文件 撤销文件添加 git reset HEAD . 撤销所有文件添加 git reset HEAD <文件名> 撤销添加指定文件 git reset -mixed 文件退出暂存区,但修改保留 文件提交到仓库 git commit -m "提交的注释" 查看提交 git status 远程仓库管理 git remote add <版本库名> <链接> 添加远程版本库 git remote remove <版本库名> 删除远程版本库 推送到远程主机 git push <版本库名> <远程分支名> -
搭建私人云盘 准备 硬件: 树莓派4B 机械硬盘 软件: Nginx PHP MySql nextcloud 选用树莓派是由于手头上刚好有一块树莓派,为了不让他吃灰;实际上可以选择旧电脑,或者云服务器。 软件安装 安装nginx $sudo apt install nginx -y安装完成后在浏览器中输入树莓派的IP地址,可以看到如下界面 image-20220219132349742图片 安装PHP7.4 目前最新的PHP版本好像是7.4版本,也可以选择其他版本,将php7.4后面的7.4改成对应的版本哈就可以安装其他版本的PHP sudo apt install php7.4 php7.4-fpm php7.4-cli php7.4-curl php7.4-gd php7.4-cgi php7.4-xml php7.4-dom php7.4-zip php7.4-intl php7.4-mbstring php7.4-mysql -y安装并配置MySql $sudo apt install mariadb-server $sudo mysql_secure_installation此时系统会询问你:Enter current password for root (enter for none): ,按回车(enter)键,因为第一次登陆是没有密码的。 然后会询问你: Set root password? —— 按 y ,进行root帐号的密码设置 此时,会提示 New password ,在此输入你的MySQL密码,请牢记这个密码,输入完成按回车,会提示re-enter new password此时再重复输入密码,回车即可。 然后,询问你 Remove anonymous users ,按 y 。 然后,询问你 Disallow root login remotely ,按 y 。 然后,询问你 Remove test database and access to it ,按 y 。 然后,询问你 Reload privilege tables now ,按 y 。 最后,您将看到消息 All done! 和 Thanks for using MariaDB! 。表示已经设置完成了。 sudo mysql -u root -p #输入密码后: # 创建数据库 CREATE DATABASE IF NOT EXISTS nextcloud DEFAULT CHARACTER SET UTF8 COLLATE utf8_general_ci; # 创建用户 GRANT ALL PRIVILEGES ON nextcloud.* to '用户名'@'127.0.0.1' identified by '密码'; # 刷新数据库 FLUSH PRIVILEGES; 配置软件 配置Nginx $sudo vim /etc/nginx/sites-available/defaultnginx默认的网站代理地址是在var/www/html下,可以保留使用原来的,也可以修改到自己新建的地址下。如果选择新建不要忘记去确保指定的路径下的文件夹要存在。像我的就要在/var下新建owncloud文件夹。sudo mkdir /var/owncloud image-20220219194922636图片 location / { index index.html index.htm index.php default.html default.htm default.php; if (-f $request_filename/index.html){ rewrite (.*) $1/index.html break; } if (-f $request_filename/index.php){ rewrite (.*) $1/index.php; } if (!-f $request_filename){ rewrite (.*) /index.php; } }去掉location ~ \ .php上的注释 image-20220219195040903图片 给根目录权限 # 给权限 sudo chmod -R 755 /var/owncloud sudo chown -R www-data:www-data /var/owncloud #重启nginx sudo systemctl restart nginx在刚刚网站指定的目录下新建PHP测试文件 $sudo vim /var/owncloud/index.php #输入以下代码 <?php phpinfo(); ?>重新启动Nginx:$sudo systemctl restart nginx 可能报错: “Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.” 多检查修改过的地方,是否有单词错误,或者是否有分号,括号是否对应... Nginx代理php成功后,在浏览器输入树莓派IP地址后能看到如下界面说明配置成功。 image-20220219141927075图片 安装nextCloud 进入刚刚配置的代理目录:cd /var/nextcloud 将刚刚的测试文件删除: sudo rm * 下载nextcloud) sudo wget https://download.nextcloud.com/server/releases/nextcloud-23.0.2.tar.bz2这是目前最新版本,请自己到官网查看版本 image-20220219192510883图片 # 解压缩: sudo tar -jxvf nextcloud-23.0.2.tar.bz2 nextcloud # 复制出来 sudo cp -rf nextcloud/* /var/owncloud再访问IP地址就可以看到NextCloud的运行界面了 image-20220219200624789图片 -
搭建一个个人的专属图床 什么是图床 图床就是用来存放图片的空间,同时允许外链到其他网站。 按照我自己的话来说,图床就是给自己的图片挂上一个链接,其他人能通过这个链接看到这张图片的一个服务器。 为什么要搭建图床 网站图片 像我网站的背景图片、Logo、文章封面等等都是通过图床的链接实现的,当然也可以把这些图片放在站点的根目录下,通过文件绝对路径的方式来实现。还应该会有其他方法来实现,看个人自己的选择吧。 Markdown 很多人都应该听说过Markdown的大名。Markdown是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档。Markdown在使用起来确实很方便,语法规则也比较少,随便学以下就可以很方便的编写自己的笔记之类的。但是,在我们写好自己的笔记分享给别人后却发现图片消失不见了;因为Markdown中粘贴进去的图片是以文件路径保存在自己的本地电脑上的,在别人电脑路径上没有这个文件就导致图片丢失。这时候图床就可以发挥重要作用了,由于此时的图片插入的是一个网址,只有这个网址对应的图片还在,图片就不会丢失。 免费图床推荐 SM.MS) 免注册永久存储图片(图片不违法中国大陆和香港法律的前提下),可以直接选择文件进行上传,支持多种链接格式;虽然每天最多只能上传10次最大5MB的图片,但就稳定性和免费来说已经很不错了,如果每天写的内容较少图片也不多的情况下已经能够满足日常需求。 image-20220214175653708图片 ImgURL) 国外老牌图床,图片存储稳定可靠,但由于是国外的国内访问速度并不可靠。 image-20220214180454972图片 路过图床](https://imgtu.com/)) 支持免注册上传图片,永久存储,支持HTTPS加密访问和调用图片,提供多种图片链接格式和SM.MS差不多。 image-20220214180858261图片 搭建一个自己的图床 自己的图床掌控权在自己手中,没有大小和数量的限制,而且自建的才我们自己在用,访问速度会比免费的要快很多。但是自建图床也没没有那么简单,要一定的技术要求还要申请很多东西,而且自建并也需要有一定的花费,虽然每个月也就几毛钱,约等于白嫖了。如果嫌麻烦的话就老老实实用免费的吧。 image-20220214182710255图片 通过阿里云对象存储OSS搭建一个自己的图床 阿里云 最好有一个ICP备案过的域名没有的话也能用,但不能用CDN加速,CDN的流量是OSS的一半,会比较省钱。 开通阿里云的对象存储:开通不要钱,要使用后才会产生费用 开通OSS服务后,默认的付费方式为按量计费。针对部分计费项目,您也可以购买资源包(包年包月)进一步降低费用。OSS的使用费用每小时结算一次,计算公式为:费用=实际资源使用量×对应资源每小时单价。 我直接购买了一个资源包,也不贵才一瓶饮料钱。 创建Bucket 名字可以随便取,不能和别人的重复。地区选离自己近的,要让别人也访问到权限要选公共读,其他的都不需要开通避免额外的费用支出 image-20220214184038394图片 image-20220214184737951图片 绑定域名 进入刚刚创建好的Bucket里面,找到传输管理展开后选择域名管理绑定自己的域名,这样以后就可以通过域名来访问到自己的图片。 找到SSl证书,选择免费证书,给刚刚绑定的域名部署SSL证书 image-20220214195101516图片 再回到OSS域名管理处部署证书,如果上一步已经部署好了会有证书名称提示 image-20220214195428084图片 开启阿里云CDN加速 增加资源站信息,选择OSS域名,在域名处会弹出自己的OSS域名。 image-20220214195741331图片 在域名管理处添加域名,根据官方提示添加域名解析。 image-20220214195944861图片 添加推荐配置,可以将时间设置得长一点 image-20220214200215841图片 创建专用用户 把鼠标移动到阿里云账户上自己的头像,找到访问控制 image-20220214201240671图片 选择身份管理里面的用户,创建用户 选择编程访问: 启用AccessKey ID和 Access Key Secret支持通过API或其他开发工具访问 输入登录名称和显示名称,点击确认按钮。 创建完成后用户信息只会出现一次,AccessKeySecret是无法找回的,要保存好 上传图片到OSS,获取地址后测试是否可用。 不成功的话,检查一下步骤。 在Typora中使用图床 安装PicGo PicGo](https://github.com/Molunerfinn/PicGo/releases)) 一个用于快速上传图片并获取图片 URL 链接的工具 image-20220214200836873图片 找到自己电脑的对应版本下载。 添加阿里云OSS KeyID和设定KeySecret就是刚刚添加的新用户管理的 其他的信息都可以在OSS管理界面看到 image-20220214202032835图片 设置Typora 在Typora主界面左上角选择文件,找到偏好设置 image-20220214202441253图片 这样我们在用Typero写笔记文章的时候就可以自己上传图片了。 由于这篇文章是我在搭好一段时间后才写的,有些关键图片没有截图保存,在自己尝试的时候如果有大问题可以在评论区留言,大家一起解决。 -
树莓派开启个人热点 更新软件 $sudo apt update $sudo apt upgrade安装并配置hostapd服务 安装hostapd $sudo apt install hostapd $sudo systemctl stop hostapd配置hostapd 编辑/etc/hostapd/hostapd.conf文件,如果不存在这个文件可以直接新建一个。 $sudo vim /etc/hostapd/hostapd.confinterface=wlan0 #bridge=br0 #无线驱动n180211 driver=nl80211 logger_syslog=-1 logger_syslog_level=2 logger_stdout=-1 logger_stdout_level=2 ##### IEEE 802.11 related configuration ####################################### #热点名字,可根据需要自行更改 ssid=AP-Pi4 utf8_ssid=1 # ISO/IEC 3166-1 标准的国家代码,用于设置监管域。根据需要设置,按照哪个国家来操作设备。 # 这可以限制可用的频道和发射功率。 #country_code=CN # 是否启用 IEEE 802.11d,0 禁用(默认),1 启用。 # 需要正确设置 country_code 才能使 IEEE 802.11d 正常工作。 #ieee80211d=1 # 是否启用 IEEE 802.11h,0 禁用(默认),1 启用。 # 这将启用雷达探测和 DFS 支持,如果可用话。 #ieee80211h=1 # 添加 Power Constraint element 到 Beacon 和 Probe Response frames 中去。 #local_pwr_constraint=5 # 该选项仅在 ieee80211h=1 选项并且已经配置 local_pwr_constraint 选项时可用。 #spectrum_mgmt_required=1 # 设置无线模式需要硬件支持 #a = IEEE 802.11a, #b = IEEE 802.11b, g #= IEEE 802.11g, #ad = IEEE 802.11ad (60 GHz) # hw_mode=a 或 hw_mode=g 选项也与 IEEE 802.11n 一起使用来设置波段。 # 当使用 ACS 时(看下文 channel parameter ),可以使用特殊的选项值 hw_mode=any ,说明可以使用任何可用的波段,该值当前仅在驱动使用了 offloaded ACS 的情况下有效。 # 默认: hw_mode=b hw_mode=g # 注意有些设备不使用这个选项,而是需要在 iwconfig 中另外配置。 # 如果编译的时候启用了 CONFIG_ACS 选项。通过设置 channel=acs_survey 或 channel=0,这样 hostapd 可以在运行时基于 ACS survey 算法自动选择合适的信道。 # 有些设备仅支持最大为11频道,有些支持最大为13频道,可以通过iw list 查看。 # 另外启用 ht_capab 将影响可用的频道数 channel=6 # ACS tuning - 信道自动选择 # 参考:http://wireless.kernel.org/en/users/Documentation/acs # 信道自动选择,有助于选择更好的信道,但是会增加启动时间,一般不需要修改。 # 可以通过设置下面选项自定义 ACS survey 算法。 # 默认:acs_num_scans=5 acs_chan_bias=1:0.8 6:0.8 11:0.8 #acs_num_scans=40 #acs_chan_bias=1:0.8 6:0.8 11:0.8 # 默认允许所有信道 #chanlist=100 104 108 112 116 #chanlist=1 6 11-13 # beacon 间隔 (默认: 100; 范围 15到65535) #beacon_int=100 #dtim_period=1 # 默认且最大值为2007个列表 #max_num_sta=255 #rts_threshold=2347 #fragm_threshold=2346 #supported_rates=10 20 55 110 60 90 120 180 240 360 480 540 #basic_rates=10 20 #basic_rates=10 20 55 110 #basic_rates=60 120 240 # 用命令:iw list 查看无线网卡是否有“short preamble supported”。 # 0 禁用,1 启用,无线网卡支持的话可以启用以改善网络性能。 #preamble=1 # 无线MAC地址过滤 # 此选项要求 driver=hostap 或 driver=nl80211 # 0 = 接受所有连接,仅拒绝 deny 列表中的连接 # 1 = 拒绝所有连接,仅接受 accept 列表中的连接 # 2 = 使用外部 RADIUS 服务器 (还是会优先查找 accept/deny 列表) # 简单一点的话,可以将两个列表设置为同一个文件,仅由 macaddr_acl 来控制允许或拒绝 macaddr_acl=0 accept_mac_file=/etc/hostapd/hostapd.accept deny_mac_file=/etc/hostapd/hostapd.deny # 身份验证算法,1 开放系统认证,2 共享密钥认证(需要 WEP),3 两者 auth_algs=3 # 是否广播,0 广播SSID,1 不广播SSID(发送空SSID,即长度为0的SSID), # 2 忽略广播 SSID 的探测请求,跟1类似,但是兼容某些不支持空SSID的设备 #ignore_broadcast_ssid=0 #vendor_elements=dd0411223301 # 启用WMM wmm_enabled=1 # # WMM-PS Unscheduled Automatic Power Save Delivery [U-APSD] # Enable this flag if U-APSD supported outside hostapd (eg., Firmware/driver) #uapsd_advertisement_enabled=1 # # Low priority / AC_BK = background #wmm_ac_bk_cwmin=4 #wmm_ac_bk_cwmax=10 #wmm_ac_bk_aifs=7 #wmm_ac_bk_txop_limit=0 #wmm_ac_bk_acm=0 # Note: for IEEE 802.11b mode: cWmin=5 cWmax=10 # # Normal priority / AC_BE = best effort #wmm_ac_be_aifs=3 #wmm_ac_be_cwmin=4 #wmm_ac_be_cwmax=10 #wmm_ac_be_txop_limit=0 #wmm_ac_be_acm=0 # Note: for IEEE 802.11b mode: cWmin=5 cWmax=7 # # High priority / AC_VI = video #wmm_ac_vi_aifs=2 #wmm_ac_vi_cwmin=3 #wmm_ac_vi_cwmax=4 #wmm_ac_vi_txop_limit=94 #wmm_ac_vi_acm=0 # Note: for IEEE 802.11b mode: cWmin=4 cWmax=5 txop_limit=188 # # Highest priority / AC_VO = voice #wmm_ac_vo_aifs=2 #wmm_ac_vo_cwmin=2 #wmm_ac_vo_cwmax=3 #wmm_ac_vo_txop_limit=47 #wmm_ac_vo_acm=0 # Note: for IEEE 802.11b mode: cWmin=3 cWmax=4 burst=102 # 检测客户端不活动超时,是否在线间隔时间,默认每5分钟检测客户端是否在线 # 站点不活动限制,默认5分钟 #ap_max_inactivity=300 # 默认禁用,设置为1,说明只要客户在5分钟内没有活动就断线,即使客户端仍然在AP信号的范围内, #如果客户端过多可以启用来提高带机量。 #skip_inactivity_poll=0 # 对于过度的传输失败或其他连接丢失的情况下,断开连接,这并不适合所有设备 #disassoc_low_ack=1 # 最大允许侦听间隔,默认65535,即不限制 (how many Beacon periods STAs are allowed to remain asleep) #max_listen_interval=100 # WDS(4-address frame)模式,仅在 driver=nl80211 的情况下支持 #wds_sta=1 # 仅在设置了bridge= 时有效,默认情况下,例如当设置了bridge=br0,那么wds_bridge=br0。 # 当然也可以手动指定为wds_bridge=XXXXX。 #wds_bridge=wds-br0 # Start the AP with beaconing disabled by default.没明白是什么意思。 #start_disabled=0 # AP隔离,1启用,0禁用。默认不隔离。 #ap_isolate=1 #bss_load_update_period=50 # 用于测试的 #bss_load_test=12:80:20000 ##### IEEE 802.11n related configuration ###################################### # 启用80211n,你也将需要启用WMM来使用全部HT功能。 ieee80211n=1 # [HT40-]或[HT40+]没有设置的话将只工作在20MHz, # [HT40-]对应可使用的频道为5-13 # [HT40+]对应可使用的频道为1-7(欧洲标准为1-9) # 当多径效应不是很严重时,用户可以将该间隔配置为[SHORT-GI-20][SHORT-GI-40] # 个人理解,如果不上天馈系统的话可以启用[SHORT-GI-20][SHORT-GI-40],前提是硬件支持。 #ht_capab=[LDPC][HT40-][HT40+][SHORT-GI-20][SHORT-GI-40][SMPS-DYNAMIC][GF][TX-STBC][RX-STBC123][DELAYED-BA][MAX-AMSDU-7935][DSSS_CCK-40][40-INTOLERANT][LSIG-TXOP-PROT] # intel Wireless-N 105 (rev c4) 网卡支持的选项 ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40][40-INTOLERANT][GF] # Atheros AR9271 网卡支持的选项 #ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40][40-INTOLERANT][RX-STBC1] #ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40] #ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40] #ht_capab=[HT40+][DSSS_CCK-40][40-INTOLERANT] # 强制要求客户端使用HT PHY,不使用就拒绝。 #require_ht=0 # 间隔时间(秒) #obss_interval=5 ##### WPA/IEEE 802.11i configuration ########################################## # 1 wpa,2 wpa2, 3 两者。 新的设备可以设置为2,仅使用wpa2版本。 wpa=2 # 指定密码,ASCII码或密码字符。 #wpa_psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef #密码设置 wpa_passphrase=12345678 # 使用密码文件,可以跟客户端MAC地址绑定设置不同的密码,比较实用。 wpa_psk_file=/etc/hostapd/hostapd.wpa_psk # 是否使用验证服务器,0 禁用(默认),1 可用,2 强制使用(其他方式将拒绝) #wpa_psk_radius=0 # 设置密钥管理算法WPA-PSK WPA-EAP或两者 wpa_key_mgmt=WPA-PSK # 设置加密算法,CCMP就是AES,不推荐使用TKIP,除非设备不支持。 wpa_pairwise=CCMP # 默认情况下rsn_pairwise自动设置为wpa_pairwise的值,当然也可以手动指定。 #rsn_pairwise=CCMP #wpa_group_rekey=600 #wpa_strict_rekey=1 #wpa_gmk_rekey=86400 #wpa_ptk_rekey=600 # 预认证 #rsn_preauth=1 #rsn_preauth_interfaces=wlp2s0 br0 enp3s0 #peerkey=1 # 80211w支持,0 禁用(默认),1 可选,2 强制使用(其他方式将拒绝) 有些网卡不支持 #ieee80211w=1 # AES-128-CMAC(默认) BIP-GMAC-128 BIP-GMAC-256 BIP-CMAC-256 四种 # 一般通用设备都支持AES-128-CMAC,其他的不一定 #group_mgmt_cipher=AES-128-CMAC #assoc_sa_query_max_timeout=1000 #assoc_sa_query_retry_timeout=201 #disable_pmksa_caching=0 #okc=1 #sae_anti_clogging_threshold=5 #sae_groups=19 20 21 25 26 ##### IEEE 802.11r configuration ############################################## # Wi-Fi无线漫游标准 #mobility_domain=a1b2 #r0_key_lifetime=10000 #r1_key_holder=000102030405 #reassociation_deadline=1000 #pmk_r1_push=1 ##### Neighbor table ########################################################## #ap_table_max_size=255 #ap_table_expiration_time=3600 ##### IEEE 802.11v-2011 ####################################################### # Wi-Fi节能版 #time_advertisement=2 #time_zone=CST8 # 下面三项有些网卡不支持 #wnm_sleep_mode=1 #bss_transition=1 #proxy_arp=1为了便于使用,将注释去除 (所用协议较老,请参照最新版) interface=wlan0 driver=nl80211 #修改名字 ssid=AP-Pi4 utf8_ssid=1 hw_mode=g channel=7 ieee80211n=1 macaddr_acl=0 auth_algs=1 wmm_enabled=0 wpa=2 #密码设置 wpa_passphrase=12345678 wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP ssid: WiFi 名称,8~64 个字符,最好用英文字母,不要出现特殊字符 hw_mode: WiFi 网络模式,一般填 g 即可,设备支持的话可以填 a 启用 5G 频段: a = IEEE 802.11a (5 GHz) b = IEEE 802.11b (2.4 GHz) g = IEEE 802.11g (2.4 GHz) channel: 信道编号。如果上面配置了 hw_mode=g 使用 2.4G 频段,则一般填 7 即可。如果配置了 5G 频段,则信道编号有所不同,具体参考:无线局域网信道列表 - 维基百科,自由的百科全书 (wikipedia.org) wpa_passphrase: WiFi 密码,最好用英文加数字,不要出现特殊字符 最新版配置文件 interface=wlan0 driver=nl80211 ssid=AP-Pi4 hw_mode=a channel=0 ieee80211n=1 ieee80211ac=1 ieee80211ax=1 ieee80211d=1 ieee80211h=1 country_code=CN auth_algs=1 wpa=2 wpa_passphrase=123456789 wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256 rsn_pairwise=CCMP macaddr_acl=0 wmm_enabled=1 wmm_ac_bk_cwmin=4 wmm_ac_bk_cwmax=10 wmm_ac_bk_aifs=7 wmm_ac_bk_txop_limit=0 wmm_ac_bk_acm=0 wmm_ac_be_aifs=3 wmm_ac_be_cwmin=4 wmm_ac_be_cwmax=10 wmm_ac_be_txop_limit=0 wmm_ac_be_acm=0 wmm_ac_vi_aifs=2 wmm_ac_vi_cwmin=3 wmm_ac_vi_cwmax=4 wmm_ac_vi_txop_limit=94 wmm_ac_vi_acm=0 wmm_ac_vo_aifs=2 wmm_ac_vo_cwmin=2 wmm_ac_vo_cwmax=3 wmm_ac_vo_txop_limit=47 wmm_ac_vo_acm=0 he_su_beamformer=1 he_su_beamformee=1 he_mu_beamformer=1 he_bss_color=5 he_default_pe_duration=0 he_basic_mcs_nss_set=2 he_oper_centr_freq_seg0_idx=0 require_ht=1 he_su_beamformee=1 he_su_beamformer=1 he_bss_color=3 he_twt_required=1 vht_capab=[SHORT-GI-80][RX-STBC1][TX-STBC][SU-BEAMFORMER][SU-BEAMFORMEE]编辑/etc/default/hostapd文件,将DAEMON_CONF前面的注释去掉,并加上/etc/hostapd/hostapd.conf image-20220208150739117图片 $sudo vim /etc/default/hostapd DAEMON_CONF="/etc/hostapd/hostapd.conf"保存退出后启动hostapd $sudo systemctl unmask hostapd $sudo systemctl enable hostapd $sudo systemctl start hostapdimage-20220208153101418图片 可以看到热点已经开启成功,但是还没有分配IP不能上网。 配置wlan0静态IP 让wlan0的IP地址设置成静态的,然后在通过DHCP同态的去给连接设备分配IP $sudo apt install dhcpcd $sudo vim /etc/dhcpcd.conf在文件最后添加 interface wlan0 static ip_address=192.168.4.1/24 nohook wpa_supplicant保存退出,重启dhcpcd服务: $sudo systemctl restart dhcpcd查看wlan0的IP地址:ifconfig ,可以发现,wlan0的IP已经改变为之前设置的地址 image-20220209160315594图片 安装并配置dnsmasq服务 Dnsmasq 提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为DHCP 服务器,dnsmasq 可以用于为局域网电脑分配内网ip地址和提供路由。DNS和DHCP两个功能可以同时或分别单独实现。dnsmasq轻量且易配置,适用于个人用户或少于50台主机的网络。此外它还自带了一个 PXE 服务器。 安装dnsmasq服务 $ sudo apt install dnsmasq $ sudo systemctl stop dnsmasq配置dnsmasq 编辑/etc/dnsmasq.conf文件,将里面的内容删除或者注释掉。 sudo vim /etc/dnsmasq.conf #添加新内容 interface=wlan0 dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h #dhcp 服务会给客户端分配 192.168.4.2 到 192.168.4.20 的 IP 空间,并设置24 小时租期。 #重启dnsmasq服务 $sudo systemctl restart dnsmasq配置完后连接到热点已经自动分配到了一个IP地址,但是还不能上网 image-20220209162149776图片 配置IP转发 编辑 /etc/sysctl.conf 系统配置文件,将 net.ipv4.ip_forward=1 前面的注释去掉。 $sudo vim /etc/sysctl.conf #net.ipv4.ip_forward=1 #将前面的 # 号删除image-20220209162842756图片 修改防火墙规则 安装iptables apt install iptables$sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE $sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT $sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT ##若要通过热点建立NAS开启以下防火墙规则 #sudo iptables -A INPUT -p tcp --dport 139 -j ACCEPT #sudo iptables -A OUTPUT -p tcp --sport 139 -j ACCEPT #sudo iptables -A INPUT -p tcp --dport 445 -j ACCEPT #sudo iptables -A OUTPUT -p tcp --sport 445 -j ACCEPT 为了避免每次重启后都要重新配置,将防火墙规则写入开机启动项 将防火墙规则写入文件 $sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"编辑/etc/rc.local,将iptables-restore < /etc/iptables.ipv4.nat加到exit 0前面。 $sudo vim /etc/rc.local #加在exit 0前面 iptables-restore < /etc/iptables.ipv4.nat 若执行后出现:sh: 1: iptables-save: not found 要先安装iptables $sudo apt install iptablesimage-20220209163455762图片 保存退出后重启树莓派:sudo reboot。 网络测试 经过一段时间的测试,能够正常访问互联网,网速也还可以,但是在流量较大时会间歇性断开连接,上传速率也有些异常,目前还不清楚是什么原因造成。(已解决) image-20220209185439101图片 常见问题修复 网络慢问题分析及解决办法 {% link 树莓派开启个人热点(二)解决网速慢问题,Mstzf,https://blog.teohzy.com/post/startAP2/index.html %} 设置hostapd开机自启失败解决办法 可能原因:NetworkManager占用wlan0导致启动失败 解决办法:禁用 NetworkManager 控制 wlan0 创建一个 NetworkManager 的配置文件 sudo nano /etc/NetworkManager/conf.d/no-wlan0.conf 编辑配置文件 [keyfile] unmanaged-devices=interface-name:wlan0 重启NetworkManager sudo systemctl restart NetworkManager -
Windows环境下安装gcc编译器 原因 在使用VSCode时,我们可以比较方便的编写C语言的代码,但是VSCode并没有自带编译器,这时候我们就需要去安装其他的编译器来对写好的代码进行编译。在Windows上安装gcc编译器并不像Linux中那样方便快捷。 安装MinGW 进入mingw官网下载安装程序 https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/ 打开后可以看到如下界面 image-20220403172249018图片 往下滑 image-20220403172828690图片 安装软件 如果选择了在线安装要选择对应架构 MinGW选择参数图片 Version(版本号):一般默认就行 Architecture(架构):64位系统选择x86_64,32位系统选择i686 Threads(设置线程标准):可选posix或win32; Exception(异常处理系统):x86_64可选为seh和sjlj,i686为dwarf和sjlj; Build revision(构建版本号):默认就行 下一步,安装路径最好自己设置,便于添加环境变量 如果下载的是压缩包文件,则只需要将文件解压缩到自己想要的GCC安装目录下即可 设置环境变量 “此电脑->属性->高级系统设置->环境变量” 在系统变量的Path中新加入GCC的安装路径到/bin结束 MinGW环境变量图片 Win+R输入CMD调出Windows终端,输入“gcc -v” GCC安装完成检验图片 如果出现以下界面,说明gcc已经安装成功