关键字:udp、打洞、流程、关键、失败、拒绝、原因
时间:2021年10月

一、流程
1、客户端A向服务器发送任意数据,服务器记录客户端A的公网IP和端口,暂不应答客户端A;
2、客户端B向服务器发送任意数据,服务器把之前记录的客户端A的公网IP和端口发送给客户端B,同时把客户端B的公网端口和IP发送给A;
3、客户端A对收到服务器发来的客户端B的外网IP和端口立即发送数据,客户端B对收到服务器发来的客户端A的外网IP和端口立即发送数据;
4、客户端A和客户端B正常收发对方数据。

二、关键点
1、家用宽带基本都是可以UDP打洞的(Symmetric NAT很少见),没有成功通常是代码问题;
2、客户端本地端口可以固定也可以随机,但必须保证发送数据到服务器和发送数据到另一客户端使用相同的端口;
3、尽量保证两个客户端对发第一条数据在同一时刻,否则出现连接拒绝(refused)的概率很大。
4、实际打洞时,会有一定概率连接拒绝的情况,重新打洞即可,最好不要固定本地端口。

提供以打洞成功的源码,仅供参考:https://gitee.com/gitee211012/udp_hole_punching.git

关键字:nat、vsftp、passive、被动模式、配置
时间:2021年10月

问题1 需要哪些准备工作?
答:了解FTP主动模式和被动模式,了解端口映射工具iptables或lvs。

问题2 主动模式与被动模式如何选择?
答:对于公网FTP服务而言,主动模式是行不通的,只能采用被动模式。

问题3 被动模式需要映射哪些端口?
答:被动模式下,21端口的连接用于指令传输,FTP服务器会动态打开监听端口用于传输文件数据,端口号可配置。因此,仅映射21端口是不够的。

问题4 vsftp如何配置被动模式
答:
1、pasv_enable=YES启用被动模式;
2、pasv_min_port=60000和pasv_max_port=60010设置监听端口范围60000~60010,根据自己的情况修改范围值;
3、pasv_address=x.x.x.x设置ftp服务器的外网IP
修改完配置后,记得重启vsftp

问题5 端口映射如何配置
答:NAT网关上安装lvs,执行”ipvsadm -A 172.16.0.1:21 -s rr”、”ipvsadm -a 172.16.0.1:21 -r 172.16.0.105:21 -m”两条命令,完成21端口的映射,其他端口以此类推。pasv_min_port与pasv_max_port之间的端口均需要映射,172.16.0.1是NAT本机地址,172.16.0.105是FTP服务器地址,别替换错了。

问题6 客户端登录正常,无法获取文件?
答:因为pasv_address设置的是IPv4地址,需要屏蔽listen_ipv6=YES,并设置listen=YES。

问题7 如何限制用户的根路径?
答:限制用户的根路径设置不当,反应的现象看起来和网络问题很想,很容易误认为是被动模式配置或端口映射有问题。只需要注意chroot_local_user=YES和allow_writeable_chroot=YES配合使用即可,allow_writeable_chroot在vsftp老版本中并不需要配置,但在新版本中,如果不配置为YES,会涉及一系列目录权限的修改。

关键字:stc15f104w、linux、编译、烧录、stcgal、sdcc、stc15
时间:2021年4月

编译与烧录

user1@debian:~/example$ sdcc -mmc51 --iram-size 128 --xram-size 0 --code-size 4096 "main.c"
user1@debian:~/example$ stcgal -b 1200 -P stc15 main.ihx

常见问题

Switching to 19200 baud: Protocol error: incorrect frame start
Switching to 19200 baud: Serial port error: read timeout

波特率降低到1200即可解决。

关键字:ds1302、时间、归零、清零、注意
时间:2020年12月

接口协议

DS1302的接口不是SPI,也不是I2C,只能通过GPIO按照时序控制。SPI输入和输出是MOSI和MISO,而DS1302输入输出都是DAT脚;I2C有地址应答,而DS1302没有地址应答。

接口连接

DS1302的CLK、DAT、RST脚必须接上拉电阻(4.7K或10K),否则会造成时钟归零问题出现。曾经遇到过一个案例,STM32+DS1302+MAX7219显示时间,每次MAX7219上电,都会造成DS1302时钟归零,加上上拉电阻后,问题解决。

关键字:433MHz、无线、接收、发送、FS1000A、MX-RM-5V
时间:2020年11月

发送模块FS1000A

发送模块有3个脚,分别印有GND、VCC、ATAD。ATAD脚用于接收来自单片机或串口TX脚的电平信号。

接收模块MX-RM-5V

接收模块有4个脚,PCB上只印刷了GND和VCC,中间两个脚是连通的,我们把他标记为DATA脚。DATA脚用于发送电平信号给单片机或串口的RX脚。

接线

+-----------+    +-----------+    +---------+
|  MX-RM-5V |    | USB-UART  |    | FS1000A |
|           |    |           |    |         |
|       VCC |<-->| 5V     5V |<-->| VCC     |
|      DATA |<-->| RX     TX |<-->| ATAD    |
|       GND |<-->| GND   GND |<-->| GND     |
+-----------+    +-----------+    +---------+

测试

打开一个串口调试工具,波特率选择2400或4800,输入字符点击发送按钮,观察接收到的内容。

注意

1.433MHz频率承载的数据带宽有限,高于4800波特率的数据基本无法正确接收。
2.通常433MHz频率干扰信号是存在的,串口调试工具收到异常数据属于正常现象,如果用于实际通讯,需要加校验位。

1. 打开官网www.st.com;
2. 搜索stm32f1;
3. 找到Recommended Links,点击链接STM32F1 Series;
4. 点击Tools&Software标签;
5. 依次找到All tools & software types > Embedded Software > MCU & MPU Embedded Software > STM32 Standard Peripheral Libraries;
6. 在表格中的General Description列,找到STM32F10x standard peripheral library,点击STSW-STM32054

uint64_t delay_ticks;

void SysTick_Handler(void) {
	if (delay_ticks > 0) {
		delay_ticks--;
	} else {
		SysTick->CTRL = 0x00;
		SysTick->VAL = 0x00;
	}
}

void delay_us(unsigned long n) {
	delay_ticks = n;
	SysTick_Config(SystemCoreClock/1000000);
	while(delay_ticks);
}

void delay_ms(unsigned long n) {
	delay_ticks = n;
	SysTick_Config(SystemCoreClock/1000);
	while(delay_ticks);
}

注:SystemCoreClock在头文件system_stm32xxx.h中有定义。

关键字:stm32、标准库、16m、晶振、串口、乱码
时间:2020年4月

问题

STM32F030是48MHz主频,标准库STM32F0xx_StdPeriph_Driver的相关代码默认外部晶振为8MHz。通常可以通过定义HSE_VALUE宏,来修改晶振频率。但是只修改HSE_VALUE为16M,主频则变成了96MHz,MCU处于超频状态运行,不能长期运行,并且会影响串口、SPI、I2C等外设的正常运行。

解决方法

修改PREDIV和PLLMUL两个寄存器,从而使主频(SYSCLK)回到正常的48MHz。原理参考STM32F030F4数据手册“clocks and startup”章节。

stm32f0xx.h文件

修改前

...
#if !defined  (HSE_VALUE)     
#define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz*/
#endif /* HSE_VALUE */
...

修改后

...
#if !defined  (HSE_VALUE)     
#define HSE_VALUE    ((uint32_t)16000000) /*!< Value of the External oscillator in Hz*/
#endif /* HSE_VALUE */
...

system_stm32f0xx.c文件

修改前

...
static void SetSysClock(void)
{
  ...
    /* PLL configuration */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);
  ...
}
...

修改后

...
static void SetSysClock(void)
{
  ...
    /* PLL configuration */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLMULL6);
  ...
}
...

或者修改后

...
static void SetSysClock(void)
{
  ...
    /* PLL configuration */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL3);
  ...
}
...

关键字:android、strongswan、vpn、mtu、1360、无法上网
时间:2019年11月

现象

iPhone手机连接已经配置好strongswan的VPN服务器,已经能够正常访问公网。
Android手机连接同一台VPN服务器,手机状态栏已经出现VPN图标,但无法打开网页。

解决办法

在VPN服务器端执行如下脚本

root@debian:~# iptables -t mangle -A FORWARD -s 10.0.0.0/24 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360

10.0.0.0/24为你的手机连接vpn获取的ip地址池。

原因分析

Android手机连接VPN后的MTU协商值不太合适,通过iptables拦截MTU协商包并强行修改为1360。

作者:Roc

关键字:3D打印、选购、安装、建模、切片、注意事项、维护

目录

一、是否应该购买3D打印机

二、选购3D打印机

三、打印机安装

四、设计模型

五、模型切片

六、打印

七、维护

一、是否应该购买3D打印机

1、使用频率

如果使用频率不高,建议寻找网络3D打印服务平台进行打印。

2、打印精度

可以简单的认为家用3D打印机精度大概在0.1mm左右。官网产品介绍上的精度是理想状态值,实际精度会差一些,3D打印的精度与开模的精度相比还是要差1个数量级以上。适合原型产品设计等使用。

3、材质

3D打印主要以PLA、ABS等树脂材料为主。也有木材、金属等3D打印机,其价格昂贵,不适合家用。

4、打印数量

3D打印不适合大批量生产。3D打印的速度非常慢,打印一个装两节电池的电池盒需要1~1.5小时。

5、打印模型的结构

3D打印并不能打印任意的结构。3D打印和修房子相似,是由下往上,逐层打印,类似天花板的结构,面积较小可以打印,面积较大会产生形变甚至导致整个打印失败。

二、选购3D打印机

如果只是以学习为目的,可以购买1000元左右的3D打印机。如果是以产品外壳设计、制作玩具等为目的,简易购买3000元以上的机型。

三、打印机安装

1、准备

A)安装3D打印机需要一个比较稳定的桌子,桌面尽量保证水平。

B)电源使用一般的插线板即可,家用3D打印机功耗峰值一般在400w左右,正常打印阶段一般只有70w左右。

2、开箱

A)注意观察纸箱上是否有《使用说明》或《操作手册》之类的提示,如果有,一定先详细阅读后再进行开箱。

B)机体、打印头等通常有泡沫材料包裹,拆除时需注意,可能存在包裹材料需要通电调整打印头位置或升降台面等操作后才能取出。

C)升降台面上有一层纸,叫美纹纸,主要作用是便于打印出来的模型与台面分离。请勿将美纹纸撕下。

3、安装

A)放置好打印机好,通常会有一个送料架需要安装,按照说明安装即可。打印机可能会附送一盒耗材,请在附件中查找,然后按照说明进行耗材安装。

B)线材安装时,线头进入送料管之前不要离手,否则与线盘上的线材绞在一起,很难分辨是否绞死。

4、打印测试

A)3D打印机一般都支持USB和SD卡两种接口,还会附送一张SD卡,里面有驱动程序、切片程序、模型例子等。找到SD插槽,插入SD卡。

B)进行打印前,需先进行预热。待达打印头和底板都达到预热温度后,按照说明选择模型文件进行打印。

C)打印时注意观察,如果打印头挤出的材料大面积脱离底板,请停止打印,更换模型再进行打印测试。未添加基座的模型必定打印失败,该问题后续会进行说明。

四、设计模型

1、软件选择

这里主要介绍一款模型设计软件OpenSCAD

A)此软件为免费软件。

B)这款软件是通过写代码的形式进行模型设计,适合于工业设计。它通过立方体、圆柱体、球形、圆锥体等基本结构进行平移、旋转、相交、挖空等操作构成你需要的结构。

C)最终输出STL格式文件。

具体使用方法请自行查找资料学习。

2、设计注意事项

五、模型切片

1、为什么要切片

A)打印机产品说明通常会说支持STL、OBJ、g-code等格式,其实只支持g-code格式。其他格式需要通过切片软件转换成g-code文件。

B)切片软件还有一个作用是添加基座。没有基座,打印成功的概率几乎为零。通常选择Raft基座,它不但便于与升降台面分离,也便于基座本身与模型分离。厂家提供的SD卡上的打印测试模型文件可能没有带基座,也就是打印会失败的原因。

2、切片软件

A)通常3D打印机厂家会提供切片软件,可能是厂家自己开发的,也可能是其他厂家开发的。

B)使用切片软件时,需要选择对应的3D打印机,或者导入打印机参数。参数主要包括是最大打印尺寸、温度、步进距离等,通常在一个配置文件中。

六、打印

1、关键步骤

a)开机

按下电源开关。

b)清理台面灰尘

调整升降台,远离打印头,使用拧干的毛巾擦拭美纹纸。

c)预热

选择预热功能,等待温度到达目标值。

d)清理打印头残余材料

待预热完成后,使用金属镊子轻轻除去打印头上挤出或附着的材料

e)选择模型文件打印

选择模型文件进行打印。

f)观察至基座打印完成

观察打印头挤出的材料是否脱离美纹纸,如果在打印头移动过程中带动了已经附着在美纹纸上的材料,建议停止打印,清理后重新打印。

g)脱离观察

基座打印完成后,再出现问题的概率就比较小了,除非模型结构设计不合理。不建议长时间脱离观察打印。

f)关机

尽量在打印头温度低于50度后关机。由于关机后打印头散热器风扇不再旋转,散热器高温会加速风散等周边塑料器件的老化速度。

2、打印注意事项

a)初期挤出不及时

打印刚开始时,打印头未及时挤出材料,如果只有3~5秒时间,影响不大,否则停止打印,后期很有可能造成基座翘角。

b)打印头扰乱已挤出线材

通常会发生在打印初期,由于挤出的材料和台面附着力不该够,已经打印的材料可能会被打印头沾粘带走,此时应该终止打印。

发生该情况,建议打印初期降低速度至60%~80%进行打印,待基座第二层打印正常后,速度调整回100%。

c)基座翘角

通常发生在基座打印完成,开始打印模型最底层阶段。随着打印继续,翘角情况会越来越严重,导致模型底层变形。该情况出现时,应及时终止打印。

d)结构晃动

当发现打印头会导致模型部分结构产生晃动时,应终止打印。出现此显现,说明该结构在设计时需要考虑加固。就好比修一个柱子,柱子要修得高,就必须要加粗才行,或者每隔一定高度做一个与墙或其他柱子连接的支撑。

七、维护

1、线材断裂

发生线材断裂通常有两种情况:

第一种,因为线材质量存在问题,第二种是绕线盘卡死。

第二种,通常是因为线材在安装时,与线盘上的线材绞在了一起引起,此问题并不会及时暴露。

2、打印头不出料

打印头不出料通常发生在线材断裂后。此时应调高打印头温度至250度左右,反复手动送料,直至打印头挤出。实在不行,则需要拆卸打印头进行清洗。