yangyang

a .NET Developer

All Posts


C#表达式树:用表达式树替代反射

在动态调用对象方法方面,可以使用重构。但是在速度方便,重构比直接调用方法要慢很多,这里有两篇文章Expression Tree vs reflection,Again on Expression Tree vs Reflection 对比了表达式树和重构,以及 用lambda表达式树替代反射 这篇文章,在一些场景下,我们可以直接使用表达式树来代替重构。 本文将以Fix框架源码来说明,在一些特定场景下使用表达式树来替代反射能达到的奇妙效果和优点。 什么是FIX协议 FIX(Financial Information eXchange)金融信息交换协议是一种主要用于证券交易过程交换的公开协议,它定义每条交易信息的内容和格式,这些信息内容与证券交易流程相对应,以保证交易信息安全准确地传送。FIX主要用于在各类参与者之间建立起实时的电子化通讯协议。 FIX协议 …

Lambda Expression Expression Trees Fix QuickFixn Reflection

C#表达式树:构建动态查询

前文介绍了C#中表达式树的基本知识,在实际中,表达式树有很多用法,这里举几个例子,说明如何使用表达式树构建动态查询,从而扩展LINQ的查询方法。 在LINQ中,只要数据源实现了IQuerable<T>接口,表达式树就可以用来表示结构化查询。比如,LINQ提供了用来查询关系数据源的IQueryable<T>接口的实现,C#编译器在执行这类数据源查询时,会在运行时生成表达式树,然后,查询会遍历表达式树的数据结构,然后将其转换成针对特定数据源的合适的查询语言。 下面的几个例子演示了如何使用表达式树动态生成查询。 Example 1:动态生成Where和OrderBy 这个例子是MSDN上的例子,平常在C#中我们一般直接写LINQ代码,比如下面这个: companies.Where(company => (company. …

Lambda Expression Expression Trees Build Dynamic Query Safe Databinding

C#表达式树:基本用法

表达式树使用一种类似树的结构来表示代码,它的每个节点都是一个表达式,比如方法调用和x<y这样的二元运算等。我们可以对表达式树的内容进行编辑和运算,这样能够动态修改可执行代码,以及动态创建查询等。我们可以使用匿名lambda表达式或者C# API来创建表达式树。 这一系列文章,主要是对C#表达式树的一种总结,基本知识参考MSDN的内容 这部分内容可以直接到MSDN上查看,后面的几篇文章主要分享一下,在工作中碰到的应用到表达式树的部分,谨做为记录和分享。 生成表达式树 通过lambda表达式创建表达式树 可以通过将lambda表达式赋值给Expression<TDelegate>类型的变量,编译器可以自动生成创建该lambda表达式的表达式树。C#编译器只能从lambda表达式生成表达式树,只能是单行lambda表达式,不能解析多行 …

Lambda Expression .NET Core Expression Trees

.NET Core IoT破解PS2通讯协议

之前使用315MHZ可以进行远程控制,但是那个只有4个按钮,理论上只能控制4个变量的输入,并且偶尔信号还会串,所以需要探索其他远程控制方式。 PS2是Sony PlayStation2游戏机的遥控手柄,它采用的是2.4G无线通讯技术,有效控制范围能达到10米。恰好有人已经破解了通讯协议,使得手柄能够接到其他器件上遥控使用,比如这个叙利亚战场上使用PS2手柄控制的遥控机枪,我们这里只是简单的用在智能小车上,当然可以扩展到很多需要控制的地方,他的特点是性价比非常高(只要几十块钱就能买到一套山寨的控制器和接口,正版Playstation 2是不可能这个价格的,但是功能一点不差),而且按键丰富,方便扩展。 PS2手柄介绍 PS2手柄和接收器如下图: ▲ PS2 手柄和接收器 手柄,主要用来发送按键信息,接收器与主机相连(主机可以是树莓派,也可以是 …

IoT .NET Core PS2Controller

ASP.NET Core SignalR入门(三):后台服务及Chrome插件

前文介绍了如何通过SignalR将捕获到的摄像头信息,通过Streaming的方式传输到客户端。在PiMonitor例子中,作者在后台通过SignalR后台服务的方式,隔一段时间获取图像帧,然后连接Azure的认知服务来判断Baby是否在哭,从而向客户端触发提醒,这里就用到了SignalR的后台服务以及涉及到了开发Chrome插件来作为SignalR的客户端,下面逐个介绍。 SignalR后台服务 要在后台长期运行,并且能够通过SignalR向客户端发送消息,就需要用到SignalR的后台服务(background service)。ASP.NET Core承载SignalR后台服务,跟承载SignalR的Hub相似。只需要在ConfigurationServices中AddSignalR以及AddHostedService中注册需要的后台服务类. public …

SignalR ASP.NET Core SignalR Real-time App Hub Chrome Extension Background services

ASP.NET Core SignalR入门(二):生命周期及流式处理

上文介绍了Signal的基本知识,接下来介绍一下SignalR里面对象的生命周期以及流式处理,这两个比较重要的概念在前文开头的树莓派监控例子中有用到并且比较重要。 功能设计 树莓派监控PiMonitR这个项目包含了几部分内容,首先是如何获取摄像头数据流,然后通过SignalR,传输到客户端展示拍到的内容,并且客户单能够控制开始监控和停止,本文将实现这一功能。界面设计如下: ▲ 摄像头监控页面 界面如图所示,有两个按钮,Start Streaming点击之后,就可以通过流式数据传输从服务端传输到页面上来,Stop Stream会停止数据传输。下面是一个image标签,收到传输过来的流式数据之后,将image标签的src属性设置为接收到的数据。 在 树莓派监控PiMonitR 例子中,使用了MMALSharp - Unofficial C# …

SignalR ASP.NET Core SignalR Real-time App Hub RPC Streaming

ASP.NET Core SignalR入门(一):基础部分

之前在玩树莓派的时候看到一篇文章,Real Time Baby Monitoring from Raspberry PI using SignalR Streaming and Cognitive Vision Service, 主要内容是一位奶爸,用树莓派的默认的摄像头,监控摇篮中的Baby,通过SingalR,连接Azure的认知服务,如果检测到小孩哭,则提醒,然后可以查看监控。这里面有几个要点,首先是如何从树莓派的摄像头获取图形帧以及如何将树莓派上的图像帧展现出来。这里面最主要的就是涉及到了SignalR的内容,于是我学习了一下,以下是简单的学习笔记,都是参考官方文档的。如果你可以看英文,建议直接看 Introduction to ASP.NET Core SignalR MSDN上的相关文档,我这里只是做个笔记。 什么是SingalR ASP.NET Core …

SignalR ASP.NET Core SignalR Real-time App Hub RPC

.NET Core IoT使用TB6612FNG驱动直流电机

在开发树莓派小车时,需要使用树莓派来控制直流电机,树莓派无法直接驱动直流电机,需要使用直流电机驱动芯片,最常见的有L298N,比如一般的TT马达用这个驱动就足够,但是如果是大功率电机,它的发热量和死区都比较大,因为我买的小车是大功率直流电机,所以使用的是TB6612FNG驱动芯片,它是东芝的芯片,能驱动两个直流电机,或者并联四个直流电机(左前和左后并联,右前和右后并联)。本文介绍如何使用TB6612FNG来驱动直流电机。 TB6612FNG驱动芯片 TB6612FNG驱动芯片结构如下图: ▲ TB6612FNG结构图 我买回来,实物是这样的,体积很小。 ▲ 装车图 针脚很多, 对照TB6612FNG结构图,各针脚功能如下。 左边针脚 功能 右边针脚 功能 PWMA A电机控制信号输入 VM 电机驱动电压输 …

IoT Raspberry Pi .NET Core TB6612FNG DCMotor

树莓派4B安装Raspberry Pi OS系统遇到的问题和解决方法

在前面的一篇文章中,描述了如何在树莓派3b+上安装ubuntu 64位系统,因为官方还没有发布正式版的64位系统,所以只有安装第三方系统,但是开发过程中会碰到各种奇怪的问题,比如缺少rasp-config,需要自己安装;比如gpio权限问题,每次重启都要重新赋权;比如通过WIFI SSH登陆时时不时WIFI会断开不稳定;比如树莓派官方摄像头无法驱动等等。所以在做需要用到GPIO,摄像头这些硬件通信的时候,安装官方的树莓派系统。 最近又买了一个树莓派4B,原因是树莓派3B+我在做驱动直流电机实验的时候,使用的是面包板的电源线改造来的,他的输出电压是12V1A,是个DC头,我买了个DC转换头,引出了正极和负极,然后连上杜邦线,当时这两根线是带电的,我在操作的时候,不小心正极碰到了树莓派3B+的电路板,当时就看到了有火花,虽然当时树莓派没通电,但悲剧依旧发生了,我的树莓派3B+永远 …

IoT Raspberry Pi .NET Core

.NET Core IoT 驱动SSD1306 I2C显示器

本篇文章严重参考阿迪王的 Windows 10 IoT: How to Drive an SSD1306 I2C Display 这篇文章,我的传感器都是参照该博客来购买的。在进行以下实验时,最好保证树莓派安装的是官方系统。我之前安装的是64位Ubuntu 20系统,但是在需要访问I2C接口,或者访问树莓派官方摄像头,红外传感器发送和接受,以及本文的SSD1306显示时,总会遇到各种各样的问题。所以我重新将系统换成了官方32位系统以及32位.NET Core运行时,这对于Visual Studio开发来说没有变化,依旧发布后,拷贝到树莓派上即可运行,不需要关注32位或者64位。 SSD1306 I2C OLED显示器 SSD1306 I2C OLED显示器分辨率为128×64,也叫12864屏,SSD1306为其显示驱动芯片,长这样,各位在购买传感器的 …

IoT Raspberry Pi .NET Core SSD1306