11月末よりModdable/ESMAScriptでESP32のプログラミングを行っている。ESP32をサーバーとして動かしたいときDHCPでIPアドレスを取得すると、実験の都度IPアドレスが変わるので固定IPアドレスを振りたいと思っていたが、静的IPアドレスを設定する方法が見当たらなかった。
Moddable-SDKはESP-IDF開発環境を利用しているのでESP-IDFで静的IPアドレスを設定する方法が無いか検索してみたが情報がヒットしなかった。そのかわりにmDSNというホスト名でIP接続できる方法が用意されているのがわかった。mDSNはApple機器が採用しているBonjourと同じ動作で、ホスト名(ホスト名.local) をUDPでローカルネット上に投げると、そのホスト名を持つネットワークデバイスが応答する仕組みである。 我が家のRaspberry Piもこの方式でアクセスできるようにして非常に便利に使っている。
このmDNSもModdable/ECMAScriptに実装されており非常に簡単に利用することができた。
利用例:ESP32でHTTPサーバを動かし測定した温度データ表示する。
main.js
// Import modules
import Timer from 'timer'
import WiFi from 'wifi'
import MDNS from 'mdns'
import { Server } from 'http'
import Net from 'net'
import Analog from 'pins/analog'
// Variables
let wifiAp = { ssid: 'Your SSID', password: 'Your password' }
let hostName = 'weather' // Host name
let counter = 0 // Access counter
let temperature = 0 // Temperature data (string)
// Connect to WiFi
new WiFi(wifiAp, function (msg) {
switch (msg) {
case 'connect':
trace('Connected wifi\n')
break // still waiting for IP address
case 'gotIP': // After get the IP address, start mDNS and bind the Host name and IP address.
new MDNS({hostName}, function (message, value) {
if (message === 1) hostName = value
})
trace(`Get IP address ${Net.get('IP')}\n`)
break // get IP
case 'disconnect':
Timer.set(id => {
WiFi.connect(wifiAp)
trace(`try reconnect WiFi\n`)
}, 5000)
trace('Disconnected\n')
break // detect connection lost, try reconnect WiFi
}
})
// HTTP server
let server = new Server({ port: 80 })
server.callback = function (message, value) {
if (message === 2) this.path = value
if (message === 8) {
let body = `Client requested path ${this.path}.\n` +
`Request #${++counter} to this server.\n` +
`Temperature: ${temperature} [C]\n` +
`Server host name '${hostName}.local' at address ${Net.get('IP')} on network '${Net.get('SSID')}'.\n`
return { headers: ['Content-Type', 'text/plain'], body }
}
}
// Temperature measuring loop
Timer.repeat(function () {
// Read the analog data from ADC
let adcRaw = Analog.read(0)
// Translate ADC-RAW data to Voltage
// Offset:-44, Max_voltage: 3.29[V] Max_adcRaw: 981
let voltage = (adcRaw - 44) * 3.29 / (981 - 44)
// TransLate Voltage to Temperature. Sensor: LM61BIZ
temperature = (100 * (voltage - 0.6) + '').slice(0, 4)
}, 1000)
manifest.json
{
"include": [
"$(MODDABLE)/examples/manifest_base.json",
"$(MODDABLE)/examples/manifest_net.json",
"$(MODDABLE)/modules/network/mdns/manifest.json",
"$(MODDABLE)/modules/pins/analog/manifest.json",
],
"modules": {
"*": [
"./main",
"$(MODULES)/network/http/*",
],
},
"preload": [
"http",
]
}