本人把硬件端和软件客户端以及云服务器结合起来做了一个还不错的作品,现在拿出来跟大家分享一下,毕竟从作品到产品的观念要慢慢培养。
具体作品:将硬件陀螺仪和微型电源模块结合组成一个可穿戴护腕。应用于教师手势上课,ppt翻页、全屏、缩小等。同时还实现了多媒体
教室—校内课室管理平台—云服务器的连接,实现了手势操作导入教学资料,上课课表等。
//具体模块代码:
//以POST方式向云平台url发送http request和response:
private string PostWebRequest()
{ //发送http request:
String myurl = "http://XXXX.sinaapp.com/index.phpXXXX";
CookieContainer cc = new CookieContainer();
string postData = "发送的关键字名(如NAME)" + 关键字的值;
byte[] byteArray = Encoding.UTF8.GetBytes(postData); // 转化
HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create(new Uri(myurl));
webRequest2.CookieContainer = cc;
webRequest2.Method = "POST";
webRequest2.ContentType = "application/x-www-form-urlencoded";
webRequest2.ContentLength = byteArray.Length;
Stream newStream = webRequest2.GetRequestStream();
// Send the data.
newStream.Write(byteArray, 0, byteArray.Length); //写入参数
newStream.Close();
//获取服务器 response:
HttpWebResponse response2 = (HttpWebResponse)webRequest2.GetResponse();
StreamReader sr2 = new StreamReader(response2.GetResponseStream(), Encoding.Default);
string text2 = sr2.ReadToEnd();
return text2;
}
//客户端虚拟按键程序:(主要通过蓝牙来实现护腕和客户端串口连接,通过虚拟按键来实现PPT等的操作)
//需要的命名空间:
using System.IO;
using System.IO.Ports;
using System.Runtime.InteropServices;
using System.Threading;
using SuperKeys;(可下载dll文件)
public partial class Form1 : Form
{
//自定义委托类型,委托签名(解释见PPT)与该委托将要绑定的方法签名应保持一致(本例为不带参数的方法)
//委托类型应在本处而不能在方法里面定义
public delegate void ReadSptEventHandler();
//除了本例中使用组件的方式拉出一个串口实例外,还可以用代码实现串口类的实例化
WinIoSys m_IoSys = new WinIoSys();
[DllImport("user32.dll", EntryPoint = "keybd_event")] //键盘事件
public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
public Form1()
{
InitializeComponent();
}
private void Serial_Load(object sender, EventArgs e)
{
m_IoSys.CloseSuperKeys();
m_IoSys.InitSuperKeys();
//将可用的串口名填充到下拉菜单中
comboBox1.DataSource = SerialPort.GetPortNames();
toolStripStatusLabel2.Text = spt.PortName + " 已关闭 ";
//如果sp/spt对象没有绑定spt_DataReceived事件,则要执行以下语句
//当串口有数据要接收时,将触发该事件,执行绑定到该事件委托的方法
}
private void Reset_Serial()
{
spt.PortName = comboBox1.Text; //指定要使用的串口号
spt.BaudRate = 115200; //设定波特率
spt.DataBits = 8; //设定字长
spt.StopBits = StopBits.One; //设定停止位
spt.Parity = System.IO.Ports.Parity.None; //设定奇偶验证协议
spt.Encoding = Encoding.UTF8; //设定通信中使用的字符集
spt.DtrEnable = true; //数据终端准备就绪(可以接收数据)
spt.ReadTimeout = 1000; //设置数据读取超时为1秒
spt.WriteTimeout = 1000; //设置数据发送超时为1秒
// toolStripStatusLabel2.Text = spt.PortName + " 已打开 " + spt.BaudRate + "bps " + spt.DataBits + " " + spt.StopBits;
}
//虚拟按键部分:
void ReadSpt()
{
//以字符的方式读取串口的全部数据
char data = Convert.ToChar(spt.ReadChar());
Logs.Text = Convert.ToString(data);
switch (data)
{
case 'a':
// keybd_event((byte)Keys.A, 0, 0, 0);
m_IoSys.KeyDown(WinIoSys.Key.VK_A);
break;
case 'd':
//keybd_event((byte)Keys.D, 0, 0, 0);
m_IoSys.KeyDown(WinIoSys.Key.VK_D);
break;
case 's':
// keybd_event((byte)Keys.S, 0, 0, 0);
m_IoSys.KeyDown(WinIoSys.Key.VK_S);
break;
case 'w':
//keybd_event((byte)Keys.W, 0, 0, 0);
m_IoSys.KeyDown(WinIoSys.Key.VK_W);
break;
case '1':
//keybd_event((byte)Keys.NumPad1, 0, 0, 0);
m_IoSys.KeyDown(WinIoSys.Key.VK_U);
break;
case '2':
//keybd_event((byte)Keys.NumPad2, 0, 0, 0);
m_IoSys.KeyDown(WinIoSys.Key.VK_J);
break;
case '3':
//keybd_event((byte)Keys.NumPad3, 0, 0, 0);
m_IoSys.KeyDown(WinIoSys.Key.VK_I);
break;
case '5':
//keybd_event((byte)Keys.NumPad5, 0, 0, 0);
m_IoSys.KeyDown(WinIoSys.Key.VK_K);
break;
case '8':
//keybd_event((byte)Keys.NumPad8, 0, 0, 0);
m_IoSys.KeyDown(WinIoSys.Key.VK_O);
break;
case '9':
// keybd_event((byte)Keys.NumPad9, 0, 0, 0);
m_IoSys.KeyDown(WinIoSys.Key.VK_L);
break;
case '7':
keybd_event((byte)Keys.NumLock, 0, 0, 0);
break;
default:
m_IoSys.KeyUp(WinIoSys.Key.VK_W);
m_IoSys.KeyUp(WinIoSys.Key.VK_A);
m_IoSys.KeyUp(WinIoSys.Key.VK_D);
m_IoSys.KeyUp(WinIoSys.Key.VK_S);
m_IoSys.KeyUp(WinIoSys.Key.VK_U);
m_IoSys.KeyUp(WinIoSys.Key.VK_J);
m_IoSys.KeyUp(WinIoSys.Key.VK_I);
m_IoSys.KeyUp(WinIoSys.Key.VK_K);
m_IoSys.KeyUp(WinIoSys.Key.VK_O);
m_IoSys.KeyUp(WinIoSys.Key.VK_L);
break;
}
//通过调用虚拟键盘就可以实现手势操作啦!当然硬件陀螺仪的算法要写好,另外,利用服务器云端可以将校园的课室管理系统连接起来哦,这样连一般的教学资料和课表都可以手势获取啦~~