UNEN
wukong

UNEN

[TOC]

阿里云

域名 unen.cn 公司

服务器 47.107.224.216 Windows Server 2012R2 悟空

服务器配置及备案

备案

服务器在悟空账户 域名在公司账户

登录悟空账户 进入备案管理

image

复制备案服务号 切换到公司账户

image

切换公司账户后 进入ICP备案系统 填写基本信息后 将复制的备案服务号 粘贴到 ECS实例中

已弃用的方案windows

FileZilla

远程连接 教程

配置阿里云oss做media库

教程

解决远程无法连接问题

  1. 启动wimRM服务 教程

  2. 在本地服务器中 启动远程管理

  3. 安装远程协助 教程

  4. 在高级属性中 打开远程协助

1.解决80端口被占用问题

  1. 使用管理员身份运行 shell
  2. net stop http //停止系统http服务
  3. sc config http start= disabled //禁用服务的自动启动,此处注意等号后面的空格不可少

2.开放80端口

控制面板—防火墙—高级设置—高级设置—出站规则—最右边 新建规则“新建出站规则向导”,在向导的第一步,选择要创建的防火墙规则类型,选择第二个“端口”。

再增加 入站规则

开放80 命名为 unen

更换为linux服务器

被window服务器折磨到不行,现更换服务器为linux,现在本地测试成功在,再更换服务器后进行部署。

mysql的安装与远程登录

下载与安装
1.下载安装包

下载链接 选择对应版本 这里选用的是 Linux-Generic

2.安装依赖库
1
2
apt install numactl
apt install libaio-dev
3.解压到指定目录

解压tar.xz文件:先 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx.tar 然后,再用 tar -xvf xxx.tar来解包。

1
2
tar -zxvf mysql-xxx
mv mysql-xxx /usr/local/mysql
4.添加文件夹、用户、设置权限
1
2
3
4
5
6
7
groupadd mysql
useradd -r -g mysql -s /bin/false mysql

mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files

5.初始化数据库
1
2
bin/mysqld --initialize --user=mysql 保存生成的临时密码 root@localhost: xxx

6.安装ssl服务
1
2
apt install openssh
bin/mysql_ssl_rsa_setup
7.复制服务文件

cp support-files/mysql.server /etc/init.d/mysql.server

登录msyql与修改密码
1.开启服务

&是后台运行的意思,执行命令之后,终端会卡在一个位置,再按一次enter即可

bin/mysqld_safe --user=mysql &

2.使用root登录并改密
1
2
3
4
5
6
7
bin/mysql -uroot -p 输入之前保存的随机密码

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password' PASSWORD EXPIRE NEVER;
use mysql;
update user set host='%' where user = 'root';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'new password';
flush privileges;
3.配置mysql为全局变量
1
2
3
sudo nano /etc/profile
export PATH=$PATH:/opt/software/node-v8.9.3-linux-x64/bin/node //增加并保存
//修改好配置文件后执行source /etc/profile 或者 source /root/.bashrc使配置文件生效
mysql问题集锦

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

/etc/init.d/mysql.server start

配置python开发环境

默认设为python3和pip3

sudo rm -rf /usr/bin/python
删除后再建立新的链接关系:
sudo ln -s /usr/bin/python3 /usr/bin/python

sudo apt-get install python3-pip

设置pip3同上

问题集锦

安装mysqlclient报mysql_config not found教程

服务器开发

Django

开发环境

软件列表

python mysql navicat

安装mysql8.0

下载链接

安装教程

shell下登录mysql mysql -uroot -p

修改密码ALTER USER "root"@"localhost" IDENTIFIED BY "你的新密码";

python虚拟环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pip install virtualenv  安装模块虚拟环境模块

pip install virtualenvwrapper-win 安装环境管理模块

mkvirtualenv testenv 新建环境在Administrator/Envs/

mkvirtualenv --python=python版本的python.exe路径 虚拟环境名称 指定版本

rmvirtualenv <name> 删除环境

workon 查看当前虚拟环境

workon <name> 进入虚拟环境 (在shell下运行)

deactivate退出环境
安装依赖的包

导出 pip freeze >r.txt

新建 r.txt文件 pip install -r r.txt安装

1

项目开始

创建项目
1
2
3
4
django-admin startproject mysite 创建django项目
python manage.py runserver 8080 设置端口号
python manage.py runserver 0.0.0.0:8080 监听所有公共ip
python manage.py startapp <name> 创建应用后在INSTALLED_APPS中增加 <name>
搭建目录文件

apps 存放应用列表 同时在setting 中增加 sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

log 存放日志

media 存放上传文件 增加 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

static 全局静态文件 js css 静态图片 STATIC_URL 后增加STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

templates 网页模板 在 TEMPLATES 下的DIRS中增加 os.path.join(BASE_DIR, 'templates')

配置数据库

先配置 MySQLdb驱动 下载对应版本后

虚拟环境下 pip install xx.whl pip install mysqlclient

1
2
3
4
5
6
7
8
9
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'MOOC',
'USER': 'root',
'PASSWORD': '1234',
'HOST': '127.0.0.1',
}
}

python manage.py makemigrations

python manage.py migrate

创建超级用户

python manage.py createsuperuser

wukong 1234

应用开发

models
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models


# Create your models here.
class UserMessage(models.Model):
name = models.CharField(max_length=20, verbose_name=u'用户名') # 对字段的注释
email = models.EmailField(verbose_name=u'邮箱')
address = models.CharField(max_length=100, verbose_name=u'地址')
message = models.CharField(max_length=500, verbose_name=u'留言信息')


class Meta:
verbose_name = u'用户留言信息'
verbose_name_plural = verbose_name
# db_table='user_message' # 指定表名
# ordering = '-id'

根据现有数据库建立model

创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致
运行下面代码可以自动生成models模型文件
python manage.py inspectdb
这样就可以在命令行看到数据库的模型文件了

把模型文件导入到app中
创建一个app
django-admin.py startapp app
python manage.py inspectdb > app/models.py

用户的登录和注册
1
2
3
4
# 重定义验证方式
AUTHENTICATION_BACKENDS = (
'users.views.CustomBacked',
)

安装 django-simple-captcha APPS 下增加 captcha

附加包开发

xadmin

下载xadmin 链接

新建extra_apps 文件夹 将xadmin 复制到其中 注册xadmin和crispy_forms 将extra_apps 加入系统路径

配置后需要更新数据库

个性化配置

1
2
3
4
5
6
7
8
9
10
11
12
13
class BaseSetting(object):  # 设置主题
enable_themes = True
use_bootswatch = True


class GlobalSettings(object): # 设置标题
site_title = 'WMOOC'
site_footer = 'Wukong'
menu_style = 'accordion' # 折叠目录

xadmin.site.register(views.BaseAdminView, BaseSetting)
xadmin.site.register(views.CommAdminView, GlobalSettings)

增加djagno主题失败后 教程

template

1
2
3
4
5
data-url="{{MEDIA.URL}}{{course_org.image}}"
# settings.py context_processors中增加
# 将 MEDIA.URL 注册到 html
django.core.context_processors.media

页码

pip install django-pure-pagination

INSTALLED_APPS=(

‘pure_pagination’,
)

peewee

简介和配置

实际开发中,如无特殊需求,一般不会直接写 SQL,而是用更为方便的 ORM(对象关系映射,Object Relational Mapping)。顾名思义,就是将关系型数据库与 Python 中的对象关联起来,提供了一种操作数据的简便方式,相当于对数据库加了一层更友好的接口。

目前 Python 中比较流行的 ORM 解决方案有三种:

  1. Django ORM。使用方便,但很难脱离 Django 单独使用。
  2. SQLAlchemy。功能强大,成熟可扩展,但学习门槛较高。
  3. peewee。轻量,可扩展,易学习,但功能有限。

安装peewee,然后shell下运行 导出数据库中的模型,参考链接: pwiz-a-model-generator

python -m pwiz -e mysql -H localhost -p 3306 -u root -P password unen >db.py

在同目录下新建py文件

1
2
3
4
from db import *

for i in ProductPction.select():
print(i.type)

Querying

教程链接

  • Model.create(), for executing INSERT queries.
  • Model.save() and Model.update(), for executing UPDATE queries.
  • Model.delete_instance() and Model.delete(), for executing DELETE queries.
  • Model.select(), for executing SELECT queries.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# save
User.create(username='Charlie')

user = User(username='Charlie')
user.save()

huey = User()
huey.username = 'Huey'
huey.save()

# foreign key
tweet = Tweet.create(user=huey, message='Hello!')
tweet = Tweet.create(user=2, message='Hello again!')

data_source = [
{'field1': 'val1-1', 'field2': 'val1-2'},
{'field1': 'val2-1', 'field2': 'val2-2'},
# ...
]

for data_dict in data_source:
MyModel.create(**data_dict)


# This is much faster.
with db.atomic():
for data_dict in data_source:
MyModel.create(**data_dict)


# We can INSERT tuples as well...
data = [('val1-1', 'val1-2'),
('val2-1', 'val2-2'),
('val3-1', 'val3-2')]
fields = [MyModel.field1, MyModel.field2]
# But we need to indicate which fields the values correspond to.
with db.atomic():
MyModel.insert_many(data, fields=fields).execute()

with open('user_list.txt') as fh:
# Create a list of unsaved User instances.
users = [User(username=line.strip()) for line in fh.readlines()]

# update
query = Stat.update(counter=Stat.counter + 1).where(Stat.url == request.url)
query.execute()

subquery = Tweet.select(fn.COUNT(Tweet.id)).where(Tweet.user == User.id)
update = User.update(num_tweets=subquery)
update.execute()

# delete
user = User.get(User.id == 1)
user.delete_instance()

# Selecting a single record
User.get(User.id == 1)
User.get_by_id(1) # Same as above.
User[1] # Also same as above.
User.get(User.id == 1).username
User.get(User.username == 'Charlie')
user, created = User.get_or_create(username=username)

# Selecting multiple records
>>> query = User.select()
>>> [user.username for user in query]
['Charlie', 'Huey', 'Peewee']
>>> query[1]
<__main__.User at 0x7f83e80f5550>
>>> query[1].username
'Huey'

>>> query = User.select().dicts()
>>> for row in query:
... print(row)

{'id': 1, 'username': 'Charlie'}
{'id': 2, 'username': 'Huey'}
{'id': 3, 'username': 'Peewee'}

# orderding
Tweet.select().order_by(-Tweet.created_date)






客户端开发

树莓派

硬件

  • 树莓派Raspberry3b+主板
  • 外接显示屏,支持HDMI接口(系统默认只支持HDMI显示)
  • 3.5寸触摸屏显示器-LCD屏幕(需要系统单独按照驱动)
  • 16GB TF卡
  • 读卡器
  • 鼠标(usb有线)
  • 键盘(usb有线)
  • HDMI连接线
  • 5V2A的电源和micro usb线

软件

  • SD Formatter(格式化工具)
  • Win32DiskImager(烧录工具)
  • 2018-11-13-raspbian-stretch.img(镜像文件)

配置

用”SD Formatter”格式化TF卡后,再将镜像烧录到其中 插入树莓派 接入显示器,鼠标,键盘后启动。

重点:烧录完成后,不要点击格式化TF卡!!!

无线连接

开启VNC SSH GPIO

image

image

putty

在TF-卡中新建文件 ssh (系统默认不开机ssh)

登录路由器管理界面查询树莓派的ip地址

image

服务器下载并安装putty 输入上图中的IP 开始连接默认用户名 pi 密码 respberry

image

VNC Viewer

putty登录后在终端输入 sudo raspi-config

选择 5.INterfacing Options

再选择 P3 VNC

服务器下载并安装VNC Viewer

image

IP与MAC地址绑定

登录路由器管理界面后,在高级设置中

image

添加IP与MAC地址绑定

更改VNC分辨率vncserver -geometry 1200x1366

更改后用IP+端口号登陆

更换源

sudo nano /etc/apt/sources.list

注释第一行 增加 deb https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi

同步更新源 sudo apt-get update

升级软件包 sudo apt-get upgrade

Linux教程

关机重启

ctrl + alt + t打开终端

1
2
3
4
5
6
7
8
9
10
11
12
#关机
sudo shutdown -h now
sudo poweroff
shutdown -r重启 -c 取消 now 现在 20:25 今天的20:25 +10 10分钟后关机

#重启
sudo reboot
sudo shutdown -r now

#注销
logout :退出 注销

系统目录说明

/ 根路径

这是Linux系统的“根”目录,也是所有目录结构的最底层。在UNIX以及和它兼容的系统中,”/“是一个单独的目录。

/boot

这个目录下包含系统启动文件(boot loader),例如Grub,Lilo或者Kernel,以及initrd,system.map等配置文件。

/sys

这个目录下包含内核、固件以及系统相关文件。

/sbin

包含系统操作和运作所必需的二进制文件以及管理工具,主要就是可执行文件。类似WINDOWS下的EXE文件。

/bin

包含单用户模式下的二进制文件以及工具程序,比如cat,ls,cp这些命令。

/lib

包含/sbin和/bin目录下二进制文件运行所需要的库文件。

/dev

内含必需的系统文件和驱动器。

/etc

内含系统配置文件,其下的目录,比如 /etc/hosts, /etc/resolv.conf, nsswitch.conf, 以及系统缺省设置,网络配置文件等等。以及一些系统和应用程序的配置文件。

/home

每一个用户的在这个目录下,都会单独有一个以其用户名命令的目录,在这里保存着用户的个人设置文件,尤其是以 profile结尾的文件。但是也有例外,root用户的数据就不在这个目录中,而是单独在根路径下,保存在单独的/root文件夹下。

/media

一个给所有可移动设备比如光驱、USB外接盘、软盘提供的常规挂载点。路径显示为/media/用户名/U盘名

/mnt

临时文件系统挂载点。比如,你并不想长期挂载某个驱动器,而是只是临时挂载一会U盘烤个MP3之类的,那么应该挂载在这个位置下。

/opt

在Linux系统中,这个目录用到的并不多,opt是 可选系统程序包(Optional Software Packages)的简称。这个目录在UNIX系统,如Sun Solaris用途要广泛的多。

/usr

用户数据目录,包含了属于用户的实用程序和应用程序。这里有很多重要的,但并非关键的文件系统挂载这个路径下面。在这里,你会重新找到一个 bin、sbin 和 lib目录,其中包含非关键用户和系统二进制文件以及相关的库和共享目录,以及一些库文件。

/usr/sbin

包含系统中非必备和并不是特别重要的系统二进制文件以及网络应用工具。

/usr/bin

包含用户的非必备和并不是特别重要的二进制文件。

/usr/lib

保存着/usr/sbin以及/usr/bin中二进制文件所需要的库文件。

/usr/share

“平台无关”的共享数据目录。

/usr/local

是/usr下的二级目录,这里主要保存着包含系统二进制文件以及运行库在内的本地系统数据。

/var

这个路径下通常保存着包括系统日志、打印机后台文件(spool files)、定时任务(crontab)、邮件、运行进程、进程锁文件等。这个目录尤其需要注意进行日常的检查和维护,因为这个目录下文件的大小可能会增长很快,以致于很快占满硬盘,然后导致系统便会出现各种奇奇怪怪的问题。

/tmp

顾名思义,这是一个临时文件夹,专门用来保存临时文件,每次系统重启之后,这个目录下的”临时”文件便会被清空。同样,/var/tmp 也同样保存着临时文件。两者唯一的不同是,后者 /var/tmp目录保存的文件会受到系统保护,系统重启之后这个目录下的文件也不会被清空。

/proc

这个目录是驻留在系统内存中的虚拟(psuedo,伪)文件系统,其中保存的都是文本格式的系统内核和进程信息。

LINUX系统目录结构图

image

基本命令
命令全称解释
man + 命令Manual手册 查询其他命令用法
pwdPrint working directory打印当前工作目录
cdChange directory切换目录
ls + -lList files列出目录下的文件
mkdirMake directory建立文件夹
rmdirRemove directory删除文件夹
catConcatenate串联?查看文件 合并文件
touchtouch新建文件
rmremove删除指定文件
clearclear清屏
treetree文件树
cpcope复制
mvmove移动/重命名
grep+字符串+文件名grep搜索
echo + 字符串 > 文件> 新建 >>增加输出内容到文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

rm扩展: -r 删除目录文件 -f强制删除无提示

tree扩展: -d 只显示目录

cp/mv扩展: -r 复制目录文件 -i 提示覆盖

cat扩展: -b空行不编号 -n全部编号

cat + 文件[文件>新文件] 合并文件

grep扩展: -n显示行号 -v反向选择 -i忽略大小写 ^a ke$


tar -cvf py.tar 01.py 02.py 03.py 文件打包(不压缩)

tar -xvf py.tar [-C dictionary] 文件解包 -z压缩为.gz -j压缩为.bz2

sudo apt install|remove|upgrade 软件名 sl 小火车 htop 系统进程

chown: Change owner 改变所有者

chgrp: Change group 改变用户组

chmod: Change mode 改变模式
insmod:Install module 安装模块
rmmod:Remove module 删除模块
lsmod:List module 列表模块

sudo是superuser do的简写

查看linux版本号:uname -a

比较两个文件:diff 1.c 2.c 或cmp 1.c 2.c

设置文件的读写权限:chmod u+w 1.c(增加文件拥有者对1.c写的权限)
chmod g-r 1.c( 删除工作组对1.c读的权限)
chmod o+x 1.c(增加其他用户对1.c的执行权限)
chmod a-w 1.c(删除所有用户对1.c写的权限)
chmod 777 -R aaa 更改目录及子文件子目录全部权限
chmod u=rwx,g=rw,o=r aa.py

u 所有者 g 所属组 o 其他用户
r=4 w=2 x=1

查看运行的进程:ps process status
杀掉某个线程:kill 1186(1186是线程号)

date 查询当前系统时间

df -h disk free 显示磁盘剩余空间 -h 人性化的方式显示文件大小

alias ll="ls -lh" 自定义命令的别名
unalias ll 取消别名

which ls 查看命令位置

树莓派实验室

RPi.GPIO 模块使用基础
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#导入模块
import RPi.GPIO as GPIO
#针脚编号
GPIO.setmode(GPIO.BCM)
#忽略警告s
GPIO.setwarnings(False)
#配置通道
GPIO.setup(channel,GPIO.IN,pull_up_down=GPIO.PUD_UP)
#输入 读取GPIO针脚的值
GPIO.input(channel)
#输出 设置GPIO针脚的输出状态 1/GPIO.HIGH/True
GPIO.output(channel,state)
#边缘检测 RISING FALLING BOTH
GPIO.wait_for_edge(channel, GPIO.RISING)

#清理
GPIO.cleanup()
#检测Raspberry Pi主板的修订版本
GPIO.RPI_REVISION
#检测RPI.GPIO的版本
GPIO.VERSION

#线程回调 边缘检测
def my_callback(channel):
print('这是一个边缘事件回调函数!')
print('在通道 %s 上进行边缘检测'%channel)
print('该程序与您的主程序运行在不同的进程中')
#回调加入开关防抖
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback,bouncetime=200)
#停止边缘检测事件
GPIO.remove_event_detect(channel)

使用 RPi.GPIO 模块的输入(Input)功能
1
2
3
4
"""
1.polling轮询 循环定时检查输入值
2.interruots中断 边缘检测 检测临界值 falling edge rising edge
"""
18B20温度传感器

坏了 2.68又买了一个 等快递
https://www.jianshu.com/p/1aeed4cfd431

DHT11温湿度传感器

参考项目

1.DHT11温湿度传感器的安装

电阻:4.7–10KΩ

接线原理图

image

接线实物图

2.收集传感器的信息

安装依赖的库

1
2
3
4
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install
sudo pip install RPi.GPIO

下载项目

1
2
3
sudo mkdir /env
cd env
git clone https://github.com/yfgeek/rpi-TempRuntime.git

修改项目

1
2
cd /env/rpi-TempRuntime
sudo nano DHT11-WITHOUT-LCD.py

修改humidity, temperature = Adafruit_DHT.read_retry(sensor, 26)中的26改为自己的GPIO#序号,humidity, temperature = Adafruit_DHT.read_retry(sensor, 4),保存退出。

历史数据以JSON格式存储在/env/rpi-TempRuntime/web/data/min(或者hour)

3.caddy部署

基本配置教程

1
2
3
curl https://getcaddy.com | bash -s personal
sudo mkdir /etc/caddy
sudo nano /etc/caddy/Caddyfile

输入

1
2
3
4
:80 localhost:8080 {
/env/rpi-TempRuntime/web
gzip
}

2019-02-12 DHT11温湿度监视图

image

第二个传感器

连接阿里云平台

在阿里物联网平台 添加产品树莓派 增加设备 SCADA

在开发板上安装nodejs 和 npm

使用官方工具包

配置python SDK

更改 默认python为python3 sudo rm -rf /usr/bin/python sudo ln -s /usr/bin/python3 /usr/bin/python

教程

不能正常升级时 教程

尝试三天后被迫放弃 官方SDK太烂 原以为我水平差看不懂 原来大家都看不懂…

还在公测阶段 选择方案3 socketio

 Comments