GOLANG 的交叉编译以及 strip

交叉编译需要知道支持的 GOOS 以及 GOARCH,我们运行 go tool dist list 就可以得到支持的OS 以及硬件平台的组合

$ go tool dist list|paste - - - - -
aix/ppc64       android/386     android/amd64   android/arm     android/arm64
darwin/386      darwin/amd64    darwin/arm      darwin/arm64    dragonfly/amd64
freebsd/386     freebsd/amd64   freebsd/arm     js/wasm linux/386
linux/amd64     linux/arm       linux/arm64     linux/mips      linux/mips64
linux/mips64le  linux/mipsle    linux/ppc64     linux/ppc64le   linux/s390x
nacl/386        nacl/amd64p32   nacl/arm        netbsd/386      netbsd/amd64
netbsd/arm      openbsd/386     openbsd/amd64   openbsd/arm     plan9/386
plan9/amd64     plan9/arm       solaris/amd64   windows/386     windows/amd64
windows/arm

检查当前的环境变量设置:

$ go env GOOS GOARCH

编译时把 -s -w 传递进 ldflags 我们就可以得到 strip 的二进制文件,以下是 aliyun-cli 项目的编译

$ go build -ldflags "-s -w -X 'github.com/aliyun/aliyun-cli/cli.Version=3.0.37'" -o out/aliyun main/main.go

香橙派上,只要 export GOARCH=arm64 就可以编译成功 aliyun cli 了。 然后就可以通过命令行来自动注册香橙派的 DNS 了。

开源智能家居系统 Home Assistant 入门

如果可以在你家的宠物猫上贴/绑一个小的低功耗蓝牙发射器,然后在一个小的家庭智能网关上搜集到这个蓝牙的位置,你是不是可以全天候监控你家萌宠,在你不在家的时候撒欢的情况了呢?本文尝试在一台 x86 虚拟机上安装这个开源的智能家居软件,待以后我们更新发布一个新的安装到树莓派或者香橙派的版本,那就是真正的智能家居系统了。

在我们的 Proxmox VE 6 集群里,找了一台空的 Ubuntu 1904 的虚拟机 1G 内存 1 vCPU。虚拟机主机名设为 lamp-u02。你问为什么要用虚拟机啊,就是为了隔离啊, 测试的东东不想和其他系统混杂,所以,我们的三台物理机的集群里,安装了很多七七八八的各种虚拟机。

开始按照网上参考文章安装,安装流程非常顺利。

$ sudo apt-get install python3-pip python3-venv
$ sudo apt-get install build-essential libssl-dev libffi-dev python-dev
$ sudo echo > /etc/pip.conf <<EOF
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple/
EOF
$ sudo useradd -rm homeassistant
$ cd /srv
$ sudo mkdir homeassistant
$ sudo chown homeassistant:homeassistant homeassistant
$ sudo su -s /bin/bash homeassistant
$ cd /srv/homeassistant
$ python3 -m venv .
$ source bin/activate
$ pip3 install homeassistant
$ hass &

等后台下载一些依赖,并启动到 “Starting Home Assistant” 可以浏览器登录 http://lamp-u02:8123/ 进入服务,来玩耍一把了。

设置好账号后,就进入一个地址定位界面,貌似自动检测不工作。 我们切换到火狐浏览器进入翻墙的情形,来测试一下定位地址的自动检测功能。显然由于不可知的原因,这个自动检测地址不工作,我们只好手工拖动地图到我们的实际位置,然后选择时区, +8 的时区选择里,居然没有中国的任何城市! :-(【后面我们会手工修改】,我们暂时选择新加坡,保存后,点击完成。这个服务就算设置好了。

接下来,我们点击集成,点击右下角的 + 号,就可以添加不同的设备或者服务了。里面有大金空调的直接输入 IP 地址就可以监控,还包括 海信,华为等设备,直接可以连接 MQTT , 还可以连接 Twillo(短信服务提供商) 等。

我们接下来去手机上安装一个 Home Assitant 的应用。 iOS 上在 App Store 里搜索 Home Assistant 第一个有房子形状的就是了。

安装完 App 后,确保手机 Wi-Fi 和 Home Assisstant 服务器在同一个网络内,App 就可以自动发现,如果没有发现的话,可以尝试手工输入 URL: http://192.168.x.x:8123/ 让 App 去发现,成功之后,点击三个允许授权,然后会出现白屏是因为中间在传输数据,大概需要 3-5分钟,手机上和 PC 浏览器上都可以出现手机的详细信息了。

下面来玩一把高级的,上面提到过,没有 上海这个时区。 其实,时区也是可以手工填写的,但是是不是 GMT+8,我们没有确认,中间没有天气预报这个模块了。 我们要初始化怎么办?实际上很简单粗暴,直接删除 .storage 目录就可以:

 $ rm -rf  /home/homeassistant/.homeassistant/.storage 

重启后,就会在浏览器上要求重新创建用户名和密码。我们要修改的时区的名称就在 .storage 目录下的 core.config 里。 把 Asia/Singapore 修改为 Asia/Shanghai 后,我们用 $ kill -HUP $(pgrep hass) 就可以重启原来启动的 hass 进程。虚拟机的 SSH console 上就可以看到重启的信息。 浏览器界面进入“配置=>通用”,就可以看到时区已经显示为 Asia/Shanghai 了。

最后, 我们把 hass 搞成一个自启动的服务, 这个在 Ubuntu 下很简单, 编辑一个启动脚本。 (请注意这个脚本和其他网络上介绍的有不一样的)

$ sudo echo > /lib/systemd/system/homeassistant@.service <<EOF
[Unit]
Description=Home Assistant
After=network-online.target

[Service]
Type=simple
User=%i
ExecStart=/srv/homeassistant/bin/hass -c "/home/%i/.homeassistant"

[Install]
WantedBy=multi-user.target
EOF
$ systemctl daemon-reload
$ systemctl --now enable homeassistant@homeassistant
$ systemctl  status homeassistant@homeassistant  // 查看服务启动情况

对以上的这个启动脚本做个解释,其中的 User=%i, 这个 %i 其实就是 服务名里面 @ 后面部分,也就是 homeassistant 。也就是说,要启动多个服务的话,只要在一个新的 HOME 下, 例如 /home/newuser 下配置好 .homeassistant 目录里,无需添加其他脚本,我们可以启动一个新的服务: systemctl start homeassistant@newuser 即可。(当然里面的端口号要修改)怎么修改启动的端口(例如 8122 )呢? 修改 configuration.yaml,把其中的 http: 部分修改成如下即可。

  base_url: lamp-u02:8122
    server_port: 8122

好了, 一个完整的配置安装教程基本完成,如果手头有其他苹果的,亚马逊的, Google 的音箱之类的,都可以爽爽的玩起来了。

什么?你不想用 8123 端口访问?前端加一个 Nginx 反向代理就可以,小儿科了。 就不介绍了。 请记住, 不能直接用普通用户启动端口号低于 1024 的 TCP 服务,例如 80/443 都必须以 root 启动。

但是问题是家庭里面,谁也不想开一台虚拟机跑这个东东吧?接下来,我们后面会尝试用其他方法来安装这个软件到小巧玲珑的树莓派,或者香橙派,或者香蕉派上面,然后在手机端就可以配置整个家庭的智能家居,在小巧的设备上配置上 DDNS,就可以远程在手机上控制家里的设备了。 譬如,你能想到的,下班前,先把家里的电饭煲开启,天冷了, 家里的空调/地热可以预先开启。等等等等。

所有这些,你都可以通过这个开源的软件来控制,好向往啊!

香橙派 Pi Zero 上的容器操作系统 BalenaOS

香橙派是深圳迅龙公司的产品。该公司旗下有不同种类的基于 AllWinner 芯片的不同的 Pi. Pi Zero 只是其中一个比较低端的产品,H2(ARM Cortex-A7 Quad-core) 的CPU,512M 内存,1x 100M 网口, Wi-Fi 模块, OTG 电源 + 1x USB 2.0 ,最大 32GB TF 卡。当然操作系统要灌在 TF 卡上。

去 balenaCloud 注册一个账号以后,添加设备,选择香橙派 Pi Zero,下载 img,烧写到 TF 卡上,插入到香橙派,上电,插网线,它会自动 DHCP 从网络里取到 IP 地址,然后,过了很长很长时间(1天,2天?)后,在 balena 的云端可以看到“Online”,之前一直 Inactive,不理解是网络那里有问题。

Balena 在他们家网站介绍就是一堆构建,部署,管理 Linux 设备的工具集。下面的这个图基本上能概括他们家的产品列表。这是一家初创公司,看上去充满了很多创新的元素。

部署的前面10个设备是免费的,20个以内每个月 99 美元!50个设备,每个月 299 美元,100 个设备的话要 1299 美元,企业级支持是每月 2999 美元!

先看下,我们已经上线的香橙派吧:

让我们通过命令行进入香橙派看看里面到底是什么东西。我们用 balena scan 看下局域网内的设备:

我们用 balena ssh IP地址,就可以进入香橙派了。 使用 lsof -Pi 命令,我们就可以查看设备侦听的所有网络口:

看下板子的信息:

定制自己的 OpenWrt

每次安装 OpenWrt, root 口令都是空的,然后每次进入都是需要手工设置一把;每次都要修改时区;我们想把 OpenWrt 的“主机名”修改为自己的品牌名称;我们还想修改 ssh 登录的 Banner … …

下载 ImageBuilder 是最快定制自己 Image 的办法。不同的 Target , 这个 ImageBuilder 也会不一样,例如 香橙派 Zero 的文件是:openwrt-imagebuilder-sunxi-cortexa7.Linux-x86_64.tar.xz 所以,我们需要先选择好 Target。所有不同的 profile 其实在 .targetinfo 文件里都有定义。选择到合适的 target profile 后,我们只需要运行
# make -j 4 image PROFILE=”xxx” PACKAGES=”xxx xxx ” FILES=”xxx” 即可安装指定的软件包,并把额外的文件在 FILES 路径下包含进来。另外,要用国内的源:中科大: http://mirrors.ustc.edu.cn/lede/releases/18.06.5/targets/x86/64/ 更新 repositories.conf 把其中的 downloads.openwrt.org 修改为:mirrors.ustc.edu.cn/lede

默认刷的就是 snapshot 版本, 不带 Web 界面的, 要刷 Web 界面,进入 ssh 后运行:
# opkg update; opkg install uhttpd uhttpd-mod-lua luci-i18n-uhttpd-zh-cn luci-theme-bootstrap luci-i18n-base-zh-cn

在想到要修改这些东西的时候,我们需要知道这些东西其实是在一个 /bin/config_generate 里面完成的,就让我们先从这个脚本开始,顺藤摸瓜来解剖 OpenWrt 吧。开头的这几行就是说,如果系统已经初始化过了,就不执行这个脚本了。反过来说,如果我们要初始化板子,直接删除 /etc/config/network 和 /etc/config/system 两个文件,然后执行 config_generate 就好。

在开发过程中,为了每次烧写后有自己网络的 IP 地址,我们把原始的 192.168.1.1 修改了一下。也就是说,如果不想让 OpenWrt 默认 IP 是 192.168.1.1 我们可以修改为其他的 VLAN。

系统名和时区,也可以在脚本里直接修改,注意上海是“UTC-8”哦!(里面的 CST 其实也只是显示为 CST 而已,你可以写任意其他的名字,但是 -8 不能修改)

修改登录的 Banner 当然是 /etc/banner 文件。

那 root 口令怎么初始化呢?我们只能手工生成一个带有 root 口令的 shadow 文件,覆盖初始化时的 /etc/shadow ,这样就完成了以上这些初始化需要注意的步骤。

如果板子是从 SD 卡启动的话,一般 SD 卡是从 img 文件直接用 dd 命令烧写的。烧写完后,挂接 SD 卡的第二个分区(根文件系统分区),用脚本修改 /bin/config_generate ,然后 unmount ,也算一种方法。

另外一种比较正式的方法就是修改包文件 base-files.ipk ,我们现在进阶到 opkg 软件包的解剖了。 ipkg 文件实际上就是一个 .tar.gz 文件。

我们用
# zcat base-*.ipk |tar xvf –

就能得到三个文件:

  • ./debian-binary
  • ./data.tar.gz
  • ./control.tar.gz

其中 data.tar.gz 就是所有这个基本包的文件,包含了这个 /bin/config_generate 脚本。我们把 data.tar.gz 包内的文件解开来,可以看到基本上都是 /etc 下核心的内容。

这里有一个我们认为比较核心的脚本是 ./lib/functions/uci-defaults.sh , 我们可以看到,其实板子启动后会自动往 /tmp/sysinfo 目录里写一些文件的,然后后面的这些启动脚本会读取里面的信息,做对应的处理。

总结:实际上修改包文件其实不符合常规的整体的包的完整性,所以,在实际的操作中,为了烧写定制的 SD卡,我们完全不必定制自己的 ipk 文件,而是用官方的 img 文件烧写完毕后,挂接第二分区,再修改相应的文件,反正烧写完以后,SD 卡是必须扩容的。所以,这个修改文件的动作,也不过是顺水推舟而已。

怎么用脚本自动扩展SD 卡的分区?且听下回分解!

香橙派 Pi Zero Plus 上手记

废话不多说,树莓派玩了几台,之前买的是 Google AIY,还托兄弟从美国买了4台,69美刀一台,送了2台,自己留了2台,号称有 Tensorflow Lite 版本。但是自己没时间玩。后来又买了树莓派 4B,1G 内存的各种操作系统刷。 打算做一款屏蔽广告的产品,先要低成本啊, 搜到了老外用 Aliexpress 买的 Pi Zero,再一搜原来是深圳迅龙的产品,当然是挑 100 RMB 内的产品买,而且是要有有线网口的。所以就选了 Zero Plus。坑的是支持的操作系统版本没几个。 Arch Linux 的下载只有 135M,所以先从 Arch Linux Server 开始干起。

安装软件包,一定很慢, 所以先找国内的镜像, 国内有清华的,中科大的, 我们就把 /etc/pacman.d/mirrorlist 第一行修改为:
Server = https://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo
然后 pacman Syuw 就可以去掉那个更新时的因为 ca-certificates 的冲突报错的问题。


再返回去,说一下板子的镜像烧写问题,因为有之前树莓派的经验,所以,手册也没看,就下载了其他不相关的镜像,导致以为板子坏了,投诉了售后的黄小姐,在她热情的指点下,终于明白了,这个板子是必须插 SD 卡才能会亮灯的。正常的启动后是 DHCP 拿地址的,然后板子是红灯亮,网口灯黄灯亮(100M?),绿灯闪。
吐槽一下他们家的百度下载,那个百度网盘实在坑爹,从 Google 网盘下载都有 4M每秒,可是百度上就只能是 100多 Kb/秒。

然后就是 pacman -S vim sudo proxychains dnsutils 等各种工具了

且慢! 磁盘空间不够了!根文件系统只有 1.1G,已经 100% 满了!

这个难不倒我们, 把 SD 卡拔出来放到一台 Linux 机器下, 用 fdisk 删分区,建分区,扩展,然后挂接, growfs 就可以。

敲入 shutdown -h now,Zero+ 就自己灭灯了, 只有绿灯还常亮。拔卡!

前面具体删分区,建分区的步骤就是比较简单, 建分区的时候要注意起始扇区要用前面删除之前的那个起始扇区号,其他都是默认就可以。 然后挂接到 /mnt 的时候,可能会遇到超级块错误,也不要慌, 先用 fsck.ext4 -y /dev/sdb2 来做好 fsck 就可以挂接了。 我们看下挂接好之后, resize2fs 前后的磁盘空间

好了, SD 卡已经扩容完毕,我们umount /mnt; eject /dev/sdb 把 SD 卡插回 Pi Zero+

接下来就是安装其他软件的事情了,我们且听下回分解 … …

树莓派的另外一种管理无线网络的办法

如果一个设备只能通过无线网络连接,真是蛮郁闷的,如果需要连接到不同的无线网络里去, 每次都要修改 SD 卡上的配置文件 /etc/wpa_supplicant/wpa_supplicant.conf
那不是郁闷死? 一种办法就是写一个自己手机的共享热点的 名称和密码, 记录下来。 下次万一需要设置树莓派, 把自己的手机名称和共享热点的密码修改一下,然后 PC 端也可以连接到手机的共享热点,这样,PC 端就能登录树莓派了。

话说 Mac 上如果要修改 SD 卡上的 Linux 分区还是真是不好办, 要安装一个什么 osxfuse 和 ext4fuse 的东东,Homebrew 又极其缓慢,最后还是用 VirtualBox 挂接的一个没有硬盘的只有的 CentOS7-Minimal ISO 启动到 Rescue 模式,挂接 U盘后解决的。 还有另外一个 USB OTG(On The Go) 的办法, 要去修改 /boot/cmdline.txt 如下:核心的就是在 rootwait 之后,添加了:
modules-load=dwc2,g_ether
还要确认 /boot/config.txt 包含:
dtoverlay=dwc2

重新启动后,可以看到树莓派上多出一块 usb0 的“网卡”,会提供 DHCP 给连接到上面的设备。我们的 Macbook 上网络设备会多出一个 RNDIS/Ethernet Gadget 的网卡,地址是 192.168.11.54,我们可以用 arp 或者 nmap 发现树莓派,这样就无需无线网络就可以登录树莓派了。

总结一下连接办法:一种是通过 Linux 虚拟机挂接 SD 卡修改无线配置文件,另外一种就是通过 USB 连接 data 端口,让 PC 设备成为 DHCP 客户端,还有一种就是把无线热点的配置固定写死到树莓派里。

Go 语言实现的 FastCGI 以及数据采集程序和 LNMP的整合

上一篇我们讲述了 LNMP 在树莓派 4B ( 1G 内存)上的安装。本文我们讲述我们自己用 Go 语言开发的基于 Modbus 协议采集传感器数据的程序, FastCGI 用于我们管理数据采集的传感器数据配置,以及一部分本地数据的配置,以及本地邮件,短信报警。

  1. 准备数据库, mysqldump 导出原先的数据库, 然后导入到树莓派上的 数据库
  2. 根据 conf 文件的配置,设置数据采集应用连接数据库的用户名和密码 .e.g grant all on xx.* to xx@localhost identified by ‘xxx’ ; flush privileges.
  3. 我们的程序采用了 FreeBSD 的自己编译的 uci 应用,分别拷贝 /bin/uci; 以及 libubox.so 和 libuci.so 到树莓派的 /bin 和 lib 目录下
  4. 我们需要通过 snmp 采集本机的 CPU/Memory, apt -y install snmpd; systemctl status snmpd

To Be Continued … …

Grafana 6.2 发布

Grafana 6.2 已经正式发布了, 读者可以点击此链接下载了。 此次更新的亮点有:

1. 新的面板(Panel),新的直方图形式(Bar Gauge)


2. 支持 Elasticsearch 7
3. 提升了数据源加密方式的安全
4. 改善了部署 (Provisioning)
5. 提升了对 Table Data 的支持
6. Panel 数据的加载在视图外用 Lazy loading
7. 没有标题的 Panel 可以使用完整的空间
更多详细列表,点击此处





5分钟快速上手开源边缘计算平台 EdgeX Foundry

原文: https://docs.edgexfoundry.org/Ch-QuickStart.html#setup
有改编
安装环境: Ubuntu 18.04.1,理论上也适用于其他 Linux 平台,只是包管理软件的命令不一致,相关软件包的名字有可能不一致。
# apt install docker docker-compose
# wget -O docker-compose.yml https://github.com/edgexfoundry/developer-scripts/raw/master/compose-files/docker-compose-delhi-0.7.1.yml
# docker-compose pull (遇到 GFW 问题时,可以尝试多次运行)
# docker-compose up -d
# docker-compose ps

以上几步就把容器搭建并启动完毕了。
接下来连接设备
启动一个随机数发生器的演示设备
# vim docker-compose.yml 把 device-random 那一节的注释去掉
# docker-compose up -d device-random
设备服务会自动注册一个叫做 Random-Integer-Generator01 的设备,发送随机数到 EdgeX. 可以用下面的命令来验证读取发送的10个随机数:
# curl http://localhost:48080/api/v1/event/device/Random-Integer-Generator01/10
EdgeX 提供各种云服务和应用的导出,下面我们使用一个 HiveMQ 上公共的 MQTT 服务,检查 EdgeX 的读入并自动发布。

运行以下的命令来注册应用:

curl -X POST -d ‘{
“name”:”QuickStartExport”,
“addressable”:{
“name”:”HiveMQBroker”,
“protocol”:”tcp”,
“address”:”broker.hivemq.com”,
“port”:1883,
“publisher”:”EdgeXExportPublisher”,
“topic”:”EdgeXQuickStartGuide”
},
“format”:”JSON”,
“filter”:{
“deviceIdentifiers”:[“Random-Integer-Generator01”]
},
“enable”:true,
“destination”:”MQTT_TOPIC”
}’ http://localhost:48071/api/v1/registration

然后我们可以用任何的 MQTT 客户端来查看发送到 MQTT 服务器的数据,我喜欢用 Mosquitto 的命令行来查看。(如果还没有安装的话, 就运行 # apt install mosquitto 来安装)

# mosquitto_sub -h broker.hivemq.com -p 1883 -t EdgeXQuickStartGuide

下面我们尝试来控制设备,我们先看下设备提供了那些控制命令:

#curl -s http://localhost:48082/api/v1/device/name/Random-Integer-Generator01|jq
jq 是把 JSON 串格式化很好的工具,如果没有安装的话就用 # apt install jq 来安装。

# curl -s http://localhost:48082/api/v1/device/name/Random-Integer-Generator01|jq

我们现在知道了有 get 和 put 命令可以使用,现在根据命令的 UUID, 我们取出 Int8 对应的随机数:
# curl -s http://localhost:48082/api/v1/device/5c6f8bf19f8fc200017a36c2/command/5c6f8bf19f8fc200017a36bd|jq
默认随机数是 -128 到 127

# curl -s http://localhost:48082/api/v1/device/5c6f8bf19f8fc200017a36c2/command/5c6f8bf19f8fc200017a36bd|jq

我们现在修改这个随机数为 0 到 100 之间的数字:

curl -X PUT -d ‘[{“Min_Int8”: “0”, “Max_Int8”: “100”} ]’ http://localhost:48082/api/v1/device/5c6f8bf19f8fc200017a36c2/command/5c6f8bf19f8fc200017a36bd

多次运行以上的 GET 指令, 也就是:

# curl -s http://localhost:48082/api/v1/device/5c6f8bf19f8fc200017a36c2/command/5c6f8bf19f8fc200017a36bd|jq

你会看到返回的随机数都在 0到100之间。

好了, 基础的介绍就到这里了。
有时间, 我会继续翻译 EdgeX 上的文档,并且注解自己的想法。


# vim docker-compose.yml
# docker-compose up -d device-random

# docker-compose up -d
# docker-compose ps

Ubuntu 上安装 Node-RED

参考: https://blog.csdn.net/u013352077/article/details/81357554

Node-RED 是构建物联网应用程序的一个强大工具,其重点是简化代码块的“连接”以执行任务。它使用可视化编程方法,允许开发人员将预定义的代码块(称为“节点”,Node)连接起来执行任务。连接的节点,通常是输入节点、处理节点和输出节点的组合,当它们连接在一起时,构成一个“流”(Flows)。

Node-RED最初是IBM在2013年末开发的一个开源项目,以满足他们快速连接硬件和设备到Web服务和其他软件的需求——作为物联网的一种粘合剂,它很快发展成为一种通用的物联网编程工具。重要的是,Node-RED已经迅速形成一个重要的、不断增长的用户基础和一个活跃的开发人员社区,他们正在开发新的节点,同时允许程序员复用Node-RED代码来完成各种各样的任务。

在 Ubuntu 上安装 Node-RED 是很简单的一件事情:

# apt install npm
# npm install -g –unsafe-perm node-red
# node-red &
就可以看到如下的输出:


然后去浏览器,我们部署的主机名是 nfsroot.local
http://nfsroot.local:1880/ 就可以看到界面了:
然后把左边菜单,“功能”里的函数(Function) 拖入工作窗口,双击, 添加
msg.payload=”Hello World!”;
保存。



然后在其前面拖入“Inject”,在其后面拖入, “debug”,用线段连接,保存,并点击右上角“部署”,然后点击 Inject 的那个把柄区域,点击右边 “i” 安装旁边的那个虫子按钮,切换到“调试窗口”,就可以看到“Hello World!”输出了。

基础的介绍就到这里。