2017年7月29日 星期六

工作(first job)

HUNT
  • CGI

通用閘道器介面Common Gateway Interface/CGI)是一種重要的網際網路技術,可以讓一個用戶端,從網頁瀏覽器向執行在網路伺服器上的程式請求資料。CGI描述了伺服器和請求處理程式之間傳輸資料的一種標準。

簡單來說就是網頁透過socket or TCP 傳給server , 例如C++ server 可以用multi-socket 接收.


(參考 work\study\CGI\CGI 接收.txt)

------------------------------------------------------------------------------------------------------

  • Ntpd

網路時間協定英語:,簡稱NTP)是在資料網路潛伏時間可變的電腦系統之間通過封包交換進行時鐘同步的一個網路協定。
它在Unix上執行名為ntpd

client : ntpd -dnqp fr.pool.ntp.org

server : ntpd -l  //default port 123?

其他參考:
http://blog.csdn.net/taixinlfx/article/details/8030671
http://wiki.openwrt.org/doc/howto/ntp.client
(編譯方式 work\study\3rdParty\build-glib.sh
------------------------------------------------------------------------------------------------------

  • UPNP

通用隨插即用英語:,簡稱UPnP)是由「通用隨插即用論壇」(UPnP™ Forum)推廣的一套網路協定。

在電腦->左邊 網路->區網中可看到
(編譯方式 work\study\3rdParty\build-glib.sh)
---------------------------------------------------------------------------------------


連到route(無限那台),指定port 會達到指定內部ip的效果,router 要有支援forwarding& 下面gateway 則是router



add

    //例如: upnpc-static -i 192.168.20.252 -a 192.168.20.153 80 8000 TCP

    std::string command="/usr/HTNAS/sbin/upnpc-static -i "+m_strGateway+" -a "+m_strIPAddress+" "+m_strIPPort+" "+m_strUPNPPort+" TCP";



delete

"/usr/HTNAS/sbin/upnpc-static -i  m_strGateway  -d m_strUPNPPort  TCP



list

"/usr/HTNAS/sbin/upnpc-static -i m_strGateway  -l

(編譯方式 work\study\3rdParty\build-glib.sh)

------------------------------------------------------------------------------------------------------

  • jmb 393 (硬體RAID)

Raid分為軟體&硬體, 軟體在板子上硬碟大時(我們情況五十T以上)很吃資源.

Raid 基本概念,常用的為Raid 0(有些要求JBOD), Raid 1,Raid 5,Raid 10. (詳細參考 work\study\Raid JMB393\RAID基本概念.docx)
簡單說:
raid 0 read/write快,空間大,但危險 (串聯)
raid JBOD 同Raid 0, 但read/write不快,一次一個bus輸出入.
raid 1 安全mirror,但空間浪費高 (並聯)
raid 5 結合raid 0&1 ,但改用偵測錯誤字元,空間為原本2/3,安全(容錯為1/3).
raid 10 是先做raid 1在做raid 0,空間也為原本的1/2,容錯為1/2.
raid 01是先做raid 0再來raid 1 所以錯1/4則全錯(所以很少用).

軟體Raid, 主要使用mdadm , 使用功能為create 、delete 、add/remove spare、sync
(詳細參考 work\study\Raid JMB393\軟體Raid\整合RAID指令.txt)

------------------------------------------------------------------------------------------------------


  • Data Format


建立ext4
mkfs.ext4 -i 524288 " + strDevice;

硬碟切割基本概念, fsck 修復

filesystem?
常用filesystem ext4(快速)
ext2 添加journaling  to ext3

Ext4 修改了structures of the filesystem

disk info command : df , mount , dumpe2fs(board 沒)

repair disk command: fsck.ext4 (file system check?)

disk format command: mkfs.ext4 (make file system ?)

explain the option "-i"
指定 -i (bytes-per-inode)? 524288 =2^19 = 512kb
The larger the bytes-per-inode ratio, the fewer inodes will be created.
(bytes-per-inode 一個inode 大小,  an inode for every "bytes-per-inode" bytes of space on the disk)

Creating a new file, directory, symlink etc. requires at least one free inode.
通常(bytes-per-inode)用小的 16384 bytes (16 KiB)


但是近幾年硬碟越大都GB , 一file 可能有多inode, 所以可以透過 -i 加大(bytes-per-inode)




------------------------------------------------------------------------------------------------------

  • Linux Driver

//driver 啟動會呼叫
module_init(led_driver_init);//led_driver_init 為function name
module_exit(led_driver_exit);


static struct file_operations gpio_fops = {
owner:
    THIS_MODULE,
open:
    gpio_open,//function name
unlocked_ioctl:
    gpio_ioctl,//function name
release:
    gpio_release,//function name
};

static struct miscdevice gpio_dev = {
    MISC_DYNAMIC_MINOR,
    "led_driver",
    &gpio_fops,//這裝置的操作方法
};

//註冊裝置
ret = misc_register(&gpio_dev);

//操作driver
    int fd = open("/dev/led_driver",O_RDWR);
    if(fd>0) {
        ioctl(fd, GPIO_WRITE_BIT,&structGpio);
     }

(
(


------------------------------------------------------------------------------------------------------

  • GPIO

大部分很多腳位都為複合用腳,透過儲存暫存器,來控制腳位輸入or輸出,很多地方用到relaybox中的rs485切換,風扇.硬碟. (有些用邏輯閘 或者 電晶體 或 二極體 去決定電流流向)

------------------------------------------------------------------------------------------------------

  • Relaybox controll 

例如之前做的車牌relaybox控制,透過rs485送資料給relaybox, rs485為半雙工,所以需要切換gpio 去讀寫控制,有些relaybox只要寫入,有些會交握.

p.s. RS485是隸屬於OSI模型實體層的電氣特性規定為2線,半雙工,多點通訊的標準。(來源wiki)

//讀寫485
m_s32Rs485Fd = open("/dev/ttyAMA1",O_RDWR| O_NOCTTY );
    if(m_s32Rs485Fd!=-1)
        setRxBaud(m_s32Rs485Fd, B9600);

    

//控制gpio,do
m_s32GPIO=open("/dev/hi_gpio",O_RDWR );
(詳細參考 work\study\車牌 ; src\untiltool\Relaybox)

------------------------------------------------------------------------------------------------------

  • Google drive & Dropbox(似google)


  1.  getToken
  2. save token to sqlite
  3.  cgi post +token(upload_post_header) + file + sslwrite (UploadFile)


主要透過socket



------------------------------------------------------------------------------------------------------

  • Sqlite

1.query data

SELECT "欄位名" FROM "表格名" WHERE "條件";

ex:  SELECT GoogleDriveTable FROM url WHERE id=0

2.update

update "TableName" set "Content" WHERE "條件";

ex:  update DropboxTable set access_token='NULL',free_space='0',user_account='' WHERE id=0;

WHERE條件為text時,要 ip='192.168.92.188'

3.delete

DELETE FROM "TableName" WHERE "條件"; //沒where 則清掉所有table data

DROP TABLE IF EXISTS "TableName" //刪除table

(詳細參考 CSQLiteTool.cpp)

------------------------------------------------------------------------------------------------------

  • Linux Memory Leak

通常記憶體會長大都跟process 底下的thread & fd 有關


1.Thread 查看


cat /proc/[pid]/maps  , /proc/[pid]/maps 顯示進程的內存區域映射信息

ls /proc/[pid]/task ,其中註意的一點是[stack:<tid>]是線程的堆棧信息,對於/proc/[pid]/task/[tid]/路徑。

cat /proc/[pid]/stat ,第20攔是thread數目, 15欄表示執行時間(單位為cpu clock time)



C++程式中查看thread id : printf("mainid %d ; tid:%ld\n", getpid(),(long int)syscall(224));//只限于i386,如果是x86_64,調用186


2.FD 查看

https://stackoverflow.com/questions/3364213/getting-the-socket-fd-from-ip-address-and-port?rq=1
/proc/net/tcp =>tcp 送data 出去的
/proc/net/udp =>內部傳送的
ls -l /proc/<pid>/fd 可看到inode 找上面tcp&udp 對應的inode


(詳細參考  work\study\Linux\linux指令.txt)


p.s. 大部分定義部分來自wiki






------------------------------------------------------------------------------------------------------

  • ffmpeg



1.Audio

存檔後常用tool : awave studio , goldwave


常用的壓縮為g726 , g711(u-law), AAC(少用,付費)
PCM用於餵入 android audiotrack, PCM 要求通常為16bit +  8000HZ

 * live audio 部分

g711->PCM 可用查表法


g726->PCM ffmpeg

回傳為 frame->data[0],
長度為av_samples_get_buffer_size(NULL, m_pavCtx->channels,frame->nb_samples, AV_SAMPLE_FMT_S16, 1);


AAC->PCM ffmpeg
aac decode後通常為 AV_SAMPLE_FMT_FLTP (float 32bit), 通過sws_convert 轉為AV_SAMPLE_FMT_S16 (pcm 16bit)
48000 hz & 8000hz

* pushvideo 部分

ulaw & AAC  8000hz 都用ffmpeg




2.Video

我們程式中的解說參考\work\study\Android\sample code\source code\ffmpeg video.txt
  • h264 decode 完為yuv12

  • 再透過把yuv12轉 bitmap565

img_convert_ctx = sws_getContext(vCodecCtxarr[nal_ch]->width, vCodecCtxarr[nal_ch]->height,vCodecCtxarr[nal_ch]->pix_fmt, vCodecCtxarr[nal_ch]->width,vCodecCtxarr[nal_ch]->height,
PIX_FMT_RGB565, SWS_FAST_BILINEAR, NULL, NULL, NULL);



或者

  • 透過java把 yuv12->nv21 ;再透過yuvImage->Bitmap565

private void YV12toNV21(final byte[] input, final byte[] output, final int width, final int height) {

final int frameSize = width * height;
final int qFrameSize = frameSize / 4;
final int tempFrameSize = frameSize * 5 / 4;

System.arraycopy(input, 0, output, 0, frameSize); // Y

for (int i = 0; i < qFrameSize; i++) {
output[frameSize + i * 2] = input[tempFrameSize + i]; // Cr (V)
output[frameSize + i * 2+ 1] = input[frameSize + i]; // Cb (U)
}
}


  • 常用的yuv格式

YUV12=>YYYYYYY VVVV UUUUU
NV21 => YYYYYYY  VUVUVUVU

I420 == YUV420P   yyyy*2 uu vv
YV12== YUV420P   yyyy*2 vv uu
NV12 == YUV420SP  yyyy*2 uv uv
NV21 == YUV420SP  yyyy*2 vu vu
NV16 == YUV422SP  yyyy uv uv
YUY2== YUV422SP  yuyv yuyv


p.s.

avcodec_decode_video2 後

    unsigned char *y_buf = pFrame->data[0]; // Y
    unsigned char *u_buf = pFrame->data[1]; // U
    unsigned char *v_buf = pFrame->data[2]; //V


總長為 Y 為 width*height ; U 為(1/2* width)*(1/2*height ); V 為 (1/2* width)*(1/2*height )
總長為3/2*width*height (例如一個寬高為640*480, 最後yuv為460,800 約460kbyte)


  • MediaCodec(Android)

Decode: h264, h265 raw streaming to yuv

source code: github

Encode:

可參考: camerapreview+encode264.rar

-------------------------------auto discovery-----------------------------------------------------------------------

主要透過 socket + receive




------------------------------------------------------------------------------------------------------



------------------------------------------------------------------------------------------------------

其他:

RTSP: Real Time Streaming Protocol (即時串流協定)
常有的步驟:

OPTIONS
DESCRIBE
ANNOUNCE (ignore)
SETUP
PLAY
PAUSE (ignore)
TEARDOWN
GET_PARAMETER
SET_PARAMETER
REDIRECT (ignore)
RECORD (ignore)

透過vlc 可取到 video(h264,h265,mjepg) + audio (g711,g726,aac)

ONVIF:
定義網路影像監控系統的國際標準組織,標準化遠端控制, 除了影像,還可控制ptz.
透過onvif 可以得到很多詳細資訊如:device name , rtsp path, ptz, and so on.

使用ONVIF Device Manager

identification ... ipcam資訊( mac , model, name...)
network setting 設定ip
live video => rtsp path
video streaming => video 解析 , fps,bitrate ,...設定
PTZ control




RTMP: 直播串流, h264+ header