前一篇介绍了怎么运行LiveKit的flutter示例程序,这一篇介绍一下它的后端搭建过程。

LiveKit 的需要两个后端程序,一个是其官方提供的 livekit-server ,另一个是利用 livekit sdk 编写的加入会议房间的token生成器。

livekit-server 要我们在自己的服务器上进行配置,安装它编译好的版本就可以了,具体可以参考 https://docs.livekit.io/realtime/self-hosting/local/ ,部署配置参考 https://docs.livekit.io/realtime/self-hosting/deployment/,要开放的端口可以参考 https://docs.livekit.io/realtime/self-hosting/ports-firewall/

token生成服务需要我们自己写一个后端服务生成,token服务主要是用来识别要进哪个room及用户名,具体可以参考 https://docs.livekit.io/realtime/server/generating-tokens/

官网go的例子有问题,我自己写了一个:

阅读全文 »

元旦的时候自己做了一套视频对讲系统给家里用,家里有一个小店。有时候店里没人的时候来客人就不太方便招待,虽然家里装了监控,也支持对讲,人在外面可以看到店里的一举一动,但是对客人来说,他看不到店员就会不太自在,会有一种被监视的感觉。

如果店里有一个大屏幕,当店主不在店的时候顾客能通过屏幕看到店主,然后店主可以远程招待客人,相当于一个视频版的对讲机,这样顾客的体验会更好。

这个需求是我爸提的,当时我的第一反应是这不就是视频会议嘛,一开始想能不能现有的视频会议软件实现,看了一圈基本上没有适合的,因为视频会议软件不能7*24小时都开着(没有人是一天到晚一直在开同一个会的,而且基本上也都有使用时长限制),于是就去调研了一圈开源的视频会议系统,最终找了一个完美的解决方案:LiveKit GitHub地址:https://github.com/livekit/livekit

说它是完美的,是因为视频会议所需的各种功能它都有,支持私有部署,代码全部开源,还提供了各个语言的使用例子。

它的后端程序可以直接部署使用,不需要做任何改动。客户端部分我选用了它提供的flutter样例,其实本来想采用它的vue样例的,那样更简单,但浏览器只支持https的网页调用摄像头,而自己配置证书啥的又太麻烦了,而且浏览器的另一个不足是现在的浏览器都自带休眠功能,一个页面长时间不操作就会被休眠。

阅读全文 »

最近在工作中遇到了一个比较难解决的问题,简单来说就是,要在嵌入式设备里跑两个程序,一个是后台服务程序要常驻在系统中,另一个程序相当于是这个后台程序的入口程序,通过它向后台程序发送数据和命令以实现相应的功能。以往遇到这类的问题我都是用grpc来解决的,但是这回不能用grpc了,甚至连http服务都搭不起来,一来这个设备的性能非常差跑个网络服务会比较占用资源,二来我也试过编写一些后端的程序,只要涉及网络服务的在编译后都无法在设备上运行,好像是指令集缺东西,不兼容。

这时我就想起了当年学操作系统的时候背的进程间通信的几种方式:信号、信号量、共享内存、消息队列、管道、套接字。其中除了管道没在编程时用过,其他的几种都已经用过了,信号能传递的数据太少了,信号量一般用于进程间同步或者资源的分配,共享内存、消息队列用起来比较复杂,套接字其实就是用的网络服务的那一套,需要开端口来通信。而管道的话可以当成一个操作系统提供的队列,用起来简单,正好适合我的这个场景:一个进程负责读,一个进程负责写。

对于Linux、Mac等类Unix系统,go语言的标准库提供了读写管道的函数,在类Unix系统中,管道是以文件的形式存在的,所以对管道操作的函数和文件的类似。

下面简单地举个Linux、Mac下管道操作的例子:

接收数据的程序:

阅读全文 »

书接上回,弄好 Hyper-V 之后就可以根据自己的需求开虚拟机了,一台电脑可以当多台用。家庭服务器主要的用途大致有以下几种:私有云盘、软路由、监控、智能家居、技术学习、个人项目等等。

其实像私有云盘、软路由、监控、智能家居等等这些都有专门的软硬件可以购买,咱自己实现一遍就是多折腾折腾,涨涨经验,顺便也省了一笔钱。技术学习比如学k8s,因为电脑的内存足够大,多开几个虚拟机,就能搭出一个简单的集群了。个人项目那就是自己想折腾什么就折腾什么了。

底层系统用Windows的好处是特别稳定,特省心,我这里说的稳定省心是怎么折腾都没事,出了问题重启基本上都搞得定,linux就不同了,就算是一个经验丰富的老手在遇到问题时也时常会不知所措。家里的服务器一般QPS什么都很低也用不着做什么优化,装windows能节省很多折腾的时间,想用linux时开一个虚拟机就可以了。

好了,现在说说我目前服务器的使用情况吧,现在跑了私有云盘、软路由、量化程序、自己的一些小项目等。私有云盘是在另一个二手迷你电脑上跑了一个nextcloud的私有云盘服务,nextcloud 的搭建可以参考以前写的那篇 用Nextcloud搭建个人网盘 ,当时搭的这个网盘到现在也还在用。

软路由我觉得是家家必备的神器,我现在用的是 Bleach OpenWrt ,用的是它的x86版的固件,如果想在 Hyper-V 上装的话要把下好的固件转换成 vhdx 格式的虚拟硬盘文件,格式转换可以用这个软件 StarWind V2V Image Converter 。

阅读全文 »

前一篇文章发出后有朋友说zerotier也能实现内网穿透不用公网服务器中转流量。我之前也用过zerotier,它更像是一个用来组网的工具,相当于把位于不同地方的设备连接起来搭建一个虚拟的局域网,每个设备都要安装zerotier one才能连上,非常安全,不过用起来还是有些不方便的。我自己更倾向于frp这种端口映射的方案,这种是把服务直接暴露在公网上的,和直接买的云服务器基本没有差别,只是延时会长一些(因为流量的进出都要经过服务器中转)。

这一篇来讲一下解决网络问题后,怎么折腾服务器吧。首先是根据自己的需求和预算购买机器,我的预算是2千到3千之间,需求是跑多个虚拟机、搭自己的网盘、跑量化程序、软件开发。所以内存要足够大,cpu性能要强,不需要显卡。又要性能又要便宜那就只有组装机,一开始想自己组装的,在知乎上翻了一会儿感觉自己组装太麻烦了,想着有没有卖现成的组装机的,搜了下,找了一家名气比较大的专卖组装机的店,花2600块买了一台。配置是64G内存、1T硬盘、cpu为 AMD Ryzen 5 5600G。已经不间断开机6个多月了,用起来挺好的。

电脑买完后还得考虑供电的问题,现在的市电是比较稳定的,但也偶尔会有波动,我遇到过两三次间歇断电的情况,就是闪断的那种。电脑买回家后用了一阵发现系统好像重启了(我在BIOS里设置了接上电源就自动开机),左思右想没想出缘由,后来查看windows的系统日志才发现有几次间隔很短的启动记录,于是就买了一个UPS,这之后电脑就没再因电源波动重启过。

大家自己搭建服务器的时候也要注意在bios里设上插电自动启动,这样当遇到停电又来电时,电脑会自动开机,减少服务下线的时间。

接下来说一说系统吧,我一开始想装ESXi的,这是VMware的一款可以直接安装在物理机上的虚拟化操作系统,相比VMware Workstation 或者 VirtualBox ESXi 的效率更高,虚拟化带来的性能损耗几乎可以忽略不计,因为它是直接调动硬件资源的。但是ESXi只能安装在装有Intel 或Broadcom 网卡的电脑上,而一般家用的电脑都是Realtek的网卡,所以就装不了了。在查阅了各种虚拟化技术的资料之后,最后选择了安装 Windows 10 专业版,你没有看错,是Windows!主流的硬件虚拟化软件有 ESXi、Proxmox VE、Hyper-V,其中的 ESXi 已经在前面介绍过了,Proxmox VE 是一个基于linux的硬件虚拟化软件,我一开始也想装的奈何怎么也装不上,Hyper-V 是Windows自带的虚拟机,性能很好。不过话说回来 Windows 10 专业版的价格可不便宜,那怎么免费用呢,其实只要找一个kms服务器激活就可以了。

阅读全文 »

这一篇讲一讲,在家里怎么搭建自己的服务器。 可能有人会说为啥不买云服务器呢?云服务器的优点是它非常方便,不用我们自己来维护,缺点是价格太贵。如果没有拿优惠的价格买的话,一个性能很普通的云服务器一年的成本就在¥1000左右,好一点的就得几千了。现在电脑性能高还便宜, 基本上一台两三千的台式机就能足以作为我们自己的家庭服务器来用了。 而且这个台式机的所属权是我们自己,而不是云服务器厂商。

自己搭建服务器最大的坑就是没有公网IP, 现在的家庭宽带基本上都没有ipv4的公网ip了, 但是一般都会给ipv6的公网ip,ipv6的公网ip需要自己到光猫里去配置,大家可以根据自己所在的地区和宽带运营商到百度上查相应的打开ipv6公网ip的教程。如果光猫连了路由器的话,也要在路由器里设置ipv6相关的选项,这些在网上都能很容易地找到,这里就不展开讲了,不同的光猫不同的路由器的配置都不太一样。

搞到的ipv6的公网ip通常都是动态ip,直接使用也不太方便,这时就要ddns出马了。如果有自己的域名的话可以在电脑上跑一个定时获取ip并修改域名解析的脚本就行了(可以参考这个项目 https://github.com/zeruns/-Python-aliddns_ipv4-ipv6 国内码云地址:https://gitee.com/zeruns/aliddns_Python),没有自己的域名那就可以用一些免费的ddns服务商提供的二级域名。

上面提到的是搞到公网ip的情况,那如果折腾了半天发现自己就是在运营商的内网里,怎么弄都只能拿到内网ip,那怎么办呢,这时就只能采用内网穿透的方案了,我用过好几个内网穿透方案,ngrok、nps、frp,大家都可以尝试下,其中ngrok适合偶尔用一下的情况,免费版有些限制速度比较慢,nps和frp都只是开源项目,需要自己在有公网ip的服务器上部署,nps有前端管理界面但是这个项目有几年不更新了,而且也不太稳定,frp一直在更新,用着十分稳定。我现在内网穿透方案就是frp。

用frp的话就又回到最开始的话题了,不是自已搭服务器吗,咋还要买云服务器呢,因为没有公网ip的话就无法在外网环境下访问我们自己的服务器了,这时就可以买一个最低配置的云服务器来作跳板,我现在用的跳板服务器是一个阿里云的1核512MB内存的突发性能实例机器,当时一口气买了五年不到600块钱,带宽的话我选用的是按流量计费,0.8元1GB。如果不买云服务器也可以在淘宝上买现成的frp服务,一般这类服务都有端口数限制和带宽限制,也就是只能映射几个端口。

阅读全文 »

说到截图,可能大家想到的是 Ctrl+Alt+A 这个QQ提供的非常好用的截图快捷键,好像截图是一个非常简单的功能,基本上所有的系统都会有嘛。

但对于嵌入式设备来说,截图这一功能其实并不是那么容易实现。嵌入式设备碎片化特别严重,运行的操作系统大多经过裁减,采用的显示方案也各有不同,要针对不同的设备进行适配。目前最好用最方便的方案是用ffmpeg来截图。

这里我会讲针对嵌入式Linux设备的四种截图方案:

  • wayland下基于wayland debug protocolweston-screenshooter
  • xwindow下基于framebuffergsnap
  • 通过ffmpeg来截图
    • wayland下采用 kmsgrab 截图
    • xwindow下采用 fbdev 截图

weston-screenshooter

阅读全文 »

go语言中是有goto语句的,最好不要使用goto语句,能用goto的地方都可以用其他语句来代替,我们在平常编程过程中大概永远都不会用到goto语句。

goto语句过于强大,可以在程序各处来回横跳,胡乱使用的话会导致代码无法理解。

在c/c++中我们为了跳出嵌套循环会使用goto,而go语言中可以用break实现相同的操作。

go语言之所以保留了goto语句,是因为在一些特殊情况下goto可以大大简化代码。

go语言的goto有一些语法上的限制。go禁止用goto跳过变量的声明,禁止直接跳到代码块内部。

阅读全文 »

在c/c++中switch只能处理整型或枚举,而且忘记写break的话会执行下一个case中的语句,容易出错。 go语言中的switch相比c/c++要强大很多,非常好用。

支持任意类型

go语言switch处理的变量可以是任意支持用==进行判断的类型。我现在最常用的就是对字符串用switch判断,匹配到相应的值就进入对应的分支。

1
2
3
4
5
6
7
8
9
10
11
12
var command string
fmt.Scanf("%s", &command)
switch command {
case "version":
fmt.Println("v 1.0.0")
case "haha":
fmt.Println("hehe")
case "你好":
fmt.Println("世界")
default:
fmt.Println("我不理解")
}

输出:

阅读全文 »

go语言的循环语句都是通过for来实现的,简洁优雅。它支持四种写法:

  • 完整形式
  • 类似于while的条件循环
  • 死循环
  • for-range循环

下面来简单说一下吧,有过其他编程语言经验的话看一眼就明白了。

完整形式

这就是我们最熟悉的for语句了。

阅读全文 »
0%