3月 03

raspberry pi apt失败

重装raspberry pi系统,将apt-get的源换成阿里云的。执行报错如下:

W: Duplicate sources.list entry http://mirrors.aliyun.com/raspbian/raspbian/ jessie/main armhf Packages (/var/lib/apt/lists/mirrors.aliyun.com_raspbian_raspbian_dists_jessie_main_binary-armhf_Packages)
W: Duplicate sources.list entry http://mirrors.aliyun.com/raspbian/raspbian/ jessie/non-free armhf Packages (/var/lib/apt/lists/mirrors.aliyun.com_raspbian_raspbian_dists_jessie_non-free_binary-armhf_Packages)
W: Duplicate sources.list entry http://mirrors.aliyun.com/raspbian/raspbian/ jessie/contrib armhf Packages (/var/lib/apt/lists/mirrors.aliyun.com_raspbian_raspbian_dists_jessie_contrib_binary-armhf_Packages)
W: You may want to run apt-get update to correct these problems

解决
直接删除/etc/apt/sources.list.d/下面的文件,再次更新。

11月 10

raspberry pi 2用golang 控制GPIO

raspberry pi2散热量并不大,但是长时间高运算量运行还是装个小风扇比较好,所以做个自动开关的风扇。本次使用go 1.7。
硬件:4针热敏传感器模块,宝上买的1块5,采用NTC热敏电阻传感器。小风扇还没有到,用led实验。
首先安装需要库
go get github.com/stianeikeland/go-rpio
查看源码可以对Linux的文件系统有更好的了解,推荐要好好看看。
代码部分:

/*
# Date:        2016-11-10
# Author:      simonzhang
# web:         www.simonzhang.net
# Email:       simon-zzm@163.com
*/
package main

import (
    "os"
    "github.com/stianeikeland/go-rpio"
    "time"
)

var (
    aio = rpio.Pin(14)
    fio = rpio.Pin(4)
    alertCount int = 0
)

// 风扇端口
func fWrite(status string){
    fio.Output()
    if status == "high"{
        fio.High()
    }else if status == "low"{
        fio.Low()
    }
}

// 监控端口
func aRead() int{
    aio.Input()
    return int(aio.Read())
}

func main() {
    err := rpio.Open()
    if err != nil {
        os.Exit(1)
    }
    defer rpio.Close()
    // 因为没有while 直接用for
    for {
        // 数字不能太大
        // 1是内存问题,2是停止风扇范围
        if aRead() == 1 {
            if alertCount > 0{
                alertCount -= 1
            }
        }else{
            if alertCount <= 10{
                alertCount += 1
            }
        }
        //print(alertCount, "   ", aRead(), "\n")
        //
        if alertCount > 3{
            fWrite("high")
        } else {
            fWrite("low")
        }
        // 每次次循环等待一秒钟
        time.Sleep(1000 * time.Millisecond)
    }
}

imhot20161110
运行后实验,用手加热
qidong20161101
放开手
tingzhi20161110
raspberry pi2 接口图

raspberry pi2

raspberry pi2

1月 24

python调用golang编译的动态链接库

当前任务:抓取页面,然后删除回车,tab和空格,然后打印出来。
最初是在raspberry上做的测试。使用新浪作为测试网站。

python部分文件名 gradAndDel.py

#!/bin/env python
# -*- coding:utf-8 -*-
# -------------------------------
# Date:        2016-01-21
# Author:      simonzhang
# Web:         www.simonzhang.net
# Email:       simon-zzm@163.com
# -------------------------------
import urllib

url = "http://www.sina.com.cn/"

data = rullib.urlopen(url).read()
data = data.replace('\n', '')
data = data.replace('\t', '')
data = data.replace(' ', '')
print data

使用时间如下
real 0m2.878s
user 0m1.910s
sys 0m0.240s

golang文件名gradAndDel.go

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
)

func main() {
    resp, err := http.Get("http://www.sina.com.cn")

    if err != nil {
        fmt.Println("http get error.")
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("http read error")
    }

    src := string(body)

    src = strings.Replace(src, "\n","",-1)
    src = strings.Replace(src, "\t","",-1)
    src = strings.Replace(src, " ","",-1)
    fmt.Println(strings.TrimSpace(src))
}

使用时间如下:
real 0m0.718s
user 0m0.290s
sys 0m0.090s

使用golang比python快差不多4倍(使用requests模块抓取显示中文乱码,暂时没有找原因)。

golang1.5后可以将go语言编译为动态链接库。
这样使用python处理业务逻辑,然后调用golang的动态链接库加速执行速度。
但是在raspberry pi上调用的时候报段错误。没有细查,直接放到64位Linux服务器上测试。

要产生动态的链接库的golang代码gradAndDelso.go

/*
# Date:        2016-01-21
# Author:      simonzhang
# Web:         www.simonzhang.net
# Email:       simon-zzm@163.com
*/
package main

import ("C"
        "fmt"
        "net/http"
        "io/ioutil"
        "strings"
       )


//export Deltr
func Deltr(webdata *C.char) *C.char {
    var src string
    url := C.GoString(webdata)
    src = string(grad(url))
    src = strings.Replace(src, "\n","",-1)
    src = strings.Replace(src, "\t","",-1)
    src = strings.Replace(src, " ","",-1)
    data := C.CString(src)
    return data
}

//export grad
func grad(url string) string{
    resp,err := http.Get(url)
    if err != nil {
        fmt.Println("http get error.")
    }
    defer resp.Body.Close()
    body,_ := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("http eee error.")
    }
    goback := string(body)
    return goback
}

func main() {}

编译命令
go build -buildmode=c-shared -o gradAndDelso.so gradAndDelso.go

编译完成会产生两个文件,一个so和一个h文件。
使用python调用golang动态链接库部分,代码文件userGoSo.py

#!/bin/env python
# -*- coding:utf-8 -*-
# -------------------------------
# Date:        2016-01-21
# Author:      simonzhang
# Web:         www.simonzhang.net
# Email:       simon-zzm@163.com
# -------------------------------
import ctypes

lib = ctypes.CDLL("./gradAndDelso.so")
url = "http://www.sina.com.cn"
re = lib.Deltr
re.argtypes = [ctypes.c_char_p]
re.restype = ctypes.c_char_p
print re(url)

使用时间
real 0m0.893s
user 0m0.068s
sys 0m0.024s

在64位的服务器上python、golang和python调用golang的动态链接库速度基本上一样没有区别。
如果是处理复杂的运算golang应该比python快很多,实际项目中可以试试。
golang开发的代码量比python还是大不少,编译后的文件有6M,动态链接库8M,个人感觉这部分太大了。

本文源码打包pythonUserGolangLib

1月 15

raspberry pi 源码安装 golang1.5

  从golang.org下载go1.4.3和go1.5.3。解压到/usr/local/目录中。go1.4.3目录为go1.4,go1.5.3目录为go1.5。

sudo su #到管理员权限

apt-get install -y mercurial bison gcc gccgo libc6-dev ed gawk make git #安装需要的库

以下为在管理员权限下,使用的命令记录。
export GOARM=5
export GOROOT=/usr/local/go1.4
export GOARCH=arm
export GOOS=linux
export PATH=$PATH:$GOROOT/bin/

cd /usr/local/go1.4/src/
time ./all.bash

mkdir -p /usr/local/go1.5/bin
cd /usr/local/
ln -s /usr/local/go1.4 /usr/local/go-bootstrap
export GOROOT_BOOTSTRAP=/usr/local/go-bootstrap
export GOROOT=/usr/local/go1.5
export PATH=$PATH:$GOROOT/bin/
cd /usr/local/go1.5/src
time ./all.bash

如果没有报错则编译完成。我的记录
go1.4.3编译时间为54分钟 go1.5编译时间160分钟

/etc/profile增加如下内容
export GOARM=5
export GOROOT=/usr/local/go1.5
export GOPATH=/usr/local/go1.5/pkg
export GOARCH=arm
export GOOS=linux
export PATH=$PATH:$GOROOT/bin/

配置生效
source /etc/profile

在系统中可以使用go version看看版本的正确性