Advertisement

传感器连接mysql_获取传感器数据并传入数据库-HTTP/POST/ASP.NET

阅读量:

该文本描述了通过HTTP POST请求将传感器数据直接上传至Web服务器并存储到数据库的方法。与之前依赖GSM/WiFi模块的复杂方案相比,这种方法短小精悍,编码简单,逻辑清晰。通过在IIS上部署Web服务,并使用Arduino+Wi-Fi(ESP8266)设备进行数据发送,实现了每秒发送两条数据的高频率传输。该方法在数据处理效率和稳定性上均有显著提升,适合需要实时数据上传的场景。

获取传感器数据并传入数据库-HTTP/POST/ASP.NET

在较早的时候,参与了一个与传感器数据采集相关的项目。项目的主要需求是通过单片机的IO端口来采集传感器数据。随后,使用了网络模块(如GSM/WI-FI),作为客户端设备,通过TCP/IP协议将采集到的JSON数据上传至服务器的TCP端口。服务器端运行一个监听程序,用于解析接收到的JSON数据,并将解析结果存储到数据库中。

047f753206af09d8ebf9cb42b306e180.png

这种模式在实际应用中的效果并不理想,当时遇到的问题有:

Client/Server之间建立连接的过程较为漫长。 为了维持心跳功能,若采用GSM模块将导致显著的数据流量。 当数据量较大时,Server需要实现数据接收、解析和存储功能,其稳定性尚待验证。

最近考虑使用Web POST请求,将传感器获取的数据发送到Web服务器后,经由后端处理机制存储到数据库。同时,目前有部分项目需要通过Web界面展示传感器数据(采用数据可视化技术),这一功能的实现相对简单,且逻辑结构清晰易懂。

f4583328cebe2667855d081f8ef03dab.png

建立数据库

fc2fc02809e28838ee65837de82989aa.png

Web服务端(ASP. NET)

建立ASP.NET空网站,目标框架 .NET Framework4.0,添加一个Web服务。

dbbb324a806c838fc96b3badcd8b75b9.png

这里的WebService.asmx作为之后的请求接口

using System;

using System.Data;

using System.Configuration;

using System.Data.SqlClient;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Services;

///

/// WebService 的摘要说明

///

[WebService(Namespace = "http://tempuri.org/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。

// [System.Web.Script.Services.ScriptService]

public class WebService : System.Web.Services.WebService

{

SqlConnection con;//创建连接对象

SqlCommand sc;

public WebService()

{

//如果使用设计的组件,请取消注释以下行

//InitializeComponent();

}

#region 接口测试

[WebMethod]

public static void test(string 参数名)接收数据字段data。
定义一个名为test的静态方法,该方法的参数为字符串类型,链接地址为https://...,并接收数据字段data。

{

字符串变量strsql由配置管理器获取"sqlserverconfig"连接字符串,并调用ToString方法转换为字符串类型。

con = new SqlConnection(strsql);

//添加一条数据记录

$ sql = "向SensorData表中插入(1,1,'" + data + "','" + DateTime.Now.ToString() + "')";

try

{

con.Open();//打开连接对象

sc = new SqlCommand(sql, con);//执行SQL

int i= sc.ExecuteNonQuery();//影响的记录条数

con.Close();//关闭对象

}

catch (Exception ex)

{

ex.ToString();

con.Close();

}

}

#endregion

}

对Web.config加入跨域请求说明和允许远程调试说明

此时我们调试WebService.asmx中的test,测试调用。

5b925db52fd4760ec4979014efffc080.png
a250cd40246190d5846e94dc939c76f7.png

当前,系统会显示新增的测试记录。至此,Web服务器端的部署工作已经完成。然后,将该服务部署到IIS,并启动WebService.asmx服务。

7e310accce07ab7324b843798088a669.png

Arduino+Wi-Fi(ESP8266)HTTP协议发送POST请求

硬件准备:

Arduino UNO ESP 8266系列可选的数字传感器模块(如温湿度传感器、电流电压计)采用3.3V电源,配置了GND、GND、RX、TX引脚,分别位于第12和13脚位。

252a7afbc3a40320efcbe78fa132c879.png

#include

SoftwareSerial mySerial(13, 12); // RX, TX

//--------------参数设置 START-------------

String Host="192.168.31.32";//域名或IP

String Port="80";//IIS端口,默认80

String URL="/DataSender/WebService.asmx/test";//接口地址

String Data = "data=8888";//注释:请求参数的前半部分必须与WebService.asmx中test方法的参数名一致。String data。

String WiFi_SSID="BS-112-Lab";

String WiFi_PSW="i-am-wifi-psw";

//--------------参数设置 END---------------

void setup() {

Serial.begin(57600);//本地调试串口

while (!Serial) {//等待连接

}

mySerial.begin(57600);//软串口

initWifi();//初始化Wi-Fi SSID/PSW

setHttpServer();//设置发送模式

}

void loop() {

if (mySerial.available()) {

Serial.write(mySerial.read());//数据回显

}

if (Serial.available()) {

mySerial.write(Serial.read());

}

postToServer(Data);

}

void Response(){//接受服务器的响应并显示在本地串口

delay(50);

while (mySerial.available()) {

Serial.write(mySerial.read());

}

Serial.write("\n");

}

void initWifi(){

mySerial.println("AT+RST"); // 重启模块

delay(1000);

Response();

mySerial.println("AT");//测试通信,返回OK

Response();

delay(1000);

mySerial.println("AT+CWMODE=3"); // 设置ESP8266模块处于AP兼Station模式

Response();

mySerial.println("AT+CWJAP=""+WiFi_SSID+"",""+WiFi_PSW+"""); // 连接Wi-Fi

Response();

delay(10000);

}

void setHttpServer(){

mySerial.println("AT+CIPMODE=1");

mySerial.println("AT+CIPSTART="TCP",""+Host+"","+Port+""); // 连接服务器的80端口

delay(1000);

Response();

mySerial->send("AT+IPSEND命令"); // 进入TCP穿透传模式,后续发送的所有数据将直接发送至服务器端

}

void postToServer(String paras){

//组装HTTP报头

String httpContent="POST "+URL+" HTTP/1.1\r\nHost字段为"+Host+"\r\nContent-Type字段设置为x-www-form-urlencoded格式\r\nContent-Length:"+paras.length()+"\r\n\r\n"+paras;

Serial.print("==============\nPost Data: "+paras+"\n");

mySerial.print(httpContent); //POST

delay(2000);//POST请求频率,建议2s,小于这个时间建议调高波特率。

Response();

}

将代码烧录至Arduino后,通过打开串口监视器,即可观察到数据发送状态、POST报文以及服务器的响应。

afe3e47633c9bbe9c6d636d501566944.png
6fb9f9c15590a66ffc5eed4ffe792bca.png

在分析AddTime字段时,可以观察到POST频率达到每秒两条,表现极为出色。

代码量统计

Arduino: 70行 WebService.asmx:50行

在较短时间内完成了对传感器数据的数据库上传,这种方法简洁高效,值得借鉴。

全部评论 (0)

还没有任何评论哟~