HUNT
- CGI
通用閘道器介面(Common Gateway Interface/CGI)是一種重要的網際網路技術,可以讓一個用戶端,從網頁瀏覽器向執行在網路伺服器上的程式請求資料。CGI描述了伺服器和請求處理程式之間傳輸資料的一種標準。簡單來說就是網頁透過socket or TCP 傳給server , 例如C++ server 可以用multi-socket 接收.
(參考 work\study\CGI\CGI 接收.txt)
------------------------------------------------------------------------------------------------------
- Ntpd
它在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;
參考: Linux 磁碟與檔案系統管理
硬碟切割基本概念, 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 nameunlocked_ioctl:gpio_ioctl,//function namerelease:gpio_release,//function name};
(詳static struct miscdevice gpio_dev = {MISC_DYNAMIC_MINOR,"led_driver",&gpio_fops,//這裝置的操作方法};//註冊裝置ret = misc_register(&gpio_dev);//操作driverint 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)
------------------------------------------------------------------------------------------------------
主要透過socket
------------------------------------------------------------------------------------------------------
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)
------------------------------------------------------------------------------------------------------
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)
- getToken
- save token to sqlite
- cgi post +token(upload_post_header) + file + sslwrite (UploadFile)
主要透過socket
------------------------------------------------------------------------------------------------------
- Sqlite
1.query dataSELECT "欄位名" 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 查看
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)
------------------------------------------------------------------------------------------------------
- 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
其他:
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

