在我的前两篇博客中介绍了如何用普通电脑控制电灯泡开关灯的两种方法:
http://www.dengfengsoft.com/docs/web/dengfengsoft_phidgets_powercontrol.htm
http://www.dengfengsoft.com/docs/web/dengfengsoft_phidgets1014.htm
在这篇教程里,我们要向您介绍如何通过网络远程调用天邦登峰Phidgets 1017 SBC 板来控制电灯泡的开关灯。
要准备的东西如下:
所需硬件:
所需硬件:
1072-PhidgetSBC2 http://www.dengfengsoft.com/ViewDetails85.aspx
产品编号: 1072 含网络连接线,电源线
|
Dual Relay Board (双继电器板). http://www.dengfengsoft.com/ViewDetails204.aspx 产品编号: 3051
|
|||
灯泡和灯座 数量: 1 可在五金店买到。
|
保险丝. 10A 250V 用于保护电路,避免电流过高。(可选) 在各电子城都能找到。
|
|||
电源线 从中间剪断备用
|
电线若干 |
所需要的软件:
1..Net Framework 3.5 (Windows 7 自带,Windows XP 请下载)
2. Visual Studio 2010 Express (下载)
3. 本文范例源码及其所需要的组件 ( C#)
1. 首先用一根电线一端连接1072-PhidgetSBC2板的数据输出口 1 (可以选择其他口,我们这里暂时用1口),另一端连接3051-Dual Relay Board(双继电器板)的开关控制 1 口。
2. 把电源线从中间剪断,把尾部的电线抽出来,火线端先连接10A 保险丝(可选,如果要带的电器比较多,最好加这个保险丝,1个灯泡加不加都行),然后接入3051-Dual Relay Board(双继电器板)的1C口。
3. 找另一根电线,一端连接3051-Dual Relay Board(双继电器板)的NO口,另一端连接电灯泡的负极。
4. 找另一根电线,一端连接电灯泡的正极,另一端连接电源线的零线。
硬件连接完毕!
连接后的实物图如下图所示:
Phidgets1072 非常方便的地方是Webservice已经帮您配置好了!所以您只需要设置一个访问密码,就可以立即使用网络发送指令远程控制3051继电器!
用一根网线连接局域网,并插入Phidgets1072的网口,Phidgets 1072 SBC会自动获取IP地址,并自动联网。
我们在服务器端电脑安装Phidgets驱动程序 ,和BonjourPSSetup.exe 组件(Phidgets1072 网络自动连接控制组件)。
安装完毕后,双击电脑桌面右下角的Ph图标,调出Phidgets控制面板:
打开控制面板的”PhidgetsSBC”页,可以看到,服务器端已经远程自动检测到Phidgets1072 SBC板!并已经获取了Phidgets1072的IP地址等信息了。
双击 Phidgets1072 SBC2,就可以打开Phidgets1072板内的Web配置页面,我们只需要在配置页面的第一页设置登录
密码就可以了。
其他信息都可以不用设置。如果要设置,默认的用户名是:admin,密码是您设置的密码。这里我们输入1234作为登录密码。
切换控制面板到“WebService”页,点击“Bonjour”页,双击 Phidget InterfaceKit 8/8/8 (Phidgets 1072是内置Phidget InterfaceKit 8/8/8的)
就可以出现控制页面,如下图所示:
好了,现在用鼠标点击“Digital Out”内的输出口 1,就可以通过局域网远程控制电灯的开关灯了!
但我们最终的软件不能是这个样子的,所以我们必须为服务器端来开发控制软件,这个软件可以通过网络
控制局域网内天邦登峰Phidgets1072,并控制Phidgets1072输入开关灯指令。
运行我们提供的范例程序:
上电后电灯泡是不亮的。
点击“开”或“关”就可以打开和关闭电灯泡了!
软件关键源码(以C#为例,更多编程语言范例,请参考:http://www.dengfengsoft.com/dengfengsoft_phidgets_programming_resources.html)分析如下:
private void iniPhidget() { try { //Initialize the InterfaceKit object ifKit = new InterfaceKit(); //Hook the basica event handlers ifKit.Attach += new AttachEventHandler(ifKit_Attach); ifKit.Detach += new DetachEventHandler(ifKit_Detach); ifKit.Error += new Phidgets.Events.ErrorEventHandler(ifKit_Error); //Hook the phidget spcific event handlers ifKit.InputChange += new InputChangeEventHandler(ifKit_InputChange); ifKit.OutputChange += new OutputChangeEventHandler(ifKit_OutputChange); ifKit.SensorChange += new SensorChangeEventHandler(ifKit_SensorChange); //使用命令行参数打开Phidgets openCmdLine(ifKit); } catch (PhidgetException pe) { MessageBox.Show(pe.ToString()); } }
使用命令行通过局域网初始化Phidgets1072
#region Command line open functions private void openCmdLine(Phidget p) { openCmdLine(p, sysinfo.password);//1072板的访问密码 } private void openCmdLine(Phidget p, String pass) { int serial = -1; int port = sysinfo.port;//端口 String host = sysinfo.ip;//1072 SCB板的IP地址 bool remote = true, remoteIP = true; string[] args = Environment.GetCommandLineArgs(); String appName = args[0]; try { //Parse the flags for (int i = 1; i < args.Length; i++) { if (args[i].StartsWith("-")) switch (args[i].Remove(0, 1).ToLower()) { case "n": serial = int.Parse(args[++i]); break; case "r": remote = true; break; case "s": remote = true; host = args[++i]; break; case "p": pass = args[++i]; break; case "i": remoteIP = true; host = args[++i]; if (host.Contains(":")) { port = int.Parse(host.Split(':')[1]); host = host.Split(':')[0]; } break; default: goto usage; } else goto usage; } if (remoteIP) p.open(serial, host, port, pass); else if (remote) p.open(serial, host, pass); else p.open(serial); return; //success } catch { } usage: StringBuilder sb = new StringBuilder(); sb.AppendLine("Invalid Command line arguments." + Environment.NewLine); sb.AppendLine("Usage: " + appName + " [Flags...]"); sb.AppendLine("Flags:/t-n serialNumber/tSerial Number, omit for any serial"); sb.AppendLine("/t-r/t/tOpen remotely"); sb.AppendLine("/t-s serverID/tServer ID, omit for any server"); sb.AppendLine("/t-i ipAddress:port/tIp Address and Port. Port is optional, defaults to 5001"); sb.AppendLine("/t-p password/tPassword, omit for no password" + Environment.NewLine); sb.AppendLine("Examples: "); sb.AppendLine(appName + " -n 50098"); sb.AppendLine(appName + " -r"); sb.AppendLine(appName + " -s myphidgetserver"); sb.AppendLine(appName + " -n 45670 -i 127.0.0.1:5001 -p paswrd"); MessageBox.Show(sb.ToString(), "Argument Error", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); } #endregion
其他Phidgets的事件都不变:
void ifKit_SensorChange(object sender, SensorChangeEventArgs e)//传感器事件变化事件 { //e.Index 传感器所插的插口编号 0-7 //e.Value 传感器的值 } void ifKit_OutputChange(object sender, OutputChangeEventArgs e)//接口板输出事件 { //e.Index 输出口编号 //e.Value 输出的值 } void ifKit_InputChange(object sender, InputChangeEventArgs e)//接口板输入事件 { //e.Index 输入口编号 //e.Value 输入的值 } void ifKit_Error(object sender, ErrorEventArgs e) { //e.Description; 错误信息 } void ifKit_Detach(object sender, DetachEventArgs e) { //连接状态提示 //1018-PhidgetInterfaceKit 8/8/8 接口板 "已和硬件成功断开连接!"; } void ifKit_Attach(object sender, AttachEventArgs e) { //连接状态提示 // 1072-PhidgetSBC2板 "已和硬件成功建立连接!"; }
通过局域网开关灯的代码也不变!
private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (this.checkBox1.Checked)//打勾=开 { this.checkBox1.Text = "关"; ifKit.outputs[1] = true; //从6信号口输入1信号打开电源 this.pictureBox1.Image = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "//lights_On.png"); } else//=关 { this.checkBox1.Text = "开"; ifKit.outputs[1] = false; //从6信号口输入0信号关闭电源 this.pictureBox1.Image = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "//lights_Off.png"); } }
我们看到,实际起作用的仅仅用了两行代码:
ifKit.outputs[1] = true;//开灯
ifKit.outputs[1] = false;//关灯
我们通过局域网络实现了远程电灯泡的开关灯操作!