項目中使用了海康相機用於拍照功能,要訪問海康相機就須要知道相機的IP,通常咱們經過配置文件將IP地址傳入程序中,在調用其官方SDK進行拍照。每次都須要手工配置IP地址,每次現場安裝實施都要配置,很是容易配置錯誤。因此若是軟件可以自動搜索相機,並自動配置,免去手工配置的麻煩和易出錯,能夠加強軟件的可靠性,下降部署複雜度。java
分析以後想到,海康官方有提供一個相機IP修改的工具,功能強大,只要在局域網中,即便不在一個IP段也能搜索到相機。若是咱們的程序也可以實現該功能,可否實現前面的設想?git
根據這個想法,我以爲能夠分析下其IP搜索通訊協議。工具
經過使用wireshark抓包工具,發現其IP搜索使用了兩種通訊方式,一種是UDP廣播,另外一種是更加底層的通訊方式,直接經過網卡發送廣播包。實測時發現,兩種通訊方式功能基本相同,都可以所搜IP,修改配置。直接使用網卡發包的方式比UDP廣播的方式貌似兼容相機多些。ui
UDP廣播:加密
UDP廣播通訊方式,搜索工具會向IP:239.255.255.250,端口號:37020進行廣播,通訊內容爲xml格式字符串,例如如下內容。各個字段含義已經比較清晰了。code
/* 如下是海康相機UDP協議 * 用於搜索相機和修改IP * 廣播地址:239.255.255.250 * 端口號:37020 */ 搜索相機廣播請求 <?xml version="1.0" encoding="utf-8"?> <Probe> <Uuid>AB2CC373-2332-4F7B-AA18-838E08E748AE</Uuid> <Types>inquiry</Types> </Probe> 搜索相機返回結果 <?xml version="1.0" encoding="utf-8"?> <ProbeMatch> <Uuid>AB2CC373-2332-4F7B-AA18-838E08E748AE</Uuid> <Types>inquiry</Types> <DeviceType>140063</DeviceType> <DeviceDescription>DS-2CD5A26FWD-IZ</DeviceDescription> <DeviceSN>DS-2CD5A26FWD-IZ20160518AACH604074182</DeviceSN> <CommandPort>8000</CommandPort> <HttpPort>80</HttpPort> <MAC>bc-ad-28-53-85-e8</MAC> <IPv4Address>172.16.16.191</IPv4Address> <IPv4SubnetMask>255.255.255.0</IPv4SubnetMask> <IPv4Gateway>172.16.16.1</IPv4Gateway> <IPv6Address>::</IPv6Address> <IPv6Gateway>::</IPv6Gateway> <IPv6MaskLen>0</IPv6MaskLen> <DHCP>false</DHCP> <AnalogChannelNum>0</AnalogChannelNum> <DigitalChannelNum>1</DigitalChannelNum> <SoftwareVersion>V5.3.8build 151223</SoftwareVersion> <DSPVersion>V7.3 build 151218</DSPVersion> <BootTime>2016-08-01 17:04:52</BootTime> <ResetAbility>false</ResetAbility> <DiskNumber>0</DiskNumber> <Activated>true</Activated> <PasswordResetAbility>true</PasswordResetAbility> <PasswordResetModeSecond>true</PasswordResetModeSecond> </ProbeMatch> 修改相機參數請求 <?xml version="1.0" encoding="utf-8"?> <Probe> <Uuid>21A9F613-5E4F-41DF-B821-E36523087D1D</Uuid> <Types>update</Types> <MAC>28-57-be-af-7a-14</MAC> <Password>/RsWjdUa5zJ3OQWH6zy00w==</Password> <IPv4Address>172.16.16.190</IPv4Address> <CommandPort>8000</CommandPort> <HttpPort>80</HttpPort> <IPv4SubnetMask>255.255.255.0</IPv4SubnetMask> <IPv4Gateway>172.16.16.190</IPv4Gateway> <IPv6Address>::</IPv6Address> <IPv6Gateway>::</IPv6Gateway> <IPv6MaskLen>0</IPv6MaskLen> <DHCP>false</DHCP> </Probe> 修改相機參數成功 <?xml version="1.0" encoding="utf-8"?> <ProbeMatch> <Uuid>AB2CC373-2332-4F7B-AA18-838E08E748AE</Uuid> <Types>update</Types> <Result>success</Result> <DeviceType>140063</DeviceType> <DeviceDescription>DS-2CD5A26FWD-IZ</DeviceDescription> <DeviceSN>DS-2CD5A26FWD-IZ20160518AACH604074182</DeviceSN> <CommandPort>8000</CommandPort> <HttpPort>80</HttpPort> <MAC>bc-ad-28-53-85-e8</MAC> <IPv4Address>172.16.16.195</IPv4Address> <IPv4SubnetMask>255.255.255.0</IPv4SubnetMask> <IPv4Gateway>172.16.16.1</IPv4Gateway> <IPv6Address>::</IPv6Address> <IPv6Gateway>::</IPv6Gateway> <IPv6MaskLen>0</IPv6MaskLen> <DHCP>false</DHCP> <AnalogChannelNum>0</AnalogChannelNum> <DigitalChannelNum>1</DigitalChannelNum> <SoftwareVersion>V5.3.8build 151223</SoftwareVersion> <DSPVersion>V7.3 build 151218</DSPVersion> <BootTime>2016-08-01 17:04:52</BootTime> <ResetAbility>false</ResetAbility> <DiskNumber>0</DiskNumber> <Activated>true</Activated> <PasswordResetAbility>true</PasswordResetAbility> <PasswordResetModeSecond>true</PasswordResetModeSecond> </ProbeMatch> 修改相機參數失敗 <?xml version="1.0" encoding="utf-8"?> <ProbeMatch> <Uuid>AB2CC373-2332-4F7B-AA18-838E08E748AE</Uuid> <Types>update</Types> <Result>failed</Result> </ProbeMatch>
其中密碼部分進行了加密,加密方式爲md5+base64,加密參考代碼以下xml
/** * md5加密 * @param password * @return */ public static byte[] md5(String password) { try{ // MD5 MessageDigest md = MessageDigest.getInstance("MD5"); md.update(password.getBytes()); byte[] digestedValue = md.digest(); return digestedValue; }catch(Exception e){ e.printStackTrace(); return null; } } /** * md5(base64)加密 * @param password * @return */ public static String md5Base64(String password){ try{ // MD5 byte[] digestedValue = md5(password); // base64 BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(digestedValue); }catch(Exception e){ e.printStackTrace(); return null; } }
網卡廣播方式:ip
網卡廣播的方式,其協議內容使用二進制格式,並不像UDP方式那麼容易理解。對於其協議格式只破解了一部分,其中貌似有校驗和的字段,其校驗和的計算方式沒法得知,致使並不能實際用該協議對相機參數進行修改。要可以使用網卡進行廣播通訊,還須要安裝WinPcap(官方工具也裝了這個),java的話還須要jPCAP才能進行底層通訊。以下是部分協議解析結果:md5
// mac通訊設備搜索 //21 02 01 42 00 00 1D 2C 06 04 03 00 21 82 50 7B 9D 73 44 73 AC 10 10 F4 FF FF FF FF FF FF 00 00 00 00 00 00 00 00 FE 80 00 00 00 00 00 00 9D 57 F5 8D 3B B0 78 EC 00 00 00 00 00 00 00 00 00 00 00 00 // 貌似如下是mac地址通訊接收的數據 //21 01 01 F6 00 00 1D 07 06 04 //04 (04=inquiry,07=update) //00 (結果:01=失敗,02=成功) //5B 44 //C0 56 E3 7C B0 C4 (物理地址地址) //AC 10 10 C1 (IP地址:172.16.16.193) //FF FF FF FF FF FF 00 00 00 00 //FF FF FE 00 (子網掩碼:255.255.254.0) //44 53 2D 32 43 44 32 34 31 32 46 2D 49 32 30 31 35 30 33 32 35 43 43 43 48 35 30 38 35 33 37 39 37 38 (設備序列號:DS-2CD2412F-I20150325CCCH508537978) //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 98 11 00 00 //1F 40 (端口:8000) //00 00 00 01 00 00 00 00 //56 35 2E 31 2E 36 62 75 69 6C 64 20 31 34 30 36 31 32 (軟件版本:V5.1.6build 140612) //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //56 35 2E 30 2C 20 62 75 69 6C 64 20 31 34 30 34 31 31 (DSP版本:V5.0, build 140411) //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //32 30 31 36 2D 30 38 2D 30 32 20 31 38 3A 31 37 3A 33 31 (啓動時間:2016-08-02 18:17:31) //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 9C 9D 99 //AC 10 10 01 (網關:172.16.16.1) //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 //00 (DHCP:00=關,01=開) //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //50 (http端口:80) //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //44 53 2D 32 43 44 32 34 31 32 46 2D 49 (設備類型:DS-2CD2412F-I) //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // mac通訊修改信息 //21 02 01 42 00 00 26 19 06 04 06 00 33 16 50 7b 9d 73 44 73 //ac 10 10 f4 (PC機IP(20)) //c0 56 e3 7c b0 c4 (mac地址(24)) //ac 10 11 87 (IP地址(30):172.16.17.135) //ff ff fe 00 (子網掩碼(34):255.255.254.0) //82 7c cb 0e ea 8a 70 6c 4c 34 a1 68 91 f8 4e 7b (md5加密(38)) //00 00 1f 40 00 00 00 00 00 00 00 00 02 9c 02 41 (1f 40兩個值多是校驗和) //ac 10 10 01 (網關(70):172.16.16.1) //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (IPV6地址(74)) //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (IPV6網關(90)) //00 (IPV6子網前綴長度(104)) //00 //00 (DHCP(106)) //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //50 (http端口(137):80) //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00