NodejsはMQTTを利用してEsp 8266にデータを転送します.

7669 ワード

前の2つの記事はNodejsがMQTTサーバデータを受信し、Esp 8266センサデータをMQTTサーバに送信することを実現しました.今はNodejsを通じてEsp 8266上にデータを転送したいので、Esp 8266センサデータの収集時間間隔を制御できます.
主にPbSubClientライブラリのsubscribeとpublishの使用です.npmでmqttの使用もあります.
参考記事:https://github.com/knolleary/pubsubclient/blob/master/examples/mqtt_esp 8266/mqtt_esp 8266.inohttps://www.npmjs.com/package/mqtt
Nodejs端末で使用するコード:
/*  MQTT    (         publish   )*/
var mqtt = require('mqtt')
var fs = require('fs')

var client  = mqtt.connect('mqtt://127.0.0.1:61613',{username:"admin",password:"password"})

client.on('connect',function () {
    client.subscribe('world');
    client.publish('world','5000');
})

client.on('message', function (topic, message) {

  console.log(typeof message);
  console.log(message.toString());
  client.end();

})
Esp 8266エンドコード:
//         callback()        
#include 
#include 


#include 
#include 

#ifdef U8X8_HAVE_HW_SPI
#include 
#endif
#ifdef U8X8_HAVE_HW_I2C
#include 
#endif

const char *ssid = "smart";
const char *password = "19940508";

WiFiClient espClient;
PubSubClient client(espClient);


U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/D3, /* data=*/D2, /* reset=*/U8X8_PIN_NONE);

int lastVal = 0;

int ordernum = 1000;
// String offcommand ;

void reconnect()
{
  while (!client.connected())
  {
    Serial.print("Attempting MQTT connection...");
    // client connect("id","username","password")
    if (client.connect("arduinoClient","admin","password"))
    {
      Serial.println("connected");

       //   Topic:world
      client.subscribe("world");
    }
    else
    {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      //   5s     
      delay(5000);
    }
  }
}


void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  char arr[length];
  for (int i = 0; i < (int)length; i++) {
    arr[i] = (unsigned char)payload[i];
    // Serial.print(arr[i]);
  }
  //         '\0'     ,           
  arr[length] = '\0';
  // Serial.println(arr);

  //char     int
  ordernum = atoi(arr);
  Serial.println(ordernum);

}


void setup()
{
  Serial.begin(9600);
  u8g2.begin();

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

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  //   mqtt         
  client.setServer("192.168.43.65", 61613);
  client.setCallback(callback);

  pinMode(A0,INPUT);
}


void loop()
{

  if (!client.connected())
  {
    reconnect();
  }
  client.loop();

  int val = analogRead(A0);
  char str [10];
  itoa(val, str, 10);
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.drawStr(0, 30, str);
  if (val != lastVal) {
    //     ordernum
    // Topic: hello
    delay(ordernum);
    client.publish("hello", str);
    lastVal = val;
  }

  u8g2.sendBuffer();
  delay(10);
}
大体のコードはこのようになります.