2022年3月

一周尝试了uni-app/native-script/ionic/cordova/termux/tasker, 想实现一个mqtt订阅消息推送到android通知栏这么个简单功能, 却是种种失败啊~~~~~郁闷得不行,难道是我的手机系统真的太老了吗哈哈

termux安装后, 如果需要和android系统交互, 还需要安装termux:api
官方文档

android 7.0能下载的最后版本是0.101, 再新的版本似乎都不能安装了.截至目前, android 7.1还能安装最新版本0.118

换源

使用termux-change-repo GUI界面换源. 回车键确定, 空格键选择.
可选择清华源. 换源后第一时间应更新pkg up
pkg up中如果选择了多个y,有可能会覆盖掉这个repo的配置, 此时最好重新再次配置一次termux-change-repo

远程登录

Remote access

# 更新(必须, 否则有些包装不上). 注意其中一些步骤要按`Y`
pkg up
# 安装包
pkg install openssh
# 开启服务
sshd
# 查询用户名
whoami
# 查看ip
ifconfig
# 设置密码
password

termux ssh默认8022端口, 在pc上连接

ssh -p 8022 user@hostname_or_ip

termux api

重点:权限要开足。
除了在安卓系统设置中给予的所有权限,还包括自启动权限。在meizu系统中找不到自启动权限,但是手机管家中有一个智能后台,必须要开启允许后台常驻。这个权限一开始可能找不到,必须要用一下才找得到。

安装完android studio,avd和正常启动了模拟器以后, 如果希望直接启动模拟器而不是先启动android studio, 可以从命令行启动.
注意, 必须进入 sdk/tools目录启动, 否则会找不到依赖项
示例如下:

cd D:\rsoft\mybin\android\sdk\tools
emulator -avd Pixel_2_API_27 -netdelay none -netspeed full

官方文档

emulator命令的帮助:

C:\Users\k>emulator -help
Android Emulator usage: emulator [options] [-qemu args]
  options:
    -list-avds                     list available AVDs
    -sysdir <dir>                  search for system disk images in <dir>
    -system <file>                 read initial system image from <file>
    -writable-system               make system image writable after 'adb remount'
    -datadir <dir>                 write user data into <dir>
    -kernel <file>                 use specific emulated kernel
    -ramdisk <file>                ramdisk image (default <system>/ramdisk.img
    -image <file>                  obsolete, use -system <file> instead
    -initdata <file>               same as '-init-data <file>'
    -data <file>                   data image (default <datadir>/userdata-qemu.img
    -partition-size <size>         system/data partition size in MBs
    -cache <file>                  cache partition image (default is temporary file)
    -cache-size <size>             cache partition size in MBs
    -no-cache                      disable the cache partition
    -nocache                       same as -no-cache
    -sdcard <file>                 SD card image (default <datadir>/sdcard.img
    -snapstorage <file>            file that contains all state snapshots (default <datadir>/snapshots.img)
    -no-snapstorage                do not mount a snapshot storage file (this disables all snapshot functionality)
    -snapshot <name>               name of snapshot within storage file for auto-start and auto-save (default 'default-boot')
    -no-snapshot                   perform a full boot and do not do not auto-save, but qemu vmload and vmsave operate on snapstorage
    -no-snapshot-save              do not auto-save to snapshot on exit: abandon changed state
    -no-snapshot-load              do not auto-start from snapshot: perform a full boot
    -snapshot-list                 show a list of available snapshots
    -no-snapshot-update-time       do not do try to correct snapshot time on restore
    -wipe-data                     reset the user data image (copy it from initdata)
    -avd <name>                    use a specific android virtual device
    -skindir <dir>                 search skins in <dir> (default <system>/skins)
    -skin <name>                   select a given skin
    -no-skin                       deprecated: create an AVD with no skin instead
    -noskin                        same as -no-skin
    -memory <size>                 physical RAM size in MBs
    -cores <number>                Set number of CPU cores to emulator
    -accel <mode>                  Configure emulation acceleration
    -no-accel                      Same as '-accel off'
    -ranchu                        Use new emulator backend instead of the classic one
    -engine <engine>               Select engine. auto|classic|qemu2
    -netspeed <speed>              maximum network download/upload speeds
    -netdelay <delay>              network latency emulation
    -netfast                       disable network shaping
    -code-profile <name>           enable code profiling
    -show-kernel                   display kernel messages
    -shell                         enable root shell on current terminal
    -no-jni                        disable JNI checks in the Dalvik runtime
    -nojni                         same as -no-jni
    -logcat <tags>                 enable logcat output with given tags
    -no-audio                      disable audio support
    -noaudio                       same as -no-audio
    -audio <backend>               use specific audio backend
    -radio <device>                redirect radio modem interface to character device
    -port <port>                   TCP port that will be used for the console
    -ports <consoleport>,<adbport> TCP ports used for the console and adb bridge
    -onion <image>                 use overlay PNG image over screen
    -onion-alpha <%age>            specify onion-skin translucency
    -onion-rotation 0|1|2|3        specify onion-skin rotation
    -dpi-device <dpi>              specify device's resolution in dpi (default 165)
    -scale <scale>                 scale emulator window (deprecated)
    -http-proxy <proxy>            make TCP connections through a HTTP/HTTPS proxy
    -timezone <timezone>           use this timezone instead of the host's default
    -dns-server <servers>          use this DNS server(s) in the emulated system
    -cpu-delay <cpudelay>          throttle CPU emulation
    -no-boot-anim                  disable animation for faster boot
    -no-window                     disable graphical window display
    -version                       display emulator version number
    -report-console <socket>       report console port to remote socket
    -gps <device>                  redirect NMEA GPS to character device
    -shell-serial <device>         specific character device for root shell
    -tcpdump <file>                capture network packets to file
    -bootchart <timeout>           enable bootcharting
    -charmap <file>                use specific key character map
    -prop <name>=<value>           set system property on boot
    -shared-net-id <number>        join the shared network, using IP address 10.1.2.<number>
    -gpu <mode>                    set hardware OpenGLES emulation mode
    -camera-back <mode>            set emulation mode for a camera facing back
    -camera-front <mode>           set emulation mode for a camera facing front
    -webcam-list                   lists web cameras available for emulation
    -screen <mode>                 set emulated screen mode
    -force-32bit                   always use 32-bit emulator
    -selinux <disabled|permissive> Set SELinux to either disabled or permissive mode
    -unix-pipe <path>              Add <path> to the list of allowed Unix pipes
    -fixed-scale                   Use fixed 1:1 scale for the initial emulator window.
    -wait-for-debugger             Pause on launch and wait for a debugger process to attach before resuming
    -skip-adb-auth                 Skip adb authentication dialogue

     -qemu args...                 pass arguments to qemu
     -qemu -h                      display qemu help

     -verbose                      same as '-debug-init'
     -debug <tags>                 enable/disable debug messages
     -debug-<tag>                  enable specific debug messages
     -debug-no-<tag>               disable specific debug messages

     -help                         print this help
     -help-<option>                print option-specific help

     -help-disk-images             about disk images
     -help-debug-tags              debug tags for -debug <tags>
     -help-char-devices            character <device> specification
     -help-environment             environment variables
     -help-virtual-device          virtual device management
     -help-sdk-images              about disk images when using the SDK
     -help-build-images            about disk images when building Android
     -help-all                     prints all help content

dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
bcdedit /set hypervisorlaunchtype off

然后重启.
安装intel haxm

撤销上述命令的方式

dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
bcdedit /set hypervisorlaunchtype auto

准备

首先装一个必装插件: mechin3. 官网我死活找不到下载入口, 放在网盘上吧。

链接: https://pan.baidu.com/s/1Z1ncM-0G6VFIg3B-AK7LJg?pwd=y4k6 提取码: y4k6
以下根据视频https://www.bilibili.com/video/BV1JR4y1G76z?p=2&spm_id_from=pageDriver整理
blender严重依赖快捷键,并且最好时有全键盘,带有小键盘的那种。然而笔记本上没有,可以勾选编辑->偏好设置->输入->模拟键盘,用主键盘区的数字键替代小键盘.

重要操作步骤:
要先选中物体, 然后再进入点线面的编辑模式, 编辑模式是针对某一个物体编辑的,此时不能再选中其他物体编辑.

Undo操作记录步骤:
编辑->偏好设置->系统->撤销次数(32~256)

快捷键(按照视频中出现顺序)

  • 简便起见, 以ahk的快捷键简述. ^=Ctrl, !=Alt, +=shift, &=连续按键 #=Win键
  • 不加说明的话,数字键1、2、3……都是指的是小键盘而不是主键盘
  • 部分快捷键后面加x/y/z可以指定在对应轴上应用效果. 如果这时候按Shift和x/y/z则是排除在对应轴上应用效果.
  • 双击x/y/z则是在物体的x/y/z轴上应用效果. 如s&x是在世界坐标上缩放, s&x&x是在物体坐标上缩放. 如果物体旋转过, 这两种方式肯定会有不同应用.
快捷键 描述
中键 旋转视图
+中键 移动视图
!中键 吸附到前后左右等视图
` 视图菜单
操作中&右键 取消操作
+A 创建物体菜单
Tab 切换物体模式/编辑模式中的点线面模式
1 前视图
^1 后视图
3 右侧视图
^3 左侧视图
5 切换正交视图
7 顶视图
^7 底视图
Z 切换渲染模式
+Z 线框视图, 线框视图下选择线,可以选择到背面被遮挡的部分
!Z 半透明视图
.(小键盘) 视图缩放到当前物体. 菜单:左上角->视图->框显所选
/(小键盘) 独立显示当前物体,菜单:左上角->视图->局部视图->切换到局部视图
G 抓取并移动, 注意在物模式下会移动原点,在编辑模式下则不会(原点不会选中)

物体模式下

快捷键 描述 扩展支持
R 旋转Rotate &X/Y/Z&角度数字
S 缩放Scale &X/Y/Z&倍数数字
+D 复制物体 &X/Y/Z
N 查看物体变换属性是否已经应用
^A 确认物体形变为实际形变
+S 将游标放回0点
+右键 3D游标放到鼠标处
^P 两物体建立父子关系一并移动
H 隐藏物体
^J 联合两个物体为一组
  • 设置原点: 右键菜单->设置原点->原点到3D游标

面模式下

快捷键 描述 扩展支持, 扩展含义
I 内插面
E 挤压Extrude
G 抓取并移动 &X/Y/Z, 沿轴向
^B 倒角 &滚轮, 平滑度
+N 修复面倒错
L 选择相连所有面
F 选择相连平面
^+(Ctrl加) 扩展选择相邻面(好像也是选择相连面)
^- 缩回选择相邻面

放样: 选中两个面, 点右键->LoopTools->Loft

边模式下

快捷键 描述 扩展支持, 扩展含义
!左键 循环选择
^左键 连续选择
+左键 取消选择
^B 倒角 &滚轮, 平滑度; &C, 钳制重叠(不允许重叠)
^R 增加环绕边
P 分离物件
!S 沿法线缩放
A 全选
M 融合菜单, 其中按距离融合可以将重叠的的边融合在一起
X 溶解菜单
^E 边菜单 可以标记锐边
^1(主键盘) 转换为细分曲面

点模式下

快捷键 描述 扩展支持, 扩展含义
+^B 倒角
^B&V 倒角
F 闭合所有点为面
E 挤出点为线
!E 挤出菜单
B 框选模式
K 切线成点 &左键&A(笔直切)&左键&C(切穿)&回车
G 平移(每次移动固定长度)
G&G 滑移(每次移动固定百分比)
M 合并,如可以将所有的点合并成1个点从而生成点
!M 拆分
  • 镜像孔: 此模式下右上角网格->对称

    注意: 点模式下合成的面, 如果不切换到面模式下就直接挤出为体,似乎这个体有点儿问题, 例如不能正确切分物体. 感觉是个Bug.

修改器

生成倒角

修改点:

  • 偏移量
  • 段数
  • Angle模式
  • 硬化法向
    附加修改:
  • 物模式->右键->平滑着色
  • 物体数据属性->法向->自动光滑
    以权重方式倒角:
  • 边模式选中要倒角的边->按N键调出属性菜单->平均倒角权重设置为1->选择倒角方式为权重

生成镜像

将生成目标物体的镜像,注意需要把物体原点挪到世界原点

生成实体化

似乎是让实心物体变为薄壁结构

形变曲线

让物体沿曲线移动,就像套在曲线上一样

  • 需要将物体在未应用此修改器前调整到世界原点
  • 需要调整看是沿着哪个轴形变(如Z轴)
  • 一旦调整正确后, 按G抓取移动, 并锁定对应的轴(如Z轴)

布尔运算

  • 布尔运算在生成器中应在最前面, 特别是在倒角的前面
  • 布尔运算后再倒角,可能遇到伪影问题, 此时应用布尔运算, 将物体上的顶点与边缘连接的线不垂直的,改为垂直. 方法是: 选择垂线的两个端点, 按J, 然后选中不垂直的造成伪影的线, 点击delete,选择融合边
  • 布尔运算会造成N-gon问题, 也就是超过4条边的多边形问题, 如五边形/六边形等等, 会造成渲染和其他种种问题, 如环切不能穿越N-gon. 此时需要用点合并(3.1上没找到)或者用K将N-gon限制在很小区域,避免大面积着色不良.

插件

Bool tool

快捷键 描述 扩展支持
+^B bool命令菜单
^- 布尔减

Copy Attributes Menu

用于复制修改器

  • 点击目标->Shift点击源->^C->选择要复制的属性->确定

Add Curve/Mesh: Extra Objects

曲线

网格和曲线转换

物体模式选中物体->左上角“物体”下拉菜单->转换->曲线
辨别是曲线还是网格:网格的编辑模式有点线面,曲线没有。另外,左上角的菜单里面,如果是网格会显示网格菜单,如果是曲线会显示曲线菜单

曲线加粗

曲线菜单(右下侧绿色两方点连一个曲线)->倒角->设置值

曲线转网格

  • 物体模式下: 左上角->物体->转换->网格
  • 另一种曲线转网格然后还能减少网格数量的方式: 物体模式下, ^1(主键盘)增加细分->在修改器中删除细分->按上一条的方法转换网格, 然后就会发现网格数减少

快捷键

快捷键 说明
^1(主键盘) 设置细分1级

菜单

添加阴影显示效果

右上角4个小球右边的下拉箭头, 选中阴影Cavity

按各自原点操作

中上方两个球->下拉菜单选择各自的原点

单个物体变为线框显示

右下侧黄色方块带四个角的图标物体属性->视图显示->显示为选择线框

吸附到目标表面移动

中上方吸铁石图标右侧的图标, 下拉->选择旋转对齐目标, 然后按G再按Ctrl就可以吸附到目标表面;

材质

为整个物体增加新材质

  • 点亮右上角材质小球
  • 选中左下角材质选项对话框
  • 选中一个物体, 点击材质菜单的+新建

应用已有材质

  • 选择材质菜单里的材质球
  • 下拉菜单选择已经新建的材质

为部分物体增加材质

  • 面模式选中面
  • 可以按^+选择相邻面
  • 材质对话框添加一个材质
  • 材质球里选择一个材质
  • 点击指定按钮

材质常用选项

  • 默认表(曲)面:原理化BSDF
目标效果 基础色 金属度 糙度
金属 1 0.3~0.4
  • 默认表(曲)面:自发光(发射)
目标效果 颜色 强度/力度
自发光 红/白 13

渲染

HDRI高动态范围图片

hdrihaven下载hdri, 现在更名为polyhaven
all->overcast(阴天)搜索abandoned slip way下载4K(25M左右)或者8K(100M左右)图片, 真是大啊

  • 回到blender, 点击右下角世界属性地球图标
  • 表(曲)面->颜色旁点击第一个小球, 展开的菜单中选择环境纹理
  • 点击文件夹图标, 选择上面的hdri文件, hdri加载为预览画面
  • 如果不想预览的话, 点击渲染属性小电视图标->胶片->勾选透明

增加背景

  • 使用+A增加平面
  • 增加一个地板, 稍微在物体下面一点
  • 增加个墙面背景, 在要渲染的视角背后
  • 设置材质为暗色金属

增加摄像机

  • 使用+A增加摄像机
  • 需找一个摄像位置
  • 左上角菜单->视图->对齐视图->活动摄像机对齐当前视角
  • 可以选中摄像机按G移动位置
  • 0查看摄像机视角

设置摄像机参数

  • 点击右下角摄像机图标(不知道为什么翻译成了物体数据属性)
  • 选择焦距为135mm
  • 移动摄像机退后G&Z&Z

设置HDRI角度

  • 渲染属性去掉透明
  • 下部拉出另一个窗口
  • 窗口左上角球下拉选择着色编辑器, 将物体改为世界环境
  • 增加一个node wrangler的插件
  • 选中anbandoned......hdr窗, 按^T
  • 左侧mapping窗中调整Z可以旋转hdr,测试照明

设置渲染属性

  • 偏好设置->系统->Cycles渲染设备->CUDA选择GPU
  • 右侧渲染对话框, 渲染引擎选择Cycles
  • 设备选择GPU计算, 如果GPU很弱那么还不如选择CPU
  • 采样->渲染->采样输入200
  • 光程->最多反弹次数设置按如下参数:
总数 漫射 光泽 投射 体积(音量) 透明
6 3 3 4 4 0
  • 右侧选择输出属性打印机照片图标
  • 格式选择分辨率
  • 输出文件格式改为tiff, 16位色深

合成器设置降噪

  • 左上角视图按钮选择合成器
  • 选中选择节点
  • ^A菜单->滤镜->降噪
  • 降噪节点放在中间
  • 降噪法向连接法向,降噪反照率连接反照率(本应还有其他降噪的, 如降噪图像要连接, 但是3.1里找不到了)

合成器设置辉光

  • ^A->滤镜->辉光
  • 加到降噪合成中间
  • 条斑改为雾晕

开始渲染

  • 回到3D视图, 选择实体视图
  • 点击左上角菜单渲染->渲染图像

今年打算好好给公司的软件搭个架子,昨天设想了一下,应该包括三个层次:

层数 名称 作用
3 纯逻辑应用层 完全与硬件和操作系统无关的层,可实现应用的所有逻辑功能,不同功能之间应完全解耦、并充分可配置。并可编译为windows程序进行单元测试和系统测试。
2 中间层 与操作系统相关,可能与硬件无关的。对上提供标准接口,对下提供几种标准接入。(再想想)
1 硬件适配层 硬件驱动,对硬件进行调用。接口标准化。需要在板上调试。在上层测试时被打桩stub的层。

在google搜索embedded software structure发现一篇文章https://www.ssla.co.uk/embedded-software-architecture/ 上来讲得就跟我想的一样;
顺便, 写文章的公司ssla是一家英国的硬件方案公司,提供嵌入式软硬件方案和硬件制造, 在限定时间内(6个月)完成硬件项目的服务.

另外, 关于软件架构这有一篇很好的文章https://blog.csdn.net/best_xiaolong/article/details/108480336
可以关注lua和python在嵌入式架构里的应用

http://www.nongnu.org/lwip/2_1_x/index.html
https://beej.us/guide/bgnet/html/

问题: 如果tcp连接过程中网断了(网线拔出/路由器断电)怎么办?
回答: 参考https://stackoverflow.com/questions/14782143/linux-socket-how-to-detect-disconnected-network-in-a-client-program
总的来说, socket中的sendrecv都不会关心网是不是断了. 正如前述参考回答中所说, tcp send只有在tcp连接没有正确建立或者缓冲溢出的时候才会明确报错, 否则它只会不断重试, 在linux上重试时间可能长达5分钟. 同样,recv如果不设置超时, 就会一直等待, 它也不知道网断了.