传感器连接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数据,并将解析结果存储到数据库中。

这种模式在实际应用中的效果并不理想,当时遇到的问题有:
Client/Server之间建立连接的过程较为漫长。 为了维持心跳功能,若采用GSM模块将导致显著的数据流量。 当数据量较大时,Server需要实现数据接收、解析和存储功能,其稳定性尚待验证。
最近考虑使用Web POST请求,将传感器获取的数据发送到Web服务器后,经由后端处理机制存储到数据库。同时,目前有部分项目需要通过Web界面展示传感器数据(采用数据可视化技术),这一功能的实现相对简单,且逻辑结构清晰易懂。

建立数据库

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

这里的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,测试调用。


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

Arduino+Wi-Fi(ESP8266)HTTP协议发送POST请求
硬件准备:
Arduino UNO ESP 8266系列可选的数字传感器模块(如温湿度传感器、电流电压计)采用3.3V电源,配置了GND、GND、RX、TX引脚,分别位于第12和13脚位。

#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报文以及服务器的响应。


在分析AddTime字段时,可以观察到POST频率达到每秒两条,表现极为出色。
代码量统计
Arduino: 70行 WebService.asmx:50行
在较短时间内完成了对传感器数据的数据库上传,这种方法简洁高效,值得借鉴。
