MicroPython动手做(23)——掌控板之WiFi与蓝牙

eagler8, eagler8
帖子创建于2020年05月04日 基础使用 2584 次浏览 2 人关注


1、Wi-Fi (无线上网)

Wi-Fi(发音: /ˈwaɪfaɪ/,法语发音:/wifi/),在中文里又称作“行动热点”,是Wi-Fi联盟制造商的商标做为产品的品牌认证,是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关,也常有人把Wi-Fi当做IEEE 802.11标准的同义术语。“Wi-Fi”常被写成“WiFi”或“Wifi”,但是它们并没有被Wi-Fi联盟认可。并不是每样匹配IEEE 802.11的产品都申请Wi-Fi联盟的认证,相对地缺少Wi-Fi认证的产品并不一定意味着不兼容Wi-Fi设备。IEEE 802.11的设备已安装在市面上的许多产品,如:个人计算机、游戏机、MP3播放器、智能手机、平板电脑、打印机、笔记本电脑以及其他可以无线上网的周边设备。Wi-Fi联盟成立于1999年,当时的名称叫做Wireless Ethernet Compatibility Alliance(WECA)。在2002年10月,正式改名为Wi-Fi Alliance。

WiFi 主要功能

无线网络上网可以简单的理解为无线上网,几乎所有智能手机、平板电脑和笔记本电脑都支持Wi-Fi上网,是当今使用最广的一种无线网络传输技术。实际上就是把有线网络信号转换成无线信号,就如在开头为大家介绍的一样,使用无线路由器供支持其技术的相关电脑,手机,平板等接收。手机如果有Wi-Fi功能的话,在有Wi-Fi无线信号的时候就可以不通过移动联通的网络上网,省掉了流量费。无线网络无线上网在大城市比较常用,虽然由Wi-Fi技术传输的无线通信质量不是很好,数据安全性能比蓝牙差一些,传输质量也有待改进,但传输速度非常快,可以达到54Mbps,符合个人和社会信息化的需求。Wi-Fi最主要的优势在于不需要布线,可以不受布线条件的限制,因此非常适合移动办公用户的需要,并且由于发射信号功率低于100mw,低于手机发射功率,所以Wi-Fi上网相对也是最安全健康的。但是Wi-Fi信号也是由有线网提供的,比如家里的ADSL,小区宽带等,只要接一个无线路由器,就可以把有线信号转换成Wi-Fi信号。国外很多发达国家城市里到处覆盖着由政府或大公司提供的Wi-Fi信号供居民使用,我国也有许多地方实施”无线城市“工程使这项技术得到推广。在4G牌照没有发放的试点城市,许多地方使用4G转Wi-Fi让市民试用。

37 条评论

eagler8

2020年05月05日


2、网络基础

MicroPython network 模块用于配置WiFi连接。有两个WiFi接口,STA模式即工作站模式(ESP32连接到路由器), AP模式提供接入服务(其他设备连接到ESP32)。

STA模式

掌控板以基于network模块封装 mpython.wifi() 类简化wifi连接设置:

from mpython import * #导入mpython模块

mywifi=wifi() #实例化wifi类

mywifi.connectWiFi("ssid","password") # WiFi连接,设置ssid 和password

注解

实例化wifi()后,会构建 sta 和 ap 两个对象。 sta 对象为工作站模式,通过路由器连接至网络。ap 为AP模式,提供wifi接入。

连接成功后Repl串口如下打印:

Connecting to network...

Connecting to network...

WiFi Connection Successful,Network Config:('192.168.0.2', '255.255.255.0', '192.168.0.1', '192.168.0.1')

断开WiFi连接:

mywifi.disconnectWiFi()

查询wifi连接是否已建立:

mywifi.sta.isconnected()

注解

如已建立连接,返回 True ,否则 False 。

您可以通过以下方式查看网络设置:

mywifi.sta.ifconfig()

注解

返回值4元组: (IP address, netmask, gateway, DNS)

ifconfig() 带参数时,配置静态IP。例如:

mywifi.sta.ifconfig(('192.168.0.4', '255.255.255.0', '192.168.0.1', '192.168.0.1'))

AP模式

除STA模式连接路由器wifi,掌控板还可以使用AP模式,提供wifi接入服务。

from mpython import wifi # 导入mpython模块的wifi类

mywifi=wifi() # 实例wifi

mywifi.enable_APWiFi(essid = "mpython-wifi", password = "mpython123456") # 配置并打开AP模式

wifi.enable_APWiFi(essid,password) 用于配置并开启AP模式函数, essid 参数为wifi名称, password 参数为wifi密码设置。AP模式开启后,其他掌控板或网络设备就能连接该网络,进行网络通信。

注意

AP模式并不是类似手机的热点功能,设备可以通过热点连接至互联网。这点需要注意。

一旦设置了WiFi,访问网络的方式就是使用套接字。 套接字表示网络设备上的端点,当两个套接字连接在一起时,可以继续进行通信。 Internet协议构建在套接字之上,例如电子邮件(SMTP),Web(HTTP),telnet,ssh等等。 为这些协议中的每一个分配一个特定的端口,它只是一个整数。给定IP地址和端口号,您可以连接到远程设备并开始与之通信。

eagler8

2020年05月05日

3、掌控板的wifi 函数

提供便捷的 wifi 连接网络方式或热点 wifi 功能

wifi.connectWiFi()

描述: 连接 wifi 网络,连接掌控板开启的热点则无需密码

参数:

ssid - WiFi网络名称

password - WiFi密码

wifi.sta.ifconfig()[n]

描述: wifi 连接成功后,获取wifi配置信息,含 IP、netmask、getway、DNS,n为0、1、2、3

wifi.disconnectWiFi()

描述: 断开wifi网络连接

wifi.enable_APWiFi(essid,channel)

描述: 开启无线AP功能,用于掌控板之间的相互通信

参数:

essid - 创建WiFi网络名称

channel -设置wifi使用信道,channel 1~13

wifi.disable_APWiFi()

描述: 关闭无线AP

ntptime.settime(timezone, server)

描述: 将掌控板的时间与网络时间同步

参数:

timezone - 时区时间差,默认为东八区,补偿8小时

server - 可自行指定授时服务器,server为字符串类型,默认授时服务器为”ntp.ntsc.ac.cn”

appserver.start()

描述: TinyWebIO服务后台运行,该服务为App Inventor应用提供远程控制接口的掌控板工具包

appserver.start_foreground()

描述: TinyWebIO服务前台运行

eagler8

2020年05月05日


4、掌控板的ubluetooth --- 低功耗蓝牙

该模块提供低功耗蓝牙控制接口。当前,它在中央,外围设备,广播和观察者角色中支持蓝牙低功耗(BLE),并且设备可以同时在多个角色中运行。

此API旨在与低功耗蓝牙协议相匹配,并为更高级的抽象(如特定的设备类型)提供构建模块。

注解

该模块仍在开发中,其类,功能,方法和常量可能会发生变化。

BLE 类

构建

class ubluetooth.BLE

返回 BLE 对象

配置

BLE.active([active])

(可选)更改BLE无线电的活动状态,并返回当前状态。

在使用此类的任何其他方法之前,必须使无线电处于活动状态。

BLE.config('param')

BLE.config(param=value, ...)

获取或设置BLE接口的配置值。为了获得一个值,参数名称应该用字符串引号,并且一次只查询一个参数。要设置值,请使用关键字语法,一次可以设置一个或多个参数。

当前支持的值为:

'mac': 返回设备的MAC地址。如果设备具有固定地址(例如PYBD),则将其返回。否则(例如ESP32),当BLE接口处于活动状态时,将生成一个随机地址。

'rxbuf': 设置用于存储传入事件的内部缓冲区的大小(以字节为单位)。该缓冲区是整个BLE驱动程序的全局缓冲区,因此可以处理所有事件(包括所有特征)的传入数据。增加此值可以更好地处理突发的传入数据(例如,扫描结果),并可以使中央设备接收较大的特征值。

事件处理

BLE.irq(handler, trigger=0xffff)

为BLE堆栈中的事件注册回调。handler接收两个参数,event (看下文的事件代码)和 data (其是值的特定事件元组)。

可选的 trigger 参数允许您设置程序感兴趣的事件的掩码。默认值为所有事件。

注: addr, adv_data 和 uuid 元组中的项是引用的数据管理 ubluetooth 模块(即相同的实例将被重新使用多次调用到事件处理程序)。 如果您的程序想在处理程序之外使用此数据,则它必须首先复制它们,例如使用 bytes(addr) or bluetooth.UUID(uuid) 。

广播者(Advertiser)

BLE.gap_advertise(interval_us, adv_data=None, resp_data=None, connectable=True)

以指定的时间间隔(以微秒为单位)开始广播。该间隔将四舍五入到最接近的625微妙。要停止广播,请将 interval_us 设置 为None。

adv_data 和 resp_data 可以是任何 buffer 类型 (例如 bytes, bytearray, str)。 adv_data 包含在所有广播中,并发送 resp_data 以应答有效的扫描。

注意:如果 adv_data (或 resp_data )为None,则将重用传递到上一个调用的数据 gap_advertise 。 这样一来,广播者就可以使用来恢复广播 gap_advertise(interval_us) 。为了清除广播负载,传递一个空的bytes,即b''。

eagler8

2020年05月05日

观察者 (Scanner)

BLE.gap_scan(duration_ms[, interval_us][, window_us])

运行持续指定时间(以毫秒为单位)的扫描操作。

要无限期扫描,请将 duration_ms 设置为 0 。要停止扫描,请将 duration_ms 设置为 None 。

使用 interval_us 和 window_us 可以选择配置占空比。 扫描器将每间隔一微秒运行一次 window_us 微秒,总计持续时间为毫秒。默认间隔和窗口分别为1.28秒和11.25毫秒。

对于每个扫描结果,_IRQ_SCAN_RESULT 将引发该事件。

停止扫描(由于持续时间结束或明确停止)时,_IRQ_SCAN_COMPLETE 将引发该事件。

外围设备 (GATT Server)

BLE外围设备具有一组注册服务。每个服务可能包含特性,每个特性都有一个值。特征也可以包含描述符,描述符本身具有值。

这些值存储在本地,并通过在服务注册过程中生成的“值柄”进行访问。它们也可以被远程的中央设备读取或写入。 此外,外围设备可以通过连接句柄将特征“通知”到已连接的中央设备。

特征和描述符的默认最大为20个字节。任何由中央设备写给它们的都会被截短到这个长度。但是,任何本地写操作都会增加最大大小, 所以,如果你写想更长的数据,请注册后使用 gatts_write 。例如, gatts_write(char_handle, bytes(100))

BLE.gatts_register_services(services_definition)

使用指定的服务配置外围设备,替换所有现有服务。

services_definition 是一个服务的列表,其中每个服务都是一个包含UUID和特征列表的二元元组。

每个特征都是一个包含 UUID,flags 值以及一个可选的描述符列表的2或3元素元组。

每个描述符是一个包含UUID和一个flags值的二元元组。

flags是一个按位或组合的 ubluetooth.FLAG_READ,ubluetooth.FLAG_WRITE 和 ubluetooth.FLAG_NOTIFY 。如下文所定义的值:

返回值是元组的列表(每个服务一个元素)(每个元素是一个值句柄)。特征和描述符句柄按照定义的顺序被展平到相同的元组中。

以下示例注册了两个服务 (Heart Rate, and Nordic UART):

HR_UUID = bluetooth.UUID(0x180D)

HR_CHAR = (bluetooth.UUID(0x2A37), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY,)

HR_SERVICE = (HR_UUID, (HR_CHAR,),)

UART_UUID = bluetooth.UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E')

UART_TX = (bluetooth.UUID('6E400003-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY,)

UART_RX = (bluetooth.UUID('6E400002-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_WRITE,)

UART_SERVICE = (UART_UUID, (UART_TX, UART_RX,),)

SERVICES = (HR_SERVICE, UART_SERVICE,)

( (hr,), (tx, rx,), ) = bt.gatts_register_services(SERVICES)

这三个值柄(hr, tx, rx)可与使用 gatts_read, gatts_write, 和 gatts_notify 。

注意:注册服务之前,必须停止广告。

BLE.gatts_read(value_handle)

读取本地的值柄 (该值由 gatts_write 或远程的中央设备写入)。

BLE.gatts_write(value_handle, data)

写入本地的值柄,该值可由中央设备读取。

BLE.gatts_notify(conn_handle, value_handle[, data])

通知连接的中央设备此值已更改,并且应发出此外围设备的当前值的读取值。

如果指定了数据,则将该值作为通知的一部分发送到中央设备,从而避免了需要单独的读取请求的情况。请注意,这不会更新存储的本地值。

BLE.gatts_set_buffer(value_handle, len, append=False)

设置内部缓冲区大小(以字节为单位)。这将限制可以接收的最大值。默认值为20。 将 append 设置为 True 会将所有远程写入追加到当前值,而不是替换当前值。这样最多可以缓冲len个字节。 使用时 gatts_read ,将在读取后清除该值。这个功能在实现某些东西时很有用,比如Nordic UART服务。

中央设备 (GATT Client)

BLE.gap_connect(addr_type, addr, scan_duration_ms=2000)

连接到外围设备。成功,将触发 _IRQ_PERIPHERAL_CONNECT 事件。

BLE.gap_disconnect(conn_handle)

断开指定的连接句柄。成功,将触发 _IRQ_PERIPHERAL_DISCONNECT 事件。 如果未连接连接句柄,返回 False ,否则返回 True 。

BLE.gattc_discover_services(conn_handle)

查询已连接的外围设备的服务。

对于发现的每个服务, 会触发 _IRQ_GATTC_SERVICE_RESULT 事件。

BLE.gattc_discover_characteristics(conn_handle, start_handle, end_handle)

在已连接的外围设备上查询指定范围内的特征。 每次特征发现,会触发 _IRQ_GATTC_CHARACTERISTIC_RESULT 事件。

BLE.gattc_discover_descriptors(conn_handle, start_handle, end_handle)

在连接的外围设备中查询指定范围内的描述符。

每次特征发现,会触发 _IRQ_GATTC_DESCRIPTOR_RESULT 事件。

BLE.gattc_read(conn_handle, value_handle)

向连接的外围设备发出远程读取,以获取指定的特性或描述符句柄。

如果成功,会触发 _IRQ_GATTC_READ_RESULT 事件

BLE.gattc_write(conn_handle, value_handle, data, mode=0)

针对指定的特征或描述符句柄向连接的外围设备发出远程写操作。

mode

mode=0 (默认)是无响应写操作:写操作将发送到远程外围设备,但不会返回确认信息,也不会引发任何事件。

mode=1 i是响应写入:请求远程外围设备发送其已接收到数据的响应/确认。

如果从远程外围设备收到响应,_IRQ_GATTC_WRITE_STATUS 事件将触发。

UUID 类

构建

class ubluetooth.UUID(value)

用指定的值创建一个UUID实例。

该值可以是:

一个16位整数。例如 0x2908.

128位UUID字符串。例如 '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'.

常量

ubluetooth.FLAG_READ

ubluetooth.FLAG_WRITE

ubluetooth.FLAG_NOTIFY

eagler8

2020年05月05日

5、连接WiFi 显示配置信息

#MicroPython动手做(23)——掌控板之WiFi与蓝牙

#连接WiFi 显示配置信息

#MicroPython动手做(23)——掌控板之WiFi与蓝牙
#连接WiFi 显示配置信息

from mpython import *

import network

my_wifi = wifi()

my_wifi.connectWiFi('zh', 'zy1567')

import time
while True:
oled.fill(0)
oled.DispChar(my_wifi.sta.ifconfig()[0], 0, 11, 1)
oled.DispChar(my_wifi.sta.ifconfig()[1], 0, 24, 1)
oled.DispChar(my_wifi.sta.ifconfig()[2], 0, 37, 1)
oled.DispChar(my_wifi.sta.ifconfig()[3], 0, 50, 1)
oled.show()
time.sleep_ms(1000)

eagler8

2020年05月05日

mPython 图形编程


eagler8

2020年05月05日

连接WiFi 显示配置信息


eagler8

2020年05月06日

6、连接WiFi 点亮三颗绿色RGB

#MicroPython动手做(23)——掌控板之WiFi与蓝牙
#连接WiFi 点亮三颗绿色RGB

from mpython import *

import time

import network

my_wifi = wifi()

my_wifi.connectWiFi('zh', 'zy1567')
rgb.fill( (0, 0, 0) )
rgb.write()
time.sleep_ms(1)
while True:
if my_wifi.sta.isconnected():
oled.fill(0)
oled.DispChar('已连接WiFi', 33, 22, 1)
oled.show()
rgb.fill((int(0), int(51), int(0)))
rgb.write()
time.sleep_ms(1)

eagler8

2020年05月06日

mPython 图形编程


eagler8

2020年05月06日

连接WiFi 点亮三颗绿色RGB


eagler8

2020年05月06日

7、开启AP模式设置热点mPython

#MicroPython动手做(23)——掌控板之WiFi与蓝牙
#开启AP模式设置热点mPython(热点端)

from mpython import *
import network
import time

my_wifi = wifi()


my_wifi.enable_APWiFi("mPython", "", channel=11)
rgb.fill( (0, 0, 0) )
rgb.write()
time.sleep_ms(1)
while True:
oled.fill(0)
oled.DispChar("热点mPython打开", 15, 22, 1)
oled.show()
rgb[1] = (int(0), int(102), int(0))
rgb.write()
time.sleep_ms(1)

eagler8

2020年05月06日

#MicroPython动手做(23)——掌控板之WiFi与蓝牙
#开启AP模式设置热点mPython(接收端)

from mpython import *

import time

import network

my_wifi = wifi()

my_wifi.connectWiFi('mPython', '')
rgb.fill( (0, 0, 0) )
rgb.write()
time.sleep_ms(1)
while True:
if my_wifi.sta.isconnected():
oled.fill(0)
oled.DispChar('已连接热点', 33, 22, 1)
oled.show()
rgb.fill((int(0), int(0), int(102)))
rgb.write()
time.sleep_ms(1)

eagler8

2020年05月06日

mPython X 图形编程(热点端)


eagler8

2020年05月06日

mPython 图形编程(接收端)


eagler8

2020年05月06日

打开手机——设置——无线和网路——WLAN,查看热点


eagler8

2020年05月06日

开启AP模式设置热点mPython


eagler8

2020年05月06日

8、互联网授时的模拟时钟

#MicroPython动手做(23)——掌控板之WiFi与蓝牙

#互联网授时的模拟时钟

#MicroPython动手做(23)——掌控板之WiFi与蓝牙
#互联网授时的模拟时钟

from mpython import *

import time

import network

my_wifi = wifi()

my_wifi.connectWiFi('zh', 'zy1567')

import ntptime

from machine import Timer

def timer1_tick(_):
eagler8.settime()
eagler8.drawClock()
oled.show()
eagler8.clear()

tim1 = Timer(1)

eagler8 = Clock(oled, 64, 32, 30)
rgb.fill( (0, 0, 0) )
rgb.write()
time.sleep_ms(1)
ntptime.settime(8, "time.windows.com")
tim1.init(period=1000, mode=Timer.PERIODIC, callback=timer1_tick)
while True:
rgb.fill((int(0), int(51), int(0)))
rgb.write()
time.sleep_ms(1)
time.sleep(1)
rgb.fill((int(0), int(0), int(0)))
rgb.write()
time.sleep_ms(1)
time.sleep(1)

模拟时钟——UI类指令,提供模拟钟表显示功能

class UI.Clock(x, y, radius)

描述: 构建对象

参数:

x、y - 左上角作为起点坐标

radius - 钟表半径

UI.settime()

描述: 获取本地时间并设置模拟钟表时间

UI.drawClock()

描述: 绘制钟表

UI.clear()

描述: 清除钟表

eagler8

2020年05月06日

mPython 图形编程


eagler8

2020年05月06日

互联网授时的模拟时钟


eagler8

2020年05月06日

9、测试掌控板蓝牙功能

打开Mind+——扩展——用户库——添加掌控板蓝牙模块


eagler8

2020年05月06日

//MicroPython动手做(23)——掌控板之WiFi与蓝牙
//测试掌控板蓝牙功能

#include <MPython.h>
#include "BluetoothSerial.h"
// 函数声明
void onButtonAPressed();
// 创建对象
BluetoothSerial SerialBT;


// 主程序开始
void setup() {
Serial.begin(9600);
mPython.begin();
SerialBT.begin("mPython");
buttonA.setPressedCallback(onButtonAPressed);
}
void loop() {
if ((SerialBT.available())) {
Serial.println((SerialBT.read()));
}
}


// 事件回调函数
void onButtonAPressed() {
SerialBT.write(1);
}

eagler8

2020年05月06日

Mind+ 图形编程


eagler8

2020年05月06日

程序上传后,在手机上下载安装蓝牙串口助手,打开手机蓝牙搜索配对。



eagler8

2020年05月06日

打开下载好的蓝牙串口助手,在连接界面,选择我们已经配对好的“mPython”。



eagler8

2020年05月06日

接下来就可以试试数据收发功能了,在手机端发送123,打开mind+串口,收到49 50 51(ASCII码类型的123,通过工具设置发送数据格式)。


eagler8

2020年05月06日

然后我们按下掌控板A键,在手机端收到数据。


eagler8

2020年05月06日

10、网络同步时区数码管时钟

#MicroPython动手做(23)——掌控板之WiFi与蓝牙

#网络同步数码管时钟

#MicroPython动手做(23)——掌控板之WiFi与蓝牙
#网络同步时区数码管时钟

from mpython import *

import network

my_wifi = wifi()

my_wifi.connectWiFi('zh', 'zy1567')

import ntptime

import framebuf

import font.digiface_44

import time

import font.digiface_21

def display_font(_font, _str, _x, _y, _wrap, _z=0):
_start = _x
for _c in _str:
_d = _font.get_ch(_c)
if _wrap and _x > 128 - _d[2]: _x = _start; _y += _d[1]
if _c == '1' and _z > 0: oled.fill_rect(_x, _y, _d[2], _d[1], 0)
oled.blit(framebuf.FrameBuffer(bytearray(_d[0]), _d[2], _d[1],
framebuf.MONO_HLSB), (_x+int(_d[2]/_z)) if _c=='1' and _z>0 else _x, _y)
_x += _d[2]
ntptime.settime(8, "time.windows.com")
while True:
oled.fill(0)
display_font(font.digiface_44, (''.join([str(x) for x in [time.localtime()[3] // 10, time.localtime()[3] % 10, ':', time.localtime()[4] // 10, time.localtime()[4] % 10]])), 0, 0, False, 2)
display_font(font.digiface_21, (str(time.localtime()[5] // 10) + str(time.localtime()[5] % 10)), 103, 45, False, 2)
oled.show()

eagler8

2020年05月06日

mPython 图形编程


eagler8

2020年05月06日

网络同步时区数码管时钟


eagler8

2020年05月08日

11、通过音频模块播放网络歌曲

#MicroPython动手做(23)——掌控板之WiFi与蓝牙
#通过音频模块播放网络歌曲(掌控宝内置喇叭)

from mpython import *
import network
import audio
import time

my_wifi = wifi()

my_wifi.connectWiFi("zh", "zy1567")


audio.player_init()
audio.set_volume(70)
audio.play("http://wiki.labplus.cn/images/4/4e/Music_test.mp3")
while True:
oled.fill(0)
oled.DispChar("播放网络歌曲", 30, 16, 1)
oled.DispChar("春天在哪里", 35, 32, 1)
oled.show()
rgb[1] = (int(0), int(51), int(0))
rgb.write()
time.sleep_ms(1)

播放网络音频

要播放网络上mp3音频文件,需要知道音频的URL地址。目前,大部分的音乐网受版权保护,并不直接提供音乐的URL,你可以通过一些插件爬取音频的URL地址。

注解

掌控板需要确保连接网络通畅。URL必须是完整的网络地址,否则无法解析。音频解码功能使用到 audio 模块的 audio.play(url) 函数, url 参数可以为音源的本地文件系统的路径或网络URL地址。

eagler8

2020年05月08日

mPython X 图形编程


eagler8

2020年05月08日

网络音乐


eagler8

2020年05月08日

网络音乐


eagler8

2020年05月09日

11、心知天气本地版

心知天气

是国内最早创立的商业气象服务公司之一,自创立以来,心知一直在数据层面努力积累,相继与中国气象局气象信息中心、国家预警信息发布中心达成战略合作伙伴关系,成为国内官方气象机构的数据授权商。与此同时,心知还与国内外多家商业公司、高校与科研机构合作,不断夯实数据基础。

于2009年推出的国内首个气象数据API,是心知天气最广受好评的产品。其凭借丰富的天气数据内容,与扎实的IT服务基础,成为企业用户最好的选择。心知天气数据API目前已经为蚂蚁金服、中国平安、美的、戴森、蔚来汽车、声智科技、瑞幸咖啡等数百家国内外知名企业提供企业级高精度气象数据服务,累计提供服务超630亿次。

心知天气插件3.0采用了全新的技术架构,支持全站数据通过插件展示:除天气实况与预报外,还可选择展示分钟级实时天气预警、专业空气质量数据、能见度、气压、湿度、风和云量等。支持专业数据展示,不仅扩充了天气插件的应用场景,更能激发天气插件潜力,提高可玩性。

注册链接 https://www.seniverse.com/


eagler8

2020年05月09日

#MicroPython动手做(23)——掌控板之WiFi与蓝牙
#心知天气本地版

from mpython import *
import network
import json
import urequests

my_wifi = wifi()

my_wifi.connectWiFi("zh", "zy1567")

def get_seni_weather(_url, _location):
_url = _url + "&location=" + _location.replace(" ", "%20")
response = urequests.get(_url)
json = response.json()
response.close()
return json


w1 = get_seni_weather("https://api.seniverse.com/v3/weather/daily.json?key=SMhSshUxuTL0GLVLS", "ip")
w2 = get_seni_weather("https://api.seniverse.com/v3/life/suggestion.json?key=SMhSshUxuTL0GLVLS", "ip")
oled.fill(0)
oled.DispChar((''.join([str(x) for x in [w1["results"][0]["location"]["name"], " ", w1["results"][0]["daily"][0]["text_day"], " ", w1["results"][0]["daily"][0]["low"], " - ", w1["results"][0]["daily"][0]["high"], " 度"]])), 0, 0, 1)
oled.DispChar((str("穿衣指数 : ") + str(w2["results"][0]["suggestion"]["dressing"]["brief"])), 0, 16, 1)
oled.DispChar((str("运动指数 : ") + str(w2["results"][0]["suggestion"]["sport"]["brief"])), 0, 32, 1)
oled.DispChar((str("紫外线指数 : ") + str(w2["results"][0]["suggestion"]["uv"]["brief"])), 0, 48, 1)
oled.show()

eagler8

2020年05月09日

mPython X 图形编程


eagler8

2020年05月09日

心知天气