资讯详情

micropython中mqtt客户端的ssl/tls单向加密连接

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.最后上电进行测试

我测试了一次发现过了一个小时这个设备就收不到信息了,不知道啥问题

标签: 8pin电子终端连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台