2015年2月25日 星期三

Raspberry Pi 各版本耗電量測試

目前Raspberry Pi在市面上的版本就有Model A, A+, B+, Generation 2 Model B(Pi2),筆者根據手上有的以及能借到的測試一下各版本的耗電狀況

筆者使用下圖的電流電壓測試器,由於此電流電壓測試器的準確度有限,就要各位看官不要太計較了XD


檢測結果如下
Model
Busy
Idle
Power Off
A+
0.11
0.08
0.02
B
0.44
0.39
0.1
B+
0.25
0.21
0.04
Pi2
0.31
0.24
0.06
表上的Busy, Idle及Power Off的單位為安培(ampere)

Busy: 故意跑無窮迴圈程式讓CPU維持在100%左右的使用率,由於Pi2有4顆CPU所以故意跑多個無窮迴圈程式使其總CPU loading同樣維持在100%左右

Idel: 開機後不額外執行任何指令或程式只維持開機後靜止不動的狀態

Power Off: 下sudo poweroff並等到所有燈號熄滅只剩電源指示燈有亮的狀況下測量

結論
  由上表的結果未來筆者若要再購買會以Pi2為主(畢竟4顆心臟太強大了),且耗電只有0.31A拿來掛網、FTP server、HTTP server、DLNA server非常方便

  而A+在特殊需求下,例如DLNA server配合一般NAS使用也是非常適合

  B板的話則是會慢慢的退至第二線或是送人吧

Update 2015/3/3
  國外另有大大專業的量測,有興趣的人可以閱讀此篇文章http://raspi.tv/2014/how-much-less-power-does-the-raspberry-pi-b-use-than-the-old-model-b

Raspberry Pi 2 入手

過年前訂的Raspberry Pi 2(簡稱Pi2)終於到貨了~

安裝前請各位看官重新燒最新的Raspbian到另一張micro SD card,目前的Raspbian是無法在B+和Pi2上替換著用的

以下為Pi2的簡單測試

1. 外觀: 除了畫面正上方的小字能看出這是Pi2外,其他長的跟B+幾乎一模一樣 不過各pin腳的對應還需要再確認是不是和B+一模一樣

2. 效能: 從下圖左上方可以看到Pi2從一顆樹梅成長為四顆樹梅當然變強的不像話(被毆


  簡單測試以下項目
    i. 安裝iceweasel瀏覽網頁: Google, Yahoo等網頁跟普通桌機感覺差不多(感動到痛哭流涕!比起過去的Pi光開瀏覽器就lag到昏倒好太多了!!!

    ii. 播放YouTube影片: 開啟YouTube網頁速度悲劇,播放時也有lag的狀況大概是繪圖和解碼能力仍舊不足

    iii. 開啟vim編輯不會lag!

    iv. ssh連線穩定且不會lag!

    v. JDownloader安裝速度快許多,安裝完畢後開啟JDownloader幾乎不用等待

    vi. 耗電量: 經由測試發現把B+多0.06A

剩下的等有空再測試吧~

[機械式鍵盤] Cherry 無刻鍵盤清潔與鍵帽清洗

最近由於手滑把nano SIM卡掉在鍵盤中,拔起鍵帽後發現卡超多灰塵,連鍵盤外部也髒掉不少.............來花點時間來清潔吧


1. 拆掉全部鍵帽,由於筆者的鍵盤是Cherry的無刻鍵盤,所以在拆之前就要有心理準備裝回去有機會裝錯位置XD
  拆完以後如下圖所示



2. 接著拿吹球將卡在縫隙裡的灰塵和髒東西清掉,如果能借到輪胎打氣的機器也是個方法,不然像筆者用吹球就吹到手痠個半死

3. 清洗鍵帽,傳說中鍵帽洗衣袋 + 洗衣機就能把鍵帽洗得亮晶晶,但為了環保省水筆者還是決定乖乖用手一個一個拿起來搓洗然後再曬乾

4. 接著就是重點放回鍵帽,把鍵帽反過來看可以發現鍵帽後面會有I, II, III, IV等字樣,從上到下就是I, II, III, IV,至於長得比較奇怪的鍵帽當然就不用特別去記了~

  不過根據筆者的經驗,拆鍵帽的時候還是要順手記一下鍵帽和他所在的排列的號碼對不對,不然像筆者裝到一半就沒把握會很糗XD....

從上到下為I, II, III和IV

對應到上圖的從左到右的I, II, III, IV


2014年11月13日 星期四

Mac OSX 10.10 Yosemite Eclipse 上機測試無法選擇device問題

最近跟瘋升級到Yosemite

但是今天要測試Android app上機跑的時候卻遇到抓不到裝置的問題(10.9的時候不會這樣啊QAQ)


詳細症狀如下

  1. 接上Android裝置後按下Run as Android Application卻找不到裝置


  2. 在上圖的畫面顯示的情況下拔掉Android裝置再插上去就會出現

  3. 選擇device後按下OK可以正常上機執行

  4. 稍微修改code後再按一下Run as Android Application會發現裝置又消失啦 => 回到第一步loop
    頓時腦中響起「我跳出來啦 我又回去啦 打我啊笨蛋」......  (°Д°#)

解決方式(from Stack Overflow)

  1. 使用adb檢查Android裝置是不是真的有接上Mac

  2. 接著再跑一次Run as Android Application,但是這時候要拖移一下欄位的寬度一切就正常了!!!


  3. 收工(╯°Д°#)╯︵ ┻━┻  

  雖然不知道是Yosemite, Android Plugin還是Eclipse luna的layout問題造成問題,但這問題太扯了!!!


參考資料

2014年10月1日 星期三

Raspberry Pi 樹莓派 無線AP to 有線網路橋接

筆者最近在研究Wi-Fi時發現Pi也可以模擬成AP,因此筆者用閒暇時間整理出如何將Pi變成一台無線基地台

簡介

首先先說明一下筆者所處的網路架構(圖1),圖片從右到左的介紹如下
  i. 首先是modem: 俗稱小烏龜的玩意兒,常見的就是ISP(中華電信, 寬頻業者)給的機器
  ii. 無線基地台(AP): 手機或筆記型電腦能透過Wi-Fi連接上AP後就能上網,很重要的一點是預設要開啟DHCP功能
  iii. 平板、手機、筆電: 透過Wi-Fi上網的機器
  iv. PC: 透過有線網路上網的機器

圖1. 典型網路架構

圖2為筆者目標的網路架構,說明如下
  目標: 
    i. 將有線網路延伸出去,像是AP架在客廳可是房間訊號很差,但卻有有線網路能接的情況
    ii. 另一種玩法就是做封包分析和網路攻擊的時候中間多個橋接器方便很多的
    iii. 由於是橋接的方式,在Pi無線網域下的所有裝置與有線網域下的所有裝置都還是在同一個網段,簡單的說就是網芳還是通的~
  架構:
    將有線網路接到Pi上,再由Pi發出Wi-Fi的訊號給手機、平板等裝置連線


網卡晶片

  筆者使用RTL8188CUS配合Realtek的軟體後可正常使用,但RTL8188SU和RTL8192SU試了好幾次都跑不起來.......

架設前注意事項

  以下的操作建議在Pi上接著螢幕和鍵盤執行,橋接完後AP分給Pi的IP可能會改變,此外有線網卡(eth0)基本上不會再取得IP,即便取得也不穩定,因此完成所有步驟前請直接在Pi上操作

架設步驟

  1. 安裝bridge工具

pi@ ~ $ sudo apt-get install bridge-utils

  2. 檢查網卡晶片組

  若跟筆者一樣是Realtek網卡晶片組請先跳到下方的"修正Realtek網卡在Pi上無法使用hostapd問題"章節安裝Realtek的hostapd,完成後再回到第4步
pi@ ~ $ sudo lsusb

  3. 安裝官方的hostapd

  (Realtek網卡晶片的使用者請勿使用Pi官方版本的hostapd)
pi@ ~ $ sudo apt-get install hostapd

  4. 檢查網卡代號

  此處筆者的有線網卡為eth0,無線網卡為wlan0
pi@ ~ $ ifconfig

  5. 修改無線網卡設定使其eth0和wlan0橋接起來

pi@ ~ $ sudo vi /etc/network/interfaces
auto lo

iface lo inet loopback
#iface eth0 inet dhcp

#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp

auto br0
iface br0 inet dhcp
bridge_ports eth0 wlan0 

  6. 建立hostapd的設定檔(預設可能不會有此設定檔)

pi@ ~ $ sudo vi /etc/hostapd/hostapd.conf
interface=wlan0
driver=rtl871xdrv
bridge=br0
ssid=RPI
channel=6
hw_mode=g
ieee80211n=1
wmm_enabled=1
wpa=2
wpa_passphrase=Raspberry
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
auth_algs=1
macaddr_acl=0 

  7. 重開機

pi@ ~ $ sudo reboot

  8. 測試hostapd是否能正常執行

pi@ ~ $ sudo hostapd -dd /etc/hostapd/hostapd.conf

  9. 編輯hostapd的設定檔

  使其在啟動daemon時載入/etc/hostapd/hostapd.conf的設定
pi@ ~ $ sudo vi /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"

  10. 啟動hostapd,接著就能RPi當做AP來使用了~

pi@ ~ $ sudo service hostapd restart

修正Realtek網卡在Pi上無法使用hostapd問題

  1. 安裝Pi官方提供的hostapd,目標只是取得hostapd的daemon而已XD
pi@ ~ $ sudo apt-get install hostapd
  2. 刪除hostapd(不要懷疑,上一步就只是為了daemon檔案而已)
pi@ ~ $ sudo apt-get remove hostapd
  3. 到Realtek的下載頁面下載RTL8188CUS的工具包(在下載頁面搜尋RTL8188CUS即可找到)
    PS: 由於Realtek的下載頁是用js觸發下載事件,為節省麻煩建議直接用其他電腦的瀏覽器下載再使用scp指令(Windows請用WinSCP or FileZilla的sftp)複製到pi

  4. 將RTL8188CUS的工具包從Mac, Linux or Windows傳送到pi的家目錄中(Windows請使用WinSCP或FileZilla)
Shiun@ShiundeMacBook-Pro ~ scp RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip pi@192.168.0.148:/home/pi
  5. 將RTL8188工具包解壓縮
pi@ ~ $ unzip RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip
  6. 移動到hostapd的目錄
pi@ ~ $ cd RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/
  7. 解壓縮wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gz
pi@ ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd $ tar -zxvf wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gz
  8. 進入hostpad的目錄
pi@ ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd $ cd wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd/
  9. 開始建置hostapd
pi@ ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ make clean; make
  10. 安裝hostapd到正確的位置
pi@ ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ sudo make install;
  11. 再複製hostapd的執行檔以方便daemon使用,for Realtek的hostapd到此安裝完成
pi@ ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ sudo cp /usr/local/bin/hostapd* /usr/sbin


這篇寫的好累Orz.......,讀者若有發現任何錯誤請盡量向筆者糾正,謝謝^^
參考資料
  1. Raspberry Pi 的應用 - Wifi 無線基地台

2014年8月17日 星期日

使用Eclipse Luna + Tomcat 7 + Jersey 2架設RESTful service

前言

此篇文章介紹如何使用Jersey架設RESTful web service,使用到的工具如下
  1. Eclipse Luna
  2. Tomcat 7
  3. Jersey 2.11

為避免對Maven或Gradle不熟悉的人感到疑惑,因此此篇文章只針對如何使用Jersey 2架設RESTful service,不使用Maven或Gradle進行管理

架設步驟

1. 開啟Eclipse

2. 建立新的專案File -> New -> Dynamic Web Project


3. 輸入專案名稱JerseySample並選擇Apache Tomcat v7.0作為Target runtime,記得要把Generate web.xml deployment descriptor打勾




4. 將jersey官網下載的jaxrs-ri-2.11.zip解壓縮,接著把所有的jar檔複製到jerseySample/WebContent/WEB-INF/lib下


5. 重新整理JerseySample專案確保lib都有正常載入



6. 修改web.xml讓Tomcat可以正確載入Jersey相關資源
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>JerseySample</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>org.sample.test</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/api/*</url-pattern>
  </servlet-mapping> 
  
</web-app>

  參數說明
    i. servlet-class
      Jersey 1的servlet-class為
        com.sun.jersey.spi.container.servlet.ServletContainer

      而Jersey 2的servlet-class必須改成(畢竟Sun已經R.I.P.了QAQ........)
        org.glassfish.jersey.servlet.ServletContainer

    ii. jersey.config.server.provider.packages
      Jersey掃描的packet路徑,resource的java檔要放在此package下

    iii. url-pattern
      Resource對應的URL位置,client端必須要照此參數設定才能呼叫到對應的resource

7. 建立package: org.sample.test



8. 建立resource的java檔案: Hello.java



9. 加入以下的程式碼至Hello.java
package test;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class Hello {
    // This method is called if TEXT_PLAIN is request
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String sayPlainTextHello() {
        return "Hello Jersey";
    }

    // This method is called if XML is request
    @GET
    @Produces(MediaType.TEXT_XML)
    public String sayXMLHello() {
        return "" + " Hello Jersey" + "";
    }

    // This method is called if HTML is request
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String sayHtmlHello() {
        return "<html> " + "<title>" + "Hello Jersey" + "</title>"
              + "<body><h1>" 
              + "Hello Jersey"
              + "</h1></body></html></pre>" 
              + " ";
 }
}

10. 將專案在Tomcat上跑起來,並使用瀏覽器檢查http://localhost:8080/JerseySample/api/hello是否正確




11. 使用RESTful client工具檢查xml的request是否能正常使用。只要送出的request包含Accept: text/xml檔頭,Jersey就會自動切換到回傳sayXMLHello函式結果


參考資料
1. REST with Java (JAX-RS) using Jersey - Tutorial (適用Jersey 1)
2. Jersey 2.5 + Maven = easy REST web services

[手工藝玩具] 1入2出 音源切換器

完成以下兩篇的玩具後,筆者的音樂播放器就從PC換成Pi
  Raspberry Pi 樹莓派 啟動I2S DAC or USB DAB 音效卡
  Raspberry Pi 樹莓派 架設ShairPort使用AirPlay播放音樂

但由於最近有不少狀況需要開PC,又PC要輸出聲音的話需要把喇叭從Pi換到PC的耳機座上,
根據以前悲劇的經驗,這樣不是喇叭的耳機頭先壞掉就是PC的耳機座先被插壞.........
因此筆者決定弄一個音源切換器,參考DIY音源切換器[DIY]兩種音源切換器(二入一出)後筆者自製了一個音源切換器

原料如下
  1. 6pin 2段式開關x1
  2. 3.5mm 耳機座x3 (二入一出)
  3. 塑膠盒子,大小為60x40x30mm
  4. 比6pin 2段式開關的pin粗一點點就熱縮套

以上原料大概只有80元可以搞定,接著就是開始對把線焊上2段式開關 -> 塑膠盒鑽4個孔 -> 鎖上耳機座元件 -> 鎖上2段式開關 -> 將耳機座和2段式開關焊上,接著就完成了(詳細內容請直接參考最底下的參考資料)

最後成品如下圖~


補上小小心得
  整天過著寫程式的生活難免會有枯燥乏味的時候,偶而來DIY些小東西來玩也挺有趣的,尤其是對筆者這種拿焊槍次數10根手指頭就能算完的新手,以玩家的角度來做這東西其實挺有趣的

  在焊接的部份以往都有強者學長支援,但這次在沒人支援的情況下在60x40x30mm的盒子裡焊接東西讓筆者苦戰整個下午才搞定,做完其實挺有成就感的

  而實際上這東西在網路上買的到,價格大概3xx到4xx(2014年8月份),不過根據筆者DIY整個東西的時間,其實3xx元已經非常划算了,如果不是以玩家的心情做的話建議還是花錢直接買現成的吧


參考資料
  1. DIY音源切換器
  2. [DIY]兩種音源切換器(二入一出)