WPF在上位机的应用

抱一只橘 757 0
温馨提示

本篇是是桌面开发第六篇。上一篇是electron项目构建,本篇章属于一次上位机的框架搭建尝试,以备后续进军工控界使用。

 

 

一、基本概况

1.参考资料

  • 书:
    • 2010的深入浅出WPF:可以作为入门参考了解概念(xaml、历史、)
    • 147页

 

 

  • 行情:
    • 对应:上位机开发、客户端开发、非标行业
    • 接触情况:之后也有可能去(40%-20%),待过一段时间。
    • 优先级:汽车>新能源>机械>3C

 

2.选型特点

  • 历史:
    • 2003年:winform已经接替了mfc和一些com组件,实现了事件驱动、组件化
    • 2007年,历史使命是接替winform,后续应用到了vs2010的构建。
    • 2014年,xamarin.forms出现,功能是跨平台应用。但主要是uwp和移动端。
      • 特点:独立的控件体系,不可用winUI 2.0。使用的是Mono .NET Framework
      • 命名空间是:Xamarin.Forms和xmlns="http://xamarin.com/schemas/2014/forms"
      • 前期作用是移动端和Windows phone,后面才是uwp。
    • 2015年,uwp应用 win10时代,一套兼用c++和c#来开发win10应用的框架,一直不温不火。打包成AppX包格式
      • AppX程序包不直接生成传统的.exe可执行文件,而是由系统在安装时解包并处理到一个受保护的目录下,通常是C:\Program Files\WindowsApps,为了保证用户的安全性和防止恶意篡改。
      • api:WinRT API ——代替.net
      • 命名空间:Windows.UI.Xaml和 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      • winui2.0:这是将XAML控件引入给uwp应用使用的原生组件库。
        • 命名空间是:Windows.UI.Xaml即xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    • 2016年,在.NET Core上进行WinForms、WPF开发,可以利用.NET Core的独立部署、模块化、更高性能等特性,这些是在.NET Framework下进行WinForms、WPF开发所不具备的。
    • 2020年,WinUI 3.0:是XAML和WPF解耦后的纯XAML的框架,类似于wpf的现代化版本,需要使用原生的windows10+Sdk,不支持win7。
      • 使用:只支持桌面的项目,有独立的nuget包,例如win32传统软件、WPF。
      • 命名空间:也是Microsoft.UI.Xaml
    • 2020年:maui:为了取代xamarin.forms的跨平台开发产物——更好的一致性和.net 6.0支持
      • 命名空间:"http://schemas.microsoft.com/dotnet/2021/maui"和using Microsoft.Maui;
      • 可使用WinUI 3.0。具体没用过。
    • 2021年:.net 6.0,懂的都懂

 

  • 三条产品线:
    • 跨平台:xamarin.forms、maui、flutter、react native
    • 部分跨平台:uniapp(小程序)、electron(桌面)
    • 前端:blazor、三大家(vue、react、angular)
    • 桌面:32(mfc-winform-wpf-winui3)

 

  • 创新点:
    • 支持mvvm:即数据绑定,不再操作对象组件
    • 支持组合式语法:即利用c#的patial机制,使用代码后置功能。
    • 结构化xaml声明:引入标签空间,和jsp、Android和xml等一致。
    • 解释环境:c#的clr,而不是浏览器内核和窗口。

 

  • 对比:
    • winform:门槛略高,ui更好,图形能力更流畅。
    • 前端技术栈:重点比对同为mvvm技术的vue。
    • qt:从应用开发角度,WPF完胜,除非是要上到Linux(嵌入式设备)。
    • electron:兼容性更好,但作品的价值面更低。

 

  • 补充.net core的选型特点
    • 理念:云原生、独立部署、丢掉历史代码(webform、winform等桌面绑定应用)
    • framework缺点:操作系统级的库、不能与服务器打包()+与iis深度耦合、内存占用大
    • asp.net层面:彻底放弃web form、提升渲染管线调度。
      • 1.项目配置:没有App.config或Web.config文件,csproject文件不同
    • 类库层面:制定了.net stander,方便跨平台编译。
    • 关于异步编程:对照“异步点餐”的例子,异步编程的优点就是可以提高服务器接待请求的数量,但不会使得单个请求的处理效率变高,甚至有可能略有降低。

 

 

二、开发方式

  • 页面:
    • 预览:
      • 前端:spa不支持,静态页面才支持。
      • wpf:支持Android原生级的预览,但不支持整体预览、绑定数据预览。
    • 调试:
      • 前端:开发者工具+nodejs,控制台和网络拦截器为主,结构预览次之。
      • wpf:vs全程调试,支持结构预览、不支持网络拦截(对接甲方MES)
    • 可视化编程:
      • 前端:低代码,生成组件,但是后续二改限制严重。
        • 特点:布局就是flex,可以调整位置和宽高,带属性编辑器。但是无法预览定位(原生js),也无法改数据源(做复杂计算)
      • winform:与qt一致的,原生十分快速(也有可能是功能有限)。
        • 特点:绝对定位无敌,
      • wpf:blend拖控件设计
        • 特点:实现了类似绝对定位效果,可以手拖改变布局、控件位置(基于margin)。
    • 逻辑:
      • 前端:spa实现了组件分离和组合式内聚开发(手动写在一起)
      • winform:支持组件化,但无MVVM需要操作view组件
      • WPF:UI框架实现了路由,得用。
    • 布局控件panel:
      • 特点:支持嵌套多个控件。
      • grid:近似于html的table,Android的grid,flutter的gridview需要预定好行列宽高,
      • UniformGrid:自动均分宽高的grid,
      • wrapPanel:就是阉割版flex布局, 类似于row和column会换行
      • stackPanel:实现了折叠(删除元素)动画的布局。LinearLayout。但会占满不换行
        • Orientation
      • dockpanel:float属性
      • WrapGrid:就是完整升级版flex,允许定义宽和高了,最大行数、多对齐手段等等。
      • canvas:绝对定位的像素绘图,重大缺点就是缺少弹性布局
      • ScrollViewer:提供滑动条的stackPanel
    • 内容控件:
      • 父类:contentConctrol,特点是带有content属性,只支持一个子组件(content、panel
      • 例子:button、checkbox、label等表单组件,tooltip
    • 标题内容控件:
      • 父类HeadcontentConctrol:就是带<template #head>的组件
      • 例子:tabitem、盒子groupbox、
    • 列表控件:
      • 例子:combobox多选、Selector选择器、Listview(table表格)、Menu菜单、
    • 校验:给binding对象的ValidationRules属性添加值。

 

  • 框架引用:
    • 默认命名空间:xaml/presentation:System.windows、控件、
    • x命名空间:拓展命名空间。/2006/xaml
      • x:Class:生成的全命名空间类名,影响编译的
      • x:Name:声明并赋值Name属性为对应名值,不推荐用Name
      • x:Key:WPF在上位机的应用指定资源,x:shared是指定对象是否单例。
      • x:Array:WPF在上位机的应用在标签里定义数据
      • x:code和x:data:声明c#代码和类对象
      • x:type :创建自定义对象时显式指定类,或定义里嵌套有Type,就相当于给泛型<T>传入值WPF在上位机的应用
    • xml原生标签支持:用<xmlDataProvider>
    • D命名空间:blend设计器的相关设定,expression/blend/2008
      • DesignHeight:设计视图的长宽
      • DataContext:指定预览时的上下文
    • local命名空间:本项目命名空间
    • MC命名空间:
      • mc:Ignorable="d":能够提高兼容性,忽略某些元素

 

  • 谈谈MVC:
    • WPF在上位机的应用
    • 缺点:UI交互层经常有很多算法(操作ui组件的逻辑)
    • mvvm的解决点:把UI独立出来,只操作数据VM(解放程序员,也分离UI设计和逻辑处理的工作)。
    • 原生绑定binding
      • 注册是必须实现 INotifyPropertyChanged+DataContext注册+使用时用
      • c#绑定:WPF在上位机的应用
      • xaml绑定:xxText={Binding Path(可省)= }——类似于flutter的绑定controller
      • WPF在上位机的应用
      • 绑定对象:就是上面这种Path指定,常用全局Datacontext,类似于vue的:data=TableList
      • WPF在上位机的应用
      • 绑定原始值:直接绑定,而不用path指定对象WPF在上位机的应用
      • 绑定datatable:listView1.ItemSouce得用dt.defaultView属性;或是指定DataContext=dt
      • 循环模版:
        • 隐式创建:DisplayMemberPath="Name"会根据对象属性全额创建item控件,与下面相同
        • 显示创建:类似于v-for
        • WPF在上位机的应用
    • WPF在上位机的应用

 

  • 谈谈mvvm:
    • 排序:字段—>clr属性—> 依赖属性(重写set方法)或者用setStatus()方法
    • 属性:就是对字段封装了安全访问,是个语法糖(.net或spring的log4j)
    • 依赖对象:就是允许对象(ui控件)的内存初始化时极小,但拥有绑定数据分配内存能力。
      • WPF在上位机的应用
      • 类似于:和@双绑标签的属性值,binding对象就是ref()响应式封装。
    • 响应式原理:首先继承了dependencyObject,Register方法,把CLR属性存在包装器里就成了依赖属性(具有响应式get、set),底层类型是dependencyProperty,由CLR包装器+原属性类型生成hashTable存储对象GlobalIndex。WPF在上位机的应用
    • 附属属性:即可以凭空添加的属性,本质是依赖属性。

 

  • 事件处理机制:
    • 事件的本质:是消息是一个结构体,Windows有消息队列存等待处理的数据。
    • 订阅:event和eventhandler的关系是,event先被调用,然后调用事件处理器。
      • 所以事件处理器的参数是event类型
    • 回顾委托:本质是函数指针,委托之于方法,是一个统一调用类型,接口之于方法,是重载实现、
    • 弊端:
      • 说人话:必须显式订阅绑定(和信号槽一个道理),且必须在同一个容器下(组件级)
    • 路由事件:
      • 从事件的传播方式看:极度类似JavaScript的冒泡事件,可以截获数据。

 

三、生态逻辑

  • wpf ui
    • 基础:提供一套插件+xml命名空间+nuget库
    • 现代桌面fluent:
      • 侧边栏导航:代替传统多窗口(vs等工业软件)
      • 动画:ui现代化的灵魂
      • 响应式:开发效率问题+性能的兼容考虑
      • 自定义页头区域:替代传统的菜单栏(大标题和快捷按钮)
    • 实际:无文档、6k的star

 

  • MaterialDesignInXamlToolkit
    • 基础:同上
    • 现代移动端material:
      • 按钮:模拟真实世界的阴影、纵深。
      • 平面动画:很多转场动画,事实证明全部app都不用。
    • 实际:github文档,14k的star

 

  • CommunityToolkit.Mvvm
    • 微软官方的框架
    • [ObservableProperty]注解:实现了INotifyPropertyChanged规范的属性(依赖属性)
    • 注册:DataContext = ViewModel;

 

  • Win2D:

 

四、Scada实践

1.点位统计

 

  • CCD相机:36台
    • 情况:无厂家支持(实际有)、全工控机
    • 思元:楼下的印刷2
    • HOPO:楼下的印刷5
    • 解决方案:反编译+读串口(得看机台)
    • 确认:全部有厂家支持。

 

  • 烧结炉:64台
    • 情况: 无传感器,无厂家支持(实际有)
    • 33台老品牌SIERRATHERM:xp软件,难度高。楼下的2#
    • 8台双永:xp软件,难度高,3厂5楼的77#
    • 9台台丰机:直连触摸屏(得看机台)、3厂五楼的91#89#。
    • 12台喜而诺盛:2厂四楼的34#、37有联网
    • 解决方案:反编译?
    • 确认:直连的情况,联网的情况(新的机台原厂做的)

 

  • 印刷站:83+36=119台
    • 情况:无传感器,无厂家支持,点位自己读(没有点位,得加装)
    • plc品牌:
      • 欧姆龙:22CPM2C、54cqm(2厂居多、1厂也有)、8CJ、2cpu43、4台CPS21、1台cp1h(2厂32#)
      • 基恩士:14台kv3000(2厂4楼,41-42#)
      • 松下:10FP2(2厂4楼,97-98#)、4FPT
    • 已经联网42台:4楼1#~5、3厂5楼6-69#(得看机台)
      • 参考思路:外接传感器+串口读取(eightdemo)
    • 未联网78台:4楼10#、2厂18-19#、3厂5楼
    • 解决方案:
      • 购买网卡(76张cpm、8张cj、1张cp/)+plc远程读写+破解点位;
      • 外接传感器+串口读取(eightdemo)
    • 确认:制程人沟通(李智)+已经联网的情况(7台)+实际(116台)

 

  • 镭射:170台
    • 情况:全工控机,xp、docs的老系统,难度大,无厂家支持,需要工艺管理?
    • 雷科4楼、光华2厂、3厂5楼也有雷科光华
    • 解决方案:反编译?
    • 确认:镭射的exe文件,工艺管理的含义

 

  • 折条:91台
    • 情况:需要工艺管理、全部已经联网?全厂家支持
    • 品牌:40台和博、51台万润:统一1对8,串口+api
      • cqm:23台、楼下折条2号
      • cp:40台、扩1厂折条29号
      • 松下:28台、FR-XHC60T、折条17号
    • 解决方案:反编译已有的和博(eightdemo)
    • 确认:工艺管理(需要工控机管控)、联网情况(有读取,但是得开机)
  • 折粒:81台
    • 情况:需要工艺管理、全部已经联网?全厂家支持
    • 品牌:46台万润、5台和博、30台雄鹰
      • 三菱46:35台3u、11台2n——扩1厂的折粒31号和40号
      • 松下12:FP-XXC30T。折粒4号
      • 欧姆龙23:5台cp、18台TPM1A-30CDR。4楼折粒1号有上位机
    • 解决方案:
      • 购买网卡(46台BCNET-FX+12台BCNET-KV+5台BCNET-CP)
      • 反编译已有的和博(eightdemo)
    • 确认:同上

 

  • 电镀:13台
    • 情况:工控机、全部已经联网?厂家支持
    • 全易镀:电镀1
  • 外观CCD:38台
    • 情况:工控机、无联网、厂家支持
    • 35ATV:外观CCD-1#
    • 2台擎邦:外观CCD-3#
    • 1台和博:6楼
  • 真空镀膜机:2台
    • 情况: 无厂家支持
    • 腾胜真空:有上位机
  • 解决方案:找厂家,看联网

 

  • 难度:折条>印刷>折粒>电镀/外观(工控机)>CCD>镭射>烧结炉
    • 方案:远程传输+中央算力>上位机采集+api上传
    • 需求:远程平台(办公室)监控+工艺下发

 

2.框架搭建

 

  • 系统图标:根目录下的ico文件
  • app.xaml:
    • Startup:指定启动方法OnStarup()
    • Starturi:快速启动的默认页面,
    • <ResourceDictionary>:用于全局引入命名空间的组件
      • 引入:ui:Design.Background="{DynamicResource ApplicationBackgroundBrush}"
      • 主题:ApplicationThemeManager来管理ApplicationTheme,ThemesDictionary+SystemThemeWatcher可实现全局应用
  • app.xaml.cs:
    • application类:
      • 创建IHost _host:来管理依赖注入(手动添加类
      • WPFUI的:page解析、Theme主题解析、TaskBarService动画、INavigationWindow启动窗口
      • 自己的页面路由:page和Viewmodel
  • app.manifest:资源清单,手动设置,否则vs默认提供
    • 信任信息(TrustInfo):level="asInvoker" uiAccess="false"可以设置应用权限
    • 兼容性声明(Compatibility):使应用兼容win7等系统
    • 依赖项(Dependency):用winCommon-Controls
  • using.cs:全局关键包引入
    • System 和 System.Windows:wpf关键包
    • CommunityToolkit.Mvvm:官方的mvvm框架
      • [RelayCommand]:回调方法,OnXX——>XXCommand
      • [ObservableProperty]:依赖属性,_xx——>Xx

 

  • 布局:
    • 本质上scrfood、vue的后台管理、桌面的侧边切换是一个grid
    • 桌面Window:
      • viewmodel:同index.js
        • 作用绑定固定路由组件窗口标题等、
      • xaml:同app.vue,但不是像组件式ui。而是固定式
        • <ui:FluentWindow:是一个框架的窗口
          • WindowBackdropType: acrylic和mica
        • <ui:TitleBar>:一次性
          • 作用:相当于appbar和Topnavigation,在row0。
          • 内容:标题+icon+自定义小图标导航
        • <ContentPresenter>:别动
          • 作用:内容控件,插槽,同slot。
        • <ui:NavigationView>:真正的scrfood
          • 作用: 这个就是body插槽,可改大小,其他基本不变。
          • FooterMenuItemsSource和MenuItemsSource属性:侧标题栏。绑定viewmodel的NavigationViewItem
          • BreadcrumbBar:暂时未知
        • <ui:NavigationView.Heade>:小标题插槽,可以去掉
        • <ui:NavigationView.ContentOverlay>:插槽。里面TargetPageWPF在上位机的应用
        • tray:托盘文件
      • cs:别动,都是绑定框架组件。
    • 单独page:
      • viewmodel:同js
        • INavigationAware:OnNavigatedTo和From拦截器方法。
        • InitializeViewModel():获取某个动态数据的方法,在生命周期里调用,相当于oninit()。
        • 事件方法:用注解RelayCommand
        • 属性:无脑加[ObservableProperty]
      • xaml:同<template>
        • 主要:定义页面+绑定好数据。
        • 绑定DataContext
      • cs:作用同design.cs。别动
        • 绑定viewmodel和xaml就行,

 

  • 需求:
    • 总体:读取固定点位(配置类)、
      • 1.√上传:前后端交互的http client。——最后弄
      • 2.√读数据静态网络工具类:HSL——封装到model里
      • 3.√侧边栏分类(代替上边标签页):印刷机、折条机、折粒机(都差不多)
      • 4.√印刷机:c#多线程+抓取数据选择(表单)√、实时日志√、判断开关机
      • 5.暂时不弄:直连数据库、excel下载、串口(可能不用)、分类之halcon。
      • WPF在上位机的应用
      • 5.表格统计(模拟MES):印刷机速度、压力、判断开关机(数据库)
    • 2.5:还是在研究
    • 2.15:还是在研究,研究差不多了。
    • 2.19:改好页面先——》解决托盘bug+绑定细节。
    • 2.20:
      • 继续改mainwindow:
        •  BreadcrumbBar="{Binding ElementName=BreadcrumbBar}"是绑定本页面控件到属性
      • 暂时未知作用:dockpanl、wrapgrid、canvers、
      • 均分用grid纵横切分或者uniformgrid:做导航栏
      • 列表一般用ListView/recycleview+scollview:无限滑动
      • 整体垂直布局一般用column/stackpanel/LinearLayout/flex布局/grid纵分(容易混乱层次):如个人中心、表单、设置界面,一般都是要带scoll的。
      • 元素容器必用row/Flex/Wrap/WrapPanel、也可以grid横向切分(不响应式):如表单一行、个人中心一行
    • 2.21:
      • 继续加page:
        • DataContext绑定好——实现INavigableView<PrintViewModel>、
        • viewmodel: 两个接口ObservableObject, INavigationAware
        • xaml+属性+框架/原生组件+自己的组件/Template——》viewmodel写方法和数据
        • 加DynamicResource:d:DataContext、mc:Ignorable、
        • 注册路由:
    • 2.22:
      • icon:splitvertical24、Filmstrip、
      • 集合:带有itemsource+datatemplate,
        • <DataTemplate>:自定义组件组合,作用同react的v-for
      • 模板:三大模版
        • WPF在上位机的应用
        • ContentControl和ContentPresenter:
          • 定义:很多控件的基类。template属性就是controltemplate视图、ContentTemplate就是数据
          • 使用:定义Usercontrol时可用
        • ControlTemplate自定义组件:
          • 定义:<ControlTemplate x:Key="roundButtonTemplate" TargetType="Button">
          • 使用:<Button Content="Round Button" Template="{StaticResource roundButtonTemplate}">然后赋值到控件的Template属性中。
          • 关系:ContentPresenter属性是显示内容,它也有ContentTemplate属性就是DataTemplate。
        • DataTemplate:
          • 主要是items的子组件数据模版,是可复制的。Items控件的CellTemplate或ContentTemplate或ItemTemplate属性,此时不用指定DataType属性
          • <DataTemplate.Triggers>:ControlTemplate也有,简单的事件
          • 也能:定义用户组件时使用,就当使用正常的bingding一样
        • ItemsPanelTemplate列表自定义布局:每种ItemsControl都有其默认的ItemsPanelTemplate。对于 ListBox,默认值使用 VirtualizingStackPanel。 对于 MenuItem,默认值使用 WrapPanel。 对于 StatusBar,默认值使用 DockPanel。也主要是Items控件的ItemsPanel
      • <UserControl>:自定义组件components,组合现有的控件
        • 使用:<local:MyUserControl/>
        • xaml:展示组件为主+
          • <DataTemplate DataType="{x:Type models:PLCInput}">:相当于传入一个state数组
          • 或直接写<grid>开始布局
        • cs:继承的是UserControl,要写事件在这里
      • <ResourceDictionary>+MyButton.cs:自定义控件controls,相当于框架组件
        • 使用:<local:MyButton Content="Click me" MyCustom="Custom property value"/>
        • xaml:<Setter Property="Template">+<ControlTemplate>
        • cs:自定义组件的属性值DependencyProperty,事件用ICommand类型
      • ResourceDictionary:
        • 样式文件<Style>:颜色、居中。baseon样式:要加“Control.”前缀
        • 使用:作为动态绑定{DynamicResource ApplicationBackgroundBrush},DynamicResource运行时加载资源,是能被改变的变量。
        • 或静态绑定StaticResource+x:key值:编译时确定资源
    • 2.23:
      • 用法:Icon="{ui:FontIcon '&#x1F308;'}" />或者{ui:SymbolIcon Fluent24}
      • 样式:在 <Page.Resources>里写
    • 2.26:
      • 消息写法:aop切面方法
      • 操作组件实例:难(不推荐),解决方法是重写组件
    • 2.27:
      • http请求:client特点是baseurl、自带支持异步的get、post方法。header这些在拦截器里加。原始的System.Net.HttpWebRequest则需要request+response自己封装发送-流获取-关闭连接。
      • 之前的串口:也是0-8个字节循环读Number是第几台。tag搞个奇数偶数变颜色。texts是串口缓冲区数组、data是字节流、result是压力速度数据数组(要上传的)、xianNumber累积4秒没读到数据就显示错误,读到就重置为1。期间不断重置texts缓冲区发请求获取数据。huanNumber就是当定时器检测到已经更新数据立马更新否则xianNumber+1。
      • WPF在上位机的应用modbus协议
      • 之前的上传:8~15是设备号Deviceid,工单Lotno则是17~24,0-7是设备类型station,时间cdate则是统一为5分钟间隔,FoldList就是我要上传的model(例如plcinput)。最后每条转json发送,弄个日志显示(textbox3)
      • 工单号和其他全是写死在配置文件里,手输,关闭时还会更新。
    • 2.28:
      • 工单号:是生产的主键
        • 料号:一对多连接的二表
        • bom表:可能是中间仓管人员相关
        • 制程routing:各个站的人员
      • 批号:是成品的主键之一
      • sap:
        • 作用:出表单-做资料关联-查询
        • 版本:s4、750
        • 模块:basic资料、制造、采购、仓管、财务。
      • 外挂系统:
        • tapping:从散料入库到tapping机台再到检测入库再出库再成品入库。
        • chipR:电阻生产中的数据(痛点:假数据多,工单详细资料扫描过站,)
        • Mes:主键一定是CDate+Lotno。理想中:过站后扫一下工单自己带出来数据。然后启动机台时能监测到实时数据,并在结束后统计好数据。
      • MES:
        • 要和ERP产生工单紧密对接
      • 预留坑:传感器数据获取(plc的数据区有无)+如何从工单获取并存到数据库+断网检测。
      • 回归flutter。

 

3.机器视觉

  • halcon
    • 面向客户编程:公司客户、
    • 应用:blob检测、ocr、二维码
    • 收费:

 

  • 海康:
  • 4.1~4.12
    • 面向客户编程:资讯内部人员备份数据使用。
    • 产品分类:门禁、视觉算法、
    •  控制器:一共要page相关的(时间、分页)+具体查询(姓名、工号、卡号、ip)+固定(账号、端口、密码)
      • 导出,还是要登录
    • 直接二改:查询参数选择——查询subitem处理——(只要姓名、工号、卡号、时间、设备名或ip、)
      • 1.原有的sdk:asc_event,没有姓名、工号被加密,但是工号
      • 2.拿着工号查userinfo:还是被加密,有姓名。1w条数据(基本不可能啦)
      • 2.5:用替代方式:sendwithRECV_STATUS代替NET_DVR_GetNextRemoteConfig
      • 3.解密工号:得让海康人解决。
    • 注册:loginv30传入四大参数(结构体)——ip端口、账号密码——获取mid
    • 报警布放:回调函数(上位机数据ip传来,自动触发)-lCommand是类型,可以switch解析为抓拍一次、
    • public class FMSGCallBack_V31 implements HCNetSDK.FMSGCallBack_V31
    • 事件:
      • 1.NET_DVR_ACS_EVENT_COND:开始结束时间StartTime、持卡人姓名byCardName、byCardNo卡号、dwMajor主时间固定、dwMinor次事件固定——COND指针
      • 2.NET_DVR_StartRemoteConfig方法:参数为登录id m_UserID、命令(常数)、COND指针、——返回m_lGetAcsEventHandle
      • 3.NET_DVR_ACS_EVENT_CFG参数:init初始化就对了——struCFG
      • 4.NET_DVR_GetNextRemoteConfig方法:m_lGetAcsEventHandle——struCFG.struAcsEventInfo里填充好了查询数据
      • 5.ProcessAcsEvent+AddAcsEventToList方法:CardTypeMap()等方法解析struAcsEventInfo结构体为列名、
    • 额外知识:Marshal.StructureToPtr()是托管与非托管传送
    • 人脸管理:
      • 1.添加人(卡)——card/user Managment
      • 2.添加脸(图库或者机器实时)——face Managment
      • 3.查询or删除脸——Deleteface 或Managment
    • isapi方法:基于摘要认证,哈希加密。

 

  • 4.15~4.17
    • 单次人脸添加:其实和设备连线重复
    • 批量添加:
      • 1.各模块独立重构——人、卡、脸
      • 2.excel解析导入人:新增证件号(也不用)、性别(也不用)、用户类型(不用,无效字段)
      • 3.人脸压缩包解析——要么要4.5包,要么固定路径驯化用户。都是读每个图片。根据名字来查询到工号去下发。
      • 4.关键你添加的是设备的人脸,且无法采集(app)。优点是能产生事件,缺点是后期需要同步。
      • 5.方案b是搞到数据库复制+下发>数据库密码>全额备份

发表评论 取消回复
表情 图片 链接 代码

分享