ラズパイの代わりにESP8266でDDNS更新を試みる[Lua,LoLin]

Lua
この記事は約4分で読めます。

ラズパイの準備ができなかったし、どうも進まないので忘れてたLoLin(ESP8266)を使ってDDNSの更新をやろうと思いました

今のところLua言語を使ってやってるけど全く知らないし大変ですw


ネットに落っこちてる情報ってピンポイント過ぎて惜しい情報が多いですねぇ

「HTTP接続をする」だけでもいっぱい情報あるし、関係ないことも多い

結構多かったのがLua言語はヤマハのルータで使えるようで、その情報が多かったです(もちろん使えません


とりま現時点のソースをご覧あれ~

urltable = {
hostname directory UseIPaddress
{"www.mydns.jp", "/directip.html?MID=mydnsxxxxxx&PWD=xxxxxxxxxxx&IPV4ADDR=",true},
{"f5.si", "/update.php?domain=xxxxxxxxx&password=xxxxxxxxxx", false}
}
http://symfoware.blog68.fc2.com/blog-entry-455.html
function split(str, delim)
if string.find(str, delim) == nil then
return {str}
end
local result = {}
local pat = "(,-)" ..delim .."()"
local lastPos
for part, pos in string.gfind(str,pat) do
table.insert( result, part )
lastPos = pos
end
table.insert( result, string.sub(str, lastPos))
return result
end
data=''
ip=''
function urlget( host, directory, agent, mode)
conn = net.createConnection( net.TCP, false )
conn:on(
"receive",
function( conns, pl )
print("\n", host, directory, agent, mode, "\n")
if mode == "ip" then
data = pl
for i, val in ipairs( split( data ,"\r\n")) do
ip = val
end
ip = string.sub( ip, 0, string.len(ip)1 )
print("IP: " ..ip )
for i, value in ipairs( urltable ) do
if value[3] == true then
access = value[2] ..ip
else
access = value[2]
end
urlget( value[1], access, "ZinLion(ESP8266; Lua;)" ,"")
print (value[1], access, "ZinLion(ESP8266; Lua;)" ,"")
print('B')
end
else
print("————————-")
print( pl )
print("————————-")
uart.setup(0,115200,8,0,1,1)
end
end
)
conn:on(
"connection",
function( c )
print("conected")
connsendd = "GET " ..directory .." HTTP/1.1\r\n"
.."Host: " ..host .."\r\n"
.."Accept: " .."/" .."\r\n"
.."Accept-Language: " .."ja-jp" .."\r\n"
.."User-Agent: " ..agent .."\r\n"
.."\r\n"
print(connsendd)
conn:send(connsendd)
end
)
conn:connect(80, host)
end
urlget( "ifconfig.io", "/", "curl/7.29.0", "ip" )
for i , value in ipairs(urltable) do
print( value )
end
"ZinLion(ESP8266; Lua;)"
view raw
ddns.lua
hosted with ❤ by GitHub

やたら長くなっちゃった

解説

解説するほどでもないか(わからないから

urltableというテーブル(配列やリストみたいなもの)にホストメイン、「/」からのパス、IPアドレスが必要なら付け加えるかを記載します

単にURL一つからアクセスできるものじゃないようです(出来るなら教えて

それぞれのデータはサーバーに送るヘッダーに埋め込みます

urlgetという関数がGETアクセスする部分です

引数にurltableの情報とユーザーエージェント、おまけを指定します

79行目のところでcurlとしてアクセスしているのは「 ifconfig.io 」にcurlとしてアクセスするとグローバルIPアドレスが返ってきます

What is my ip address? – ifconfig.io

その為このようにしています。(コレ以外の接続は全部適当に決めたユーザーエージェントです)

おまけはIPアドレスを取得するためのアドレスかどうかです

split関数はサーバーから送られたデータからIPアドレスのみをくり抜くために使ってます

こちらのをパクっ参考にしています

Luaで文字列の分割を行なう(split) – Symfowareについての考察blog

その他色々他の言語だったら簡単だと思うことをめんどくやってます


その他したこと

デバッグ中に特に触ってもいないのにブツブツLoLinが切断されるのでMicroUSB接続からUSB-シリアル変換を経由するようにした

VCCは3.3Vです

この方法にしてからほとんど切断されてない

多分ESP8266の消費電力が結構多いので落ちる→復活→落ちるを繰り返してたと思う

あと、あまりひどいときは物理的に外したほうがいいです

PC側がブルースクリーン吐きました

まぁ所詮パチもんですよ


改善点

  • いちいち実行しないといけない
  • URLの一覧を別にしたほうがいい
  • forの速度が早いので非同期通信が追いつかない
  • クライアントをLuaLoader意外にすると途中で止まる
  • ベーシック認証対応できればいいのに

欠点だらけ…

上2つはどうにかなりそうだけど非同期通信に(多分)追いつかないのは問題

urltableの一番最後のURLしか受信ができなかった

あと、LuaLoaderを使うと全部取得できるのに、tera tarmとか使うと途中で止まっちゃうんです

LuaLoaderは2バイト文字が来ると文字化け起こしてLoLin間通信速度を勝手に変えちゃうし…


ラズパイでDDNS更新したほうがめっちゃ楽だろうなぁー

今更だけどArduino IDEで開発したい(C言語が使える)

Lua言語でESP8266を制御する系の情報が海外ばっかで疲れた

でも、Arduino IDEで書き込むとファイルで保存云々ができなくなっちゃうよなぁ

難しいです

参考:

net Module – NodeMCU Documentation

HOW TO USE – MyDNS.JP

ESP8266とNodeMCUをLuaでWi-Fi設定とLチカする – Qiita

ボタンが押されたら通知する – Qiita

ESP8266のNodeMcuでiFttt – Qiita

技適つき格安wifiモジュールesp8266にnode mcuのファームを焼いてLuaで制御する – illmatic工業

コメント