在上篇博文《Html5:Canvas+WebSocket实现远程实时通信(上)》中已经介绍了当前实现动态网页的一些基本技术,也说明了在.NET micro framework平台下实现Web Server需要注意的一些设计原则,本篇文章将继续介绍Canvas和WebSocket实现远程实时通信的技术细节。

(2)网页动态画面实现(Canvas

我们采用Dreamweaver软件进行网页和脚本编写(如下图所示)

Index.html文件相对比较简单,在<body>中定义一个<canvas>区,声明一定的大小和外观即可,具体的的动态画面我们主要在canvas.js中实现。

<html><head><title>MF-Html5</title><style>   html,body{font:normal 0.9em arial,helvetica;}</style><script src="canvas.js"  language="javascript" ></script></head><body onLoad="init()"><img src="logo.gif" alt="YFSoft"/><h3>.NET Micro Framework html5 Demo</h3><canvas id="canvas1" style="border:1px solid;background-color:#EEEEEE;" width="440" height="450"></canvas><div><button onClick="quit()">close websocket</button><a href="www.sky-walker.com.cn">叶帆科技 www.sky-walker.com.cn</a></div></body></html>

canvas.js脚本文件中的init()函数,由于我们在index.html中定义了<body onLoad="init()">,所以网页加载后自动自行这个初始化函数的内容。

我们再这个初始化函数中获取canvas对象,代码如下:

canvas = document.getElementById('canvas1');

获取该对象后,我们就可以定义我们可以绘图的上下文对象了(目前可获取2d对象,3d对象在未来的标准中也会支持)。

context = canvas.getContext('2d');

'canvas1' 对应我们网页中的<canvas id="canvas1">。

有了context这个对象之后,我们就可以在画布上进行诸如,画点、画线、画矩形、画圆和贴图等操作了。(请参见百度百科 Canvas元素)。

另外我们还支持画面鼠标捕捉,可以绘制一些按钮(不过在一些嵌入式设备上,该功能支持不太好,建议还是直接使用网页按钮)。

canvas.addEventListener('mousedown',mousedown,false);

canvas.addEventListener('mousemove',mousemove,false);

canvas.addEventListener('mouseup',mouseup,false);

添加这三个事件后,就可以获取鼠标相关信息了。

详细的代码如下:

View Code

(3)、客户端和服务端实时通信实现(WebSocket

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。

在WebSocket API中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

(详情请参见 维基百科 WebSocket条目)。

在脚本文件中,我们创建WebSocket的代码如下:

function init()  {    var host = "ws://192.168.1.100:10189";  try    {      socket = new WebSocket(host);      socket.onopen    = function(msg)      {         drawNetworkState(true);      };      socket.onmessage = function(msg)      {         if(msg.data=="button1=down")         {             drawLED(0,true);         }         else if(msg.data=="button1=up")         {             drawLED(0,false);         }         else if(msg.data=="button2=down")         {             drawLED(1,true);         }         else if(msg.data=="button2=up")         {             drawLED(1,false);         }         else if(msg.data=="button3=down")         {             drawLED(2,true);         }         else if(msg.data=="button3=up")         {             drawLED(2,false);         }         else         {             try             {                var temp = parseInt(msg.data,10);                showAd1 = (temp * 3.3 / 4096).toFixed(2);                ad1 = temp / 40;             }             catch(ex){}         }      };      socket.onclose = function(msg)      {         drawNetworkState(false);      };    }    catch(ex){}  }  function send(msg)  {      try{ socket.send(msg);} catch(ex){  }  }  function quit()  {    socket.close();    socket=null;  }

在代码中需要指定服务器IP和端口,换句话说,这个实现和我们用其它开发语言开发socket客户端没有任何区别。

和xmlhttp的区别就是,它不是基于http协议的,传输可以直接是二进制数据。

在系统中我们只需要构建一个socket server,建立连接后,互发握手指令,成功后,就可以互发数据了。

3.1 握手

握手协议旧版和新版有很大的不同,我们这里仅介绍最新版的(也应该是最终版了)。

打开所提供的Htm5_Websocket.sln工程,确保我们打开websocket库的debugmode(webSocket.DebugMode = true)。

一旦浏览器访问我们的开发板,则串口中会输出上图的信息。

客户端所发:

GET / HTTP/1.1

Upgrade: websocket

Connection: Upgrade

Host: 192.168.1.100:10189

Origin: http://192.168.1.100

Sec-WebSocket-Key: G9CM/xrVbYUo00RaAuThLQ==

Sec-WebSocket-Version: 13

Sec-WebSocket-Extensions: x-webkit-deflate-frame

服务端返回:

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: Id0PdUz40uyrpDdq0OwQdkg/ODA=

WebSocket-Origin: http://192.168.1.100

WebSocket-Location: ws:192.168.1.100:10189/

可以看出目前最新版的协议是V13

握手中最重要的就是key的验证了,服务端发送的key为Sec-WebSocket-Key: G9CM/xrVbYUo00RaAuThLQ==,这是一个base64编码。

这个key+” 258EAFA5-E914-47DA-95CA-C5AB0DC85B11”的字符串进行SHA1换算后,转换为base64编码,也就是Sec-WebSocket-Accept: Id0PdUz40uyrpDdq0OwQdkg/ODA=中的key。

然后服务端发送上段内容后,就完成了握手,后续就可以直接收发数据了。

小插曲:我在.NET Micro Framework平台实现这段代码的过程中遇到两个问题,一是SHA1加密,二是官方提供的base64库有bug。后来,只好自己想办法实现了这两个功能,才完成了websocket的握手验证。

3.2 数据通信

新版和老版不同,数据格式定义的比较复杂,如下图所示:

具体格式的介绍,可以参见3.4参考中所提到的文章。

3.3 YFSoft.Html5.websocket封装库

由以上介绍可知,实现websocket的功能还是相对复杂的,所以我封装了一个websocket库,用户可以非常方便的实现websocket。

定义:

webSocket = new WebSocket(10189, 3, 60);

webSocket.DataReceived += new WebSocketDataReceivedHandler(webSocket_DataReceived);

webSocket.Run();

事件处理:

static void webSocket_DataReceived(WebSocketClient client, WebSocket.Frame frame)  {      string info = frame.Dump();         if (info == "led1=on")      {          LED1.Write(true);      }      else if (info == "led1=off")      {          LED1.Write(false);      }      else if (info == "led2=on")      {          LED2.Write(true);      }      else if (info == "led2=off")      {          LED2.Write(false);      }      else if (info == "led3=on")      {          LED3.Write(true);      }      else if (info == "led3=off")      {          LED3.Write(false);      }  }

事件参数中直接可以获取websocket的数据。

AD数据发送:

static void ADSend()  //这是一个线程,不断发送AD的值

{

while (true)

{

webSocket.SendText(ad1.ReadRaw().ToString());

Thread.Sleep(1000);

}

}

不局限于仅发字符信息,也可以发二进制信息。

库下载(示例源码+文档):

http://www.sky-walker.com.cn/MFRelease/library/v42/YFSoft.Html5.WebSocket.rar

3.4 参考

websocket 通信协议(已更新到version 13)

http://www.zendstudio.net/archives/websocket-protocol/

基于Websocket草案10协议的升级及基于Netty的握手实现

http://blog.csdn.net/fenglibing/article/details/6852497

WebSocket新版Hybi-10协议介绍

http://www.hackecho.com/archives/1104.html

 

(4)、网页部署和发布

我们编写的网页文件涉及到三个文件:index.html、canvas.js和LOGO.gif,我们通过YFFileViewer工具把它们部署到开发板中的文件系统中去。

关于YFFileViewer请参见博文博文《【玩转.Net MF –03】远程文件查看器》和《【玩转.Net MF –05】加载文件系统中的Pe文件》。

仅需要写如下代码,就可以实现web页面发布。

using (WebServer server = new WebServer(80))

{

server.SetWebRoot("\\ROOT\\web");

Thread.Sleep(Timeout.Infinite);

}

程序运行后,我们在浏览器中输入IP地址,就可以访问网页了。

相关操作视频:

http://v.youku.com/v_show/id_XNDY3NzM1Mzky.html

声明:由于作者以前主要在桌面程序、通信和嵌入式领域进行开发,对网页开发技术也是最近才开始深入研究,本文描述有失误和偏颇之处还望方家多多指教。

MF简介:http://blog.csdn.net/yefanqiu/article/details/5711770

MF资料:http://www.sky-walker.com.cn/News.asp?Id=25

本文源码:http://www.sky-walker.com.cn/mfrelease/sample/html5_websocket_file.rar

相关硬件: http://www.sky-walker.com.cn/Products.asp?Id=24

本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/1066944,如需转载请自行联系原作者

【物联网智能网关-14】Html5:Canvas+WebSocket实现远程实时通信(下)相关推荐

  1. 【物联网智能网关-15】WAV播放器(WinForm+WavPlay库实例)

    2002年在首钢实施焦炉四大机车自动化项目的时候,为了使系统更加友好,便增加了语音提示功能.不过控制设备是PLC,所以语音模块是通过IO进行控制的.接触WAV解码,是在2009年,为TI DM355平 ...

  2. 【物联网智能网关-08】TinyGUI和WPF汉字显示技术比较

    TinyGUI是我在2010上半年的时候,基于.NET Micro Framework系统开发的一个轻量级图形库,虽然TinyGUI运行需要的资源少,运行快,但是不支持汉字显示(如需显示汉字还是必须借 ...

  3. 【物联网智能网关-02】获取摄像头数据+显示

    在上一篇文章<通过AD采集获取温湿度>我们介绍了物联网智能网关的AD端口的使用情况,AD接口是.NET Micro Framework标准库函数之一,只要底层BSP支持就可以直接使用.但是 ...

  4. 物联网智能网关应用系统的一般设计方法

    随着互联网的日益普及.信息共享程度的要求不断提高,各种家电设备.仪器仪表以及工业生产中的数据采集与控制设别在逐步走向网络化,以便利用庞大的网络资源,实现分布式远程监控.信息交换与共享.物联网的发展更是 ...

  5. BHIOT-833物联网智能网关

    物联网网关可以实现感知网络与通信网络,以及不同类型感知网络之间的协议转换.既可以实现广域互联.也可以实现局域互联. 简单的来说,有了网关,所谓的 M2M 不再是狭义上机器与机器的对话,而是设备.系统. ...

  6. 【物联网智能网关-01】通过AD采集获取温湿度

    无论是机房管理系统,还是面向农村温室大棚的管理系统,温湿度采集模块是必不可少的.常见的温湿度模块从通信接口上来说,一般有三种,第一种是单总线方式(我以前写了两篇博文来介绍这方面的内容<DHT11 ...

  7. 工业4.0时代,您需要的是高性价工业物联网智能网关(超高性价比),PLC远程监控,PLC远程维护,系统数据采集,一个都不能少。

    www.maiside.cn www.maiside.top 如何实现智能制造? 第一步能够完成生产过程的自动化,第二步将生产过程中的数据实时上送到MES.ERP.EAM.大数据分析系统.设备远程运维 ...

  8. 西门子SIMATIC IOT2050与钡铼技术BL102工业物联网智能网关的区别

    工业物联网智能网关是工业物联网技术不断发展的必然产物,是融合IT与OT的纽带.不管是工业控制领域的国际大品牌玩家,还是国内的小精专企业,都根据市场需求推出了自己的产品.这些工业物联网智能网关广泛应用于 ...

  9. 工业物联网 | 智能网关实现换热站远程监控方案

    换热站是连接供热工业与用户的一个重要环节,目前,设备运行的安全性.可靠性直接影响了供热的质量.目前大多数的换热点电站大多都采用人员轮换的值守模式:一方面容易出现事故发现时难以被发现,另一方面,工作人员 ...

最新文章

  1. oracle调用存储过程
  2. 3.NIO_Buffer缓冲区
  3. redis watch使用场景_[Redis] 常用类型及应用场景
  4. Java高阶语法---final
  5. C语言,计算数据类型及所对应的字节数。
  6. 花书+吴恩达深度学习(九)优化方法之二阶近似方法(牛顿法, CG, BFGS, L-BFGS)
  7. PAT 1085 PAT单位排行(25)(映射、集合训练)
  8. POJ 3671 DP or 乱搞
  9. 如此逼真的高清图像居然是端到端网络生成的?GANs 自叹不如 | ICCV 2017
  10. 动态链接库(DLL)开发基础
  11. jad反编译成java_反编译工具jad的使用(将*.class文件变成*.java文件,附带jad.zip包)[转]...
  12. DW——验证注册页面 设计JavaScript
  13. verilog语法检查
  14. 二本计算机软件工程专业大学排名,哪些二本大学的软件工程专业最好
  15. 网站:推荐几款好用的在线短链生成工具
  16. vue 填空题组件封装
  17. 专题三:羊毛党络绎不绝,电商行业防不胜防
  18. 模糊查询(java)
  19. 他们如何利用微信赚钱
  20. java using用法_如何使用java合并两个PPT。(How to merge two PPTs using java.)

热门文章

  1. pandas drop 删除行和列的方法
  2. microsoft edge 打不开 csdn 博客
  3. 用snap在ubuntu上构建 Microk8s,使用kubectl,部署应用
  4. LeetCode 159. Longest Substring with At Most Two Distinct Characters --Java,C++,Python解法
  5. docker部署Redis6-0-6
  6. 【Netty】Bootstrap引导
  7. Mysql的空值与NULL的区别
  8. 在你做回归测试的时候,突然有个着急的测试需求,你会怎么做?
  9. plsql连接oracle无响应,求教 pl/sql连接本机数据库是未响应问题
  10. 佳能ts3100打印机使用说明书_佳能TS9120打印机完全满足家庭使用—最具性价比打印机...