ESPDUINO上传数据到oneNet云平台

最近对物联网上传数据产生了兴趣,成功上传数据到云平台了,这里跟大家分享下心得。

为什么选用ESPDUINO,因为arduino yun太贵,arduino+wifi模块也挺麻烦的也比较贵ESPDUINO只要40多+传感器不超过50元就可以实现了

这里可以看看 ESPDUINO的介绍http://bbs.doit.am/forum.php?mod=forumdisplay&fid=69&page=2


先来展示下成果吧

ESPDUINO上传数据到oneNet云平台_第1张图片


ESPDUINO上传数据到oneNet云平台_第2张图片


先贴arduino端的代码吧

/*
 Name:		OneNetTest.ino
 Created:	2017/11/22 星期三 21:38:48
 Author:	蓝色魅影
*/
#include 
#include 

const char *ssid = "路由器账号";
const char *password = "路由器密码";

dht11 DHT11;
#define DHT11PIN 2 //DHT11 PIN 2 连接ARDUINO 2


WiFiClient client;
#define DebugSerial Serial

const unsigned int WIFIRxBufferLength = 1000;
char WIFIRxBuffer[WIFIRxBufferLength];
unsigned int WIFIBufferCount = 0;

#define Success 1U
#define Failure 0U

char OneNetServer[] = "183.230.40.33";       //服务器地址
char device_id[] = "******";    //修改为自己的设备ID
char API_KEY[] = "******";    //修改为自己的API_KEY
char sensor_temp[] = "TEMP";  //不需要修改
char sensor_humi[] = "HUMI";  //不需要修改


void setup() {
	Serial.begin(115200);
	delay(10);

	WifiConnected();
}

void loop() {
	int chk = DHT11.read(DHT11PIN);								//读取温湿度值

	//串口调试DHT11输出信息
	DebugSerial.println("Read sensor: " + chk);

	delay(5000);

	if (chk == DHTLIB_OK) {

		Serial.println(DHT11.temperature);

		Serial.print("connecting to ");
		Serial.println(OneNetServer);

		// Use WiFiClient class to create TCP connections
		const int httpPort = 80;
		if (!client.connect(OneNetServer, httpPort)) {
			Serial.println("connection failed");
			return;
		}

		postDataToOneNet(API_KEY, device_id, sensor_temp, DHT11.temperature);//上传温度数据

		postDataToOneNet(API_KEY, device_id, sensor_humi, DHT11.humidity);//上传湿度数据

		Serial.println();
		Serial.println("closing connection");
	}
	else
	{
		DebugSerial.print("Read sensor: ERROR");
	}
}

//链接WIFI
void WifiConnected() 
{
	WiFi.disconnect();
	WiFi.mode(WIFI_STA);

	Serial.println();
	Serial.print("Connecting to");
	Serial.println(ssid);

	WiFi.begin(ssid, password);
	while (WiFi.status() != WL_DISCONNECTED)
	{
		delay(500);
		Serial.print(".");
	}

	Serial.println("");

	Serial.println("WIFI connected");

	Serial.println(WiFi.localIP());

}

void clrWIFIRxBuffer(void)
{
	memset(WIFIRxBuffer, 0, WIFIRxBufferLength);      //清空
	WIFIBufferCount = 0;
}

//发送数据到云平台
void postDataToOneNet(char* API_VALUE_temp, char* device_id_temp, char* sensor_id_temp, double data_value)
{
	char send_buf[400] = {
		0 };
	char text[100] = {
		0 };
	char tmp[25] = {
		0 };

	char value_str[15] = {
		0 };


	dtostrf(data_value, 3, 2, value_str); //转换成字符串输出

										  //连接服务器
	memset(send_buf, 0, 400);    //清空

								 /*准备JSON串*/
								 //ARDUINO平台不支持sprintf的double的打印,只能转换到字符串然后打印
	sprintf(text, "{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":%s}]}]}"
		, sensor_id_temp, value_str);

	/*准备HTTP报头*/
	send_buf[0] = 0;
	strcat(send_buf, "POST /devices/");
	strcat(send_buf, device_id_temp);
	strcat(send_buf, "/datapoints HTTP/1.1\r\n"); //注意后面必须加上\r\n
	strcat(send_buf, "api-key:");
	strcat(send_buf, API_VALUE_temp);
	strcat(send_buf, "\r\n");
	strcat(send_buf, "Host:");
	strcat(send_buf, OneNetServer);
	strcat(send_buf, "\r\n");
	sprintf(tmp, "Content-Length:%d\r\n\r\n", strlen(text)); //计算JSON串长度
	strcat(send_buf, tmp);
	strcat(send_buf, text);

	//client.print(send_buf);

	if (sendCommand(send_buf, "\"succ\"}", 3000, 1) == Success);
	else errorLog(10);

}

void(*resetFunc) (void) = 0; //制造重启命令

//错误日志
void errorLog(int num)
{
	DebugSerial.print("ERROR");
	DebugSerial.println(num);

	//resetFunc();
}

unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry)
{
	clrWIFIRxBuffer();
	for (unsigned char n = 0; n < Retry; n++)
	{
		DebugSerial.print("\r\n---------send AT Command:---------\r\n");
		DebugSerial.write(Command);

		client.println(Command);

		WIFIReadBuffer();
		if (strstr(WIFIRxBuffer, Response) != NULL)
		{
			DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
			DebugSerial.print(WIFIRxBuffer); //输出接收到的信息
			clrWIFIRxBuffer();
			return Success;
		}	

	}
	DebugSerial.print("\r\n==========receive AT Command:==========\r\n");
	DebugSerial.print(WIFIRxBuffer);//输出接收到的信息
	clrWIFIRxBuffer();
	return Failure;
}

void WIFIReadBuffer() {
	while (client.available())
	{
		WIFIRxBuffer[WIFIBufferCount++] = client.read();
		if (WIFIBufferCount == WIFIRxBufferLength)clrWIFIRxBuffer();
	}
}

平时人很懒,难得写写纹章,如果有人有兴趣的话,哪部分理解不充分我会谢谢详细的

你可能感兴趣的:(物联网)