micropython中mqtt客户端的ssl/tls单向加密连接
- 概述
- 正文
-
- 一,刷micropython固件
- 二、配置网络
- 三、正片开始
-
- 1.安装依赖
- 2.上传boot.py到开发板,里面是开机要操作的程序
- 3.最后上电测试
概述
硬件基础: esp8266 编程语言:micropython 开发环境:thonny(这个东西总是错的,但是再打开也可以用),或者vscode (RT-Thread插件)(这个东西bug多的一p,错了就再也用不了了) 外部依赖:micropython-umqtt.simple (就是micropython中的mqtt库,好几年没更新了,有点落后,功能少) 服务端:emqx 自带签证,也就是说服务器端已经配置好了
正文
一,刷micropython固件
至于怎么刷micropython这里就不啰嗦了,自己去百度吧
二,配置网络
这里就不说怎么配置网络了,自己去百度吧 对了,可以配置一个webrepl
三、正片开始
下面的命令都在esp8266上的micropython命令敲门
1.安装依赖
这里使用upip import upip upip.install('micropython-umqtt.simple') #可能会安装失败,重新安装几次,或者直接下载包里有一个文件,发送到开发板上 这样,这个库就会被安装到/lib下面可以用os.listdir()查看,或者用开发环境检查 把下载的simple.py删除文件中第61行函数中的第二个参数(如下),否则总是报错 self.sock = ussl.wrap_socket(self.sock, **self.ssl_params) 改为 self.sock = ussl.wrap_socket(self.sock)
2.上传boot.py到开发板,里面是开机要操作的程序
以下是我的示例程序
#这里使用mqtt协议,用emqx平台用于远程
开关esp8266-01s relay模块 from simple import MQTTClient as mqttc #我直接把它放在这里simple文件放在根目录中,可以直接引入,没有移动位置没有移动位置 #from umqtt.simple import MQTTClient as mqttc from machine import Pin #用于控制继电器 import time import webrepl #配置文件为webrepl_cfg.py webrepl.start() import network #配置网络 #启动wifi客户端连接wifi def apc(): print('启动wifi客户端') sta_if = network.WLAN(network.STA_IF) if not sta_if.isconnected(): print('connecting to network...') sta_if.active(True) sta_if.connect('要连接的wifi的名称', 'wifi密码') while not sta_if.isconnected(): time.sleep(1) #检查连接状态,有ip地址才离开循环 while 1: if '0.0.0.0' == sta_if.ifconfig()[0]: time.sleep(2) else: break print("run end") print(sta_if.ifconfig()) #启动热点 def aps(): print('启动热点') ap_if = network.WLAN(network.AP_IF) if not ap_if.isconnected(): print('setting ap...') ap_if.active(True) ap_if.config(authmode=network.AUTH_WPA_WPA2_PSK,password="设置ap热点的密码") apc() aps() #初始化继电器,继电器的开闭由gpio 0 控制 pin=Pin(0,Pin.OUT) pin.on() #默认设为高电平,常关 #设置mqtt参数 #emqx这里我服务器开启了用户名密码认证,需要填写这两项,cid是clientid可以随便填 #这里的数据有些要转为二进制,不然报错 cid=b'relay-01s-2' #可自己设置 strcid='relay-01s-2' #和上面一样,格式不一样而已,用来发信息的 host='你的服务器地址或域名' port=8883 #emqx的8883有ssl加密的,默认18083没有加密 user=b'test' pwd=b'test' meettopic=b'relay_ctl' #订阅的topic,从这个topic中接受消息,可自己设置 pushtopic=b'relay_msg' #推送消息到这个topic,可以自己设置 #收到订阅topic中的消息时处理消息的回调函数 def dealMsg(topic,msg,server=None,port=None,ssl=None): global pin,cli print(msg) #收到0,输出高电平,切断被控设备电源,并发送消息 if msg==b'0': pin.on() cli.publish(pushtopic,strcid+': normal close!') #收到1,输出底电平,连接被控设备电源,并发送消息 if msg==b'1': pin.off() cli.publish(pushtopic,strcid+': normal open!') #初始化一个mqtt客户端,开启ssl cli=mqttc(cid,host,port,user,pwd,keepalive=0,ssl=True) #设置处理消息的回调函数 cli.set_callback(dealMsg) #连接 cli.connect() cli.subscribe(meettopic) cli.publish(pushtopic,strcid+' is online!') #阻塞在此等待消息,由于此库没有自动重连,这里只能自己写一个了 #由于esp8266不支持多线程,这里只能让进程阻塞在这里 #这导致终端和webrepl没法正常使用 #如果支持多线程可以另起一个线程,在后台运行 while 1: try: cli.wait_msg() except Exception as e: print(str(e)) time.sleep(2) print('reconnect!') cli.connect() #断线之后要重新订阅 cli.subscribe(meettopic)
3.最后上电进行测试
我测试了一次发现过了一个小时这个设备就收不到信息了,不知道啥问题