SADPTool原理:

向239.255.255.250:37020发送基于ONVIF协议的 udp 组播,设备会监听 239.255.255.250:37020,收到指令,会向 发送组播的机器,返回设备信息,也会向239.255.255.250:37020 发送 设备信息的 组播。

发送 报文(Uuid是Guid,每次都生成一个新的,用同一个,我没有试过,可不可以)

12D17626-0DE1-48DB-97E3-40B106467932inquiry

返回报文

12D17626-0DE1-48DB-97E3-40B106467932

inquiry

139991

CS-C6TC-32WFR

CS-C6TC-32WFR0120170327CCCH738231995

8000

80

54-c4-15-9a-38-72

172.20.20.100

255.255.255.0

172.20.20.254

false

0

1

V5.2.3build 180804

V1.0 build 180731

2018-10-18 21:30:10

N/A

true

false

通过 wireshark 抓包发现,发送 ONVIF协议后,还会 广播 一个 包

但是不知道,是做何作用,我用SharpPcap 模拟发送了一个EarthNet II 的包,这个包 是固定不变的。

EarthNet II 的包,C# 原生 Socket 貌似不支持,raw_Socket 写起来太繁琐了,SharpPcap 另一个用处是可以基于网卡抓包。

搜索设备代码:

public void SearchDecives()

{

//EtherNetII 协议

byte[] SearchIpCameraByte = new byte[]{

0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,//目的地Mac

0x00 ,0x15 ,0x5d ,0xe6 ,0xaa ,0x0b ,//源地址Mac

0x80 ,0x33 ,//协议类型(0x8033萤石自定义类型)

0x21 ,0x02,//发送数据

0x01 ,0x42 ,0x00 ,0x00 ,0x24 ,0x03 ,0x06 ,0x04 ,0x03 ,0x00 ,0x13 ,0x82 ,0x00 ,0x15 ,0x5d ,0xe6,

0xaa ,0x0b ,0xa9 ,0xfe ,0x50 ,0x50 ,0xff ,0xff ,0xff ,0xff ,0xff ,0xff ,0x00 ,0x00 ,0x00 ,0x00,

0x00 ,0x00 ,0x00 ,0x00 ,0xfe ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x64 ,0x7e ,0x5d ,0xb0,

0x9e ,0x93 ,0xcd ,0x07 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00,

};

var devices = CaptureDeviceList.Instance;

Console.Write("---------------------------");

// differentiate based upon types

foreach (ICaptureDevice dev in devices)

{

if (dev is AirPcapDevice)

{

// process as an AirPcapDevice

}

else if (dev is WinPcapDevice)

{

dev.Open();

//dev.Capture();

//dev.StartCapture();

dev.SendPacket(SearchIpCameraByte);

Thread.Sleep(1000);

//dev.StopCapture();

//dev.Close();

// process as an WinPcapDevice

}

else if (dev is LibPcapLiveDevice)

{

// process as an LibPcapLiveDevice

}

}

return;

}

/// /// 查找设备

///

///

///

private void button1_Click(object sender, EventArgs e)

{

SendInQuiry();

SearchDecives();

SendMSearch();

}

/// /// 搜索upnp 设备

/// 向ssdp服务地址239.255.255.250:1900组播发送数据

///

public void SendMSearch()

{

//向ssdp服务地址239.255.255.250:1900组播发送数据

IPEndPoint ipend = new IPEndPoint(IPAddress.Any, 0);

UdpClient client = new UdpClient(ipend);

client.EnableBroadcast = false;

client.JoinMulticastGroup(IPAddress.Parse("239.255.255.250"));

IPEndPoint multicast = new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900);

byte[] buf = Encoding.Default.GetBytes("M-SEARCH * HTTP/1.1\r\nHOST:239.255.255.250:1900\r\nMAN:\"ssdp:discover\"\r\nST:upnp:rootdevice\r\nMX:3\r\n\r\n");

client.Send(buf, buf.Length, multicast);

//异步接收数据

//client.BeginReceive(new AsyncCallback(ReceiveBack), client);

//设置网络超时时间,一段时间未接收到数据时自动退出

//client.Client.ReceiveTimeout = 150;

//单播接收数据

//while (true)

//{

// byte[] value = client.Receive(ref ipend);

// string msg = Encoding.Default.GetString(value);

// //OLog.Info(msg);

// Console.WriteLine(msg + "-" + ipend.Address.ToString());

//}

}

/// /// 发送设备探究

/// 向ssdp服务地址239.255.255.250:37020组播发送数据

///

public void SendInQuiry()

{

var uuid = Guid.NewGuid().ToString().ToUpper();

//A207AD1A-962B-480B-A32C-4B0D98CBA0D4inquiry

var InQuiry = new byte[]{

0x3c ,0x3f ,0x78 ,0x6d ,0x6c ,0x20,

0x76 ,0x65 ,0x72 ,0x73 ,0x69 ,0x6f ,0x6e ,0x3d ,0x22 ,0x31 ,0x2e ,0x30 ,0x22 ,0x20 ,0x65 ,0x6e,

0x63 ,0x6f ,0x64 ,0x69 ,0x6e ,0x67 ,0x3d ,0x22 ,0x75 ,0x74 ,0x66 ,0x2d ,0x38 ,0x22 ,0x3f ,0x3e,

0x3c ,0x50 ,0x72 ,0x6f ,0x62 ,0x65 ,0x3e ,0x3c ,0x55 ,0x75 ,0x69 ,0x64 ,0x3e

}.

Concat(System.Text.Encoding.UTF8.GetBytes(uuid)).//uuid

Concat(new byte[]{

0x3c ,0x2f ,0x55 ,0x75 ,0x69 ,0x64 ,0x3e ,0x3c ,0x54 ,0x79 ,0x70 ,0x65 ,0x73 ,0x3e ,0x69,

0x6e ,0x71 ,0x75 ,0x69 ,0x72 ,0x79 ,0x3c ,0x2f ,0x54 ,0x79 ,0x70 ,0x65 ,0x73 ,0x3e ,0x3c ,0x2f,

0x50 ,0x72 ,0x6f ,0x62 ,0x65 ,0x3e

}).ToArray();

IPEndPoint ipend = new IPEndPoint(IPAddress.Any, 0);

UdpClient client = new UdpClient(ipend);

client.EnableBroadcast = false;

client.JoinMulticastGroup(IPAddress.Parse("239.255.255.250"));

IPEndPoint multicast = new IPEndPoint(IPAddress.Parse("239.255.255.250"), 37020);

client.Send(InQuiry, InQuiry.Length, multicast);

}

监听组播代码:

private void button2_Click(object sender, EventArgs e)

{

//接收组播数据

Thread t = new Thread(new ThreadStart(RecvThread));

t.IsBackground = true;

t.Start();

//Socket recv_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

//recv_socket.Bind(new IPEndPoint(IPAddress.Any, 1900));

//recv_socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveMessage, recv_socket);

}

/// /// 获取 ssdp 组播

/// ssdp地址固定:239.255.255.250:1900

/// 海康设备组播到 37020 端口

///

void RecvThread()

{

//绑定组播端口

UdpClient client = new UdpClient(37020);

client.EnableBroadcast = false;

client.JoinMulticastGroup(IPAddress.Parse("239.255.255.250"));

IPEndPoint mult = null;

while (true)

{

byte[] buf = client.Receive(ref mult);

string msg = Encoding.Default.GetString(buf);

Console.WriteLine(msg);

MessageBox.Show(msg);

//Console.WriteLine(mult.Address.ToString());

}

}

还可以用 ARP 映射原理 获取 局域网 所有机器的MAC地址,根据MAC 前6位判断是 哪家生产的设备,同一企业生产的 网络设备mac地址 前6位一般是固定的。

海康设备Mac地址 都是54-c4-15 开头的

我这里用的是 cmd arp -a,取arp映射的,也可以 sharppcap抓包,或者Windows api 发送arp 协议 包,取返回值

private static string GetARPResult()

{

Process p = null;

string output = string.Empty;

try

{

p = Process.Start(new ProcessStartInfo("arp", "-a")

{

CreateNoWindow = true,

UseShellExecute = false,

RedirectStandardOutput = true

});

output = p.StandardOutput.ReadToEnd();

}

catch (Exception ex)

{

throw new Exception("IPInfo: Error Retrieving 'arp -a' Results", ex);

}

finally

{

if (p != null)

{

p.Close();

}

}

return output;

}

mac版本 sadptool_海康 设备 发现(SADPTool原理)相关推荐

  1. 海康设备通过SDK获取和设置设备网络参数

    目录 1.获取网络相关参数 2.设置网络相关参数 1.获取网络相关参数 //获取设备的网络参数private void getNetCfg(int iUserID) {HCNetSDK.NET_DVR ...

  2. 国标流媒体服务器GB28181协议和海康设备的交互过程记录

    国标GB28181协议从2016年更新后,变得比之前更火了,到今年已经4年了,国标视频流媒体服务器基础的功能都已经发展起来,而更深层次的功能还需要进一步的研发. 在日常运用中,海康的摄像头运用较为广泛 ...

  3. 海康设备接入EasyCVR,出现告警信息缺失且不同步该如何解决?

    EasyCVR可支持设备通过国标GB28181.RTMP.RTSP/Onvif.海康SDK.大华SDK.Ehome等协议接入,对外可分发RTSP.RTMP.FLV.HLS.WebRTC等格式的视频流. ...

  4. LiveNVR监控流媒体Onvif/RTSP功能支持海康摄像头通过海康SDK接入支持回看倍速播放海康设备存储的设备录像

    LiveNVR功能支持海康摄像头通过海康SDK接入支持回看倍速播放海康设备存储的设备录像 1.流媒体服务说明 2.支持海康SDK接入 3.查看设备录像 3.1.时间轴模式 3.2.列表模式 4.RTS ...

  5. 海康设备注册一直失败的问题

    今天用JAVA对接海康设备,但是注册一直失败,ip.端口.用户名.密码都是正确的,一直百思不得其解,后来一番查询与排错,终于找到了原因,是因为没有初始化设备 初始化设备的代码(红框里的部分): if ...

  6. Ehome/ISUP协议海康设备的主动注册管理

    第一步:在平台软件所在网络需映射端口 7660(UDP) 54000-65535(TCP+UDP) 第二步:IE登录海康设备,进入海康设备网络--高级设置--平台接入 第三步:接入类型选择EHome或 ...

  7. 海康设备对接sdk错误码汇总 v6.0

    海康设备对接sdk错误码汇总 v6.0

  8. 使用RTSP协议读海康设备的视频记录

    前言 作为一名搞CV的程序员,我们的输入通常就是视频流.我相信很多人都用的OpenCV提供的VideoCapture函数.就我现在的经验来说,该函数支持以下3种输入: # 方式1:填入索引,表示读取设 ...

  9. mac版本 sadptool_【Koala 工具】设备调试相关工具集锦

    附件:2,DeviceManage_V1.0.0.1.T.20161017.zip • 16.85MB • 下载 附件:3,LYClient1.8.9.rar • 9.57MB • 下载 附件:4,海 ...

  10. 海康设备对接——高抛

    背景:由于工作问题,最近对接了海康的设备网络SDK,参考了SDK自带demo,还有一部分的网上博客,发现没有很全的,自己决定把自己开发的经验分享下 开发环境: 语言:Java 工具:idea 代码: ...

最新文章

  1. hash tree算法
  2. r型聚类典型指标_文献解读 | 缺陷和非缺陷型精神分裂症脑网络功能紊乱的共性和异性...
  3. resttemplate 请求重试_使用Spring Cloud Ribbon重试请求
  4. 每个程序员都必读的12篇文章
  5. 每日一题:leetcode1128.等价多米诺骨牌对数
  6. windows:(1)xmind常用快捷键
  7. 《实现模式(修订版)》—第2章模式
  8. 华为P50外观定了:居中挖孔
  9. MYSQL定时创建表分区
  10. 我的成长笔记20210324(进度把控)
  11. 2d头发_3D打印毛囊突破性进展!“头发工厂”将成秃顶的救星
  12. 阶段3 2.Spring_06.Spring的新注解_3 AnnotationConfigApplicationContext的使用
  13. windows自带黑体_win7系统黑体字体
  14. 什么是数据脱敏,数据脱敏有哪些方式
  15. 手机、电话号码、邮箱、域名、身份证号的测试用例
  16. 手机怎么打开html.chm,chm格式文件怎么打开,华为手机chm阅读器哪个好
  17. 网上书店管理系统mysql代码_网上书店管理系统数据库 sql sever
  18. Unity开发手机游戏从第一行代码到Taptap上线,我经历了什么
  19. c语言链表删除重复点,【图片】想问一道链表题,如何删除重复元素【c语言吧】_百度贴吧...
  20. 常德职业技术学院2018级新生军政训练总结表彰大会隆重召开

热门文章

  1. UI控件Telerik UI for Silverlight发布R2 2019|附下载
  2. 应届生从头脑风暴到游戏策划案的个人思路(一)
  3. 维修技术论坛专用工具包 v5.0
  4. 物联网可视化平台-场景编辑器-轻松实现三维地图搭建
  5. 【CF55D】Beautiful Numbers-数位DP+优化
  6. 第一届对象存储技术及应用大会:Esri中国周宁——万物互联时代,云存储技术的变革与展望...
  7. 小艾机器人apk_小艾QQ群机器人安卓版
  8. hrbust/哈理工oj 1809 再就业【状压dp】
  9. php排斥ajaxsubmit函数,关于php:ajaxsubmit错误捕获
  10. jquery.form.js的ajaxSubmit和ajaxForm使用