johnh 发布的文章

一些整理

  • 每艘船都有 ais 发送设备,发送的内容包含船只信息、位置等。mmsi 开头数字是 2~7,长度为 9 位。
  • 非船只也会有些设备能发送 ais 消息

    • 如船员落水报警设备,其 mmsi 开头数字是 9。
    • 有些设备的 mmsi 不是 9 位,长度随意
  • 在固定位置有 ais 基站来接收这些信息

一个优秀的在线解码 ais 消息的网站

https://www.aggsoft.com/ais-decoder.htm

几个开源的解析库

获取 ais 消息数据的方法

https://kystverket.no/en/navigation-and-monitoring/ais/access-to-ais-data/ 这个网站提供了相应的实时数据的接口(未做验证)

ais 消息所包含内容的详细说明

一些固定类型信息的参考表

实时地图及船只查询

本篇文章主要目的是记录下首次安装过程,及一些个人使用上软件的配置的分享

本人使用的操作系统是 Win 11 家庭版,没有 Hyper-V,不包含虚拟机管理功能。

安装

初次使用,直接到应用商店搜索 Debian,直接安装即可。相比 Ubuntu,Debian的安装包只有90M左右。

安装成功后,在控制台输入 wsl 或 Debian 来启动系统。等首次初始化完成后,会要求你输入一个新的用户名,这里因为我需要 root 用户,我直接关掉了窗口。再次进入 wsl,就会看到是以默认的 root 用户进入系统了。

启用 systemd

为了贴合习惯,这里我们启用 systemd。输入如下命令

echo -e "[boot]\nsystemd=true" | tee -a /etc/wsl.conf

配置后需要通过wsl --shutdown命令关闭 wsl,来进行 wsl 的完整重启。
再次启动wsl后,输入命令

ps --no-headers -o comm 1

来检查 systemd 是否启用成功,如果返回的是 init 说明 systemd 未启用,如果是 systemd 说明已启用成功。

切换到国内源

备份现有源:

cp /etc/apt/sources.list /etc/apt/sources.list_bak

这里我使用了阿里云的源:

sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list
sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list

配置完后,记得 apt update 更新一次

安装 oh-my-zsh

oh-my-zsh 能提供一个开箱即用,漂亮的终端,并且其高亮、自动补全插件非常实用

安装 zsh,并设为默认shell

apt install zsh
chsh -s $(which zsh)

此时,退出再重新进入 wsl,运行命令 echo $SHELL, 如果结果中包含 zsh,说明 zsh 已经安装成功

继续安装 oh-my-zsh

为了避免出现错误,可以先安装好依赖 apt install git curl
通过官网首页提供的https://ohmyz.sh/#install安装脚本来安装(可能需要科学上网)

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

安装完成后,终端终于不止于黑白了
2024-05-23T11:21:42.png
接下来安装我常用的2个插件,分别是 zsh-syntax-highlightingzsh-autosuggestions

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

编辑 vi ~/.zshrc 在 plugins 加入2个插件来启用
2024-05-23T11:30:15.png
重新进入wsl,随便敲些历史命令,就能看到自动补全了。

安装 tmux

tmux 是一个终端复用器。能在一个窗口中,拆分出多个子窗口,并且可置于后台运行。

使用他人创建好的配置文件

具体请参考 https://github.com/gpakosz/.tmux ,我个人使用的也是基于此项目进行的修改
具体的修改是启用了鼠标控制功能,启用了恢复会话的插件(通过编辑 ~/.tmux.conf.local)
保存后记得 tmux source .tmux.conf,然后进入 tmux,此时会自动安装启用的插件。

配置 smb

为了方便 windows 开发,通过 smb 方式,将 wsl 中个别开发目录挂载到 windows 系统中,方便使用 ide 进行开发。
目前(2024年5月),使用 wslg 的方式,在 linux 中运行的 jetbrain 或 vscode,常常会有些或大或小的,令人不舒服的问题,如输入法、字体、边框等,所以我个人更倾向于使用 smb 的方式来进行开发工作。
而 vscode 的 Remote development in WSL 短暂体验下来其实还不错,目前处于全体 ide 切换到 vscode 的试验阶段。

将 wsl 安装到其他位置

需要先安装好系统后,再导出镜像,再通过 import 命令将镜像导入(安装)到指定位置。
可以在刚刚安装好镜像或做好以上配置后进行镜像导出,此时的镜像可以作为基础环境,方便后期回滚或安装一个新的环境。
参考1: https://learn.microsoft.com/zh-cn/windows/wsl/setup/environment#set-up-your-linux-username-and-password
参考2: https://www.cnblogs.com/tl542475736/p/14855863.html

前提

  • 在windows系统中进行软件开发
  • 在windows下使用串口模拟器
  • 在windows下使用x86安卓模拟器进行软件调试
  • 面向arm安卓系统的触屏设备

有两种串口

  • rs232 串口
  • usb 串口

本文仅涉及rs232串口,其访问地址是/dev/ttyS*开头,开发中使用串口模拟器来模拟串口。
未找到模拟usb串口的办法,虽然实际开发中有用到,涉及到此部分时只能远程调试了。

安卓内置模拟器
使用如下两条命令来启用串口,并启用root权限。同时,实际使用中,开启串口通信后,非常容易导致安卓模拟器崩溃假死,更推荐使用genymotion。

  • emulator -avd Book_API_28 -writable-system -qemu -serial COM1
  • adb root && adb shell "setenforce 0"

genymotion
兼容arm端的转换,心智负担更小,编译时只启用arm平台即可正常调试。

  • 自带root
  • vbox分配端口
  • adb shell chmod777 ttyS0

function apiResource($router, $path, $controller, $name = null, $exclude = []) {
    $g = function ($method, $name, $pathExt = '') {
        return ['method' => $method, 'name' => $name, 'pathExt' => $pathExt];
    };

    $restfulMethods = [
        $g('get', 'index'),
        $g('get', 'show', '/{id:\d+}'),
        $g('post', 'store'),
        $g('put', 'update', '/{id}'),
        $g('delete', 'destroy', '/{id}'),
    ];

    foreach ($restfulMethods as $restItem) {
        if (in_array($restItem['name'], $exclude)) {
            continue;
        }

        $router->{$restItem['method']}($path . $restItem['pathExt'], [
            'as' => $name .'.'. $restItem['name'],
            'uses' => $controller .'@'. $restItem['name'],
        ]);
    }
}

修改自此Github Gist

七牛使用base64图片的形式上传,查看七牛原文,对其上传代码使用axios的进行了实现。

function qiniuUploadBase64 (dataUrl, saveKey = '', isFullName = false) {
  let baseStr = dataUrl.split(',')[1]

  const eqTagIndex = baseStr.indexOf('=')
  const baseSizeStr = eqTagIndex !== -1 ? baseStr.substring(0, eqTagIndex) : baseStr
  const strLen = baseSizeStr.length
  const fileSize = parseInt(strLen - (strLen / 8) * 2, 10) // fileSize 可直接写为 -1,省去计算步骤

  return axios
    .post(`https://upload.qiniup.com/putb64/${fileSize}/key/${btoa(makeSaveKey(saveKey, isFullName))}`, baseStr, {
      headers: {
        'Content-Type': 'application/octet-stream',
        Authorization: 'UpToken ' + mkToken(saveKey, isFullName)
      }
    })
}

有两点需要注意

  • fileSize 设置为 -1 其实更为方便
  • post请求的url中,携带了key参数,这样能保证覆盖上传而不返回错误