第二十章 无线网络-K230接入物联网的关键
🎯 本章目标:
掌握 K230 如何通过外接 ESP8266 WiFi 模块实现无线网络通信,学会使用 UART + AT 指令进行 WiFi 连接、TCP/UDP 通信、HTTP 请求、MQTT 上云,将 K230 从“单机视觉设备”升级为“物联网智能终端”。
1. K230 无线能力现状
1.1 内置无线?
- ❌ K230 芯片本身不集成 WiFi 或蓝牙
- ✅ 但可通过 UART、SPI、SDIO 外接无线模块
1.2 常用无线方案
| 方案 | 说明 | 推荐度 |
|---|---|---|
| ESP8266 WiFi 模块(如 ESP-01) | 通过 UART 使用 AT 指令 | ⭐⭐⭐⭐☆ |
| ESP32 模块 | 支持 WiFi + 蓝牙,AT 或自编程 | ⭐⭐⭐⭐⭐ |
| 4G 模块(如 EC20) | 远程通信,成本高 | ⭐⭐☆ |
| LoRa 模块 | 低功耗远距离,速率低 | ⭐⭐⭐ |
✅ 本章重点:ESP8266 + UART + AT 指令 实现 WiFi 接入
2. 硬件连接:K230 与 ESP8266
2.1 接线图
| ESP8266 引脚 | K230 引脚 | 说明 |
|---|---|---|
| VCC | 3.3V | 3.3V 供电 |
| GND | GND | 共地 |
| TX | RX(如 Pin10) | 发送 → 接收 |
| RX | TX(如 Pin11) | 接收 ← 发送 |
| CH_PD | 3.3V | 使能引脚(高电平有效) |
| RST | 可接 GPIO 控制 | 复位 |
⚠️ 注意:
- ESP8266 RX 引脚为3.3V 不耐压 5V!K230 为 3.3V 电平,可直接连接
- 建议加 1kΩ 电阻缓冲
3. FPIOA 映射与 UART 初始化
from fpioa_manager import fm
from machine import UART
# === 1. FPIOA 映射 ===
TX_PIN = 11 # K230 发送
RX_PIN = 10 # K230 接收
fm.register(TX_PIN, fm.fpioa.UART1_TX)
fm.register(RX_PIN, fm.fpioa.UART1_RX)
# === 2. 初始化 UART ===
uart = UART(UART.UART1, baudrate=115200, bits=8, parity=None, stop=1)
✅ 波特率:ESP8266 默认
115200
4. AT 指令基础
ESP8266 支持标准 AT 指令集:
| 指令 | 功能 |
|---|---|
AT | 测试通信 |
AT+RST | 重启模块 |
AT+CWMODE=1 | 设置为 Station 模式 |
AT+CWJAP="SSID","PASSWORD" | 连接 WiFi |
AT+CIFSR | 获取 IP 地址 |
AT+CIPSTART="TCP","192.168.1.100",8080 | 建立 TCP 连接 |
AT+CIPSEND=10 | 发送数据 |
AT+CIPCLOSE | 关闭连接 |
5. 实战项目一:WiFi 连接测试
import time
def send_at(cmd, timeout=2000):
uart.write(cmd + '\r\n')
time.sleep_ms(10)
start = time.ticks_ms()
response = ""
while time.ticks_diff(time.ticks_ms(), start) < timeout:
if uart.any():
ch = uart.read(1)
if ch:
response += ch.decode('utf-8', errors='ignore')
if "OK" in response or "ERROR" in response:
break
print(f"← {response}")
return response
# === 1. 测试通信 ===
print("测试 ESP8266...")
resp = send_at("AT")
if "OK" not in resp:
print("❌ ESP8266 未响应,请检查接线")
raise Exception("ESP8266 not ready")
# === 2. 重启模块 ===
send_at("AT+RST")
time.sleep(2)
# === 3. 设置为 Station 模式 ===
send_at("AT+CWMODE=1") # 1=Station, 2=AP, 3=Both
# === 4. 连接 WiFi ===
ssid = "YOUR_WIFI_SSID"
password = "YOUR_WIFI_PASSWORD"
resp = send_at(f'AT+CWJAP="{ssid}","{password}"')
if "WIFI GOT IP" in resp or "OK" in resp:
print("✅ WiFi 连接成功")
else:
print("❌ WiFi 连接失败")
print(resp)
raise Exception("WiFi connect failed")
# === 5. 获取 IP ===
resp = send_at("AT+CIFSR")
6. 实战项目二:TCP 客户端通信
# 假设服务器运行在 192.168.1.100:8080
server_ip = "192.168.1.100"
server_port = 8080
# 建立 TCP 连接
resp = send_at(f'AT+CIPSTART="TCP","{server_ip}",{server_port}')
if "OK" not in resp and "ALREADY CONNECTED" not in resp:
print("❌ TCP 连接失败")
raise Exception("TCP connect failed")
# 发送数据
data = "Hello from K230!\r\n"
send_at(f'AT+CIPSEND={len(data)}')
uart.write(data)
# 接收响应(简单轮询)
time.sleep_ms(500)
if uart.any():
rx_data = uart.read()
print("服务器响应:", rx_data)
✅ 用途:与 PC、树莓派、云服务器通信
7. 实战项目三:HTTP GET 请求(获取网页)
# 请求 http://httpbin.org/get
host = "httpbin.org"
port = 80
path = "/get"
# 建立连接
send_at(f'AT+CIPSTART="TCP","{host}",{port}')
# 构造 HTTP 请求
http_get = f"GET {path} HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n"
# 发送
send_at(f'AT+CIPSEND={len(http_get)}')
uart.write(http_get)
# 接收响应(流式)
print("开始接收 HTTP 响应...")
response = ""
start = time.ticks_ms()
while time.ticks_diff(time.ticks_ms(), start) < 5000:
if uart.any():
ch = uart.read(1)
if ch:
response += ch.decode('utf-8', errors='ignore')
if '\r\n\r\n' in response: # HTTP 头结束
break
print("HTTP 响应头:")
print('\n'.join(response.split('\r\n')[:10]))
# 继续接收 body
body = ""
while time.ticks_diff(time.ticks_ms(), start) < 10000:
if uart.any():
ch = uart.read(1)
if ch:
body += ch.decode('utf-8', errors='ignore')
if len(body) > 1000:
break
print("Body 摘要:", body[:500])
8. 实战项目四:MQTT 上云(接入 OneNet / EMQX)
8.1 使用 MQTT 固件(AT+MQTT)
# 连接 MQTT 服务器
mqtt_server = "183.230.40.39" # OneNet
mqtt_port = 1883
client_id = "k230_001"
username = "your_username"
password = "your_password"
send_at(f'AT+MQTTUSERCFG=0,1,"{client_id}","","","{username}","{password}"')
send_at(f'AT+MQTTCONN=0,"{mqtt_server}",{mqtt_port},0')
8.2 模拟 MQTT(TCP + 自组包)
若不支持 AT+MQTT,可用 TCP 手动实现:
# 连接到 MQTT 代理(如 EMQX)
send_at('AT+CIPSTART="TCP","broker.emqx.io",1883')
# 发送 MQTT CONNECT 包(简化)
connect_packet = bytes([
0x10, 0x1A, # 固定头
0x00, 0x04, 'M','Q','T','T', # 协议名
0x04, # 协议级别
0x02, # 连接标志
0x00, 0x3C, # 保持连接(60s)
0x00, 0x08, 'k','2','3','0','-','c','l','i','e','n','t' # Client ID
])
# 完整包需填充长度,此处仅为示意
✅ 建议:使用 OneNet HTTP API 更简单
9. 实战项目五:上传数据到 OneNet(HTTP 方式)
import time
import ujson
def upload_to_onet(device_id, api_key, data):
host = "api.heclouds.com"
url = f"/devices/{device_id}/datapoints"
# 构造 JSON 数据
payload = ujson.dumps({"datastreams": data})
# HTTP POST 请求
request = f"""POST {url} HTTP/1.1
Host: {host}
api-key: {api_key}
Content-Length: {len(payload)}
Content-Type: application/json
{payload}"""
# 发送
send_at(f'AT+CIPSTART="TCP","{host}",80')
send_at(f'AT+CIPSEND={len(request)}')
uart.write(request)
print("已发送数据到 OneNet")
# 示例调用
data = [
{"id": "temperature", "datapoints": [{"value": 25.6}]},
{"id": "humidity", "datapoints": [{"value": 60.3}]},
]
upload_to_onet("your_device_id", "your_api_key", data)
10. 常见问题与调试
❌ 问题1:ESP8266 无响应
排查:
- 供电是否稳定(ESP8266 峰值电流大)
- TX/RX 是否接反
- 波特率是否匹配
- CH_PD 是否接高电平
❌ 问题2:WiFi 连接失败
解决:
- 检查 SSID 和密码是否正确
- 确保路由器支持 2.4GHz
- 重启 ESP8266
❌ 问题3:TCP 连接超时
排查:
- 服务器是否开启
- 防火墙是否放行
- IP 和端口是否正确
11. 性能与优化
| 操作 | 耗时 |
|---|---|
| WiFi 连接 | 2~5s |
| TCP 连接 | 0.5~2s |
| HTTP 请求 | 1~3s |
| 数据上传 | 0.5~1s |
✅ 建议:
- 使用 心跳机制 保持连接
- 数据打包上传,减少连接次数
- 加入重连逻辑
✅ 本章你已掌握:
- K230 + ESP8266 硬件连接
- UART + AT 指令通信
- WiFi 连接、TCP、HTTP
- 数据上传到 OneNet/MQTT
- 常见问题排查

被折叠的 条评论
为什么被折叠?



