2019年6月27日 星期四

[Raspberry] mjpg-streamer

簡述:

測試看看 Raspberry Pi 上, 使用 Mjpeg-Streamer 的 frame delay.

安裝及編譯:

$ sudo apt-get install libjpeg8-dev
$ sudo apt-get install imagemagick
$ sudo apt-get install cmake
$ sudo git clone https://github.com/jacksonliam/mjpg-streamer.git
$ cd mjpeg-streamer/mjpg-streamer-experimental
$ make all
$ sudo make install

用測試圖片驗證:

在 plugins 目錄下有一個 input_testpicture 的目錄, 可以用來測試驗證.

在 raspberry pi 上面執行以下命令,
$ ./mjpg_streamer –i “input_testpicture.so –r 320x240 –d 500” –o “output_http.so –w www”


就可以從瀏覽器上打開 http://192.168.43.201:8080/index.html










或是從 VLC 上打開 http://192.168.43.201:8080/?action=stream


可以確認 live view 的部分是 work 的.


用 USB cam 來當作影像輸入:

mjpg-streamer 本身的 input_uvc 是有支援 USB Cam/Webcam 的. 只不過一般的 webcam 通常預設是 YUYV 的格式, 而非 MJPEG. 最簡單的方法就是修改 plugins/input_uvc/input_uvc.c 這個檔案. 把 V4L2_PIX_FMT_MJPEG 改成 V4L2_PIX_FMT_YUYV.

然後啟動 mjpg_streamer
$ ./mjpg_streamer –i “input_uvc.so –r 320x240 –d 500” –o “output_http.so –w www"
從瀏覽器打開











或是從 VLC player 連線

搭配 Raspberry Camera :

載入 raspberry pi camera driver
$ sudo modprobe bcm2835-v4l2










啟動 mjpg_streamer













可同時連線



















[NT98515] SDIO Wifi module RTL-8189ES

簡述:

又到了團團轉時間. 這一次大風吹的是 "在 NT98515 的平台上啟用 SDIO 介面的 WiFi 模組 RTL8189ES"
這部分的整合, 需要考量到幾方面, wifi module 的接線, SDIO driver 的設置, wifi driver 的設置.

SDIO wifi module :

根據 SDIO 的規格, SDIO 有一個 card detect ping, 這個 pin 並不在 SD card 的插槽上. 當有卡插入的時候, 這個 pin 會短路到 ground. 主機端從而判斷出插槽裡面有卡, 開始偵測這張卡, 並試圖啟用這張卡.


SDIO driver 的設置 :

Linux 的硬體設定, 是從 dts 傳送給核心, 在啟動相對應的驅動程式時, 傳送相關的參數. 確認過 dts (linux-kernel/arch/mips/boot/dts/novatek/nvt-na51023-evb-default.dtsi), 幸運地發現 SDIO port (mmc2) 已經設定好了.



另外, (uitron/Project/DemoKit/ModelConfig_IPCAM2_EVB.txt) 這裡面有一些 NVT_SDIO_WIFI/NVT_USB_WIFI , 不用去管它. SDIO 介面的 wifi driver 目錄是空的, USB port 上沒有接 wifi driver, 也不用特別去改設定. 總之, 改這個沒有用.

確認 SDIO driver 是否可以正常動作 :

附圖是兩個 SDIO bus, 一個有  device, 一個沒有. 很容易分辨出來.


RTL-8189ES driver 設置 :

1. 從 https://github.com/openwetek/rtl8189es 下載
2. 參考 rtl8188ftv/Makefile, 加入 NT98515 的組態
3. make
基本上沒有甚麼大問題.

2019年6月3日 星期一

[Android] AsyncTask 用法詳解

簡述:

Android 的 App, 通常只在預設的 UI Thread 運行. 當遇到一些較為耗費時間的工作時, 就必須採用 Multi Thread  的作法. 否則很容易就會遇到 ANR 的錯誤, 導致 App 被停止執行. AsyncTask 是一種 Multi Thread 的作法.

AsyncTask 的型態:

因為 AsyncTask 的目的就是提供一個線外作業的機制, 所以它會有兩個特性:  
  1. 在平行時間運行. AsyncTask 和 UI Thread 必須可以在不互相影響的狀況下各自運行.
  2. 互動. AsyncTask 的運行必須可以反映到  UI Thread (如果不能反映到 UI Thread, 又怎麼知道它執行完畢了呢 ?)
於是, 很容易可以猜想到, AsyncTask  它會接收一個起始狀態, 一個運行狀態, 一個結果回報的狀態. 這3 種狀態的參數型態,  就是這個 AsnycTask 的參數型態, 如下圖:
 
class SleepTask extends AsnycTask<String, Integer, String>, 這邊就宣告了 SleepTask 是 AsyncTask 的衍生類別, 它有 3 個參數型態, String, Integer, String. 各參數依序為起始狀態, 運行狀態, 結果狀態.
起始狀態是在執行時, 由呼叫程序傳入, 然後 AsnycTask 在呼叫 doInBackground 時, 以參數傳入. 從字面上的意義可以知道, doInBackground 是真正在計算的苦力. doInBackground  接收到起始狀態, 然後照起始狀態的指示, 開始運算. 算到一個階段 (需要通知 UI Thread 進度的時候),  就呼叫 publishProgress, 並給予運行狀態, 以便回報進度.  AsyncTask 再把這各參數轉送到 onProgressUpdate. 計算結束的時候, doInBackground 的返回值也會被送到 onPostExcute, 以便更新運算的結果.
之所以要這麼麻煩, 是因為 AsyncTask 除了要運行 doInBackground() 這個苦力程序外, 還要負責同步狀態到 UI Thread. 所以就有了 onPreExecute()/onProgressUpdate()/onPostExecute(), 這三個程序, 用來在不同的時間點更新 UI Thread. 其中除了 onPreExecute 不需要參數, onProgressUpdate()/onPostExecute() 都是把 doInBackground() 產生的狀態更新到 UI Thread.

AsyncTask 的成員函式:

衍生的 AsnycTask 類別, 需要實作以下函式
onPreExecute(), 在還沒有開始計算前, 負責準備工作.
doInBackground(), 真正的苦力運算函式.
onProgressUpdate(), 協助更新 doInBackground 的運算進度
onPostExecute(), 協助更新 doInBackground 的運算結果.

[ NT98515] CROSSCOMPILE ECLIPSE PAHO MQTT C Client

簡述: 試著把 Eclipse Paho MQTT C client  移植到 NT98515 的平台, 並且測試驗證. 下載 source: git clone https://github.com/eclipse/paho.mqtt.c make: cmake $ cmake...