Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器

 

最近在业余时间玩玩树莓派,刚开始的时候在树莓派里写一些基于wiringPi库的C语言程序来控制树莓派的GPIO引脚,从而控制LED发光二极管的闪烁,后来觉得,是不是可以使用HTML5+jQuery等流行的前端技术做一个简单的Web站点,让树莓派搭载这个站点,通过手机或者平板电脑来控制树莓派。经过一番调研,考虑如下:

  • 使用Apache或者Nginx搭建一个Web服务器

    • 优点:服务器实现相对成熟
    • 缺点:偏重,而且与树莓派的交互需要涉及Service调用,而实现RESTful服务对于Apache或者Nginx需要额外的组件支持,要付出一定的学习成本
  • 使用Python+Flesk
    • 优点:技术相对成熟,也有很多成功应用案例
    • 缺点:对于我来说需要额外学习Python语言

基于这样的前提,鉴于目前Mono在Linux下的出色表现,想想还是自己使用.NET开发一个轻量型的Web服务器吧,第一期版本让它既支持静态文件的访问服务,也支持RESTful API的调用,在RESTful API中可以暴露访问树莓派GPIO引脚的接口,供HTML5+jQuery的单页面应用调用,于是也就实现了在任意设备上通过浏览器来控制树莓派的目的。

Raspkate项目

Raspkate项目的名字,我想就是两个方面:Rasp,它来源于树莓派的英文名字Raspberry Pi,有表示“小、轻量”的意义,而Kate则寓意能够充分发挥开发者的想象,对其进行扩展和定制。Raspkate就是这样一款基于.NET Framework、由C#开发的轻量型Web服务器,它的核心部分是一个HttpListener对象,通过多线程模型将HTTP请求异步委托给HttpListener执行。当一个HTTP请求被接受的时候,Raspkate会根据请求的格式或类型,分配特定的模块(Module)对请求进行处理,然后将处理结果返回。如果请求的是一个文件,那么Raspkate会返回文件的内容,如果是一个RESTful请求,则Raspkate会使用已经注册的RESTful API控制器来处理这个请求,并将计算结果以JSON格式返回。

开源地址

Raspkate项目是开源的,代码库地址是:https://github.com/daxnet/raspkate,所使用的许可协议是GPL2.0,(因为其所使用的与树莓派相关的组件是第三方的由GPL2.0授权的开源库),因此,不能在商业环境中使用此项目。

应用场景

您可以在以下场景中使用Raspkate:

  1. 在自己的应用程序中实现内建的Web服务器(Self-Hosting)
  2. 将Raspkate寄宿在Windows Service中,向外提供RESTful服务
  3. 将Raspkate寄宿在Windows Service中,向外提供静态Web页面请求服务
  4. 将Raspkate作为树莓派中的一个独立的小型Web服务器,提供控制树莓派GPIO的Web用户界面

整体架构

下图展示了Raspkate项目的整体架构设计:

可以看到,在Raspkate核心部分就是一个HTTP Listener组件,并且由Module和Configuration支撑Raspkate完成HTTP请求处理。每个模块可以包含多个HTTP Handler,这在定义模块的时候可以对多个HTTP Handler进行注册。

Raspkate配置信息(也就是上图中的Configuration)非常简单,下图就是这个配置信息的类型视图,在RaspkateConfiguration对象上,设定了HttpListener所使用的Prefix,而Modules部分则指定了Raspkate扫描可用模块的路径,IsRelative指定模块路径是否是相对的。

以下是一个标准的Raspkate配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="raspkateConfiguration" type="Raspkate.Config.RaspkateConfiguration, Raspkate"/>
  </configSections>
 
  <raspkateConfiguration xmlns="urn:Raspkate.Config" prefix="http://127.0.0.1:9023/">
    <modules>
      <add path="modules"/>
    </modules>
  </raspkateConfiguration>
 
</configuration>

代码使用

首先,使用Git客户端将代码库克隆到本地:

然后,在装有MSBuild的Windows机器上,执行build.bat命令:

  • build.bat All - 这将编译所有模块,并将模块的二进制文件复制到modules目录下
  • build.bat Minimal - 这仅编译核心模块(不包含类似树莓派支持等扩展模块)

如果是在装有Mono的Linux机器上,则相应地执行build.sh即可。

在编译完成之后,进入bin目录,执行RaspkateService.exe即可(注意:如果是在树莓派中执行,并且希望加载树莓派支持模块,则需要通过 sudo ./RaspkateService.exe 命令执行,以获得root权限)。在成功启动后,你应该看到类似下面的画面:

这时,打开浏览器,在浏览器中输入http://127.0.0.1:9023,您应该可以看到类似以下的画面:

这表示您已经成功运行Raspkate服务,此页面显示了运行服务器相关的信息。注意:如果你希望你的Raspkate服务能够在同网络的其它机器访问,请在执行RaspkateService.exe之前,将RaspkateService.exe.config文件中的Prefix设置修改为:http://+:9023/。但这样做可能会牵涉到用户访问控制的问题,如果将Prefix改为该值后,出现Raspkate无法启动的问题,请先在Command Line执行:

1
netsh http add urlacl url="http://+:9023/" user=everyone

演示

这里有几张屏幕截图,展示了Raspkate提供的相关功能。

获取并显示树莓派信息

以下屏幕截取自我的手机浏览器,分别显示了我的树莓派系统信息、树莓派主板信息以及树莓派中所有引脚的名称、类型和电平值列表。

        

使用HTML5+jQuery控制发光二极管的点亮和熄灭状态

前端是一个寄宿在Raspkate上的一个HTML5+jQuery的单页面应用,后端是运行Raspkate的树莓派。

    

 
分类: 树莓派

NET的可运行于树莓派的更多相关文章

  1. C#写的WebServices可运行于树莓派

    阅读目录 Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器 Raspkate项目 演示 回到目录 Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器   最近 ...

  2. Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器

    最近在业余时间玩玩树莓派,刚开始的时候在树莓派里写一些基于wiringPi库的C语言程序来控制树莓派的GPIO引脚,从而控制LED发光二极管的闪烁,后来觉得,是不是可以使用HTML5+jQuery等流 ...

  3. 树莓派如何便捷的使用pi4j

    问题的由来 pi4j用起来很方便,但是感觉pi4j库的命名太杂乱,啰嗦了,很容易弄混,而且好像没听说官方有自己的编译器.如果没有智能点的编辑器的话,写起来真要命,但是树莓派运行Eclipse不太现实, ...

  4. 建立树莓派raspberry交叉编译环境以及编译内核

    最近买了一个树莓派,玩了几天,虽然已经有很多人玩了,现在玩好像有点晚了,但是他确实是个好东西,学好它,对嵌入式的整个开发流程也就会熟悉很多.虽然性能不是很强和现在的BB-BLACK比有点慢了,但是它便 ...

  5. 树莓派小车(三)Python控制小车

    正文之前 由于最近忙于复习赶考,所以暂时没有拿起树莓派小车,直到昨天,终于空出时间来把代码整理一下来和大家分享. 正文 在树莓派小车系列之二中,讲到了树莓派的引脚定义方式有两种: PHYSICAL N ...

  6. 毫秒级检测!你见过带GPU的树莓派吗?

    树莓派3B+英特尔神经计算棒进行高速目标检测 转载请注明作者梦里茶 代码: 训练数据预处理: https://gist.github.com/ahangchen/ae1b7562c1f93fdad1d ...

  7. 树莓派(Raspbian系统)中使用pyinstaller封装Python代码为可执行程序

    一.前言 将做好的Python软件运行在树莓派上时,不想公开源码,就需要对文件进行封装(或称打包),本文主要介绍使用pyinstaller封装Python代码为可执行程序. Python是一个脚本语言 ...

  8. 【树莓派】【转载】Raspberry Pi (树莓派)折腾记

    在网上看到一篇对树莓派折腾记录比较详细的文章,时间比较早,但是有些东西没变. 对于新手而言,还是有点参考价值.文章参见:http://skypegnu1.blog.51cto.com/8991766/ ...

  9. 树莓派(Raspberry Pi 3) - 系统烧录及xshell连接

    树莓派(Raspberry pi)是一块集成度极高的ARM开发板,不仅包含了HDMI,RCA,CSI,HDMI,GPIO等端口,还支持蓝牙以及无线通信.由于 Raspberry Pi 几乎是为 Lin ...

随机推荐

  1. 使用Curl进行抓取远程内容时url中文编码问题

    PHP中对于URL进行编码,可以使用 urlencode() 或者 rawurlencode(),二者的区别是前者把空格编码为 '+',而后者把空格编码为 '%20',不过应该注意的是,在编码时应该只 ...

  2. [Django实战] 第4篇 - 用户认证(用户登录)

    今天来实现用户登录模块 首先,我们创建一个表单(forms.py): from django import forms from django.contrib.auth.models import U ...

  3. sharepoint 2010 显示和隐藏Ribbon区域条

    在sharepoint 2010的页面中,我们在页面的最上方,有一条深灰色的Ribbon工具栏,如下图,这里可以通过下面的脚本,做一些脚本,来控制它的隐藏和显示. 最后把这些脚本,放在v4.maste ...

  4. codeforces584B Kolya and Tanya

    题目链接:http://codeforces.com/problemset/problem/584/B 解题思路:当n=1时,_______    _______   ______  三个数每位上可以 ...

  5. SLB 权重问题

    <pre name="code" class="html">一般配置SLB的时候有个权重0到100,是如何选择数值的? 权重需要您根据后端机器的配置 ...

  6. Python+Django+SAE系列教程14-----使表单更安全

    还记得我们上一章提到过的加入页面吗? watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVtZW5nMTk4MA==/font/5a6L5L2T/fonts ...

  7. Ubuntu下实现双屏独立切换

    在编码时,总觉得屏幕大小不够,要是能多个屏多好,可以这样 把你的显示器连接到你的电脑,然后开启一个终端 输入:xrandr 显示如下: LVDS1 connected 1366x768+1024+0 ...

  8. 移动app接口编程技术-学习实现之PHP进阶 数组

    数组创建,初始化 <?php //请创建一个数组变量arr,并尝试创建一个索引数组 /** * 不带初始值的创建.创建后赋予值 * 注:下标一定是整数 */ $arr = array(); $a ...

  9. 外语学习强烈推荐Rosetta Stone

    外语学习强烈推荐Rosetta Stone 外语学习强烈推荐Rosetta Stone

  10. VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式

    原文:VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式 Excel包含很多公式,如数学.日期.文本.逻辑等公式,非常方便,可以灵活快捷的对数据进行处理,达到我们想要的效果.Exce ...