關于ESP8266-NodeMCU和onenet通信傳輸學習總結(一)
1.ESP8266-NodeMCU簡介:
? ESP8266-NodeMCU是一個開源硬體開發板,由于它支持WIFI功能,所以在物聯網(IOT)領域,Arduino開發板最大的對手之一就是ESP8266-NodeMCU開發板,ESP8266-NodeMCU尺寸與Nano類似, 他并不是Arduino團隊開發的,但是我們也可以使用Arduino IDE 對他進行開發,而且他還有一顆地道的“中國芯”—ESP8266模塊,

(這里我要感謝太極創客團隊對這塊開發板的教學制作,對很多新手玩家很友好);
開發板引腳:

更多關于開發板資料可以到太極創客官網進行了解學習
http://www.taichi-maker.com/homepage/reference-index/arduino-hardware-refrence/nodemcu/
2.onenet物聯網平臺
該平臺為廣大物聯網產品開發提供了免費的服務器進行資料存盤和傳輸,更多詳情可以到其官網進行了解,這里不累述,
對于新入門用戶可能對其如何使用有很大疑惑,在半知半解的學習中,這里提供其中一種使用方法,通過mqtt協議建立使用:
第一步注冊onenet賬戶:

第二步,進入控制臺:

選擇多協議接入:

這里選擇mqtt舊版,創建產品,內容任意:

重點看下技術引數,按照自己的網路方式進行選擇,可以參考如下方式:

然后生成產品后進入創建設備:

這里著重注意要留好設備ID,產品ID和你的Master-APIkey,該資訊將作為esp8266連入onenet的設備ID,用戶名和密碼,創建完成后可以創建資料流,方式任意,記得資料流名字就ok了,到此onenet上的準備作業完成,
3.ESP8266-NodeMCU客戶端設備開發
話不多說,先上代碼:
/**
* author: topthemaster
* time: 2021.1.6
*
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
#include <ArduinoJson.h>
#define PRODUCT_ID "396066" //產品名
#define API_KEY "tx6WM==zmW21Z2pt4susBRlHMuY="//產品密鑰
#define DEVICE_ID "666259032"//設備名
#define TOPIC "ceshitopic1"//訂閱主題
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
const char* ssid = "Fishing WiFi ";
const char* password = "zheshiyigewifi";
const char* mqttServer = "183.230.40.39";//onenet地址
const uint16_t mqttPort = 6002;//mqtt介面埠
Ticker ticker;
int count;
char msgJson[75];
char msg_buf[200];
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // 設定板上LED引腳為輸出模式
digitalWrite(LED_BUILTIN, HIGH); // 啟動后關閉板上LED
Serial.begin(9600);
WiFi.mode(WIFI_STA);
connectWifi();
mqttClient.setServer(mqttServer,mqttPort);
// 設定MQTT訂閱回呼函式
mqttClient.setCallback(receiveCallback);
connectMQTTServer();
ticker.attach(1, tickerCount);
}
void loop() {
if (mqttClient.connected()) { // 如果開發板成功連接服務器
// 每隔3秒鐘發布一次資訊
// 保持心跳
if (count >= 3){
pubMQTTmsg();
count = 0;
}
mqttClient.loop();
} else { // 如果開發板未能成功連接服務器
connectMQTTServer(); // 則嘗試連接服務器
}
}
void tickerCount(){
count++;
}
void connectMQTTServer(){
String clientId = DEVICE_ID;
String productId=PRODUCT_ID;
String apiKey=API_KEY;
// 連接MQTT服務器
if (mqttClient.connect(clientId.c_str(),productId.c_str(),apiKey.c_str())) {
Serial.println("MQTT Server Connected.");
Serial.println("Server Address: ");
Serial.println(mqttServer);
Serial.println("ClientId:");
Serial.println(clientId);
subscribeTopic(); // 訂閱指定主題
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(3000);
}
}
// 訂閱指定主題
void subscribeTopic(){
// 建立訂閱主題,主題名稱以Taichi-Maker-Sub為前綴,后面添加設備的MAC地址,
// 這么做是為確保不同設備使用同一個MQTT服務器測驗訊息訂閱時,所訂閱的主題名稱不同
String topicString = "temperature";
char subTopic[topicString.length() + 1];
strcpy(subTopic, topicString.c_str());
// 通過串口監視器輸出是否成功訂閱主題以及訂閱的主題名稱
if(mqttClient.subscribe(subTopic)){
Serial.println("Subscrib Topic:");
Serial.println(subTopic);
} else {
Serial.print("Subscribe Fail...");
}
}
void receiveCallback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message Received [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println("");
Serial.print("Message Length(Bytes) ");
Serial.println(length);
//測驗下發資料
if ((char)payload[0] == '1') { // 如果收到的資訊以“1”為開始
digitalWrite(BUILTIN_LED, LOW); // 則點亮LED,
Serial.println("LED ON");
} else if((char)payload[0] == '0'){
digitalWrite(BUILTIN_LED, HIGH); // 否則熄滅LED,
Serial.println("LED OFF");
}
}
void pubMQTTmsg(){
//onenet資料點上傳系統主題
String topicString = "$dp";
char publishTopic[topicString.length() + 1];
strcpy(publishTopic, topicString.c_str());
//json資料轉換為陣列
DynamicJsonDocument doc(16);
doc["temperature"] = 35.5;
serializeJson(doc, Serial);
// 建立發布資訊,溫度
String jsonCode;
serializeJson(doc, jsonCode);
Serial.print("json Code: ");Serial.println(jsonCode);
String messageString = jsonCode;
char publishMsg[messageString.length() + 1];
strcpy(publishMsg, messageString.c_str());
int json_len=strlen(publishMsg);
memset(msg_buf,0,200);
msg_buf[0]=char(0x03);
msg_buf[1]=char(json_len>>8);
msg_buf[2]=char(json_len &0xff);
memcpy(msg_buf+3,publishMsg,json_len);
// 實作ESP8266向主題發布資訊
if(mqttClient.publish(publishTopic, (uint8_t*)msg_buf,3+json_len)){
Serial.println("Publish Topic:");Serial.println(publishTopic);
String msg_bufTotal;
for(int i=0;i<sizeof(msg_buf)/sizeof(msg_buf[0]);i++)
{
msg_bufTotal+=msg_buf[i];
}
Serial.println("Publish message:");Serial.println(msg_bufTotal);
} else {
Serial.println("Message Publish Failed.");
}
}
void connectWifi(){
WiFi.begin(ssid, password);
//等待WiFi連接,成功連接后輸出成功資訊
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi Connected!");
Serial.println("");
}
? 這里通過arduino進行開發,程式下載到開發板后,便可往onenet服務器傳輸資料點資訊,onenet服務器亦可下發指令到客戶端設備,下面進行演示:

成功連入onenet服務器后,會自動顯示在線,這里原理涉及遺囑機制,不展開說明,知道能看到狀態就好,
通過串口資訊,我們往服務器$dp系統主題發送json資料(這里有很多坑,容易踩跨自己),該發送模式采用了官方傳入協議的第三種模式(不問為什么,簡單方便,也只試過這種),代碼詳情如圖,需要設定模式位,位元組大小位,然后json資料轉碼發送才能收到;
void pubMQTTmsg(){
//onenet資料點上傳系統主題
String topicString = "$dp";
char publishTopic[topicString.length() + 1];
strcpy(publishTopic, topicString.c_str());
//json資料轉換為陣列
DynamicJsonDocument doc(16);
doc["temperature"] = 35.5;
serializeJson(doc, Serial);
// 建立發布資訊,溫度
String jsonCode;
serializeJson(doc, jsonCode);
Serial.print("json Code: ");Serial.println(jsonCode);
String messageString = jsonCode;
char publishMsg[messageString.length() + 1];
strcpy(publishMsg, messageString.c_str());
int json_len=strlen(publishMsg);
memset(msg_buf,0,200);
msg_buf[0]=char(0x03);
msg_buf[1]=char(json_len>>8);
msg_buf[2]=char(json_len &0xff);
memcpy(msg_buf+3,publishMsg,json_len);
// 實作ESP8266向主題發布資訊
if(mqttClient.publish(publishTopic, (uint8_t*)msg_buf,3+json_len)){
Serial.println("Publish Topic:");Serial.println(publishTopic);
String msg_bufTotal;
for(int i=0;i<sizeof(msg_buf)/sizeof(msg_buf[0]);i++)
{
msg_bufTotal+=msg_buf[i];
}
Serial.println("Publish message:");Serial.println(msg_bufTotal);
} else {
Serial.println("Message Publish Failed.");
}
}
串口發送資訊:

此時,服務器端可見:

這里只用了測驗資料,然后我們測驗下發指令:




發送一個1,我們開發板上會亮燈,發送0會熄滅,測驗成功,
這是一個完整的onenet平臺連接程式代碼,如果需要使用可以直接copy,注意改一下自己的onenet資訊即可,可以上傳資料點和下發指令,傳感器方面還未加入,現僅實作通過mqtt協議與onenet平臺進行通信和資料傳輸,后續將加入一些實際開發資料完善專案,
這是一個完整的onenet平臺連接程式代碼,如果需要使用可以直接copy,注意改一下自己的onenet資訊即可,可以上傳資料點和下發指令,傳感器方面還未加入,現僅實作通過mqtt協議與onenet平臺進行通信和資料傳輸,后續將加入一些實際開發資料完善專案,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/247235.html
標籤:其他
上一篇:HaaS600物聯網開發板學習筆記(一)---開發板硬體資源
下一篇:傳感器小結
