0
0

ESP32からHTTPSリクエスト例

Last updated at Posted at 2024-09-29

ESP32のJavascript実行環境を使って、HTTPSリクエストを使ったIoTのためのライブラリを作成しました。

以下のESP32用のJavascript実行環境のファームウェアを使います。

「電子書籍:M5StackとJavascriptではじめるIoTデバイス制御」

準備

以下を参考に、HTTPSのためのブリッジサーバを立ち上げます。

そして、以下を1回実行しておきます。

main.js
import * as http from "Http";
http.setHttpBridgeServer('http://【立ち上げたブリッジサーバ】:30080');

サンプルライブラリ

(i) LINE Notify

LineNotify.js
import * as http from "Http";

export default class LineNotify{
  constructor(accessToken){
    this.accessToken = accessToken;
  }

  notify(message){
    var body = {
      message: message
    };
    var headers = {
      Authorization: "Bearer " + this.accessToken
    };
    var url = "https://notify-api.line.me/api/notify";
    var result = http.fetch(http.method_post_urlencode | http.resp_json, url, null, body, headers );
    return result;
  }
}

使い方

main.js
//import * as http from "Http";
//http.setHttpBridgeServer('http://【立ち上げたブリッジサーバ】:30080');

import LineNotify from "LineNotify.js";
var linenotify = new LineNotify("【アクセストークン】");

(async function(){
  try{
    var result = linenotify.notify("こんにちは");
    console.log(JSON.stringify(result));
  }catch(error){
    console.error(error);
  }
})();

(ii) Beebotte

Beebotte.js
import * as http from "Http";

export default class Beebotte{
  constructor(channel, channelToken){
    this.channel = channel;
    this.channelToken = channelToken;
  }

  write(data){
    var body = {
      records: [
      ]
    };
    for( const [key, value] of Object.entries(data)){
      body.records.push({ resource: key, data: value });
    }
    var headers = {
      "X-Auth-Token": this.channelToken
    };
    var url = "https://api.beebotte.com/v1/data/write/" + this.channel;
    var result = http.fetch(http.method_post_json | http.resp_json, url, null, body, headers );
    return result;
  }
}

使い方

main.js
//import * as http from "Http";
//http.setHttpBridgeServer('http://【立ち上げたブリッジサーバ】:30080');

import Beebotte from "Beebotte.js";
var beebotte = new Beebotte("【チャネル名】", "【チャネルトークン】");

(async function(){
  try{
    var data = {
      resource1: 5677,
      resource2: "テスト"
    };
    var result = beebotte.write(data);
    console.log(JSON.stringify(result));
  }catch(error){
    console.error(error);
  }
})();

(iii) OpenWeather

OpenWeather.js
import * as http from "Http";

export default class OpenWeather{
  constructor(apikey){
    this.apikey = apikey;
  }

  current(lat, lon){
    var qs = {
      lat: lat,
      lon: lon,
      lang: "ja",
      appid: this.apikey
    };
    var url = "https://api.openweathermap.org/data/2.5/weather";
    var result = http.fetch(http.method_get | http.resp_json, url, qs );
    return result;
  }
}

使い方

main.js
//import * as http from "Http";
//http.setHttpBridgeServer('http://【立ち上げたブリッジサーバ】:30080');

import OpenWeather from "OpenWeather.js";
var openWeather = new OpenWeather("【APIキー】");

(async function(){
  try{
    var result = openWeather.current(35.45289084467834, 139.64291548274204);
    console.log(JSON.stringify(result));
  }catch(error){
    console.error(error);
  }
})();

(iv) SwitchBot

SwitchBot.js
import * as http from "Http";

export default class SwitchBot{
  constructor(token){
    this.token = token;
    this.base_url = "https://api.switch-bot.com/v1.0";
  }

  getDeviceList(){
    var headers = {
      "Authorization": this.token
    };
    var url = this.base_url + "/devices";
    var result = http.fetch(http.method_get | http.resp_json, url, null, null, headers );
    if( result.statusCode != 100 )
      throw new Error("statusCode is not 100");
    return result.body;
  }

  getDeviceStatus(deviceId){
    var headers = {
      "Authorization": this.token
    };
    var url = this.base_url + "/devices/" + deviceId + "/status";
    var result = http.fetch(http.method_get | http.resp_json, url, null, null, headers );
    if( result.statusCode != 100 )
      throw new Error("statusCode is not 100");
    return result.body;
  }

  sendDeviceControlCommand(deviceId, commandType, command, parameter){
    var params = {
      command: command,
      parameter: parameter,
      commandType: commandType
    };
    var headers = {
      "Authorization": this.token
    };
    var url = this.base_url + "/devices/" + deviceId + "/commands";
    var result = http.fetch(http.method_get | http.resp_json, url, params, null, headers );
    if( result.statusCode != 100 )
      throw new Error("statusCode is not 100");
    return result.body;
  }
}

使い方

main.js
//import * as http from "Http";
//http.setHttpBridgeServer('http://【立ち上げたブリッジサーバ】:30080');

import SwitchBot from "SwitchBot.js";
var switchBot = new SwitchBot("【アクセストークン】");

(async function(){
  try{
    var result = switchBot.getDeviceList();
    console.log(JSON.stringify(result));
  }catch(error){
    console.error(error);
  }
})();

(v) Gemini

Gemini.js
import * as http from "Http";

export default class Gemini{
  constructor(apikey){
    this.apikey = apikey;
    this.base_url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent";
  }

  generateContent(text){
    var qs = {
      key: this.apikey
    };
    var body = {
      contents: [{
          parts : [{
              text: text
          }]
      }]
    };
    var result = http.fetch(http.method_post_json | http.resp_json, this.base_url, qs, body );
    return result;
  }
}

使い方

main.js
//import * as http from "Http";
//http.setHttpBridgeServer('http://【立ち上げたブリッジサーバ】:30080');

import Gemini from "Gemini.js";
var gemini = new Gemini("【APIキー】");

(async function(){
  try{
    var result = gemini.generateContent("こんにちは");
    console.log(JSON.stringify(result));
  }catch(error){
    console.error(error);
  }
})();

(vi) Slack

Slack.js
import * as http from "Http";

export default class Slack{
  constructor(token){
    this.token = token;
    this.base_url = "https://slack.com/api";
  }

  postMessage(channel, text){
    var params = {
      token: this.token,
      channel: channel,
      text: text
    };
    var url = this.base_url + "/chat.postMessage";
    var result = http.fetch(http.method_post_formdata | http.resp_json, url, null, params );
    return result;
  }
}

使い方

main.js
//import * as http from "Http";
//http.setHttpBridgeServer('http://【立ち上げたブリッジサーバ】:30080');

import Slack from "Slack.js";
var slack = new Slack("【OAuth Token】");

(async function(){
  try{
    var result = slack.postMessage("#general", "こんにちは");
    console.log(JSON.stringify(result));
  }catch(error){
    console.error(error);
  }
})();

(vii) Chatwork

Chatwork.js
import * as http from "Http";

export default class Chatwork{
  constructor(apitoken){
    this.apitoken = apitoken;
    this.base_url = "https://api.chatwork.com/v2";
  }

  getChatList(){
    var headers = {
      "x-chatworktoken": this.apitoken
    };
    var url = this.base_url + "/rooms";
    var result = http.fetch(http.method_get | http.resp_json, url, null, null, headers );
    return result;
  }

  postMessage(room_id, message){
    var headers = {
      "x-chatworktoken": this.apitoken
    };
    var body = {
      body: message
    };
    var url = this.base_url + "/rooms/" + room_id + "/messages";
    var result = http.fetch(http.method_post_urlencode | http.resp_json, url, null, body, headers );
    return result;
  }
}

使い方

main.js
//import * as http from "Http";
//http.setHttpBridgeServer('http://【立ち上げたブリッジサーバ】:30080');

import Chatwork from "Chatwork.js";
var chatWork = new Chatwork("【APIトークン】");

(async function(){
  try{
    var result = chatWork.getChatList();
    console.log(JSON.stringify(result, null, "\t"));
    var result = chatWork.postMessage(result[0].room.id, "こんにちは");
    console.log(JSON.stringify(result, null, "\t"));
  }catch(error){
    console.error(error);
  }
})();

(viii) GAS SpreadSheet

Chatwork.js
import * as http from "Http";

export default class GasSpreadsheet{
  constructor(url){
    this.url = url;
  }

  call(data){
    var result = http.fetch(http.method_post_json | http.resp_json, this.url, null, data );
    return result;
  }
}

使い方

main.js
//import * as http from "Http";
//http.setHttpBridgeServer('http://【立ち上げたブリッジサーバ】:30080');

import GasSpreadsheet from "GasSpreadsheet.js";
var gasSpreadsheet = new GasSpreadsheet("【ウェブアプリのURL】");

(async function(){
  try{
    var data = ["value1", "value2"];
    var result = gasSpreadsheet.call(data);
    console.log(JSON.stringify(result, null, "\t"));
  }catch(error){
    console.error(error);
  }
})();

GASのスクリプト例

code.gs
//var ss = SpreadsheetApp.openById("【スプレッドシートID】");
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("【シート名】");

function doPost(e) {
  try{
    var data = JSON.parse(e.postData.contents);
    sheet.appendRow(data);
    SpreadsheetApp.flush();

    var out = ContentService.createTextOutput();
    out.setMimeType(ContentService.MimeType.JSON);
    out.setContent(JSON.stringify({ status: "OK" }));
    return out;
  }catch(error){
    var out = ContentService.createTextOutput();
    out.setMimeType(ContentService.MimeType.JSON);
    out.setContent(JSON.stringify({ status: "ERROR" }));
    return out;
  }
}

本ファームウェアのサポートサイト

〇電子書籍:M5StackとJavascriptではじめるIoTデバイス制御

〇ファームウェアのサポートサイト

〇ファームウェアダウンロードサイト

◯参考

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0