2023

小米米家温湿度计2的正确重置(复位、恢复出厂、reset、触点按不动)方法

家里三个小米温湿度计2,连着小米智能插座2的蓝牙网关,小巧方便,手机随时查看家里温湿度情况。最近其中一个在更换电池后,出现了奇怪的问题:米家app上能看到设备,并且也显示已连接蓝牙网关,但是温湿度数据就是获取不到,点进设备详情界面也一直没反应,提示“打开蓝牙”,此时如果开启手机蓝牙,会以很慢的速度通过蓝牙连接设备,然后确实可以正常获取到数据,只是整个过程反应很慢,不像之前网关正常时随点随出,同时这样在外出时也看不到这个温湿度计的实时信息了(从米家app的中枢网关界面里也能看到这个温湿度计是连接状态,并且离着不远三格信号满格),后来看了下固件,发现可以升级到最新的“0130”,于是升了下级(这个过程也是特别慢,不知道是不是由于蓝牙传输所致),升级完成后问题依旧!百度搜索了下,发现有人提到可以重置一下试试,然后就进入了今天记录的主题,这个小米温湿度计的重置设计也算是另类了,网上能搜到的重置方法基本都是这样说的:

Continue reading…

关于spring框架使用websocket + stomp协议时的发消息顺序问题

还是继续上一篇stomp的问题,这次是在实际使用中又有了新发现,那就是java后端向前端发送stomp消息时,存在底层异步操作造成的消息顺序不确定性问题,如下:

    @Autowired
    SimpMessageSendingOperations messagingTemplate;

    @MessageMapping("/create")
    @SendToUser("/queue/reply")
    public ReplyDTO create(@Payload CreateDTO msg, SimpMessageHeaderAccessor accessor) throws Exception {
        String userId = getUserId(accessor);
        if (userId.isEmpty())
            return buildNotLoggedInReply(accessor);
        int createId = myService.create(userId, msg.getTypeName());
        CreateInfo ci = myService.info(createId);
        String infoStr = new ObjectMapper().writeValueAsString(ci);

        messagingTemplate.convertAndSendToUser(
                Objects.requireNonNull(accessor.getSessionId()),
                "/queue/response",
                buildOkResp(accessor),
                createHeaders(accessor.getSessionId())
        );

        return buildReply(accessor, infoStr);
    }
Continue reading…

cannot deserialize from Object value (no delegate- or property-based Creator)

最近研究springstomp协议框架,上到消息订阅、发送时一开始用的普通String,没有任何问题,都可以跑通,后来上DTO数据对象时,遇到了标题上的问题,查了下发现是框架层在调用jackson自动反序列化json为DTO对象时报的错,很久没用java,都忘记了,参考下面链接的说明

https://blog.csdn.net/weixin_39827145/article/details/89314433

意识到jackson反序列化时默认的行为是需要class的无参构造,之后再处理各个属性对应到json key的value,而出问题是的DTO class上用的lombok标记是“@AllArgsConstructor”,只生成了全成员变量参数构造,因此导致了此问题,把接收stomp请求,用于对应@Payload的class换成@NoArgsConstructor(当然,一般还要带上@Getter,用于成员变量的访问)后,问题解决,接收到stomp请求后,成功传递到了controller的对应处理方法中。小问题连带了一个小知识点,记录一下。

也记一篇关于strncpy和snprintf中n的不同之处

关于这俩c库函数的使用方法,百度上一搜能搜到很多,但是实际上用了这么多年的我有时候还是会犯迷糊,分不清哪个是处理0结尾的,哪个是没有的,因此今天趁着放假有时间,再整理记录一下。

#include <cstring>

int main(int argc, char *argv[])
{
    char sz_test1[10] = {};
    char sz_test2[10] = {};

    char sz_source[10] = "123456789";

    strncpy(sz_test1, sz_source, 10);
    snprintf(sz_test2, 10, "%s", sz_source);

    return 0;
}

上面是一段很简单的写在cpp里的c代码,纯c也差不多,主要说的是这俩c函数的区别,可以看到sz_source有9个字符,带1个结尾0凑成10字节的字符串,上面还有两个同样是10字节的char缓冲区用于测试,可以看到strncpysnprintf的n都给10的时候,sz_test1和sz_test2都是和sz_source一样的结果,包括结尾0。

接下来把两个函数的n都换成9,这时候可以看到如下结果:

Continue reading…

关于x265编码使用CBR流控码率不达标问题的处理

之前在使用x264编码时所谓的CBR流控其实是通过abr流控+vbv码率、缓冲参数设置的(vbv-maxrate,vbv-bufsize,也可以是ffmpeg的minrate,maxrate,如“ffmpeg -re -stream_loop -1 -i test.mp4 -c:v libx264 -x264-params “nal-hrd=cbr:force-cfr=1” -b:v 4M -minrate 4M -maxrate 4M -bufsize 1M -f flv rtmp://127.0.0.1/live/test,即控制了波动范围的vbr,而到了x265编码时,发现如法炮制的参数并不好使了,码率还是会有较大范围的波动,最后搜索研究了很久后发现,原来x265有这么个参数:

–[no-]strict-cbr Enable stricter conditions and tolerance for bitrate deviations in CBR mode. Default %s\n”, OPT(param->rc.bStrictCbr));

实测加上这个参数后,编码输出码率几乎就是目标码率很小范围内波动了,ffmpeg命令如下:

ffmpeg -re -stream_loop -1 -i <input> -c:v libx265 -b:v 25M -muxrate 30M -x265-params strict-cbr=1:vbv-bufsize=25000:vbv-maxrate=25000 -c:a aac -ac 2 -b:a 128k -f mpegts udp://239.3.3.3:5000

[转]将立创EDA中PCB元件封装转换为KiCad格式方法

最近在学习EDA,使用的是开源的KiCad,基本操作还是挺简单的,但是众多的电子元件符号、封装相比起来还是不如立创EDA这种web版生态完善的来的方便,好在网上找到了将立创EDA中PCB元件封装导入KiCad的方法(拿来主义,哈哈),原文在这里:http://www.taodudu.cc/news/show-5505674.html?action=onClick,转过来记录一下:

在使用KiCad软件的时候,有些元器件的封装没用合适的,需要自己画。但是自己画起来比较麻烦,这时候就可以直接去立创EDA软件中下载。
  首先登陆立创网页版的EDA,网址:https://pro.lceda.cn/ 进入标准版。

Continue reading…

合宙AIR32使用Keil的Event Recorder实现日志查看功能

之前曾经写过一篇 魔改国产ST-LINK V2仿真器,增加SWO支持 的博文,记录了给山寨ST-LINK V2增加SWO引脚引出的方法,而今天要说的是,这个方法在合宙的AIR32系列MCU上实测并不不好用,原因在于:https://wiki.luatos.com/chips/air32f103/switchFromSxx.html#debug-sw-jtag ,这里合宙官方的文档上描述了AIR32与STM32的JTAG关断差异,简单说就是SWD和JTAG同气连枝,要开都开,要关都关,而后面又有关于SWO的描述:https://wiki.luatos.com/chips/air32f103/switchFromSxx.html#traceswo-printf,要使用SWO则必须关掉JTAG但保留SWD(这个目前我理解是SWO的printf输出依赖SWD调试),但是尴尬的是:https://wiki.luatos.com/chips/air32f103/switchFromSxx.html#jtag-jtrst,调试状态关JTAG会导致程序复位,这几个情况叠加在一起就造成了我试验时的现象:接上魔改的ST-LINK V2的SWO,一通配置Keil调试设置和代码设置(具体不写了,百度一搜一大堆),然后调试启动后确实能看到SWO的输出,但是过一小会儿,程序就重置了。。。😂于是,我又开始寻找其它方案(其实最后还是换了带串口的DAP-LINK,走UART打log了,这里记录的是研究过程),最终使用Keil的中间件(应该是这么叫吧)Event Recorder实现了既不依赖SWO,也不用串口,就SWD那几根儿线打log的功能:

Continue reading…

又换了个鼠标微动,顺便试用了下“大黑棒子”吸锡器

这次坏的是公司用的明基鼠标(具体型号不明,海贝A800键盘套装送的,用着还算顺手,也是10多年的了),这个鼠标几年前滚轮编码器坏过,当时更换编码器时还特意检查了下左右键微动,是凯华的,感觉好像还挺耐用的,就没管它,结果最近发现左键开始出现接触不良的情况,拖动窗口按着按键有时自己就松开了,严重影响各种拖拽操作,容易造成意外,于是赶紧换了个之前存货的凯华红微动

Continue reading…

给快20岁高龄的明基海湾A110键盘续了个命

这款明基键盘是04年时购买的,当时一位学长买了这款键盘,我体验了下当场就爱了,从来没有用过这么好手感的键盘,后来才知道X架构之类的细节,而且也很喜欢这款键盘的键程,比笔记本键盘的那种巧克力按键要高点,但又没有标准键盘那么高,敲代码玩游戏都非常舒适,即使是今天换了机械键盘,也依然很怀念明基X架构的键盘(后来工作了又买了一把海贝A800,按键手感相同,不过弯曲的形状感觉不如海湾)。遗憾的是这把A110在20年时出现了Y键失灵的问题,最开始时偶尔还能有反应,但是后来就完全不行了,然后没过多久下面的H也出现了类似的情况。当时也尝试过修理,但是没找到问题,拆开键盘后清理了下,扒出薄膜来看了下,不像之前拆过的廉价键盘,薄膜电路很复杂,而且还有胶粘住(估计是为了防水),上面那层已经有很多氧化发黑的银线了,不过应该不影响封在内部的上下层间按键接触导电。由于当时没有银漆,又急着用键盘,于是就封印了A110,买了把机械先用着了…

Continue reading…

魔改国产ST-LINK V2仿真器,增加SWO支持

最近同事提到合宙商城在搞AIR32F103的BluePill开发板(https://wiki.luatos.com/_static/bom/BluePill.html)促销活动,9.9一个开发板还额外赠送一片AIR32F103CCT6,之前从来没接触过STM32系的MCU,于是入了一片研究,至少可以收藏。

到手后在合宙官网快速学习了一下,又从搜索引擎上查找了一些STM32的入门资料学习(互联网时代各行各业的入门知识都很廉价),了解到了各种上传程序的方法,由于之前购买过ST-LINK V2(本来是打算留着给文宇WY815P焊台刷固件用的),于是选择了ST-LINK SWD方式测试,焊好排针,按丝印指示接好线,电脑装上STM32 ST-LINK Utility,插上调试器,顺利识别,随后又装了研究版的Keil(买ST-LINK时送的网盘5.23版),按合宙wiki里的教程装好AIR32的软件库,学了下GPIO的调用方法,顺利点亮了板子上的小灯(到这一步就已经能够感觉到Arduino对比起来有多简单了😂),而且也能成功使用Keil进行断点调试,但是紧跟着问题就来了,用Arduino Nano时,虽然无法断点调试,但是可以很容易的使用IDE自带的串口通讯工具查看log以及完成命令行形式的交互,现在这套配置并不能实现简单的看printf功能,于是又花了一些时间搜索调研…

Continue reading…