ラズパイの準備ができなかったし、どうも進まないので忘れてた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;)" |
やたら長くなっちゃった
解説
解説するほどでもないか(わからないから
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側がブルースクリーン吐きました
ブルスク出ちまった
— じんさん (@uesitananame55) April 23, 2017
まぁ所詮パチもんですよ
改善点
- いちいち実行しないといけない
- URLの一覧を別にしたほうがいい
- forの速度が早いので非同期通信が追いつかない
- クライアントをLuaLoader意外にすると途中で止まる
- ベーシック認証対応できればいいのに
欠点だらけ…
上2つはどうにかなりそうだけど非同期通信に(多分)追いつかないのは問題
urltableの一番最後のURLしか受信ができなかった
あと、LuaLoaderを使うと全部取得できるのに、tera tarmとか使うと途中で止まっちゃうんです
LuaLoaderは2バイト文字が来ると文字化け起こしてLoLin間通信速度を勝手に変えちゃうし…
ラズパイでDDNS更新したほうがめっちゃ楽だろうなぁー
今更だけどArduino IDEで開発したい(C言語が使える)
Lua言語でESP8266を制御する系の情報が海外ばっかで疲れた
でも、Arduino IDEで書き込むとファイルで保存云々ができなくなっちゃうよなぁ
難しいです
参考:
net Module – NodeMCU Documentation
ESP8266とNodeMCUをLuaでWi-Fi設定とLチカする – Qiita
技適つき格安wifiモジュールesp8266にnode mcuのファームを焼いてLuaで制御する – illmatic工業
コメント