锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2022-10-04 09:00:00 对射光电开关传感器感应开关excon021传感器传感器接入器sc25v传感器

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

很久以前,我做了一个与传感器数据采集相关的小项目,需要单片机IO通过网络模块收集传感器数据(GSM/WI-FI)将数据作为客户端(JSON)通过TCP/IP协议上传到服务器TCP端口。同时,监控程序在服务器上运行,分析JSON然后转存到数据库。

047f753206af09d8ebf9cb42b306e180.png

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

Client/Server之间建立连接需要较长时间。 如果使用,需要保持心跳GSM模块产生更多的数据流量。 Server需要监听/分析/转存TCP如果数据量大,端口数据程序的稳定性未知。

最近想到用HTTP POST请求将传感器获得的数据直接连接到传感器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 void test(string data)

{

string strsql = ConfigurationManager.ConnectionStrings["sqlserverconfig"].ToString();//读取webconfig连接字符串的数据库

con = new SqlConnection(strsql);

///添加数据记录

string sql = "insert into SensorData (ID,DeviceID,Data,AddTime) Values (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 可选数字传感器(如温湿度、电压电流计) Arduino ESP-8266 3.3V 3.3V GND GND 12 RX 13 TX

#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");

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

delay(1000);

Response();

mySerial.println("AT+CIPSEND"); // 进入TCP透传模式,接下来发送的所有消息都会发送给服务器

}

void postToServer(String paras){

//组装HTTP报头

String httpContent="POST "+URL+" HTTP/1.1\r\nHost: "+Host+"\r\nContent-Type: application/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行

不足150行便实现了传感器数据上传到数据库的流程,可见这种方法短小精悍。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章