大象笔记

知者行之始,行者知之成

MQTT go 客户端发布消息

为了方便客户端测试,搭建好 EMQX 服务之后,需要用 golang 写一个发布消息的测试程序。 用于向指定主题推送消息,这样客户端可以提前测试 MQTT 相关的功能。 安装 Eclipse Paho MQTT Go Client > go get github.com/eclipse/paho.mqtt.golang go: downloading github.com/eclipse/paho.mqtt.golang v1.4.1 go: downloading github.com/gorilla/websocket v1.4.2 go: added github.com/ecl ...

阅读全文...

体征监测相关的英文单词及缩写

缩写及含义 SYS: Systolic blood pressure 收缩压、高压 DIA: Diastolic pressure 舒张压、低压 SpO2: oxygen saturation 血氧值,血氧饱和度 HR: heart rate 心率 RESP: Respiratory rate 呼吸率 TEMP: temperature 体温 ECG: Electrocardiogram 心电图 NIBP: non-invasive blood pressure 无创性测血压 数据类型 血氧:int, 单位 %, 范围 35~100% 心率:int, 单位 bpm, 范围 25~250 ...

阅读全文...

MQTT Broker 的开源实现 EMQX

想使用 EMQX 的根本原因是,蓝牙网关上报数据推荐使用 MQTT 协议。 而这个消息量巨大,我担心扛不住腾讯云的费用。 使用 MQTT 协议的优势 MQTT 协议自带了账号密码验证机制,以及主题订阅权限 蓝牙网关默认支持 MQTT 协议 TCP 需要自己处理数据粘包问题,而 MQTT 则不需要 UDP 无法保证数据到达的顺序,对于时序数据来说,比较致命。而终端的时间戳我觉得不太可靠 但是首先,我还是想把 EMQX 的文档过一遍。之前虽然在一个项目中用过 MQTT, 可那是基于腾讯云 MQTT 实现的,担心很多概念并不清晰,还是需要看一遍文档。 EMQX 5.0 的文档地址 https: ...

阅读全文...

gin 服务线上没有 systemd 日志的问题

原配置 StandardOutput=append:/some_path/log/access.log StandardError=append:/some_path/log/err.log 我确认了目录权限没有问题。 真正的原因 systemd 版本问题 参考 https://unix.stackexchange.com/questions/321709/redirect-systemd-service-logs-to-file systemd v236 之后支持 file v240 之后支持 append。即每次重启后不会覆盖原文件 而腾讯云上的 systemd 是旧版本的 $ su ...

阅读全文...

Google Play 商品详情的描述规范

趁着 Google Play 最近搞的一个学习活动,了解了一下谷歌应用市场的优化技巧。 产品介绍的写作思路 面向的特定用户群体:例如,孩子家长,研究生,程序员之类 其他 app 没有的特色功能 常用功能有哪些?用户对哪些功能赞不绝口。 使用应用能获得什么优势? 你对应用最满意的部分是什么 是否有订阅内容 隐私保障 避免使用的词汇 免费 完美 最佳 排名第一 顶级 新 折扣 促销 百万次下载等 立即下载 立即安装 立即开始游戏 立即体验 避免堆砌关键词 这个是 Google 明确指出的。 而我恰好有这个习惯,这个做法在 baidu 和 bing 上屡试不爽。 但是确实对 Google 效 ...

阅读全文...

Material Design 3

官方文档 https://m3.material.io 具体每个组件的代码示例,在 github 上: https://github.com/material-components/material-components-android/tree/master/docs/components 官方主题生成器工具在线版 https://m3.material.io/theme-builder#/dynamic 这个工具的好处是,可以生成主题预览,然后将主题配置导出。 注意: 需要切换到 Custom Tab,然后点击右上角的导出。XML, compose, flutter, css 都支 ...

阅读全文...

微信小程序显示蓝牙信号强弱

需求背景 蓝牙控制板放到控制柜里之后,就会有 20% 的概率出现蓝牙通信丢失的情况。 不确定是信号干扰的问题,还是放到控制柜之后,受隔音棉的影响信号变弱所致。 所以需要能够实时打印当前的蓝牙信号强度,来排除信号减弱的问题。 微信小程序界面上显示信号强度。底部,默认隐藏,点击显示。 参考文档 https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.getBLEDeviceRSSI.html wx.getBLEDeviceRSSI(Object object) 获取蓝牙低功耗设备的信号强度 (Rec ...

阅读全文...

微信小程序切换到后台时,取消蓝牙监听

需求背景 蓝牙设备一直在给微信小程序发送数据,例如一秒一次。 但是切到后台之后,再切回来,例如,间隔了5分钟,再切回来会收到大量的蓝牙数据。 看起来是微信帮小程序做了缓存队列,然后疯狂地传给小程序。 造成的影响就是,用户会看到界面在一顿疯狂地刷新,异常鬼畜。 我比较担心的是,如果时间更长,会不会导致用户切回来的时候,会在很长一段时间内无法操作。 解决思路 小程序切到后台时,需要取消监听。等切回来时,再重新监听。 因为在后台这期间收到的数据并没有处理的意义,只需要在再次打开时, 同步一下状态即可。 搜索了半天没有找到相关的文档。迫不得已浏览一遍小程序蓝牙文档,看看是否有相关接口。 没想到在车间里 ...

阅读全文...

gofmt, golint, gopls, govet 的区别

ALEInfo 显示,目前用 NeoVim 打开 go 代码文件时,默认启用了 4 个 linter: Enabled Linters: ['gofmt', 'golint', 'gopls', 'govet'] 其引起的不便是,同一行代码错误,可能会显示两条错误信息。例如, composite literal uses unkeyed fields 这一个问题,显示了两行提示:一个 warning,一个 error。推测是启用了两个 go lint 语法检测。 禁用之前,需要先了解各个工具的功能,及区别。 go vet vet 兽医的意思。。。大概是治疗 go 吉祥物这个大老鼠的吧。 ...

阅读全文...

go warnning: composite literal uses unkeyed fields

在启用了 NeoVim ALE 语法检测插件之后,我发现自己的代码到处都是各种警告,无论是 JS 还是 Go。 而 Go 代码中经常出现的警告信息就是 composite literal uses unkeyed fields。 例如,在使用 Gin I18N 实现多语言翻译的功能时: 警告信息 i18n/i18n.go|32 col 23-45 warning| github.com/gin-contrib/i18n.EmbedLoader composite literal uses unkeyed fields composite: 合成的 出问题的代码: Loader: & ...

阅读全文...

腾讯云 MQTT 由服务器生成长期的设备密码

密码过期问题 登录腾讯云管理后台,物联网通信,设备调试。可以看到提示: 以下MQTT三元组仅用于调试,将于2022-09-05 12:00:00后失效,正式设备请按算法生成 Client ID xxx MQTT Username yyy MQTT Password zzz 由于嵌入式硬件不方便接入腾讯云的 MQTT SDK,所以改成硬件从服务器获取 Username 和 Password。 然后将密码过期时间设置成 50 年,因为硬件设备的寿命大概也不会超过 10 年。虽然不严谨,但是满足目前的需求场景。 Client ID 格式 ${productId}${deviceName} ...

阅读全文...

js reduce 计算最大值、最小值

示例代码 const maxWidth = imgs.reduce((m, x) => Math.max(m, x.width), 0); 其功能是计算一组图片的最大宽度。 但是看起来很难理解。 可读性更好的 reduce 用法 const maxWidth = imgs.reduce( (previousValue, img) => Math.max(previousValue, img.width), 0 ); 其实就是遍历数组中的每一项,通过函数逐一比对,最终返回一个最大/小值。 reduce 参数说明 reduce() 方法接收一个函数作为累加器,数组中的每个值( ...

阅读全文...