App Inventor开发

App Inventor 2

Android应用开发者(英语:App Inventor)是一款卡通图形界面的Android智能手机应用程序开发软件。它起先由Google提供的应用软件,现在由麻省理工学院维护及营运。

借助IA2 建立一个简易的游戏手柄。因为AI2 的蓝牙串口通讯协议是基于SPP(Serial Port Profile)串行端口配置。我们目的是并设定相对应代码,在手机发送,在树莓派解析,并对小车进行运动控制。

对应代码如下:

  • u –> 前进 gofront()

  • d –> 后退 goback()

  • l –> 左转 turnleft()

  • r –> 右转 turnright()

  • s –> 停止 istop()

每次代码运行周期为20ms

ai2截面图

树莓派蓝牙SPP设置

树莓派蓝牙配置

  1. 安装支持包

    1
    2
    sudo apt-get install pi-bluetooth
    sudo apt-get install bluetooth bluez blueman
  2. 添加pi用户到蓝牙组

    1
    2
    sudo usermod -G bluetooth -a pi
    service bluetooth status
  3. 启动/增加SPP

    1
    sudo nano /etc/systemd/system/dbus-org.bluez.service

    修改内容如下:

    1
    2
    ExecStart=/usr/lib/bluetooth/bluetoothd -C
    ExecStartPost=/usr/bin/sdptool add SP
  4. 重启,启动蓝牙串口

    1
    sudo rfcomm watch hci0

串口调试软件xgcom

1
2
3
4
5
6
7
sudo git clone https://github.com/helight/xgcom.git
sudo apt-get install make automake libglib2.0-dev libvte-dev libgtk2.0-dev
cd xgcom
sudo ./autogen.sh
sudo make
sudo make install
xgcom

展示与控制代码

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
import serial
import time
from btbu_robot.motor import motor
bluetooth = serial.Serial("/dev/rfcomm0",9600,timeout=0.5)

#bluetooth.open()
left = motor(22, 27, 17)
right = motor(24, 23, 18)
def gofront():
left.run(70)
right.run(70)
# print("前进")

def goback():
left.run(-70)
right.run(-70)
#print("后退")

def turnleft():
left.run(-70)
right.run(70)
#print("左转")

def turnright():
#print("右转")
left.run(70)
right.run(-70)

def istop():
left.run(0)
right.run(0)
#print("停止")

status = '' # 记录当前状态
if __name__ == '__main__':
while True:
data = bluetooth.readline().decode('utf-8')
if status == 'u': # 前进
gofront()

elif status == 'd': # 后退
goback()

elif status == 'l': # 左转
turnleft()

elif status == 'r': # 右转
turnright()

elif status == 's': # 停止
istop()
while data != '':
status = data[0]
if status == 'u': # 前进
gofront()

elif status == 'd': # 后退
goback()

elif status == 'l': # 左转
turnleft()

elif status == 'r': # 右转
turnright()

elif status == 's': # 停止
istop()
data = data[1:]
time.sleep(0.02)
time.sleep(0.02)

一个多月前和小伙伴熬了3天完成了2017数学建模,最后结果暂时还没出,估计也不理想。

但是好不容易写完论文,感觉排版不好,于是借助国赛\(\LaTeX\)模板,对论文进行重新排版,并且进一步完善。

经过前前后后一个月的时间,倒是做完了。现在看来,结果怎样倒是没什么了,有了这一次\(\LaTeX​\)排版的经验,反而收获不少。

顺便附上排版环境与最终论文:

  • 系统:Ubuntu 17.10 amd64
  • tex发行版本:texlive-2017
  • LaTex编译器:xelatex
  • bibTex编译器:xelatex
  • 编辑器:atom(插件:atom-latex language-latex pdf-view simplified-chinese-menu)

latex模板地址

拍照赚钱”的任务定价与任务分配的分析与探讨.pdf

WAV作为音频文件,其格式规则由微软和IBM共同制定。常用作无压缩的文件格式。

作为音频文件,文件特征包括:声道数,量化位数\((8bit, 16bit, 24bit)\),取样频率\((16khz, 22khz……)\)

wav格式文件所占容量\((B) = (取样频率 * 量化位数 * 声道数) * 时间 / 8\),除以8 的原因是因为 1字节 = 8bit

为了方便查看具体的编码的细节,我们首先先介绍下Ubuntu下一款16进制的文本查看器hexdump,其相应参数说明如下:

  • hexdump -C <== 规范的十六进制和ASCII码显示(Canonical hex+ASCII display )
  • hexdump -b <== 单字节八进制显示(One-byte octal display)
  • hexdump -c <== 单字节字符显示(One-byte character display)
  • hexdump -d <== 双字节十进制显示(Two-byte decimal display)
  • hexdump -o <== 双字节八进制显示(Two-byte octal display)
  • hexdump -x <== 双字节十六进制显示(Two-byte hexadecimal display)

比较来比较去,还是hexdump -C的显示效果更好些。

具体的编码方式定义如下:

起始地址 大小(byte) 数据块类型 内容
00H 4 字符 资源交换文件标志(RIFF)
04H 4 长整数 从下个地址开始到文件尾的总字节数
08H 4 字符 WAV文件标志(WAVE)
0CH 4 字符 波形格式标志(fmt ),最后一位空格。
10H 4 整数 过滤字节(一般为00000010H),若为00000012H则说明数据头携带附加信息(见“附加信息”)。
14H 2 整数 为1时表示线性PCM编码,大于1时表示有压缩的编码。这里是0001H
16H 2 整数 通道数,1为单声道,2为双声道。这里是0001H。
18H 4 长整数 采样频率,这里00001f40H = 8000 Hz
1CH 4 长整数 byte率(每秒平均字节数) = 采样频率×通道数×位数/8 003e80H = 16000 = 8000116/8
20H 2 整数 DATA数据块长度(字节)
22H 2 整数 PCM 位宽,0010H即16,一个量化样本占2byte。
随后2字节 2 整数 附加信息(可选,由上方过滤字节确定)
随后4字节 4 字符 数据标示符(data)
随后4字节 4 长整数 DATA总数据长度字节
随后 DATA数据块 00a640H = 42560

迁移原因

WordPress配置在腾讯云的centOS 6.8, 环境为镜像市场一键配置的。当初选择腾讯云的产品,是因为有学生优惠活动,2核/2G/1M带宽/20G硬盘+1年cn域名的使用权(12元每月)。但发现仅仅是做博客网站并不需要这样的配置,且cn域名也并非有我所想的域名。

一次偶然机会,在知乎上看到介绍国外的一些vps服务器,其中digital ocean(下简称DO)家的服务器最低每月5$ ,折合人民币35元左右,且通过github student packages能获得50 + 他人推荐码10,共60,共60的优惠,相当于第一年完全免费,加上一个国外的独立ip,意味着以前每个月的购买vpn的钱也可以省下来。长远看,还是相当划算。

因为WordPress的迁移,希望能更有自己的特色,就在阿里云购买的 liuchang.men 的新域名(10年/60元左右)。该域名和DO的服务器都不需要备案,这一点也很重要。(你永远也不知道在腾讯云cn域名备案,用了2个月才完全批下来的痛苦)

基于docker的wordpress迁移

DO下5$每月配置为:1G单核/512M内存/20G硬盘,整体配置在内存上略有缩水,但确实够用。带宽并未在官网列出,经过测试,大概有4M(500k/s)的上下行速度(美国纽约),这一点也为搭建shadowsocks提供了一个硬件基础。

以前服务器初次搭建WordPress时,本是Ubuntu下从零搭建,但发现极其繁琐,后通过镜像商场直接选择已有的镜像,但系统为centOS,自己不太熟悉。此次,在网上充分查阅后,发现基于docker的安装相当简单。

镜像选择

镜像选择Docker on 16.04 ,下列镜像本来有WordPress,但需要40G硬盘,不符合我们5$每月的需求

安装 WordPress Docker 镜像

1
sudo docker pull eugeneware/docker-wordpress-nginx

启动 WordPress 容器

1
2
3
4
# 创建容器
sudo docker run -p 80:80 --name docker-wordpress-nginx -d eugeneware/docker-wordpress-nginx
# 启动容器
docker start docker-wordpress-nginx

容器开机自启动

1
2
docker run --restart=always  xxxx       # 创建时参数
docker update --restart=always xxxx # 若创建时未指定,可后期update

访问网站 http:// + ip ,配置 WordPress

用wordpress自带的导入导出功能进行迁移

注意:关于WordPress后台地址被改导致无法登陆后台的简单解决方法

打开网站根目录下的wp-config.php文件,输入这一行代码

1
define('RELOCATE',true);

RELOCATE 的值为 true 时,就会在你登录后台的时候把 Wordpress(去后台地址)URL改为你当前输入的,这样就可以不用修改数据来重置地址。记得解决后修改。

基于docker的shadowsocks 配置

docker下用虚拟的方式配置一些环境确实方便,下面配置shadowsocks服务端也将基于docker

安装shadowsocks

1
sudo docker pull oddrationale/docker-shadowsocks

配置shadowsocks

1
sudo docker run -d -p 8888:8888 oddrationale/docker-shadowsocks -s 0.0.0.0 -p 8888 -k yourpassword -m aes-256-cfb

其中,-d为后台运行 , -p为端口映射 , -s为ip,0.0.0.0为采用默认本机ip, -k 为密码

shadowsocks客户端

附上github上shadowsocks的客户端链接:


2017-11-17更新:

原服务器因为未知原因,下行带宽被限制到0.1M,暂迁移到旧金山的DO,可以借助快照迁移完成。

附一张网速测试图:

0%