線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3777
推到 Plurk!
推到 Facebook!

IdHTTP1元件問題

答題得分者是:GrandRURU
超級賽亞人3
一般會員


發表:38
回覆:53
積分:23
註冊:2007-06-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-12-04 23:18:41 IP:123.110.xxx.xxx 訂閱
小弟最近在寫一網路程式

我使用http的方式連上server

我使用了IdHTTP元件

IdHTTP1->Host
IdHTTP1->Port

在這元件中我使用了host與port
但是要連上server的request必須還要有使用者的名稱與密碼
也就是username與password

可是我在 IdHTTP1->
之後並沒有找到這相關的
請問知道的大大能否教我
使用IdHTTP或是使用IdTCPClient
需要怎麼傳送我的username與password
編輯記錄
超級賽亞人3 重新編輯於 2010-12-05 23:20:17, 註解 無‧
超級賽亞人3 重新編輯於 2010-12-05 23:21:06, 註解 無‧
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-12-04 23:46:46 IP:111.249.xxx.xxx 訂閱
我有看到耶




有看到一個參考網站:http://www.vba90.com/post/vb31/vb31156.htm
擷錄解答內容:
idhttp1.Request.Username
idhttp1.Request.Password


===================引 用 超級賽亞人3 文 章===================
小弟最近在寫一網路程式

我使用http的方式連上server

我使用了IdHTTP元件

IdHTTP1->Host
IdHTTP1->Port

在這元件中我使用了host與port
但是要連上server的request必須還要有使用者的名稱與密碼
也就是username與password

可是我在 IdHTTP1->
之後並沒有找到這相關的
請問知道的大大能否教我
使用IdHTTP或是使用IdTCPClient
需要怎麼傳送我的username與password
超級賽亞人3
一般會員


發表:38
回覆:53
積分:23
註冊:2007-06-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-12-05 15:45:53 IP:120.110.xxx.xxx 訂閱
GrandRURU 大大你好

此問題我解決了
謝謝您
接著http server是一台攝影機
我該如何把影像抓到Image元件中呢?

我之前有參考一篇,可惜忘記網址了。

我只記得在IdHTTP中有get與post可以用

不知道我下面用法,是否可以把網路攝影機的影像送到image元件上
image =IdHTTP->Get('http://192.168.0.120/cgi-bin/viewer/video.jpg');

那如果我要控制攝影機
IdHTTP->post('http://192.168.0.120/cgi-bin/viewer/camctrl.cgi?channel=0&camid=1&move=left');



GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-12-05 22:25:38 IP:111.249.xxx.xxx 訂閱
如果是要抓jpg圖檔,「http://www.vba90.com/post/vb35/vb35157.htm」這篇或許有你要的解答

至於控制CCD…我就無能為力了


[code delphi]
uses
jpeg;

function TForm1.GetImage(url: string): boolean;
var
MemoryStream:TMemoryStream;
Idhttp:TIdhttp;
Img: TJPEGImage;
begin
MemoryStream:=TMemoryStream.Create ;
Idhttp:=Tidhttp.Create(nil);
Img := TJPEGImage.Create;
try
Idhttp.Get(url,MemoryStream);
MemoryStream.Position := 0;
Img.LoadFromStream(MemoryStream);
Image1.Picture.Bitmap.Assign(Img);
finally
MemoryStream.Free ;
Idhttp.Free;
Img.Free;
end;
end;
[/code]



===================引 用 超級賽亞人3 文 章===================
GrandRURU 大大你好

此問題我解決了
謝謝您
接著http server是一台攝影機
我該如何把影像抓到Image元件中呢?

我之前有參考一篇,可惜忘記網址了。

我只記得在IdHTTP中有get與post可以用

不知道我下面用法,是否可以把網路攝影機的影像送到image元件上
image =IdHTTP->Get('http://192.168.0.120/cgi-bin/viewer/video.jpg');

那如果我要控制攝影機
IdHTTP->post('http://192.168.0.120/cgi-bin/viewer/camctrl.cgi?channel=0&camid=1&move=left');



超級賽亞人3
一般會員


發表:38
回覆:53
積分:23
註冊:2007-06-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-12-06 14:31:32 IP:120.110.xxx.xxx 訂閱
GrandRURU 大大您好

我有加入取影像的部分
但是會有錯誤,如下圖
是哪邊有問圖呢?
能否幫我看一下,謝謝。



[code cpp]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if ((Edit1->Text != "") && (Edit2->Text != ""))
{
//設定HTTP Client的一些基本資訊
IdHTTP1->Host = Edit1->Text;
IdHTTP1->Port = StrToInt(Edit2->Text);

IdHTTP1->Request->Username = Edit3->Text;
IdHTTP1->Request->Password = Edit4->Text;

//與HTTP Server連線
IdHTTP1->Connect();
}

//{
Button1->Enabled=false;
TMemoryStream *ms=new TMemoryStream;
TJPEGImage *jpg=new TJPEGImage;
IdHTTP1->Get("http://" Edit1->Text " /cgi-bin/viewer/video.jpg", ms);
ms->Position=0;
jpg->LoadFromStream(ms);
Image1->Stretch=true;
Image1->Picture->Assign(jpg);
delete jpg;
delete ms;
Button1->Enabled=true;
//}
}

[/code]

IP攝影機程式

編輯記錄
超級賽亞人3 重新編輯於 2010-12-05 23:32:58, 註解 無‧
超級賽亞人3 重新編輯於 2010-12-05 23:34:12, 註解 無‧
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-12-06 17:30:39 IP:203.75.xxx.xxx 訂閱
我試是可以的哦
你可以先試著抓ktop的圖檔來練習(這真是不好的行為……)



===================引 用 超級賽亞人3 文 章===================
...43...
超級賽亞人3
一般會員


發表:38
回覆:53
積分:23
註冊:2007-06-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-12-06 19:46:22 IP:120.110.xxx.xxx 訂閱
那你可以提供你測試的程式給我參考嗎?

===================引 用 GrandRURU 文 章===================
我試是可以的哦
你可以先試著抓ktop的圖檔來練習(這真是不好的行為……)



===================引 用 超級賽亞人3 文 章===================
...43...
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-12-06 20:03:10 IP:203.75.xxx.xxx 訂閱
一模一樣啊
連結是我的大頭照了,請試試吧

[code cpp]
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMemoryStream *MemoryStream = new TMemoryStream();
TJPEGImage *Img = new TJPEGImage();
try
{
IdHTTP1->HandleRedirects = true;
IdHTTP1->Get("http://img54.imageshack.us/img54/3138/normal4a8ae38ce2a72.jpg", MemoryStream);
MemoryStream->Position = 0;
Img->LoadFromStream(MemoryStream);
Image1->Picture->Bitmap->Assign(Img);
}
__finally
{
delete MemoryStream;
delete Img;
}
}
//---------------------------------------------------------------------------
[/code]


編輯記錄
GrandRURU 重新編輯於 2010-12-06 18:52:14, 註解 增加轉址屬性(IdHTTP1->HandleRedirects = true;)程式碼‧
超級賽亞人3
一般會員


發表:38
回覆:53
積分:23
註冊:2007-06-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-12-07 19:51:24 IP:120.110.xxx.xxx 訂閱
GrandRURU 大大你好

我把問題先簡化
先測試連線部分
接著再登入使用者名稱與密碼

連線部分我把連線位址換成某個IP攝影機的位址
就會發生錯誤
IP攝影機位址


[code cpp]
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TMemoryStream *MemoryStream = new TMemoryStream();
TJPEGImage *Img = new TJPEGImage();
try
{
IdHTTP1->HandleRedirects = true;
IdHTTP1->Get("http://ebdemo.8800.org:47130/cgi-bin/viewer/video.jpg", MemoryStream);
MemoryStream->Position = 0;
Img->LoadFromStream(MemoryStream);
Image1->Picture->Bitmap->Assign(Img);
}
__finally
{
delete MemoryStream;
delete Img;
}
}
//---------------------------------------------------------------------------

[/code]


GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-12-07 23:09:37 IP:111.249.xxx.xxx 訂閱
會不會是Indy版本的問題?
我的是Indy10.2.3 / 10.5.5 BCB6
就利用你提供的IP攝影機位址來截圖,一切正常

而設計時期產生的「EIdConnClosedGracefully : Connection Closed Gracefully」例外(就是你之前說的錯誤視窗),不一定是真的例外。
常發生在對於不是client端主動切斷連線時的一種提醒,在程式運作時期不會發生

重要的是圖有出來就好了




最後,Indy10如果要用get連線
可以參考
http://topic.csdn.net/u/20100907/19/0103dd26-2c57-40da-a3bf-9eec39e3bb45.html

Request設定後,直接get就行了

===================引 用 超級賽亞人3 文 章===================
GrandRURU 大大你好

我把問題先簡化
先測試連線部分
接著再登入使用者名稱與密碼

連線部分我把連線位址換成某個IP攝影機的位址
就會發生錯誤
IP攝影機位址
編輯記錄
GrandRURU 重新編輯於 2010-12-07 08:49:42, 註解 無‧
GrandRURU 重新編輯於 2010-12-07 09:02:39, 註解 無‧
超級賽亞人3
一般會員


發表:38
回覆:53
積分:23
註冊:2007-06-05

發送簡訊給我
#11 引用回覆 回覆 發表時間:2010-12-08 22:14:46 IP:120.110.xxx.xxx 訂閱
GrandRURU 大大你好

這部分的例外處理機制我都解決了我是參考此網站的例外處理機制解決的

可是我reques->username與reques->password部分PTZIP攝影機都沒有回應我

我猜測這跟此IP攝影機的http指令有關。後來我嘗試把讀圖部分可以即時而加入Timer

但有點不順,不知原因在哪?能否賜教。感激您。


[code cpp]
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include
#include "Unit1.h"
#include
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//TMemoryStream *ms=new TMemoryStream;
//TJPEGImage *jpg=new TJPEGImage;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{


}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
Timer1->Interval = 30;
Timer1->Enabled = true;
SpeedButton1->Enabled = false;
SpeedButton2->Enabled = true;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
SpeedButton1->Enabled = true;
SpeedButton2->Enabled = false;
//IdHTTP1->Disconnect();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
TMemoryStream *ms=new TMemoryStream;
TJPEGImage *jpg=new TJPEGImage;
IdHTTP1->Get("http://ebdemo.8800.org:47130/cgi-bin/viewer/video.jpg", ms);
ms->Position=0;
jpg->LoadFromStream(ms);
Image1->Stretch=false;
Image1->Picture->Assign(jpg);
//delete jpg;
//delete ms;
}
//---------------------------------------------------------------------------

[/code]

GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#12 引用回覆 回覆 發表時間:2010-12-09 00:51:37 IP:111.249.xxx.xxx 訂閱
建議你的timer可以改成thread來處理
不過demo還是可以用用

timer我小改了一點點,使用上還ok
只是server的loading會很大

[code cpp]
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
TMemoryStream *ms=new TMemoryStream;
TJPEGImage *jpg=new TJPEGImage;
IdHTTP1->Get("http://ebdemo.8800.org:47130/cgi-bin/viewer/video.jpg", ms);
ms->Position=0;
jpg->LoadFromStream(ms);
Image1->Picture->Assign(jpg);
delete jpg;
delete ms;
Timer1->Interval = 100;
Timer1->Enabled = true;
}
[/code]
超級賽亞人3
一般會員


發表:38
回覆:53
積分:23
註冊:2007-06-05

發送簡訊給我
#13 引用回覆 回覆 發表時間:2010-12-09 11:38:21 IP:120.110.xxx.xxx 訂閱
GrandRURU 大大你好

謝謝你的幫忙問題都解決了
另外,分享我解決的方法
IdHTTP->Request->Username與IdHTTP->Request->Password登入的使用者帳密
似乎不適用於PTZ IP攝影機上,而是要使用特殊的方法。
這部分我有爬了數十篇的文,很多人都有遇到這樣的問題,但都沒有較好的解答
但我在一網站上有看到解決得方法如下:


idhttp.Request.CustomHeaders.Add('Authorization: AuthSub token="' mToken '" '); 

用此方法登入攝影機的帳密,其中
Authorization: AuthSub token="' mToken '←此部分可能會因為IP攝影機的不同,而有不一樣的指令。        接著控制的方法則要參考該IP攝影機的相關指令與方法,如GET與POST
舉一例子如下:        [code cpp]
IdHTTP1->Get("http://"   IP位址   ":"   Port   "/cgi-bin/viewer/camctrl.cgi?channel=0&camid=1&move=up");
[/code]        

編輯記錄
超級賽亞人3 重新編輯於 2010-12-08 20:39:52, 註解 無‧
超級賽亞人3 重新編輯於 2010-12-08 20:41:12, 註解 無‧
系統時間:2017-12-15 16:13:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!