beshell-mg-app

Example of the component become-cool/beshell-mg v1.1.3
# BeShell-MG Example App

这是一个演示 BeShell-MG (Mongoose 网络库) 用法的示例工程。

## 功能特性

本示例工程演示了以下功能:

### 网络功能 (MG Module)

| 示例文件 | 说明 |
|---------|------|
| `http-server.js` | 创建 HTTP Web 服务器,支持路由处理 |
| `http-client.js` | 发送 HTTP GET/POST 请求 |
| `http-download.js` | 下载文件,支持进度显示 |
| `mqtt-client.js` | 连接 MQTT Broker,订阅和发布消息 |
| `websocket-server.js` | 创建 WebSocket 服务器,支持双向通信 |
| `tcp-client.js` | 原始 TCP 套接字通信 |
| `sntp-time.js` | 网络时间同步,DNS 缓存操作 |

### WiFi 功能

| 示例文件 | 说明 |
|---------|------|
| `wifi-sta.js` | 连接到 WiFi 热点 (Station 模式) |
| `wifi-ap.js` | 创建 WiFi 热点 (AP 模式) |
| `wifi-scan.js` | 扫描周围的 WiFi 网络 |

### 基础功能

| 示例文件 | 说明 |
|---------|------|
| `gpio-blink.js` | GPIO 控制,LED 闪烁 |

## 项目结构

```
beshell-mg-app/
├── CMakeLists.txt          # 项目 CMake 配置
├── sdkconfig.defaults      # 默认 SDK 配置
├── README.md               # 本文件
├── main/
│   ├── main.cpp            # C++ 入口文件
│   ├── CMakeLists.txt      # main 组件 CMake 配置
│   └── idf_component.yml   # 组件依赖配置
├── img/
│   ├── partitions-4MB.csv  # 4MB Flash 分区表
│   ├── partitions-8MB.csv  # 8MB Flash 分区表
│   └── partitions-16MB.csv # 16MB Flash 分区表
└── js/
    ├── main.js             # JS 入口文件
    └── example/            # 示例脚本目录
        ├── http-server.js
        ├── http-client.js
        ├── http-download.js
        ├── mqtt-client.js
        ├── websocket-server.js
        ├── tcp-client.js
        ├── sntp-time.js
        ├── wifi-sta.js
        ├── wifi-ap.js
        ├── wifi-scan.js
        └── gpio-blink.js
```

## 硬件要求

- ESP32 / ESP32-S3 / ESP32-C3 等支持 WiFi 的芯片
- 至少 4MB Flash
- USB 转串口用于烧录和调试

## 快速开始

### 1. 配置 WiFi 凭证

编辑 `js/example/wifi-sta.js`、`js/example/http-server.js` 等文件,修改 WiFi SSID 和密码:

```javascript
const ssid = "your SSID"
const pwd = "your PASSWORD"
```

### 2. 构建项目

```bash
idf.py build
```

### 3. 烧录固件

```bash
idf.py flash
```

### 4. 查看串口输出

```bash
idf.py monitor
```

### 5. 运行示例

在串口终端中,输入以下命令运行示例:

```
run /example/http-server.js
```

## 示例详解

### HTTP Server

创建一个简单的 HTTP Web 服务器:

```javascript
import * as mg from "mg"

mg.listenHttp("0.0.0.0:8080", (event, req, rspn) => {
    if (event === "http.msg") {
        rspn.setStatus(200)
        rspn.setHeader("Content-Type", "text/html")
        rspn.send("<h1>Hello World</h1>")
    }
})
```

### HTTP Client

发送 HTTP GET 请求:

```javascript
import * as mg from "mg"

let body = await mg.get("http://api.example.com/data")
console.log(body.toString())
```

### HTTP Download

下载文件并显示进度:

```javascript
import * as mg from "mg"

// Download to memory
await mg.download("http://example.com/file.bin", null, (total, current, chunk) => {
    console.log(`Progress: ${(current/total*100).toFixed(1)}%`)
})

// Download to file
await mg.download("http://example.com/file.bin", "/data/file.bin", (total, current) => {
    console.log(`Downloaded: ${current}/${total} bytes`)
})
```

### MQTT Client

连接 MQTT Broker:

```javascript
import * as mg from "mg"

let client = mg.connect("mqtt://broker.emqx.io:1883", (event, data) => {
    if (event === "mqtt.open") {
        client.sub("test/topic")
        client.push("test/topic", "Hello MQTT")
    }
    else if (event === "mqtt.msg") {
        console.log("Received:", data.body().toString())
    }
})
```

### WebSocket Server

创建 WebSocket 服务器:

```javascript
import * as mg from "mg"

mg.listenHttp("0.0.0.0:8080", (event, req, rspn) => {
    if (event === "ws.open") {
        console.log("Client connected")
    }
    else if (event === "ws.msg") {
        let msg = req.body().toString()
        req.send("Echo: " + msg)
    }
})
```

### TCP Client

原始 TCP 套接字通信:

```javascript
import * as mg from "mg"

let conn = mg.connect("tcp://example.com:1234", (event, data) => {
    if (event === "connect") {
        conn.send("Hello TCP Server")
    }
    else if (event === "read") {
        console.log("Received:", data.body().toString())
    }
})
```

### SNTP Time

同步网络时间:

```javascript
import * as mg from "mg"

mg.sntpRequest("udp://pool.ntp.org:123", (err, timestamp) => {
    if (!err) {
        let date = new Date(timestamp)
        console.log("Current time:", date.toISOString())
    }
})
```

## 依赖组件

- [beshell](https://github.com/become-cool/beshell) - BeShell 核心框架
- [beshell-mg](https://github.com/become-cool/beshell) - Mongoose 网络库封装

## 许可证

LGPL

## 相关链接

- [BeShell 文档](https://beshell.become.cool)
- [Mongoose 文档](https://mongoose.ws/documentation/)
- [ESP-IDF 文档](https://docs.espressif.com/projects/esp-idf/)

To create a project from this example, run:

idf.py create-project-from-example "become-cool/beshell-mg=1.1.3:beshell-mg-app"

or download archive (~18.75 KB)