2016年5月9日 星期一

Android 使用adb的logcat指令抓取對應log level與tag的log資訊

由於筆者最近一般消費性平板或專業的開發板上開發的程式有不少麻煩的特性

例如
  1. 消費型平板或開發板的廠商自訂log訊息太多
  2. 消費型平板上唯一的micro USB port要拿來連結USB to UART轉接板(可用Android WiFi debug方式解決)
  3. Android framework層給的訊息少了log的時間要拿來debug不方便
  4. ..., etc.

考慮到以上的問題,筆者使用終端機開啟類似Android Studio上Android Monitor的logcat並將這些log存為文字檔後再進行分析

事前準備

  1. 安裝Android開發工具,不然至少要確定有安裝到adb的執行檔和adb的相依套件
  2. 確認環境變數
    Windows使用者請由控制台 -> 系統及安全性 -> 進階系統設定 -> 進階 -> 環境變數中確認使用者變數或是系統變數中的PATH是否有adb執行檔的路徑



    Mac/Linux使用者請確定自己的~/.bashrc或~/.zshrc中是否有加入adb的路徑

  3. 下指令測試adb是否能用
  4. # 使用adb version指令檢查adb是否可使用並且觀看adb版本 shiun@test:~$ adb version Android Debug Bridge version 1.0.32 Revision 09a0d98bebce-android

正式開工

  1. 開啟終端機
  2. 執行adb logcat -v time -s TestMainActivity列出所有以TestMainActivity作為tag的log訊息
  3. 下圖為log出來的結果,其中log訊息會包含時間, log level及log message

Android Wi-Fi debug功能

問題

  最近筆者在研究要怎麼使用Android消費型平板上的micro USB與Arduino或其他裝置透過UART進行溝通。但遇到一個非常麻煩的問題: 唯一的micro USB已經被UART轉板佔據住,沒辦法透過USB去抓debug訊息.........

  為了降低後續開發的痛苦,筆者試著找看看有沒有其他方式可以抓到debug訊息

Fig 1. Nexus 7 + USB OTG線 + USB to UART轉板

解決方案

  參考Android Developers網頁可以發現Android的設計上有Wireless debug[1]的方案,只需透過adb工具即可開啟Wi-Fi debug功能,詳細說明如下

  環境

  • Android裝置: Nexus 7 2013 + Android 6.0.1
  • 電腦: Macbook + OSX 10.11.4
  • adb 1.0.32

  步驟

  1. 使用USB線連結Android裝置與電腦
  2. 確認USB偵錯有開啟
  3. Fig 2. 開啟USB偵錯

  4. 將Android裝置連線到Wi-Fi的AP上,並找到Android裝置的IP
  5. 方法1: 由Android裝置的Wi-Fi設定找到目前IP位置,但並不是所有裝置都可以直接看到IP,例如筆者的Nexus 7就是不能透過此方法看到IP的機器之一.......
    Fig 3. 透過Wi-Fi設定找尋IP位置,筆者的Nexus 7不適用QQ.....

    方法2: 透過adb指令找到Android裝置的IP位置
    # 對Android裝置下ifconfig命令 # adb shell: 透過adb對Android裝置下指令 # ifconfig: 列出所有網卡的資訊 shiun@test:~$ adb shell ifconfig
    Fig 4. 透過adb指令找到IP位置為192.168.1.195

  6. 使用adb命令開啟Wi-Fi debug功能
  7. # 開啟Wi-Fi debug功能,並設定連線port 5555 shiun@test:~$ adb tcpip 5555 restarting in TCP mode port: 5555
  8. 拔掉USB連接線
  9. 在電腦端下連線指令
  10. # 連線至Android裝置 shiun@test:~$ adb connect 192.168.1.195 connected to 192.168.1.195:5555
  11. 接著到Android Studio上看結果


  12. 最後要收工的時候記得要關閉Wi-Fi debug功能
  13. # 關閉Wi-Fi debug功能 shiun@test:~$ adb usb restarting in USB mode

補充

  若讀者的Android裝置為已root裝置(adb shell進入後直接是root身份的開發板也行),則可考慮直接安裝WiFi ADB - Debug Over Air這套app即可

參考資料

2015年11月25日 星期三

樹莓派 /etc/network/interface 直接進行WiFi設定

auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
auto wlan0


iface wlan0 inet dhcp
        wpa-ssid "ssid"
        wpa-psk "password"


參考
  Setting up Wifi with the Command Line

Mac 使用ssh連限至遠端電腦時中文變亂碼

環境:

  本地端作業系統:  OS X Yosemite ~ Sierra
  終端機程式:          iTerm2
  遠端作業系統:      Ubuntu 14.04
  (update @2016/11/07, 最近更新Mac OS X同樣的問題又出現了,不過同樣用同樣的方法一樣能解決)

狀況:

  使用ssh連線至遠端電腦後輸入中文變成亂碼, 下圖為亂碼的例子

  1. 輸入「中文」

  2. 結果卻變成下圖

解決方案:

  修改/etc/ssh/ssh_config檔案,將SendEnv LANG LC_*註解掉即可

PHP 二進位處理 pack and unpack

幾個月前留下的PHP二進位處理方式,加減做個筆記一下

pack和unpack用來處理二進位資料
範例如下

<?php
// 使用pack將ascii的1~13放到$txData變數中
for($i=1;$i<14;$i++) {
  $txData .= pack("C", $i);
}

// 透過rs232模組寫出去,其中rs232的tx/rx短路,因此寫出去的資料可以在$rxData中收到
$rxData = $this->rs232_model->writeAndRead($txData);

// 使用unpack將$rxData中的二進位資料轉回來
$res = unpack("C*", $rxData);
?>

2015年11月24日 星期二

Nexus 7 二代 (2013版) 觸控失靈DIY維修

由於筆者的Nexus 7(2013板,以下簡稱N7)的觸控螢幕狀況每況愈下,滑動螢幕時常常沒反應或卡住,因此在網路上尋找是否有修正方法

網路上查到的可能原因方法如下:
    1. 螢幕排線鬆掉

    2. 濕氣太重

    3. 螢幕太髒

    4. Android軟韌體問題

首先先用刪去法
    3. 螢幕太髒
        筆者近期常常拿拭淨布擦,但擦完後也只有一小段時間不會觸控失靈

    4. Android問題
        許多人說的4.4.2已經改善,但是筆者的已經是Android 6.......

因此筆者針對螢幕排線和濕氣太重試著處理看看,處理流程如下
    1. 沒事就丟防潮箱,不然至少丟防潮箱一晚
      (註: 防潮箱通常只是控制濕度而已,不是專門拿來除濕用)

    2. 拆了N7的排線! 此動作可能造成保固失效或機器整台gg,請找認識的好人幫忙處理,筆者是擅長魔改硬體的強者我學長幫忙拆機
        Step 0: 拍照留個紀念
Fig 1. Nexus 7 (2013) 背面

Fig 2. Nexus 7 (2013)正面


        Step 1: 先找拆機教學影片
            影片連結: Nexus 7 (2013) Screen Repair & Disassemble

        Step 2: 關機
            避免出狀況,一定要關機後再開工。因為很重要,所以要說三次: 「要關機!」、「要關機!」、「要關機!」

        Step 3: 拆惹它!!!
            大致上如影片中採用吉他撥片拆開,但是強者我學長用指甲就拆開了XDDDDDDD
Fig 3. 拆解結果圖,上方為N7本體,下方為N7的外殼

        Step 4: 接著將下圖中紅色框框的地方如影片中的方式拆開再重插回去即可
Fig 4. 電源與排線拆解圖

            紅框1: 為安全起見,先拆除電源線
            紅框2: 
                i. 拆開剛好壓在右下紅框最下面的線,估計是聲音相關的線,但是會卡到螢幕排線
                ii. 拆解排線,此處是照影片結果推估這紅框2的兩端應該都是觸控螢幕的排線,因此把他拆開再裝回去
            最後再將聲音線和電源線裝回去

        Step 5: 把N7外殼裝回去,接著開機測試即完工

結果
    經過施工後至今N7的觸控已經回復正常(灑花)

    不過3C產品會出問題的原因百百種,此狀況雖然適用於筆者,但適不適用其他人就不得而知了,因此請各位要拆解前先思考一下以下問題
        1. 投資一定有風險,基金申購前應詳閱公開說明書。DIY的代價就是有機會整台gg,動手之前請三思
        2. 找得到專家幫忙拆或自己是能拆的專家嗎?
        3. 由於拆解了,因此保固可能失效,未來送回原廠也不能怪原廠不受理


2015年9月27日 星期日

樹莓派(Linux通用) QR code掃描機

由於最近的研究需要用到固定式QR code掃描機,但網路上找到的都要3k~10k不等,礙於荷包太過瘦弱,筆者自己用樹莓派加web cam架設QR code掃描機

前置作業
1. 準備好安裝完raspbian的Pi 2代
2. 準備支援V4L2的web cam
  不知道啥叫V4L2沒關係,反正就把web cam的USB插上Pi以後看/dev/video[N]有沒有出現
  例如筆者使用的Logitech, Inc. Webcam C310的就是出現下圖:

圖1. 查詢video裝置

架設說明如下
1. 先更新apt的資料庫
pi@raspberrypi ~ $ sudo apt-get update

2. 安裝zbar-tools
pi@raspberrypi ~ $ sudo apt-get install zbar-tools

3. 執行zbarcam,並調整解析度為320x240
  注意: 解析度千萬別設太高,否則Pi會很lag.......
pi@raspberrypi ~ $ zbarcam ---prescale=320x240
圖2. 開啟web cam後會先看到左圖的zbar logo,接著就會顯示web cam拍攝到的內容

4. 找張QR code入鏡並拍出結果吧~
圖3. 透過web cam掃描左側QR  code,再由zbarcam顯示掃描結果

=======================================================
若沒GUI的話跑zbarcam是會失敗的,此時可以改用以下指令
pi@raspberrypi ~ $ zbarcam --nodisplay ---prescale=320x240
圖4. 由ssh連上pi在純終端機頁面下指令

參考資料