立即注册

micropython-microbit 中文社区

查看: 343|回复: 6

求助 ESP8266 OSError: [Errno 103] ECONNABORTED

[复制链接]

该用户从未签到

发表于 2019-3-27 11:46:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 Linlin 于 2019-3-27 11:50 编辑

大佬们求助啊,我的esp8266上电后运行就出现图1中错误,但是在图二中直接点击Execute就正常运行
  1. # simple.py
复制代码
  1. # main.py
复制代码



批注 2019-03-27 113925.jpg
批注 2019-03-27 113221.jpg
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2019-3-27 11:51:29 | 显示全部楼层
怎么代码总是贴不出来,图1图2也是反的
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2019-3-27 11:52:12 | 显示全部楼层
  1. # simple.py

  2. import usocket as socket


  3. import ustruct as struct

  4. from ubinascii import hexlify



  5. class MQTTException(Exception):

  6.     pass



  7. class MQTTClient:



  8.     def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=0,

  9.                  ssl=False, ssl_params={}):

  10.         if port == 0:

  11.             port = 8883 if ssl else 1883

  12.         self.client_id = client_id

  13.         self.sock = None

  14.         self.server = server

  15.         self.port = port

  16.         self.ssl = ssl

  17.         self.ssl_params = ssl_params

  18.         self.pid = 0

  19.         self.cb = None

  20.         self.user = user

  21.         self.pswd = password

  22.         self.keepalive = keepalive

  23.         self.lw_topic = None

  24.         self.lw_msg = None

  25.         self.lw_qos = 0

  26.         self.lw_retain = False



  27.     def _send_str(self, s):

  28.         self.sock.write(struct.pack("!H", len(s)))

  29.         self.sock.write(s)



  30.     def _recv_len(self):

  31.         n = 0

  32.         sh = 0

  33.         while 1:

  34.             b = self.sock.read(1)[0]

  35.             n |= (b & 0x7f) << sh

  36.             if not b & 0x80:

  37.                 return n

  38.             sh += 7



  39.     def set_callback(self, f):

  40.         self.cb = f



  41.     def set_last_will(self, topic, msg, retain=False, qos=0):

  42.         assert 0 <= qos <= 2

  43.         assert topic

  44.         self.lw_topic = topic

  45.         self.lw_msg = msg

  46.         self.lw_qos = qos

  47.         self.lw_retain = retain



  48.     def connect(self, clean_session=True):

  49.         self.sock = socket.socket()

  50.         addr = socket.getaddrinfo(self.server, self.port)[0][-1]

  51.         self.sock.connect(addr)

  52.         if self.ssl:

  53.             import ussl

  54.             self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)

  55.         premsg = bytearray(b"\x10\0\0\0\0\0")

  56.         msg = bytearray(b"\x04MQTT\x04\x02\0\0")



  57.         sz = 10 + 2 + len(self.client_id)

  58.         msg[6] = clean_session << 1

  59.         if self.user is not None:

  60.             sz += 2 + len(self.user) + 2 + len(self.pswd)

  61.             msg[6] |= 0xC0

  62.         if self.keepalive:

  63.             assert self.keepalive < 65536

  64.             msg[7] |= self.keepalive >> 8

  65.             msg[8] |= self.keepalive & 0x00FF

  66.         if self.lw_topic:

  67.             sz += 2 + len(self.lw_topic) + 2 + len(self.lw_msg)

  68.             msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3

  69.             msg[6] |= self.lw_retain << 5



  70.         i = 1

  71.         while sz > 0x7f:

  72.             premsg[i] = (sz & 0x7f) | 0x80

  73.             sz >>= 7

  74.             i += 1

  75.         premsg[i] = sz



  76.         self.sock.write(premsg, i + 2)

  77.         self.sock.write(msg)

  78.         #print(hex(len(msg)), hexlify(msg, ":"))

  79.         self._send_str(self.client_id)

  80.         if self.lw_topic:

  81.             self._send_str(self.lw_topic)

  82.             self._send_str(self.lw_msg)

  83.         if self.user is not None:

  84.             self._send_str(self.user)

  85.             self._send_str(self.pswd)

  86.         resp = self.sock.read(4)

  87.         assert resp[0] == 0x20 and resp[1] == 0x02

  88.         if resp[3] != 0:

  89.             raise MQTTException(resp[3])

  90.         return resp[2] & 1



  91.     def disconnect(self):

  92.         self.sock.write(b"\xe0\0")

  93.         self.sock.close()



  94.     def ping(self):

  95.         self.sock.write(b"\xc0\0")



  96.     def publish(self, topic, msg, retain=False, qos=0):

  97.         pkt = bytearray(b"\x30\0\0\0")

  98.         pkt[0] |= qos << 1 | retain

  99.         sz = 2 + len(topic) + len(msg)

  100.         if qos > 0:

  101.             sz += 2

  102.         assert sz < 2097152

  103.         i = 1

  104.         while sz > 0x7f:

  105.             pkt[i] = (sz & 0x7f) | 0x80

  106.             sz >>= 7

  107.             i += 1

  108.         pkt[i] = sz

  109.         #print(hex(len(pkt)), hexlify(pkt, ":"))

  110.         self.sock.write(pkt, i + 1)

  111.         self._send_str(topic)

  112.         if qos > 0:

  113.             self.pid += 1

  114.             pid = self.pid

  115.             struct.pack_into("!H", pkt, 0, pid)

  116.             self.sock.write(pkt, 2)

  117.         self.sock.write(msg)

  118.         if qos == 1:

  119.             while 1:

  120.                 op = self.wait_msg()

  121.                 if op == 0x40:

  122.                     sz = self.sock.read(1)

  123.                     assert sz == b"\x02"

  124.                     rcv_pid = self.sock.read(2)

  125.                     rcv_pid = rcv_pid[0] << 8 | rcv_pid[1]

  126.                     if pid == rcv_pid:

  127.                         return

  128.         elif qos == 2:

  129.             assert 0



  130.     def subscribe(self, topic, qos=0):

  131.         assert self.cb is not None, "Subscribe callback is not set"

  132.         pkt = bytearray(b"\x82\0\0\0")

  133.         self.pid += 1

  134.         struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)

  135.         #print(hex(len(pkt)), hexlify(pkt, ":"))

  136.         self.sock.write(pkt)

  137.         self._send_str(topic)

  138.         self.sock.write(qos.to_bytes(1, "little"))

  139.         while 1:

  140.             op = self.wait_msg()

  141.             if op == 0x90:

  142.                 resp = self.sock.read(4)

  143.                 #print(resp)

  144.                 assert resp[1] == pkt[2] and resp[2] == pkt[3]

  145.                 if resp[3] == 0x80:

  146.                     raise MQTTException(resp[3])

  147.                 return



  148.     # Wait for a single incoming MQTT message and process it.

  149.     # Subscribed messages are delivered to a callback previously

  150.     # set by .set_callback() method. Other (internal) MQTT

  151.     # messages processed internally.

  152.     def wait_msg(self):

  153.         res = self.sock.read(1)

  154.         self.sock.setblocking(True)

  155.         if res is None:

  156.             return None

  157.         if res == b"":

  158.             raise OSError(-1)

  159.         if res == b"\xd0":  # PINGRESP

  160.             sz = self.sock.read(1)[0]

  161.             assert sz == 0

  162.             return None

  163.         op = res[0]

  164.         if op & 0xf0 != 0x30:

  165.             return op

  166.         sz = self._recv_len()

  167.         topic_len = self.sock.read(2)

  168.         topic_len = (topic_len[0] << 8) | topic_len[1]

  169.         topic = self.sock.read(topic_len)

  170.         sz -= topic_len + 2

  171.         if op & 6:

  172.             pid = self.sock.read(2)

  173.             pid = pid[0] << 8 | pid[1]

  174.             sz -= 2

  175.         msg = self.sock.read(sz)

  176.         self.cb(topic, msg)

  177.         if op & 6 == 2:

  178.             pkt = bytearray(b"\x40\x02\0\0")

  179.             struct.pack_into("!H", pkt, 2, pid)

  180.             self.sock.write(pkt)

  181.         elif op & 6 == 4:

  182.             assert 0



  183.     # Checks whether a pending message from server is available.

  184.     # If not, returns immediately with None. Otherwise, does

  185.     # the same processing as wait_msg.

  186.     def check_msg(self):

  187.         self.sock.setblocking(False)

  188.         return self.wait_msg()
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2019-3-27 11:52:53 | 显示全部楼层
  1. # main.py

  2. import time
  3. from simple import MQTTClient
  4. from machine import Pin

  5. led=Pin(2,Pin.OUT)

  6. def sub_cb(topic, msg):
  7.     print(topic, msg)
  8.     if topic==b'ledctl':
  9.         if msg==b'ledon':
  10.             led.off()
  11.         if msg==b'ledoff':
  12.             led.on()

  13. c = MQTTClient("umqtt_client", "111.67.206.175")
  14. c.set_callback(sub_cb)
  15. c.connect()
  16. c.subscribe(b"ledctl")
  17. while True:
  18.     c.check_msg()
  19.     if led.value()==1:
  20.         c.publish('ledstatus','ledoff')
  21.     if led.value()==0:
  22.         c.publish('ledstatus','ledon')
  23.     time.sleep(1)
复制代码
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2019-5-12 11:06
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2019-3-27 21:25:58 | 显示全部楼层
    加个延时试试
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2019-3-28 09:58:42 | 显示全部楼层

    应该加在哪里,我在程序开始和c.connect()前加了都不行
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2019-3-28 10:05:07 | 显示全部楼层

    我在simple.py报错的地方前面加了延时就OK了,谢谢大佬
    回复 支持 反对

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 立即注册

    Archiver|手机版|小黑屋|micropython-microbit 中文社区

    GMT+8, 2019-9-18 15:56 , Processed in 0.095864 second(s), 23 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表