esp32 menuconfig 中Example Configuration及sdkconfig.h中宏的生成

在esp32的框架中,我们发现例子引用的sdkconfig.h在 build\config\ 目录下,因为build目录是生成的,所以我们很容易判断这个头文件也是动态生成的。

那么这个头文件的内容我们怎么控制呢?
经过验证,文件中大概分两类宏,用户自定义宏和硬件默认规格宏。用户自定义宏都是CONFIG_ESP_ 开头,其他的都是默认规格宏。

那么这些用户自定义宏又是在什么地方定义的呢,答案是 \main\Kconfig.projbuild 文件,这个文件是类似yaml的脚本,当你执行 idf.py menuconfig 时,会加载这个文件,进行对应的修改。

esp32 win7开发环境搭建

环境

系统:win7
hw target:esp32c3

注意:很多问题都跟git的网络有关,要仔细看错误提示。很多错误需要尝试多遍,才有可能成功。

安装包

离线包安装 https://dl.espressif.com/dl/esp-idf/?idf=4.4

更新最新代码

将安装的IDF_PATH更新成最新的git版本 https://github.com/espressif/esp-idf

更新submodule

git submodule update --init --recursive

安装python virtual environment

install.bat

设置环境变量

export.bat

编译工程

设置hw 平台类型

idf.py set-target esp32c3

错误1:

Unable to checkout '4f5e89fa84ce1d178a6765b8b46f2b6f91216677' in submodule path 'components/libsodium/libsodium'

解决1:
看日志是git无法成功,我们改为手动git pull,如果提示 openssl 10054错误。则

git config --global http.sslVerify "false"

其后还有很多的失败,基本需要逐个确认,多次执行

git submodule update --init --recursive

配置成功

-- Configuring done
-- Generating done
-- Build files have been written to: G:/esp/esp-idf/examples/wifi/getting_started/softAP/build

菜单配置

idf.py menuconfig

component config->esp32c3-specific,选择rev 2:
file

编译成功

idf.py build
[84/85] Generating binary image from built executable
esptool.py v3.1-dev
Merged 1 ELF section Generated G:/esp/espidf/examples/wifi/getting_started/softAP/build/bootloader/bootloader.bin
[85/85] cmd.exe /C "cd /D G:\esp\espidf\examples\wifi\getting_started\softAP\build\bootloader\esp-idf\esptool_py &&g:\esp\espressif\python_env\idf4.4_py3.8_env\Scripts\python.exe G:/esp/espidf/components/partition_table/check_sizes.py --
offset 0x8000 bootloader 0x0 G:/esp/espidf/examples/wifi/getting_started/softAP
/build/bootloader/bootloader.bin"
Bootloader binary size 0x48a0 bytes. 0x3760 bytes (76%) free.
[954/955] Generating binary image from built executable
esptool.py v3.1-dev
Merged 1 ELF section
Generated G:/esp/esp-idf/examples/wifi/getting_started/softAP/build/wifi_softAP.bin
[955/955] cmd.exe /C "cd /D G:\esp\esp..._started/softAP/build/wifi_softAP.bin"
wifi_softAP.bin binary size 0xa3490 bytes. Smallest app partition is 0x100000 by
tes. 0x5cb70 bytes (36%) free.

Project build complete. To flash, run this command:
g:\esp\espressif\python_env\idf4.4_py3.8_env\Scripts\python.exe ..\..\..\..\comp
onents\esptool_py\esptool\esptool.py -p (PORT) -b 460800 --before default_reset
--after hard_reset --chip esp32c3  write_flash --flash_mode dio --flash_size detect --flash_freq 80m 0x0 build\bootloader\bootloader.bin 0x8000 build\partition_
table\partition-table.bin 0x10000 build\wifi_softAP.bin
or run 'idf.py -p (PORT) flash'

烧录

idf.py -p COM105 flash
esptool.py v3.1-dev
Serial port COM105
Connecting....
Chip is ESP32-C3 (revision 2)
Features: Wi-Fi
Crystal is 40MHz
MAC: 7c:df:a1:86:4a:94
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00004fff...
Flash will be erased from 0x00010000 to 0x000b3fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Compressed 18592 bytes to 11216...
Writing at 0x00000000... (100 %)
Wrote 18592 bytes (11216 compressed) at 0x00000000 in 0.6 seconds (effective 253
.8 kbit/s)...
Hash of data verified.
Compressed 668816 bytes to 372018...
Writing at 0x00010000... (4 %)
Writing at 0x0001bf69... (8 %)
Writing at 0x00025854... (13 %)
Writing at 0x0002c95b... (17 %)
Writing at 0x0003382e... (21 %)
Writing at 0x0003ae72... (26 %)
Writing at 0x00041d6a... (30 %)
Writing at 0x0004886c... (34 %)
Writing at 0x0004fb4e... (39 %)
Writing at 0x00056b56... (43 %)
Writing at 0x0005d1f1... (47 %)
Writing at 0x0006332e... (52 %)
Writing at 0x00068eeb... (56 %)
Writing at 0x0006f110... (60 %)
Writing at 0x0007537e... (65 %)
Writing at 0x0007b840... (69 %)
Writing at 0x00081ae0... (73 %)
Writing at 0x00087df9... (78 %)
Writing at 0x0008df30... (82 %)
Writing at 0x000945f7... (86 %)
Writing at 0x0009b5fe... (91 %)
Writing at 0x000a66e9... (95 %)
Writing at 0x000ae4bc... (100 %)
Wrote 668816 bytes (372018 compressed) at 0x00010000 in 11.2 seconds (effective
476.2 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 103...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.1 seconds (effective 258.7
kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
Done

擦除flash

idf.py erase_flash

查看日志

idf.py -p COMXXX monitor

esp32 windows environment issue of python requirements

pc系统:win7 x64

按照指导文档,无论是命令行安装还是msi安装,都一直卡在:

G:\esp\esp-idf-src\examples\wifi\getting_started\softAP>idf.py build
The following Python requirements are not satisfied:
pyserial>=3.0
future>=0.15.2
cryptography>=2.1.4
pyparsing>=2.0.3,<2.4.0
pyelftools>=0.22
gdbgui==0.13.2.0
pygdbmi<=0.9.0.2
reedsolo>=1.5.3,<=1.5.4
bitstring>=3.1.6
ecdsa>=0.16.0
esp-windows-curses; sys_platform == 'win32'
To install the missing packages, please run "G:\esp\esp-idf\install.bat"
Diagnostic information:
    IDF_PYTHON_ENV_PATH: D:\Programs\Python\Python38
    Python interpreter used: D:\Programs\Python\Python38\python.exe

ESP-IDF v4.2.1

解决:
python -m pip install --user -r \xxx\xxx\requirements.txt

docker Permissiissuon denied issue

realpath(): Permission denied
System.UnauthorizedAccessException: Access to the path '/app' is denied

同样的操作,在另一台同样系统版本的机器上正常。

确认了需要link的volume 目录权限,没有问题。

因为是权限问题,所以怀疑是否是selinux的问题,对比了下,确实不一样,是开启的。

尝试去disable

然后就正常了

centos6 repo update for the yum issue

yum 安装时报错:

YumRepo Error: All mirror URLs are not using ftp, http[s] or file.YumRepo Error: All mirror URLs are not using ftp, http[s] or file.

centos6 repo源一键修复:

sed -i "s|enabled=1|enabled=0|g" /etc/yum/pluginconf.d/fastestmirror.conf
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo 
yum clean all
yum makecache

千牛操作纪要

开通花呗付款:交易管理=》分期管理=》花呗
关闭聊天机器人:
1)店铺管理=》子账号管理=》分流设置=》设置=》店铺服务助手。一个bug式的存在是因为阿里总是把在线客服状态判断为离线,所以如果你开启了旺旺分流里面的“离线分流”,你将仍然收到自动回复。
2)禁用店小蜜中的自动接待和智能辅助

淘宝多客服自定义代码

其中xxx是子账号的URL编码,根据实际需要自己填写:

<div class="tb-module tshop-um tshop-um-kfzx">
    <div>
         
    </div>
    <div class="kefu190">
        <div class="hd"></div>
        <div class="bd">
            <div class="one">
                <h3 style="border-bottom:1px solid #D8D8D8;" > 售前客服</h3>
                <ul>
                    <li style="width:145px;line-height:35px;overflow:hidden;" class="item item0">
                         <a target="_blank" href="http://amos.alicdn.com/getcid.aw?v=2&uid=xxx&site=cntaobao&s=1&groupid=0&charset=utf-8">
<img border="0" src="http://amos.alicdn.com/online.aw?v=2&uid=%E6%9E%81%E9%80%9F%E7%89%A9%E8%81%94%3A%E5%BC%A0%E5%85%88%E7%94%9F&site=cntaobao&s=1&charset=utf-8" alt="给我发消息" /></a> <b style="margin-top:5px;width:30px;height:15px;right:3px;top:1px;"> AAA </b>
                    </li>
                </ul>
            </div>
            <div class="one">
                <h3 style="border-bottom:1px solid #D8D8D8;"> 售后客服</h3>
                <ul>
                    <li style="width:145px;line-height:35px;overflow:hidden;" class="item item0">
                         <a target="_blank" href="http://amos.alicdn.com/getcid.aw?v=2&uid=xxx&site=cntaobao&s=1&groupid=0&charset=utf-8">
<img border="0" src="http://amos.alicdn.com/online.aw?v=2&uid=%E6%9E%81%E9%80%9F%E7%89%A9%E8%81%94%3A%E8%82%96%E5%85%88%E7%94%9F&site=cntaobao&s=1&charset=utf-8" alt="给我发消息" /></a> <b style="margin-top:5px;width:30px;height:15px;right:3px;top:1px;"> BBB </b>
                    </li>
                </ul>
            </div>
            <div class="onez" style="padding-bottom:5px;padding-left:0px;margin-left:0px;width:100%;">
                <ul>
                    <h3 style="border-top:1px solid #D8D8D8;border-bottom:none;margin-bottom:0px;padding-top:8px;width:100%;"> 工作时间:9:00-18:00</h3>
                    <li style="height:46px;margin:0;padding-top:5px;width:100%;color:#888;background:none;line-height:23px;text-align:center;">
                         周日和法定节假日休息
                        <p style="color:#888;">只接单不发货</p>
                    </li>
                </ul>
            </div>
        </div>
    </div>
</div>

certbot renew errors

certbot renew时,突然出错:

ImportError: cannot import name UnrewindableBodyError

尝试安装更新:

pip install requests urllib3 pyOpenSSL --force --upgrade

安装后,依然有错:

pkg_resources.DistributionNotFound: The 'urllib3<1.23,>=1.21.1' distribution was not found and is required by requests

从提示看是urllib3版本不满足要求导致的问题,尝试安装最新版:

pip install urllib3
Looking in indexes: http://mirrors.aliyun.com/pypi/simple/
Requirement already satisfied: urllib3 in /usr/local/lib/python3.9/site-packages (1.21.1)

安装完最新的1.21.1 错误提示依然,说明还需要处理路径的问题。

首先需要找到的是目前到底是哪个版本,哪个路径?

find / -name "urllib3-*"
/usr/lib/python2.7/site-packages/urllib3-1.10.2-py2.7.egg-info
/usr/local/lib/python3.6/site-packages/urllib3-1.23-py3.6.egg
/usr/local/lib/python3.6/site-packages/urllib3-1.21.1-py3.6.egg
/usr/local/lib/python3.6/site-packages/urllib3-1.25.11.dist-info
/usr/local/lib/python3.9/site-packages/urllib3-1.21.1.dist-info

从上面的后缀看基本都是大于1.21的,那么当前系统索引的应该就是 urllib3-1.10.2 这个版本了。

解决

问题分析清楚了,解决就很简单了。
将前面安装时提示的最新的1.21.1对应的相关文件 手动拷贝到 1.10.2 对应的路径就好了。
分别拷贝 urllib3 和 urllib3-1.21.1.dist-info 两个目录

再去测试 certbot renew, 一切恢复正常

unraid中使用docker安装Lychee荔枝相册

管理自己的私人照片,目前的选择是群晖的moments,偶然看到荔枝相册Lychee的效果,觉得做公开图片管理很合适,所以准备学习下。

github:
https://github.com/LycheeOrg/Lychee
https://github.com/LycheeOrg/Lychee-Docker

准备工作

在宝塔中创建需要的数据库lychee。

docker安装

docker run -d --name lychee --link=baota -p 50003:80 --restart always -e DB_CONNECTION=mysql -e DB_HOST=baota -e DB_DATABASE=lychee -e DB_USERNAME=lychee -e DB_PASSWORD=xxx --network=myNetwork --ip 172.18.0.203 -v /mnt/user/lychee/conf:/conf -v /mnt/user/lychee/uploads:/uploads  -v /mnt/user/lychee/sym:/sym lycheeorg/lychee

安装完,系统初始化要等一会儿,然后按照设置的端口登录。
第一次要设置帐户密码,然后就可以使用了。

群晖moments的正确玩法

很多人装黑群晖就是因为看了网上推荐的photo station+moments的文章。

之所以这里说正确玩法,因为网上大部分推荐的photo station+moment的玩法是不正确的,或者说不是最佳的方案。

群晖官方对moments的定位是moments和drive是强绑定的,但和photo station不是,甚者功能有点重叠和冗余。

我们推荐的正确基本玩法是moments+drive,高级玩法是moments+drive+resilio sync+cloud sync。

为什么说photo station方案不是最佳?

  • 我们先说下网上推荐的moments+photo station的方案。这个方案需要在moments开启“共享照片库”,然后在首页的左上角就会出现下拉框,多出来一个“共享照片库”的选项,对于有强迫症的人就会觉得不爽,因为你需要选下,才能看到共享照片库里面的类容,当然如果你用相册模式,从不care照片模式,也许这个也不算什么大问题吧。

  • 其次,推荐的理由,用photo station主要是为了规避moments按照日期归档的毛病,在photo station中可以手动归档,不会显得凌乱,这个作用完全被Drive替代了,在drive下的moments目录里面手动整理照片,就可以在moments直接看了。而photo station是一个独立的应用,就显得多余了。

高级用法

上面提到只是有了一套照片管理的方法,但是你还是需要把内容拷贝到drive下才可以,因为群晖是虚拟机安装的,我们的照片的实际源头在unraid下面,因为unraid可见所有的物理磁盘空间,但是虚拟群晖就不性,是虚拟磁盘,空间用光了,需要手动扩容。因为上面的方案是需要实际拷贝照片的,是会实际占用虚拟机空间的。

因为我们把照片的实际源规划在unraid下,所以群晖的容量问题,我们就不甚care了,但是我们需要一个能把unraid下内容同步到群晖中drive中的方案。

我们首先想到的是群晖原生支持的webdav方案,但是unraid不是原生支持的,需要自己安装app,自己搜索安装app后,结合cloud sync可以实现自动同步的效果,但是发现因为webdav的部署,unraid的照片路径的权限被破坏了,samba不能正确访问这些目录了,所以最终这个方案被毙。

然后就出现了我们上面提到的resilio sync方案,按照说明部署后,发功能正常,也没有权限的问题。

至此,moments+drive+resilio sync已经可以解决本地或者局域网的问题了,但是对于google相册,百度云和其他在线云盘相册的照片,我们怎么同步呢,这里我们就要用cloud sync了。所以最终的方案就是moments+drive+resilio sync+cloud sync,兼顾本地存储和各种云盘,我们所有所有的照片都可以在moments中出现了。

done...

W600/W800之WebServer页面修改

在路径 \Src\App\web 下我们能看到相关的web页面,是一些简单的web配置页面。

需要修改时,参考:http://www.wdyichen.cn/?log=blog&id=68

文中写的已经算比较清楚了,需要补充的是,除了文章中提到的makefs还有另外一个命令goall,这些都是linux 脚本,需要在linux环境下执行,区别也很简单,自己点看看内容就能明了。

原文引用:

web server也即http server,在w600官方sdk中默认就有一个,主要被用来softap下网页配网,遗憾的是官方一点没有其webserver二次开发的教程,大多数小白朋友看着那个丑陋的网页完全无法下手修改,所以本文就以web server如何进行二次开发来一番介绍。

先说下这种嵌入式webserver的特点,因为w600没有文件系统,而通常我们用的webserver都是要访问server根目录下的网页文件的,所以这个webserver就对网页文件做了一点特殊处理,那就是直接把网页文件转化成c语言的数组在编译时直接编进代码中去,这样就相当于形成了一个内存文件系统,webserver在收到访问请求时,直接在内存中查找到这个网页文件,回馈给用户。当然你也可以拿spi flash或者tf/sd这些搞个实际的文件系统,本文不在讨论。

webserver主要就是前端的网页式样和后端的代码处理。其源码在在Src/App/web目录下,这里面像web.c、httpd.c、fs.c是代码实现,而fs_ap_config这种文件夹下存放的是网页(或者其它的fs*文件)。

所以当你想修改网页式样的时候,就在fs文件夹下的网页中去改,改完之后,使用web目录下的那个makefs脚本把网页转化为c数组。如:./makefs ./fs_ap_config ./fsdata_ap_config.c(当然最后面的./fs_ap_config.c可以不写就会默认生成一个叫fsdata_lwip.c的文件),最后不管你起的啥名或者用默认的名字,只要你把它在fs.c中这个地方:#include "fsdata_ap_config.c"填写的名称保持一致就行。最后我想说的是这个makefs脚本是需要在shell环境下去执行,是linux这种shell环境,不是windows下的cmd里面搞。还有就是修改网页的时候,最好不要改的太大,要考虑嵌入式资源,如果你把网页搞得太大,c数组也就很大,最后搞出来的w600固件也就很大而没法烧进去了。

改完网页之后,通常你的网页不会只是一个静态显示页面,总会需要显示一点实时信息,更有甚者还需要交互操作,所以还需要改webserver让其支持你的各种表单请求交互操作。这个webserver仅支持最简单的html,所以网页交互就是靠html 表单了,如果你对表单的概念一脸懵逼不懂我在说啥,那么我建议你花十来分钟去看看html语法,这是世界上最简单的语法了,学会它你才能进行下一部开发。

访问网页时,必然会走到这里Web_parse_line,所以网页被访问时,需要读取的实时数据就是在这里更新的;当表单提交之后,必然会走到这里do_cgi_webindex,所以需要更新给模块的数据都是在这里进行解析处理。这里需要注意web_id_tbl这个表,其IdName就是用来和网页中的各id进行匹配的所以要填一样,Value_Offset是数出来的长度如果不是固定的那我建议直接填个0起调更快捷。

最后,启动webserver就是使用httpd_init,停止就使用httpd_deinit。至于为啥不用tls_webserver_init,是因w600没有deinit我感觉比较别扭所以不想用~~~

find issue in windows command line

编译rda8910的代码时,突然提示错误,之前都是正常的:

find: ‘/I’: No such file or directory
find: ‘;xxxx\\..\\prebuilts\\win32\\bin;’: No such file or directory

先根据 /I 的关键字,在项目找到了对应的命令行:

(echo ";%PATH%;" | find /C /I ";%1;" > nul) || set "PATH=%1;%PATH%"

很显然,出错的原因是 find 没有识别 /I 选项,导致 %1前面的;号被识别到了后面的有效路径上。

知道原因了,就有解决思路了:
用搜索工具搜了下整机,找到不同路径的几个版本的find.exe,然后针对不同的find 用 /I 进行测试,发现c盘系统路径下的正常,而Git 下的find会提示跟上面错误类似的提示,基本判断find可能因为环境变量的原因使用的是Git下对应的版本。

解决

把不不出错的find.exe的版本的路径加到 Path 环境变量里:

C:\Windows\SysWOW64;C:\Windows\System32;

退出当前命令行,重进,再编译,正常了。。。

windows7禁用管理员批准模式

环境

windows7,windows10 不一定适用。

问题

不知道是不是被电脑管家修改的缘故,突然之间很多的程序执行都需要右键管理员权限才可以。
导致的一个问题是,很多编译脚本调用的工具或者命令行,都会提示没有权限,出现大量告警日志。

禁用

secpol.msc =》本地策略=》安全选项=》
用户控制:以管理员批准模式运行所有管理员

设置成禁用,然后重启