K230基础-无线网络

第二十章 无线网络-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 引脚说明
VCC3.3V3.3V 供电
GNDGND共地
TXRX(如 Pin10)发送 → 接收
RXTX(如 Pin11)接收 ← 发送
CH_PD3.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
  • 常见问题排查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hazy1k

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值