一. 任务及目标
打造一个基于智能手机端软件(APP或者微信小程序)远程可控的智能家居平台,实现可以远程关灯,通过摄像头远程视频监控现场的第一阶段任务。
目标:
- 熟悉使用linux及相关工具
- 熟悉云端服务器搭建及编程、手机端APP软件快速搭建及编程、硬件物端控制(给一个开发板如何快速掌握使用它的技巧)
- 撰写日志
- 选出每个STITP项目的小组长
二. 学习步骤
快速复原已有的项目大家参考我今年的毕业设计学长的毕业内容,顺序为
- 看视频介绍 — what— 知道已经完成的项目到底干了什么
- 粗看毕业设计论文—- 看整个项目都涉及到哪些知识点
- 看软件使用说明书 — how—知道怎么操作,搭建环境,还原整个项目
- 看源码 — where:知道哪段代码分别实现什么功能
- 细看毕业论文 — 如何针对这个项目,重撰写一篇报告,锻炼写作能力,如果能够基于这篇文章提出写个专利的思路最好。
要求每个人独立完成,但是可以相互交流,碰到问题大家在QQ大群里相互交流
三. 学习输出结果
- 日志文档:博客或者撰写类似日志文档,博客开放,日志文档一周在群里交流
- 演示视频:完成项目后通过录个小视频展示给大家交流
- 学习报告(格式自拟)
四. 学习时间
2020.6.15-2020.7.15
五. 学习资料
资料
- 微信小程序控制硬件(利用阿里工具模拟出的硬件)
https://edu.aliyun.com/course/1637/learn#lesson/12999 - 学长雷震豪毕业设计资料
链接:https://pan.baidu.com/s/13sH6GvB6pq71luzZA2yPog
提取码:hvzu
学长陆裕磊毕业涉及资料
链接:https://pan.baidu.com/s/1-AmHuXchvhZ6Lj1qI3tAgw
提取码:pt0l
复制这段内容后打开百度网盘手机App,操作更方便哦 - 有时间可以进一步学习的云、边、管、端相关资料https://edu.aliyun.com/course/1693 —-基于STM32的端到端物联网全栈开发
- 硬件及相关解决办法:开发板我可以提供,开发板资料:http://wiki.friendlyarm.com/wiki/index.php/Smart6818/zh 摄像头请大家自己购买或者自己解决涉及到的其它硬件到时可以给大家一起提供或者大家可以使用阿里物联网市场中虚拟设备进行使用资料请大家查看:https://help.aliyun.com/document_detail/73705.htmlspm=a2c4g.11186623.6.560.1e1b5dc2fC633r
2020/06/17日志
阅读完成论文的前两章,首先学习了本项目的研究的主要内容、意义、背景。明白了本系统的四大模块以及其各模块实现的功能以及所需要的关键技术;其次了解了项目的关键技术以及涉及到那些知识点,例如:WebRTC架构、NAT穿越技术、WebSocket通信协议、Golang语言等。
快速复原已有项目
看视频介绍 — what— 知道已经完成的项目到底干了什么?
整个系统划分为四大模块:对等连接模块、远程监控模块、远程登录模块、远程指令模块。
* 对等连接模块:设备的发现与建立连接。运行设备端程序,设备端将连接服务端,客户端窗口发现设备,点击设备后输入密码实现连接。
* 远程监控模块:建立连接之后可以在客户端窗口看到远程监控的画面,并且能够在Chrome自带的WebRTC调试工具中看到延迟值是否能够稳定在较低的水平。
* 远程登录模块:系统能够支持客户端SSH远程登录到设备端。使用远程登录的用户名与密码登录。
* 远程指令模块:客户端可以向设备端下达JSON格式的指令。实现3个LED灯的开关控制与状态的查询。
粗看毕业设计论文—- 看整个项目都涉及到哪些知识点?
对等连接模块
1.设备端设备通过WebSocket连接服务端。
2.设备端需要定时发送心跳包来维护自身的在线信息,客户端可以使用HTTP的GET方法来从服务端获取当前在线设备表
3.客户端产生offer SDP发送给设备端,设备端返回answer SDP 来完成SDP交换。通过WebRTC建立对等连接。
* webRTC:基于网页的视频会议,通过浏览器使用Javascript(因为数据传输和转发需要后台的服务支撑来转发)达到实时通讯。最主要的特征就是可以实现端到端的及时通信,从而减少服务器的压力,减少了延迟,提高稳定性,是WebRTC的关键。WebRTC架构:网页应用程序(Web APP)、网页程序开发接口(Web API)、WebRTC本地的C++应用程序开发接口(WebRTC Native C++ API)、传输与会话协议(Transport/Session)、音频引擎(VoiceEngine)和视频引擎(VideoEngine)六大组成部分。
* WebSocket:基于TCP协议的持续性长连接的双全工的通信协议。与HTTP协议不同(只能由客户端发起通信,服务端不能主动向客户端推送信息,发送并收到请求后便结束)。
* SDP:规范多媒体特征的会话协议,可以在会话建立的过程中,描述双方将要传输的媒体类型、使用的编码方案额传输协议、ICE的信息等。
* NAT(网络地址转换)穿越技术:是一种为了解决IPv4地址短缺而提出来的方案,是一种可以将内部私有网络地址映射到公共网络地址的技术。对WebRTC来说至关重要,webrtc只要有三种穿越技术:STUN、TURN、ICE.
* STUN:基于Client/Server和Request/Response模式的轻量级的网络协议。允许位于NAT之后的客户端找出自己的公网IP与NAT的类型,将自己绑定到公网的一个固定的端口上。
* TURN:是一种资料传输协议,属于中继协议,可以帮助两个主机之间建立通信。包的延迟和丢包几率增大。
* ICE:是一个框架,会自动根据不同的NAT类型和网络状态使用适合的技术进行NAT穿越。
远程控制模块
1.视频采集与推流
使用Gstreamer完成视频采集,Gstreamer的Pipeline的设计为采集时对视频预处理,gst-launch工具用来配置Pipeline
2.视频的播放
将vedio标签的参数以及定义进行配置在HTML5中实现视频播放
远程登录模块
远程登录方案:SSH方案
远程指令模块
1.控制设备端的各个GPIO口
2.使用JSON作为指令格式
系统测试
使用了Chrone自带的WebRTC调试工具webrtc-internals测试系统的延迟和抖动
其他知识点的应用
使用go语言开发WebRTC信令服务器、设备端程序,使用Web前端技术实现Web客户端。
Golang语言:语法上和C语言相似,最核心的特点便是拥有低开销的协程与CSP并发模式,使其适合处理信令服务这种高并发的场景。
2020/06/18日志
GO语言环境安装
1.软件下载及环境配置:实现能使用Git在vscode上打开运行并运行程序main.go程序
2.写hello.go程序
- 不能自动引用包:使用vscode中的Auto inport插件或gopkgs插件
- 使用Git运行hello.go时出现cannot refer to unexported name fmt.println(不能够应用未导出的名称fmt.println).原因;Go中规定模块中药导出的函数必须首字母大写.所以应该写成fmt.Println().
2020/06/23日志
设备端环境配置
VMware虚拟机下载及安装。参考教程
可能出现问题:此安装程序要求您重新启动系统已完成Microsoft VC Redistributable安装然后重新运行该安装程序
解决办法:下载Redistributable并安装。参考教程链接在虚拟机上安装Linux系统(Ubuntu):1.下载镜像;2.ubuntu虚拟机的建立:2.安装ubuntu系统。参考教程链接
Ubuntu下安装git
sudo apt-get install git
Ubuntu安装Golang 参考教程链接: 1.查看Ubuntu版本;2.下载安装包;3.在ubuntu中解压并安装(在下载目录下打开Terminal命令);4.环境配置
出现问题1:解压时输入命令 sudo tar -C /usr/local -xzf go1.14.4.linux-amd64.tar.gz 时出现 tar: You may not specify more than one
-Acdtrux' or
–test-label’ option Trytar --help' or
tar的错误提示。
解决办法:把-C写成了小写的-c
验证成功问题解决:在/usr/local下有go文件
出现问题2:在修改配置(输入gedit /etc/profile)文件后不能够保存修改后的文件。出现could not save the file/../的错误提示。
解决办法:由于该文件默认是只读的,我们使用管理员权限在前面加sudo(sudo gedit /etc/profile)
出现问题3:输入source ~/profile来更新配置后运行main.go文件不成功,出现
解决办法:退出登录(log out)后重新登录
- Ubuntu安装gstreanmer 参考教程
2020/06/24日志
云服务端的git安装与配置(git安装完毕并进行检验安装成功)
在阿里的云服务器上想要安装git,先运行apt-get update去更新镜像(否则提示安装失败,需要使用其他安装源来进行安装),然后使用apt-get install git去安装git。 与虚拟机ubuntu有点不同的是验证是否安装成功使用 git –version(虚拟机端使用git -v)。
云服务端golang环境配置参考教程
wget下载但是不能用tar安装
提示gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now
原因:使用wget命令直接下载的JDK是问题的根源。
去Oracle官网下载过jdk的童鞋应该都知道,下载之前需要同意Oracle的安装协议,不然不能下载,但是用wget的方式,默认是不同意,此时下载下来的安装包仅仅名字是和正常的安装包一样,实际上并不是一个完整的安装包,所以在Linux上解压一直失败。
解决办法:使用Xftp软件连接云服务器和本地传送本地下载好的压缩包到云服务器文件夹中。
输入rz命令没有出现本地窗口,而是打印出waiting to receive.和一串不明其意的字符。因为rz命令需要终端的支持(即rz命令是在客户端里面执行的),比如终端就是你用来连接远程服务器的客户端,像是 XShell、rxvt、putty、SecureCRT。
2020/07/01日志
问题1:在设备端运行go run main.go 提示Temporary failure in name resolution(域名解析暂时失败);使用terminal使用ping baidu.com显示同样的问题。
分析原因:最主要的原因为DNS出现问题
解决办法:将虚拟机关机,重启后会自动更新配置DNS
问题二:成功运行设备端还有云服务器端后软件网址(ip:8080)打不开
分析原因:阿里云安全组规则没有设置。安全组规则(允许或禁止安全组内的ECS实例对公网或私网的访问)
解决办法:打开控制台 -> 安全组规则 -> 入方向 -> 手动添加 -> 允许8080端口
2020/07/03 日志
NanoPC T4开发板的学习 NanoPC-T4/zh资料, 视频学习网址
- 功能与特点
1.支持Android7.1和Lubuntu desktop两种系统,且均带有GPU和VPU加速处理;
2.标配了LPDDR3的4G内存、16G闪存、2.4G & 5G双频WIFI模组、可直接安装使用NVME SSD高速固态硬盘;
3.拥有MIPI-CSI双摄像头接口、MIPI-DSI和eDP双显示接口、HDMI 2.0视频输出口、千兆以太网口、红外接收等;
4.非常适合广告机、游戏主机、视频会议、智能监控、集群计算、虚拟现实、机器视觉、计算机视觉、深度学习、人工智能方面学习。
串口调试开发工具:puTTY 下载地址
能够成功连接,开发板需要密码才能进去对开发板进行程序烧写
使用烧写工具win32DiskImager将程序烧写到SD卡,然后开发板从SD卡自启动系统
2020/07/06 日志
设备端Linux无法解析主机地址(could not resolve host:github.com)
Goproxy配置
问题1:http://proxy.golang.org/github.com/gorilla/websoket/@v/v1.4.2.mod:dial tcp XXXXX:443:connect:connect refused
原因:proxy.golang.org 是官方默认代理,国内被墙了
解决办法:进去goproxy.cn 重新配置fatal: could not create work tree dir ‘xxxx’: Permission denied
go:writing go mod cache: mkdir /home/go: permission denied
原因:创建文件夹要求被拒绝,使用权限问题
解决办法:使用 sudo su - 命令切换到管理员用户运行测试摄像头好坏
开发板连接wifi
ice服务器地址配置(未完成)教程
更改videosrc
2020/07/07 - 08日志
- 用官方的webrtc测试工具chrome://webrtc-internals来检测一下网络部分的延迟
客户端连接设备端,找到设备端点连接后有将近30秒的延迟
问题原因:
解决办法;
- ssh远程控制
问题1:连接后键盘不能立即输入内容,只能输入数字
原因:网络延迟
解决办法:使用Xshell登录ssh(使用串口调试ifconfig命令查询设备端ip地址)或者等待片刻()
问题2:连接运行只能在同一网络下实现,不能在设备端使用网线客户端使用wifi的条件下使用。
ssh远程登录的两种办法:1.口令登录;2.公钥登录
使用输入输入GPIO接口点亮小灯(发光二极管) 教程
点亮开发板上的灯(STATUS_LED)
看板子上一共有两个灯,一个是电源灯(PWR_LED),一个是状态灯(STATUS_LED)。刷好系统后,正常开机状态灯是会一闪一闪的,默认状态灯是作为系统时钟的心跳灯,不断闪烁,表示系统正常运行。
1.进入 status_led 目录
2.现在是 heartbeart ,我们要想控制状态灯,需要将触发条件改为 none
root@NanoPC-T4:/sys/class/leds/status_led# echo none > trigger
root@NanoPC-T4:/sys/class/leds/status_led# cat trigger
[none] rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock mmc0 mmc1 timer oneshot heartbeat gpio cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 default-on rfkill0 mmc2 rfkill1 rfkill2 rfkill3
3.使用 brightness 文件来控制状态灯
root@NanoPC-T4:/sys/class/leds/status_led# echo 1 > brightness // 灯亮
root@NanoPC-T4:/sys/class/leds/status_led# echo 0 > brightness // 灯灭
点亮发光二极管 教程
通过ssh远程连接点亮led_1灯
root@NanoPC-T4:/sys/class/gpio# ls
export gpio156 gpiochip0 gpiochip128 gpiochip32 gpiochip64
root@NanoPC-T4:/sys/class/gpio# echo 32 > export // 导出gpio1_A0(3v)
root@NanoPC-T4:/sys/class/gpio# ls
export gpio32 gpiochip128 gpiochip64 unexport
gpio156 gpiochip0 gpiochip32 gpiochip96
root@NanoPC-T4:/sys/class/gpio# cd gpio32
root@NanoPC-T4:/sys/class/gpio/gpio32# ls
active_low direction power uevent
device edge subsystem value
root@NanoPC-T4:/sys/class/gpio/gpio32# cat direction //查看GPIO方向
in
root@NanoPC-T4:/sys/class/gpio/gpio32# echo out > direction // 设置GPIO口为输出
root@NanoPC-T4:/sys/class/gpio/gpio32# echo 1 > value // 输出高电平(灯亮)
root@NanoPC-T4:/sys/class/gpio/gpio32# echo 0 > value // 输出低电平(灯灭)
控制三个灯的亮灭
led_1
- 写 init.sh 文件 (记住使用chmod 777 init.sh命令加执行权限)
因为每次重启开发板都会格式化掉我们对gpio的修改(导出gpio及配置端口)。这个脚本是每次重启以后手动执行的一个脚本,因为我当时用到三个gpio嘛,如果收到export需要三次,还要来回切文件夹,还有每个单独设置成输出口,怪麻烦的 我就写了一个脚本,把这些shell指令整合在了一个脚本里 只需要执行一次脚本,就能完成三个Gpio的初始化。
问题1:./init.sh: line 3: echo: write error: Device or resource busy
原因:资源已经存在,端口已经导出
解决办法:等下次重启系统的时候可以运行 init.sh
问题2:在网页端运行 control 点亮灯报错{“result”:”failure”,”msg”:”invalid character ‘;’ after object key:value pair”,”timestamp”:1594220257}
原因:
2020/07/09 日志
- 学习Matrix - CAM1320/zh原理及使用
2020/07/13 本周学习目标
本周学习目标
1.制作使用控制板子的视频(web端小灯的亮灭)
2.总结文档
3.使用阿里云物联网平台在mqtt写一下使用微信小程序实现触摸传感器控制灯的亮灭和蜂鸣传感器、温湿度传感器数据采集
golang语言学习:
1.Go 语言的出现是因为我们认为谷歌需要它,云计算需要一种支持并发和易于部署的编程语言;Go 语言是谷歌员工设计的,目的是让谷歌相关程序的开发变得更容易,尤其是部署在联网服务器上的程序
2.可以直接编译成机器码,不依赖其他库(拷文件给别人,不需要配置环境,直接运行)
2.并发性的优势,正如 Cloudflare 的 John Graham-Cumming 所言,“我是为了并发而来,为了组合而留”
3.Go 或 Golang 是一种静态类型的语言(类型在编译之前就需要确定,在编译的时候需要先编译,将源码转换成目标代码,然后需要运行目标代码程序才能运行,比如C++、Java、Delphi、C#:运行速度快但注意的点比价多,大型项目推荐使用跟更稳定的静态类型的语言),具有诸如垃圾收集(就像 Java)、类型安全性和某些动态类型功能等特性
4.Go 能像 Java、C 或者 C++ 一样拥有强大的并发处理能力,同时在保证并发执行代码严谨性的基础上,像 Erlang、python 一样优美
5.Go 像一些低级别的语言(如: C/C++ )一样是一门编译型语言,这意味着它的性能几乎接近于低级别语言,它还用垃圾回收(分配空间自动回收)来分配和删除对象
6.没有类,所有代码都仅用 package 分开,Go 只有结构体而不是类;不支持继承。 这将使得代码易于修改;没有构造方法、注解、泛型、异常
7.适合做什么:服务器编程、分布式系统、网络编程、内存数据库、云平台开发
go语言基础语法
1.在 Go 的世界里不用在每个语句后面加分号了
2.关于注释,完全就是C语言里的注释形式,// 或 /**/ 都是允许的。
3.在 Go 中第一个花括号 { 不能换行写,必须写在同一行,否则编译不过
4.任何在 Go 中定义的变量必须使用,如果定义了变量不使用,编译不过
5.Go 语言程序都由包构成,类似其他语言中的模块概念,主程序都从 main 包开始运行,程序开头是下面的语句:package main
6.go语言有且只有一个入口函数 main
导入包:
单独导入包
import os // 导入 os 包 (os 包 :中实现了一些 操作系统函数,不依赖平台的接口 )
import fmt /* 导入 fmt 包*/ (fmt 包:包内有格式化 IO 函数,类似 C 中的 stdio.h 和 C++ 中的 iostream ,初学者必备)
分组导入
import (
“fmt”
“os”
)
指定别名导入
可以在导入的时候指定导入包的别名,这样在调用包函数的时候,可以直接使用包别名。
import f “fmt” // 用别名f 代替 fmt
f.Println(“go go go”) // 用 f 代替了 fmt 调用 Println 函数
包导出名称约定
包中定义的函数或变量,如果是大小字母开头,那么它就是可以导出的,外部使用包的用户可以访问到,类似 C++ 中的 public 标识。相反,小写字母开头的名字外部无法使用,使用会报错
基本类型
- 内置类型
n位整型:(有符号)int int8 int16 int32 int64
(无符号整型)uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
使用vscode工具写golang 手把手教你搭建教程
- VSCode的Lunch.json配置 官方配置及解释
{
“version”: “0.2.0”,
“configurations”: [{
"name": "LaunchGo",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${fileDirname}",
"env": {
"GOPATH": "填自己的GOPATH路径",
"GOROOT": "填自己的GOROOT路径"
},
"args": [],
//"showLog": true
}
]
}
问题:go can’t find main module;see go help modules
原因:因为项目根目录下面没有 go.mod 文件,创建这个文件,这个文件里面用来管理 module 的
解决办法:1.进入当前工程目录下设置临时环境变量 go env -w GO111MODULE=on ;2.执行 go mod init 在当前目录下生成 go.mod 文件(若已存在则先删除再重新生成);go moudle介绍与使用
问题:: “could not import C (no package for import C)”
写一个运行脚本
加入新的传感器
使用小程序控制开发板进而控制客户端(7月底实现)