ESP32 使用MicroPython 控制Gopro Hero Black4

原创 云深之无迹 2021-07-11 13:03

这个实现的代码比较简单,我们先看看这个硬件,就是这个样子,很精美哦~因为不和国内市场强份额的话,就会做的很不错,算了。不说了

就是这个样子了,小屏幕很好嗷。

还是彩色的


https://docs.m5stack.com/en/quick_start/m5stickc/m5stickc_quick_start_with_uiflow

可以看看官网的图,好好看


一些设置的界面

这个是产品的一些的资料可以下载

下面的链接里面有arduino的开发API

以及mpy的API等

https://shop.m5stack.com/pages/download
https://docs.m5stack.com/en/mpy/advanced/wifi
https://docs.m5stack.com/en/arduino/arduino_development
https://console.cloud.tencent.com/iotexplorer

其实很过分,国产厂家非要搞个这emmmmm

https://github.com/meganetaaan/m5stack-avatar


https://github.com/botofancalin/M5Stack-ESP32-Oscilloscope


特别的,还可以使用云服务,腾讯云

创新的一点是可以用积木编程

然后是结构后的数据,其实是。只不过它没有格式化吧。。。

我看了看感觉的json,然后我写了个处理的脚本

然后就得到一些格式化的数据

你看这个就是可视化的推拽的生成代码

设计出来就是这样的


整体是这样的


大致就很是这样了,看实现吧。然后支持这个Gopro的HTTP协议,就是标准的mpy库是不可以的。因为不能正确的响应上下文,需要做更改:

import usocket

class Response:
def __init__(self, f): self.raw = f self.encoding = "utf-8" self._cached = None
def close(self): if self.raw: self.raw.close() self.raw = None self._cached = None
@property def content(self): if self._cached is None: try: self._cached = self.raw.read() finally: self.raw.close() self.raw = None return self._cached
@property def text(self): return str(self.content, self.encoding)
def json(self): import ujson return ujson.loads(self.content) # 解析 JSON str并返回一个对象

def request(method, url, data=None, json=None, headers={}, stream=None): try: proto, dummy, host, path = url.split("/", 3) except ValueError: proto, dummy, host = url.split("/", 2) path = "" if proto == "http:": port = 80 elif proto == "https:": import ussl port = 443 else: raise ValueError("Unsupported protocol: " + proto)
if ":" in host: host, port = host.split(":", 1) port = int(port)
ai = usocket.getaddrinfo(host, port, 0, usocket.SOCK_STREAM) ai = ai[0]
s = usocket.socket(ai[0], ai[1], ai[2]) try: s.connect(ai[-1]) if proto == "https:": s = ussl.wrap_socket(s, server_hostname=host) s.write(b"%s /%s HTTP/1.0\r\n" % (method, path)) if not "Host" in headers: s.write(b"Host: %s\r\n" % host) # Iterate over keys to avoid tuple alloc for k in headers: s.write(k) s.write(b": ") s.write(headers[k]) s.write(b"\r\n") if json is not None: assert data is None import ujson data = ujson.dumps(json) # 返回一个json对象 s.write(b"Content-Type: application/json\r\n") if data: s.write(b"Content-Length: %d\r\n" % len(data)) s.write(b"\r\n") if data: s.write(data)
l = s.readline() # print(l) l = l.split(None, 2) status = int(l[1]) reason = "" if len(l) > 2: reason = l[2].rstrip() while True: l = s.readline() if not l or l == b"\n" or l == b"\r\n": break # print(l) if l.startswith(b"Transfer-Encoding:"): if b"chunked" in l: raise ValueError("Unsupported " + l) elif l.startswith(b"Location:") and not 200 <= status <= 299: raise NotImplementedError("Redirects not yet supported") except OSError: s.close() raise
resp = Response(s) resp.status_code = status resp.reason = reason return resp

def head(url, **kw): return request("HEAD", url, **kw)

def get(url, **kw): return request("GET", url, **kw)

def post(url, **kw): return request("POST", url, **kw)

def put(url, **kw): return request("PUT", url, **kw)

def patch(url, **kw): return request("PATCH", url, **kw)

def delete(url, **kw): return request("DELETE", url, **kw)

看下结构

主要是更改这个响应部分的代码,我们做这个努力就好了。具体的实现的时候记得装饰器的使用。@property装饰器就是负责把一个方法变成属性调用。

def __init__(self, f):    self.raw = f    self.encoding = "utf-8"    self._cached = Nonedef close(self):    if self.raw:        self.raw.close()        self.raw = None    self._cached = None@propertydef content(self):    if self._cached is None:        try:            self._cached = self.raw.read()        finally:            self.raw.close()            self.raw = None    return self._cached@propertydef text(self):    return str(self.content, self.encoding)def json(self):    import ujson    return ujson.loads(self.content)

这个是类的初始化,完成了连接和关闭,以及获取回复信息

然后还是想解析json,所以写成这样

其实对于一个ujson来讲,实现的不多,刚好就够用而已

从源地址收到的信息是不透明的,需要自己构建的解析

使用这个函数来创建连接该服务的所有参数

后面是套接字类型

 ai = usocket.getaddrinfo(host, port, 0, usocket.SOCK_STREAM) ai = ai[0]

这段相当于的debug方便的处理代码

如果http,端口80

如果是https,就启动SSL

如果不是HTTP的连接协议的话,直接就raise走起。不支持这个协议了,后面把这个url的最前面的str打印一下

这个代码用来分离端口

然后

就是上面的get函数 得到一个连接源的所有必要信息

借助这些就建立和相机的连接

接着就是主要的逻辑了,但是你要注意,现在虽然是连接上了,但是读数据还是从getaddress来处理

 http://10.5.5.9/gp/gpControl/execute?p1=gpStream&a1=proto_v2&c1=restart

这里写个个URL给你开开眼

https://www.reddit.com/r/gopro/comments/2md8hm/how_to_livestream_from_a_gopro_hero4/cr1b193

连接好以后,就是https的连接了

https://docs.micropython.org/en/latest/reference/glossary.html#term-CPython

这里需要使用这个模块

就一个函数

接着就是读写了

其实读写的时候还有一个完全的发送函数

这个是逐个的发送头

先判断json是不是空

然后用一个assert继续判断

接着开始我们捕获这个json文件,import ujson

后面就是发送一个,看我的链接

https://www.cnblogs.com/zh718594493/p/12115579.html

要求发送json

发送数据,反正都是样板代码

Content-Length,在http的协议中Content-Length头部告诉浏览器报文中实体数据的大小。

先从port读data,然后下面去处理

直接分割两次

把空格处理一下

不说了,直接看代码,后面是一个内置的错误处理

这些函数很简单,直接封装了


下面的代码是可以直接写入到ESP32里面的,我就不放了,有需要的私聊我。


import usocket

class Response:
def __init__(self, f): self.raw = f self.encoding = "utf-8" self._cached = None
def close(self): if self.raw: self.raw.close() self.raw = None self._cached = None
@property def content(self): if self._cached is None: try: self._cached = self.raw.read() finally: self.raw.close() self.raw = None return self._cached
@property def text(self): return str(self.content, self.encoding)
def json(self): import ujson return ujson.loads(self.content) # 解析 JSON str并返回一个对象

def request(method, url, data=None, json=None, headers={}, stream=None): try: proto, dummy, host, path = url.split("/", 3) except ValueError: proto, dummy, host = url.split("/", 2) path = "" if proto == "http:": port = 80 elif proto == "https:": import ussl port = 443 else: raise ValueError("Unsupported protocol: " + proto)
if ":" in host: host, port = host.split(":", 1) port = int(port)
ai = usocket.getaddrinfo(host, port, 0, usocket.SOCK_STREAM) ai = ai[0]
s = usocket.socket(ai[0], ai[1], ai[2]) # try: s.connect(ai[-1]) if proto == "https:": s = ussl.wrap_socket(s, server_hostname=host) s.write(b"%s /%s HTTP/1.0\r\n" % (method, path)) if not "Host" in headers: s.write(b"Host: %s\r\n" % host) # 迭代键以避免元组分配 for k in headers: s.write(k) s.write(b": ") s.write(headers[k]) s.write(b"\r\n") if json is not None: assert data is None import ujson data = ujson.dumps(json) # 返回一个json对象 s.write(b"Content-Type: application/json\r\n") if data: s.write(b"Content-Length: %d\r\n" % len(data)) s.write(b"\r\n") if data: s.write(data)
l = s.readline() l = l.split(None, 2) status = int(l[1]) reason = "" if len(l) > 2: reason = l[2].rstrip() while True: l = s.readline() if not l or l == b"\n" or l == b"\r\n": break if l.startswith(b"Transfer-Encoding:"): if b"chunked" in l: raise ValueError("Unsupported " + l) elif l.startswith(b"Location:") and not 200 <= status <= 299: raise NotImplementedError("Redirects not yet supported") except OSError: s.close() raise
resp = Response(s) resp.status_code = status resp.reason = reason return resp

def head(url, **kw): return request("HEAD", url, **kw)

def get(url, **kw): return request("GET", url, **kw)

def post(url, **kw): return request("POST", url, **kw)

def put(url, **kw): return request("PUT", url, **kw)

def patch(url, **kw): return request("PATCH", url, **kw)

def delete(url, **kw): return request("DELETE", url, **kw)

改良过后的库完整的写到这里

评论
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 67浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 56浏览
  • 全球知名半导体制造商ROHM Co., Ltd.(以下简称“罗姆”)宣布与Taiwan Semiconductor Manufacturing Company Limited(以下简称“台积公司”)就车载氮化镓功率器件的开发和量产事宜建立战略合作伙伴关系。通过该合作关系,双方将致力于将罗姆的氮化镓器件开发技术与台积公司业界先进的GaN-on-Silicon工艺技术优势结合起来,满足市场对高耐压和高频特性优异的功率元器件日益增长的需求。氮化镓功率器件目前主要被用于AC适配器和服务器电源等消费电子和
    电子资讯报 2024-12-10 17:09 92浏览
  • 我的一台很多年前人家不要了的九十年代SONY台式组合音响,接手时只有CD功能不行了,因为不需要,也就没修,只使用收音机、磁带机和外接信号功能就够了。最近五年在外地,就断电闲置,没使用了。今年9月回到家里,就一个劲儿地忙着收拾家当,忙了一个多月,太多事啦!修了电气,清理了闲置不用了的电器和电子,就是一个劲儿地扔扔扔!几十年的“工匠式”收留收藏,只能断舍离,拆解不过来的了。一天,忽然感觉室内有股臭味,用鼻子的嗅觉功能朝着臭味重的方向寻找,觉得应该就是这台组合音响?怎么会呢?这无机物的东西不会腐臭吧?
    自做自受 2024-12-10 16:34 153浏览
  • 智能汽车可替换LED前照灯控制运行的原理涉及多个方面,包括自适应前照灯系统(AFS)的工作原理、传感器的应用、步进电机的控制以及模糊控制策略等。当下时代的智能汽车灯光控制系统通过车载网关控制单元集中控制,表现特殊点的有特斯拉,仅通过前车身控制器,整个系统就包括了灯光旋转开关、车灯变光开关、左LED前照灯总成、右LED前照灯总成、转向柱电子控制单元、CAN数据总线接口、组合仪表控制单元、车载网关控制单元等器件。变光开关、转向开关和辅助操作系统一般连为一体,开关之间通过内部线束和转向柱装置连接为多,
    lauguo2013 2024-12-10 15:53 93浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 57浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-10 16:13 113浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 80浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 69浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 99浏览
  • 近日,搭载紫光展锐W517芯片平台的INMO GO2由影目科技正式推出。作为全球首款专为商务场景设计的智能翻译眼镜,INMO GO2 以“快、准、稳”三大核心优势,突破传统翻译产品局限,为全球商务人士带来高效、自然、稳定的跨语言交流体验。 INMO GO2内置的W517芯片,是紫光展锐4G旗舰级智能穿戴平台,采用四核处理器,具有高性能、低功耗的优势,内置超微高集成技术,采用先进工艺,计算能力相比同档位竞品提升4倍,强大的性能提供更加多样化的应用场景。【视频见P盘链接】 依托“
    紫光展锐 2024-12-11 11:50 62浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 99浏览
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 57浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦