树莓派和路由:将树莓派打造成一台路由器

如果你想要一个装在口袋里的网络分享设备,树莓派可以做成一个很不错的路由器.

本次制作所用到的设备要求:

  1. 本地网络
  2. 一台电脑
  3. 运行Raspbian的树莓派
  4. 无线USB路由器
  5. HDMI连接线(可选)
  6. 键盘(可选)
  7. 路由器(可选)
  8. 有HDMI输入的监视器(可选)

如果树莓派已经设置好可以独立运行了.你不需要屏幕键盘鼠标-就是另外一台可以用SSH通过网络远程登录的电脑

需要下载的

  1. Older hostapd (只有apt下不到驱动的时候)

需要的知识,技术,能力

1,可以熟练操作计算机系统

2,基本的计算机术语知识

3,敢于在终端里敲命令.如果有必要也要敢于调整他们适合自己的开发环境

4,熟悉网络核心概念

所用到资源

  1. http://magpi.techjeeper.com/The-MagPi-issue-11-en.pdf
  2. http://www.pi-point.co.uk/documentation/
  3. http://blog.sip2serve.com/post/48420162196/howto-setup-rtl8188cus-on-rpi-as-an-access-point
  4. https://docs.google.com/file/d/0B3nsVzbJuBHVOWRJRDJacVd0S2s/preview?pli=1
  5. http://sirlagz.net/2012/08/11/how-to-use-the-raspberry-pi-as-a-wireless-access-pointrouter-part-3/
  6. http://www.raspberrypi.org/phpBB3/viewtopic.php?t=39096&p=393810
  7. http://unix.stackexchange.com/questions/119209/hostapd-will-not-start-via-service-but-will-start-directly
  8. http://www.daveconroy.com/turn-your-raspberry-pi-into-a-wifi-hotspot-with-edimax-nano-usb-ew-7811un-rtl8188cus-chipset/

概念总览

  1. 用apt-get安装做需要的组件
  2. 验证无线软件狗收发功能
  3. 配置/etc/network/interfaces
  4. 给你想要设置的接入点创建配置文件/etc/hostapd/hostapd.conf
  5. 把hostapd指向步骤4所创建的配置文件/etc/hostapd/hostapd.conf
  6. 老版本替代/sbin/hostapd
  7. 配置DNS
  8. 配置IPv4转发,使其可以连接网络

准备树莓派

确定你的树莓派是最新版本的,可以安装所有最新的安装包

sudo apt-get update
sudo apt-get upgrade

安装所需要的组件

以下这些组件都是设置接入点做需要的:

  • rfkill: 一个无线工具
  • zd1211-firmware: 很多Wi-Fi收发器通用的固件
  • hostapd: 无线接入点的守护进程
  • hostap-utils: 补充工具
  • iw: 无线网络的配置工具
  • dnsmasq: DHCP 和 DNS 工具
  • bridge-utils:  用来将多个以太网设备连接到一起

用以下命令安装这些组件:

sudo apt-get install rfkill zd1211-firmware hostapd hostap-utils iw dnsmasq bridge-utils

 配置无线收发器

验证软件狗已经被树莓派识别

检查树莓派已经识别Wi-Fi软件狗:

lsusb

验证Wi-FI软件狗支持接入点模式

如果执行下面这条命令没有任何输出是关于AP mode,那么就是说你的软件狗不适合本项目。但是如果有东西的话那就继续进行下一步。

iwlist

倒霉的是我的软件狗坏了,而且还有产生了一个”

nl180211 not found

”的错误,不过还好了继续执行下面这条命令:

dmesg | grep rtl

如果结果是类似这样的

[    6.240292] usbcore: registered new interface driver rtl8192cu

可能这个还是能干活的,接下俩会修复这个问题的.

配置网络接口

先做一个

/etc/nework/interfaces

的备份,然后在文本编辑器里打开,

改成下面这个样子的:

# Automatically brings up interfaces with ifup -a
auto lo
auto br0

# Loopback
iface lo inet loopback

# Keep eth0 as dhcp so it can connect to an existing router
# (Optional--I used this since I was configuring via SSH)
iface eth0 inet dhcp

# Bridge interface
iface br0 inet dhcp
        bridge_fd 1
        bridge_hello 3
        bridge_maxage 10
        bridge_stp off
        bridge_ports eth0 wlan0

# Allow hotplug
allow-hotplug wlan0
allow-hotplug eth0
iface wlan0 inet manual
iface wlan0 inet manual

重启

wlan0

接口

ifdown wlan0
ifup wlan0

 配置hostapd

接下来,做一个

/etc/hostapd/hostap.conf

的备份然后在文本编辑器里打开做一些改动(如果这个文件不存在请忽略第一条命令)

sudo cp /etc/hostapd/hostap.conf /etc/hostapd/hostap.conf.orig
sudo vi /etc/hostapd/hostap.conf

修改这个文件使之包含以下内容,读者根据自己情况自行改动(比如国家代码,网络名等等)

如果

iwlist

命令执行结果有之前提到的

nl80211 not found

错误,创建一个内容如下的文件:

interface=wlan0
bridge=br0
driver=rtl871xdrv
country_code=US
ctrl_interface=wlan0
ctrl_interface_group=0
ssid=RPiAP
hw_mode=g
channel=1
wpa=3
wpa_passphrase=password
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
beacon_int=100
auth_algs=3
macaddr_acl=0
wmm_enabled=1
eap_reauth_period=360000000

如果

iw list

命令执行出错,文件

/etc/default/hostapd

也是需要备份的(如果此文件存在的话).

sudo cp /etc/default/hostapd /etc/default/hostapd.orig
sudo vi /etc/default/hostapd

然后添加如下内容(千万不要注释掉)

DAEMON_CONF=”/etc/hostapd/hostapd.conf”

安装一个不同版本的

/usr/sbin/hostapd

也是很有必要的,从这里下载, 根据以往经验最好在编辑之前做一个备份:

sudo cp /usr/sbin/hostapd /usr/sbin/hostapd.orig

删除原始文件, 因为接下来将会在下载章节将其替换掉.

cd /usr/sbin
sudo rm -f hostapd
sudo wget http://dl.dropbox.com/u/1663660/hostapd/hostapd

为新文件设置适当权限

sudo chown root:root hostapd
sudo chmod 755 hostapd

重启hostapd服务以激活设置

sudo service networking restart
sudo service hostapd restart

如果hostapd重启之后有问题就试一下如下命令查看结果看是否你是否能找出配置文件中的错误并将其修复.

sudo hostapd -d /etc/hostapd/hostapd.conf

如果你现在用另外一台设备扫描的话应该能够可以看到无线网络了.但是如果想要其他人连上的话还是需要一些设置的.特别是

dnsmasq

配置dnsmasq

老规矩,备份先,然后仔仔文本编辑器里打开

sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo vi /etc/dnsmasq.conf

将以下行的注释符去掉然后根据你自己的环境配置

domain-needed
interface=wlan0
dhcp-range=192.168.2.1,192.168.2.254,12h

重启

dnsmasq

使设置生效,

sudo service dnsmasq restart

用其他设备尝试连接本网络,但是还是不能连上因特网的.

设置因特网转发

设置IPv4转发

sudo echo 1 > /proc/sys/net/ipv4/ip_forward

如果上述命令提示拒绝访问,试试下面这个:

sysctl -w net.ipv4.ip_forward=1

设置NAT

sudo iptables -t nat -A POSTROUTING -j MASQUERADE

其他适配器和用法

我之所以选择Wi-Fi软件狗的主要原因是因为我可以连接我的cantenna,然后可以扩展我的信号到很远的距离.当然用一个无线适配器会非常的简单,但是现在我需要的是天线上的灵活性.

 

树莓派和路由:将树莓派打造成一台路由器,首发于极客范 – GeekFan.net

Raspberry Pi 播放 1080p视频

看到网上说树莓派支持1080P视频的播放,专门下载了片子尝试,经常卡死。后来看到说超频后效果好一些。在xbian里面试验了一下,效果没有太大改善。

难道是硬盘原因?这个移动硬盘比较老,大概是5400转的。我通过网络尝试访问Pi,共享拷贝文件,居然只有20多k的速度,换了个比较新的硬盘,速度也没有改善多少,大概40多K,看样子不是硬盘的问题。

难道是usb hub的原因?这个hub比较老,难道是usb 1.0或者1.1的?在网上搜了一下,线材及usb hub本身原因,严重影响移动硬盘速度,甚至会损坏硬盘,所以不建议将硬盘接在hub上。将移动硬盘连直接接到Pi上,网络拷贝速度已经可以达到2.8M,虽然和电脑之间拷贝的20多M速度相比还很慢,已经算是可以接受了。用xbmc开始播放硬盘的1080P电影,果然不卡了,yeah!

 

总结,硬盘、摄像头之类的设备最好直接接在Pi上,鼠标键盘可以通过usb hub扩展,否则严重影响速度和效率。至于要不要超频,反而影响不是很大。

DO NOT use USB HUB to extend you movable disk or camera, it will slow down your read speed even you can not use it.

Adafruit的树莓派教程第十课:步进电机

概览

步进电机介于常规的直流电机(第九课)和伺服马达(第八课)之间。步进电机的优点在于它能够被精确定位,正向或反向一次性转动”一步”,并且也能够连续转动。

lesson10_1

这节课里,你将学到如何使用树莓派以及在第九课里已经用到的L239D马达控制芯片来控制一个步进电机。

这节课也将展示如何使用另外一种驱动芯片,ULN2803。

在这个项目里,你使用L239D或者ULN2803都是可以的。ULN2803更便宜一些,并且空余出来4个输出针脚你可以用来干点别的事,如果你两个芯片都没有,那还是选择ULN2803更好一些。

步进电机所需的电量很少并且所能承受的最大电流要小于直流电机和伺服马达。所以直接通过树莓派的5V输出并且保证电流是1A的情况下是可以直接驱动步进电机的。

你需要的:

5V步进电机

lesson10_2

L293D芯片

lesson10_3

ULN2803

lesson10_4

小块面包板

lesson10_5

树莓派

一把跳线

lesson10_6

硬件部分(L293D)

步进电机有5个引脚,所以L293D的两个半部都会用到。这意味着我们会在面包板上连接很多线。

步进电机的末端有5个接头。把跳线插入这些接头里这样就可以把电机连接在面包板上了。

lesson10_7

注意红色的引脚不连接任何线。

要通过引脚的颜色来区分而不是从它们伸出马达的位置。

<h4硬件部分(ULN2803)

如果你是用的是ULN2803,那步进电机的5个引脚都会被用到。

步进电机的末端有5个接头。把跳线插入这些接头里这样就可以把电机连接在面包板上了。

这个项目只适用于带有5个单级引脚的步进电机。

lesson10_8

尽管后面的代码里使用了GPIO的第18针,但只有在使用L293D芯片时才会用到它。

步进电机

步进电机使用锯齿状的转子和电磁配合推动转子一次转动”一步”。

lesson10_9

以正确的顺序给线圈通电,那么电机就会开始转动。转子的齿数与转动”一步”的角度精确对应。

我们现在使用的是8步步进电机,并且它有一个1:64的减速齿轮箱(reduction gearbox),所以它实际上转一圈需要 8*64=512步。

这节课里,我们不会使用红色的引脚。只有使用另外种类的不支持线圈电极反转的驱动芯片才会用到它。连接到两组线圈的中间意味着你就可以通过给左边或者右边的线圈通电来达到反转方向的目的而不用外接一个反转电流的电路。

因为我们使用的是支持电极反转的L293D芯片,所以我们就用不到红色的那个引脚了。可以通过这个芯片改变正负极来反转方向。

ULN2803

我们已经在第九课接触过了L293D芯片,而ULN2803也是一个非常有用的芯片。

lesson10_10

不像L293D有4个输出引脚可以反转电极,ULN2803有8个输出引脚可以把来自树莓派GPIO的输出信号放大转换成更大的电流。

与L293D不同的是,ULN2803只能输出一个方向的电流,所以这里我们要用到步进电机的红色引脚作为公用正极。并且每次只会用到线圈的一半,如粉色和橙色的部分,每次只有红色和粉色部分的线圈才会通电。

lesson10_11

软件部分

不过你用L293D还是ULN2803,软件部分都是一样的。

这个项目会用到Rpi.GPIO类库,如果你还没有装过,请参考第四课

要安装软件,你可以通过SSH连接到树莓派上然后通过下面的命令打开一个编辑器:

nano stepper.py

然后粘贴下面的代码,使用CTRL+X然后按一下Y保存。

lesson10_12

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

enable_pin = 18
coil_A_1_pin = 4
coil_A_2_pin = 17
coil_B_1_pin = 23
coil_B_2_pin = 24

GPIO.setup(enable_pin, GPIO.OUT)
GPIO.setup(coil_A_1_pin, GPIO.OUT)
GPIO.setup(coil_A_2_pin, GPIO.OUT)
GPIO.setup(coil_B_1_pin, GPIO.OUT)
GPIO.setup(coil_B_2_pin, GPIO.OUT)

GPIO.output(enable_pin, 1)

def forward(delay, steps):  
  for i in range(0, steps):
    setStep(1, 0, 1, 0)
    time.sleep(delay)
    setStep(0, 1, 1, 0)
    time.sleep(delay)
    setStep(0, 1, 0, 1)
    time.sleep(delay)
    setStep(1, 0, 0, 1)
    time.sleep(delay)

def backwards(delay, steps):  
  for i in range(0, steps):
    setStep(1, 0, 0, 1)
    time.sleep(delay)
    setStep(0, 1, 0, 1)
    time.sleep(delay)
    setStep(0, 1, 1, 0)
    time.sleep(delay)
    setStep(1, 0, 1, 0)
    time.sleep(delay)

def setStep(w1, w2, w3, w4):
  GPIO.output(coil_A_1_pin, w1)
  GPIO.output(coil_A_2_pin, w2)
  GPIO.output(coil_B_1_pin, w3)
  GPIO.output(coil_B_2_pin, w4)

while True:
  delay = raw_input("Delay between steps (milliseconds)?")
  steps = raw_input("How many steps forward? ")
  forward(int(delay) / 1000.0, int(steps))
  steps = raw_input("How many steps backwards? ")
  backwards(int(delay) / 1000.0, int(steps))

当步进电机不转动的时候,它也是处于激活状态的并且保持它的位置。这会耗电。如果你不需要步进电机保持它的位置,你可以调用setStep(0,0,0,0)来释放线圈。这样电机的转子就能自由转动并且不耗费电力了。

配置与测试

这个程序需要超级用户权限,所以要在ssh里受用下面的命令:

sudo python stepper.py

输入一个延时(5会是个合适的值)和转动的步数(512转一圈)。

lesson10_13

尝试减少延时来找到电机的最大速度吧。

Adafruit的树莓派教程第十课:步进电机,首发于极客范 – GeekFan.net

PHP的图片处理功能

在一个小项目里需要用到php的图像处理功能,才发现php通过imagefilter能够实现强大的功能。

imagefilter

(PHP 5)

imagefilter — Applies a filter to an image

Description

bool imagefilter ( resource $image , int $filtertype [, int $arg1 [, int $arg2 [, int $arg3[, int $arg4 ]]]] )

imagefilter() applies the given filter filtertype on the image.

Parameters

image
An image resource, returned by one of the image creation functions, such as imagecreatetruecolor().
filtertype
filtertype can be one of the following:

  • IMG_FILTER_NEGATE: Reverses all colors of the image.
  • IMG_FILTER_GRAYSCALE: Converts the image into grayscale.
  • IMG_FILTER_BRIGHTNESS: Changes the brightness of the image. Use arg1 to set the level of brightness.
  • IMG_FILTER_CONTRAST: Changes the contrast of the image. Use arg1 to set the level of contrast.
  • IMG_FILTER_COLORIZE: Like IMG_FILTER_GRAYSCALE, except you can specify the color. Use arg1arg2 andarg3 in the form of redgreenblue and arg4 for the alpha channel. The range for each color is 0 to 255.
  • IMG_FILTER_EDGEDETECT: Uses edge detection to highlight the edges in the image.
  • IMG_FILTER_EMBOSS: Embosses the image.
  • IMG_FILTER_GAUSSIAN_BLUR: Blurs the image using the Gaussian method.
  • IMG_FILTER_SELECTIVE_BLUR: Blurs the image.
  • IMG_FILTER_MEAN_REMOVAL: Uses mean removal to achieve a “sketchy” effect.
  • IMG_FILTER_SMOOTH: Makes the image smoother. Use arg1 to set the level of smoothness.
  • IMG_FILTER_PIXELATE: Applies pixelation effect to the image, use arg1 to set the block size and arg2 to set the pixelation effect mode.
arg1
  • IMG_FILTER_BRIGHTNESS: Brightness level.
  • IMG_FILTER_CONTRAST: Contrast level.
  • IMG_FILTER_COLORIZE: Value of red component.
  • IMG_FILTER_SMOOTH: Smoothness level.
  • IMG_FILTER_PIXELATE: Block size in pixels.
arg2
  • IMG_FILTER_COLORIZE: Value of green component.
  • IMG_FILTER_PIXELATE: Whether to use advanced pixelation effect or not (defaults to FALSE).
arg3
  • IMG_FILTER_COLORIZE: Value of blue component.
arg4
  • IMG_FILTER_COLORIZE: Alpha channel, A value between 0 and 127. 0 indicates completely opaque while 127 indicates completely transparent.

Return Values

Returns TRUE on success or FALSE on failure.

我用到的几个功能

imagefilter($dst_r, IMG_FILTER_BRIGHTNESS, -80);

The documentation misses the exact meaning and valid ranges of the arguments for ImageFilter(). According to the 5.2.0 sources the arguments are:
IMG_FILTER_BRIGHTNESS
-255 = min brightness, 0 = no change, +255 = max brightness

IMG_FILTER_CONTRAST
-100 = max contrast, 0 = no change, +100 = min contrast (note the direction!)

IMG_FILTER_COLORIZE
Adds (subtracts) specified RGB values to each pixel. The valid range for each color is -255…+255, not 0…255. The correct order is red, green, blue.
-255 = min, 0 = no change, +255 = max
This has not much to do with IMG_FILTER_GRAYSCALE.

IMG_FILTER_SMOOTH
Applies a 9-cell convolution matrix where center pixel has the weight arg1 and others weight of 1.0. The result is normalized by dividing the sum with arg1 + 8.0 (sum of the matrix).
any float is accepted, large value (in practice: 2048 or more) = no change

ImageFilter seem to return false if the argument(s) are out of range for the chosen filter.

 

 

You must add imagesavealpha($im, true); so the alpha channel will be saved on the new image.

$im = imagecreatefrompng('image.png');
imagealphablending($im, false);

imagesavealpha($im, true);

if($im && imagefilter($im, IMG_FILTER_COLORIZE, 0,0,255,0)) {
    imagepng($im, 'image-new.png');
    imagedestroy($im);
}

Adafruit的树莓派教程第九课:控制一个直流电机

概览

这节课我们来学习如何使用Python和L293D芯片控制直流电机的速度和转向。

lesson9_1

在第八课里,我们学习了如何使用小派产生脉冲来控制伺服马达的位置。这节课我们将使用脉冲和L293D马达控制芯片来控制一个直流电机的转速并交替变换它的旋转方向。

你需要的:

要完成这个项目,你需要下面一些东西。

1个树莓派
lesson9_2

1个树莓派扩展板
lesson9_3

一把公对公跳线
lesson9_4

1个小块面包板
lesson9_5

1个6V直流电机
lesson9_6

L293D马达控制芯片
lesson9_7

Adafruit Occidentalis 0.2及之后的操作系统
lesson9_8

4节5号或7号电池盒及电池
lesson8_8

PWM

PWM(Pulse Width Modulation,脉冲宽度调制)是一项用于控制电力的技术。在这里我们使用它来控制供给直流电机的电量及它的转速。

下面的图表展示了从树莓派的PWM针脚产生的脉冲信号。
lesson9_10

PWM针每1/500秒产生一次脉冲。脉冲的长度控制了直流电机所能获得的电量。没有脉冲电机就不会转动,一次短脉冲会使电机以很慢的速度转动。如果脉冲持续总长度一半的时间,那么它就会获得总电量一半的电量。

PWM核心模块

Adafruit与Sean Cross一起编写了一个核心模块被包含在了Occidentalis发行版里。更多的细节请参照这篇教程。如果你想在Raspbian或者其他发行版上使用这个模块,参考这里来把模块安装到你的环境里。

你已经在第八课里使用过了PWM与伺服马达核心模块,用于控制伺服马达。这一次,你将使用相同的模块来控制电机的转速。

这个模块使用文件类型的接口,你可以通过读写这些特定的文件来控制针脚输出进一步控制伺服电机的行为。这使得使用Python或者其他语言来编写该接口十分容易。

文件 – 描述
active – 1为激活,0为未激活。你可以通过读取它来查找输出针是否被激活,或者通过改写控制它的激活或未激活。
delayed – 如果设置为1,你对其他文件的改动不会起作用直到你使用上面的active来激活输出针。
mode – 改写文件来设置针脚是pwm,servo(伺服马达)还是audio(音频)。显然这里我们要设置为servo。注意这些针也会被小派的音频输出使用,所以你不能在使用声音的同时控制一个伺服马达。
frequency – 每秒产生的脉冲次数。
duty – 这个值应该介于0到100之间,代表了脉冲长度的百分比。数值越大,转速越快。

L293D

这是一个非常有用的芯片。它实际上可以独立控制两个电机。这节课我们将只使用芯片的一半针脚,在芯片右手边的大多数针脚用于控制第二个电机,但在树莓派上只有一个PWM输出针脚。

lesson9_11

L293D有两个+V的针脚(8和16)。+Vmotor(8)针为电机提供电力,+V(16)针作为芯片的逻辑针脚。我们将把第16针接到树莓派上然后把第8针接到电池盒上。

硬件部分

为什么我们要在这个项目里使用L293D芯片?有两个原因。第一个原因是小派似乎还没有强大到能够直接驱动一个电机并且这样做可能会损坏树莓派。

第二个原因是,在这篇教程里,我们即要控制电机的转速,也要控制电机的转向。要达到这一点,需要反转电机的电流方向,而L239D恰好就是被设计用来达到这一目的的,我们可以通过两个电机控制针脚实现。

lesson9_12

一小块面包板的大小很适合这篇教程。

软件部分

因为我们需要使用控制针脚(连接GPIO的第4针和第17针),所以我们也需要用到GPIO库。更多细节请参考第四课

有很多种方法能把下面的展示的代码弄到你的树莓派里。最简单的方法可能是使用SSH连接到小派上(参见第六课)然后使用下面的命令打开一个编辑器:

sudo nano motor.py

粘贴下面的代码,然后用Ctrl+X保存。

lesson9_13

代码在这:

import RPi.GPIO as io
io.setmode(io.BCM)

in1_pin = 4
in2_pin = 17

io.setup(in1_pin, io.OUT)
io.setup(in2_pin, io.OUT)

def set(property, value):
    try:
        f = open("/sys/class/rpi-pwm/pwm0/" + property, 'w')
        f.write(value)
        f.close()	
    except:
        print("Error writing to: " + property + " value: " + value)

set("delayed", "0")
set("mode", "pwm")
set("frequency", "500")
set("active", "1")

def clockwise():
    io.output(in1_pin, True)    
    io.output(in2_pin, False)

def counter_clockwise():
    io.output(in1_pin, False)
    io.output(in2_pin, True)

clockwise()

while True:
    cmd = raw_input("Command, f/r 0..9, E.g. f5 :")
    direction = cmd[0]
    if direction == "f":
        clockwise()
    else: 
        counter_clockwise()
    speed = int(cmd[1]) * 11
    set("duty", str(speed))

这个Python程序首先把两个GPIO针设置为输出针。然后定义了一个与第八课里面一样的为了使用方便的方法(“set”),用于写入PWM核心模块。后面我们将会用它设置PWM参数。

另外我们定义了两个方法,”clockwise”和”counter_clockwise”,它们通过控制输出针达到改变电机转向的目的。

如果两个输出针都置为高或者置为低,那么电机将会停止。如果一针为高一针为低那么电机将朝一个方向转动,如果两针的电平反转,那么电机的转向也将反转。程序循环等待用户输入一个字母(“f”或”r”)以及一个0到9之间的数字。字母设置了电机的转向数字设置了转速,数字将会乘以11然后变成一个0到99之间PWM库所期望的百分比值。

测试&配置

要运行这个程序,你需要超级用户权限,所以使用下面的命令吧:

sudo python motor.py

命令行将会提示你输入两个字符。试试下面的命令:

$sudo python motor.py
Command, f/r 0..9, E.g. f5 :f9
Command, f/r 0..9, E.g. f5 :r4
Command, f/r 0..9, E.g. f5 :

Adafruit的树莓派教程第九课:控制一个直流电机,首发于极客范 – GeekFan.net

mysql 创建 function 错误 1064解决方案

在mysql5.1创建function时,总是报下面的错误

#1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ” at line 4

检查很多遍都没发现语法错误,苦恼很久。

后上网查到,是因为mysql分隔符的问题,默认是以;作为分隔符,而function或者procedure里面很多时候都要用分号,所以造成这个问题。

解决方法是用DELIMITER //预先定义分隔符,这样就解决了这个问题。存档以防将来之需。

如下是创建随机字符串的function

DELIMITER //

CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE chars_str varchar(100) DEFAULT ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789’;
DECLARE return_str varchar(255) DEFAULT ”;
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1));
SET i = i +1;
END WHILE;
RETURN return_str;
END; //