HaaS506 - TTS语音云播报

  • 简介
  • 准备
  • 硬件接口
  • 代码流程
  • 功能实现
    • 1、物联网平台开发
    • 2、设备端开发
      • 代码
      • 调试
    • 3.应用平台开发
      • 3.1新建‘普通项目’
      • 3.2关联产品和设备
      • 3.3新建移动应用

简介

手机端发送文字,开发板发出对应语音信息。

  • 本案例需要使用到阿里云平台连接网络。通过阿里IOT studio应用开发移动应用,手机端发送文字信息,文字信息通过阿里云下发给开发板,开发板播放对应文字语音。

准备

本案例需要的硬件

器材 数量
HaaS506开发板 1
喇叭 1
SIM卡 1
4G天线 1

硬件接口


代码流程

1、连接阿里云平台。
2、接收云平台下发物模型信息。
3、根据物模型信息播放语音

功能实现

1、物联网平台开发

第一次使用物联网平台的读者,需要开通实例后使用物联网平台功能。也可以使用免费的公共实例进行开发,在阿里云物联网平台中,左上角选择‘华东2-上海’,点击‘公共实例’,即可开通。

1、平台产品创建可参考haas506 2.0开发教程-aliyunIoT

2、创建产品属性(添加物模型)

  • 选择产品功能定义编辑草稿

  • 添加自定义功能

  • 设置标识符数据类型读写类型参数,标识符(light)要与代码保持一致。点击确定

  • 发布上线,点击确定

2、设备端开发

  • 第一次使用开发板的读者可以按照haas5062.0开发教程-导学篇搭建开发环境。
  • 搭建完后复制以下代码到Visual Studio Code,复制产品证书到代码相应位置。

代码

复制代码到VS code

main.py

# coding=utf-8
import network
import ujson
import utime as time
import modem
from  aliyunIoT import Device
import ota
import kv
import TTS as tts#更改产品信息
###############################
productKey = "********"
productSecret = "*********"
###############################
global deviceName,g_connect_status,device_dyn_resigter_succed,netw
g_connect_status = False
netw = None
device = None
deviceSecret = None
device_dyn_resigter_succed = False
connect_state = False
#初始化物联网平台Device类,获取device实例
device = Device()
# 定义需要升级的模块和版本号
module_name = 'default'
app_version = '1.0.1'
# 定义升级包的下载和安装路径,其中url,hash_type和hash 会通过服务端推送被保存下来
info = {'url': '','store_path': '/data/pyamp/app.zip','install_path': '/data/pyamp/','length': 0,'hash_type': '','hash': ''
}# ota 消息推送的接受函数
def on_trigger(data):global info# 保存服务端推送的ota信息info['url'] = data['url']info['length'] = data['length']info['module_name'] = data['module_name']info['version'] = data['version']info['hash'] = data['hash']info['hash_type'] = data['hash_type']# 开始ota 包下载dl_data = {}dl_data['url'] = info['url']dl_data['store_path'] = info['store_path']ota.download(dl_data)# ota 升级包下载结果回调函数
def on_download(data):global infoif data >= 0:print('Ota download succeed')# 开始ota包校验param = {}param['length'] = info['length']param['store_path'] = info['store_path']param['hash_type'] = info['hash_type']param['hash'] = info['hash']ota.verify(param)# ota 升级包校验结果回调函数
def on_verify(data):global infoprint(data)if data >= 0 :print('Ota verify succeed')print('Start Upgrade')# 开始ota升级param = {}param['length'] = info['length']param['store_path'] = info['store_path']param['install_path'] = info['install_path']ota.upgrade(param)# ota 升级包结果回调函数
def on_upgrade(data):if data >= 0 :print('Ota succeed')#ota升完级后 重启设备reboot()def tts_play_cb(v):if v==7:print('play finish...')elif v==0:print('play start...')def tts_play(tx):global tts_play_cbtts.setCallback(tts_play_cb)tts.setVolume(1)tts.setSpeed(6)ret = tts.play(2,0,1,tx)    #优先级;打断模式;模式1-UTF-8/2-GBK;字符串if(0 == ret):print('tts play success')elif(-1 == ret):print('tts play failed')while  tts.getState() == 1:time.sleep_ms(200)print('-----------')#当iot设备连接到物联网平台的时候触发'connect' 事件
def on_connect(data):global module_name,default_ver,productKey,deviceName,deviceSecret,on_trigger,on_download,on_verify,on_upgrade,connect_stateprint('***** connect lp succeed****')data_handle = {}data_handle['device_handle'] = device.getDeviceHandle()# 初始化ota服务ota.init(data_handle)connect_state = True# ota 回调函数注册ota.on(1,on_trigger)ota.on(2,on_download)ota.on(3,on_verify)ota.on(4,on_upgrade)report_info = {"device_handle": data_handle['device_handle'],"product_key": productKey ,"device_name": deviceName ,"module_name": module_name ,"version": app_version}# 上报本机ota相关信息,上报版本信息返回以后程序返回,知道后台推送ota升级包,才会调用on_trigger函数ota.report(report_info)   txt = ''
state = 0
#当iot云端下发属性设置时,触发'props'事件
def on_props(request):global txt,stateprint('clound req data is {}'.format(request))# # # #获取消息中的params数据params=request['params']# #去除字符串的'',得到字典数据params=eval(params)if "txt" in params :txt = params["txt"]time.sleep_ms(20)if "send" in params :state = params['send']if state ==1:tts_play(txt)   #播放语音文件state = 0up_data({'send':state})#当连接断开时,触发'disconnect'事件
def on_disconnect():print('linkkit is disconnected')#当iot云端调用设备service时,触发'service'事件
def on_service(id,request):print('clound req id  is {} , req is {}'.format(id,request))
#当设备跟iot平台通信过程中遇到错误时,触发'error'事件
def on_error(err):print('err msg is {} '.format(err))#网络连接的回调函数
def on_4g_cb(args):global g_connect_statuspdp = args[0]netwk_sta = args[1]if netwk_sta == 1:g_connect_status = Trueelse:g_connect_status = False#网络连接
def connect_network():global netw,on_4g_cb,g_connect_status#NetWorkClient该类是一个单例类,实现网络管理相关的功能,包括初始化,联网,状态信息等.netw = network.NetWorkClient()g_register_network = Falseif netw._stagecode is not None and netw._stagecode == 3 and netw._subcode == 1:g_register_network = Trueelse:g_register_network = Falseif g_register_network:#注册网络连接的回调函数on(self,id,func);  1代表连接,func 回调函数  ;return 0 成功netw.on(1,on_4g_cb)netw.connect(None)else:print('网络注册失败')while True:if g_connect_status:print('网络连接成功')breaktime.sleep_ms(20)#动态注册回调函数
def on_dynreg_cb(data):global deviceSecret,device_dyn_resigter_succeddeviceSecret = datadevice_dyn_resigter_succed = True# 连接物联网平台
def dyn_register_device(productKey,productSecret,deviceName):global on_dynreg_cb,device,deviceSecret,device_dyn_resigter_succedkey = '_amp_customer_devicesecret'deviceSecretdict = kv.get(key)print("deviceSecretdict:",deviceSecretdict)if isinstance(deviceSecretdict,str):    deviceSecret = deviceSecretdict if deviceSecretdict is None or deviceSecret is None:key_info = {'productKey': productKey  ,'productSecret': productSecret ,'deviceName': deviceName}# 动态注册一个设备,获取设备的deviceSecret#下面的if防止多次注册,当前若是注册过一次了,重启设备再次注册就会卡住,if not device_dyn_resigter_succed:device.register(key_info,on_dynreg_cb)  def connect():global deviceName,g_connect_status,device_dyn_resigter_succed,connect_statedeviceName = None# 获取设备的IMEI 作为deviceName 进行动态注册deviceName = modem.info.getDevImei()# 连接网络connect_network()if deviceName is not None and len(deviceName) > 0 :#动态注册一个设备dyn_register_device(productKey,productSecret,deviceName)else:print("获取设备IMEI失败,无法进行动态注册")while deviceSecret is None:time.sleep(0.2)print('动态注册成功:' + deviceSecret)key_info = {'region' : 'cn-shanghai' ,'productKey': productKey ,'deviceName': deviceName ,'deviceSecret': deviceSecret ,'keepaliveSec': 60,}#打印设备信息print(key_info)#device.ON_CONNECT 是事件,on_connect是事件处理函数/回调函数device.on(device.ON_CONNECT,on_connect)device.on(device.ON_DISCONNECT,on_disconnect)device.on(device.ON_PROPS,on_props)device.on(device.ON_SERVICE,on_service)device.on(device.ON_ERROR,on_error)device.connect(key_info)while not connect_state:time.sleep_ms(10)print('--------------------- aliyun connect --------------------------')up_data({'txt':'请输入语音信息'})up_data({'send':state})def up_data(d):           d_str = ujson.dumps(d)data={'params':d_str}device.postProps(data)if __name__ == '__main__':connect()       #连接阿里云

调试

1、串口调试工具log打印log

POWERONREASON:0x0000,parse:NORMAL_REBOOT.
mpthread_init stack:0x80afbb5c 0x80afbb5c
device_obj->iot_device_handle:0x80b9ff00
[  11.134]<E>ACTIVATION_REPORT2 activation_report2:286 report http data:POST /device/add HTTP/1.1
Host:nps.huntercat.cn
User-Agent: AliOS-Things
Content-Length:157
Accept: */*
Content-Type:application/json
Connection: Keep-Alive{"activationStr":"V=3.0.0&P=Enginelf&A=HaaS506_App&B=HaaS506&C=M601&N=Cellular&X=HaaS506-M320&S=Cellular&O=FreeRTOS&T=DTU&M=866907051837598&Y=Alibaba-Cloud"}网络连接成功
deviceSecretdict: ********
动态注册成功:********
{'deviceName': '*******', 'deviceSecret': '********', 'region': 'cn-shanghai', 'productKey': '*******', 'keepaliveSec': 60}
[1670291375.666][LK-0313] MQTT user calls aiot_mqtt_connect api, connect
[1670291375.666][LK-0317] *********
[1670291375.666][LK-0318] *********
[1670291376.333][LK-0313] MQTT connect success in 724 ms
<I>UA uagent_ext_comm_init[63]: [uA]prepare start uagent comm <I>UA uagent_ext_comm_init[74]: [uA]Subsrcibe TOPIC /sys/****/****/_thing/service/invoke[1670291376.333][LK-0309] sub: /sys/****/****/_thing/service/invoke
<I>UA uagent_ext_comm_init[80]: [uA]IOT_MQTT_Subscribe(/sys/****/*****/_thing/service/invoke) success[1670291376.333][LK-0309] sub: /sys/****/****/_thing/service/post_reply
<I>UA uagent_ext_comm_init[89]: [uA]IOT_MQTT_Subscribe(/sys/****/****/_thing/service/post_reply) success[1670291376.333][LK-0309] pub: /sys/****/****/thing/config/log/get[LK-030A] > 7B 22 69 64 22 3A 22 31  22 2C 22 76 65 72 73 69 | {"id":"1","versi
[LK-030A] > 6F 6E 22 3A 22 31 2E 30  22 2C 22 70 61 72 61 6D | on":"1.0","param
[LK-030A] > 73 22 3A 7B 22 67 65 74  54 79 70 65 22 3A 22 63 | s":{"getType":"c
[LK-030A] > 6F 6E 74 65 6E 74 22 2C  22 63 6F 6E 66 69 67 53 | ontent","configS
[LK-030A] > 63 6F 70 65 22 3A 22 64  65 76 69 63 65 22 7D 7D | cope":"device"}}[1670291376.333][LK-0309] pub: /sys/a1laDtv9VrO/866907051837598/thing/deviceinfo/update[LK-030A] > 7B 22 69 64 22 3A 22 32  22 2C 22 76 65 72 73 69 | {"id":"2","versi
[LK-030A] > 6F 6E 22 3A 22 31 2E 30  22 2C 22 70 61 72 61 6D | on":"1.0","param
[LK-030A] > 73 22 3A 5B 7B 22 61 74  74 72 4B 65 79 22 3A 22 | s":[{"attrKey":"
[LK-030A] > 53 59 53 5F 53 44 4B 5F  4C 41 4E 47 55 41 47 45 | SYS_SDK_LANGUAGE
[LK-030A] > 22 2C 22 61 74 74 72 56  61 6C 75 65 22 3A 22 43 | ","attrValue":"C
[LK-030A] > 22 2C 22 64 6F 6D 61 69  6E 22 3A 22 53 59 53 54 | ","domain":"SYST
[LK-030A] > 45 4D 22 7D 7B 22 61 74  74 72 4B 65 79 22 3A 22 | EM"}{"attrKey":"
[LK-030A] > 53 59 53 5F 4C 50 5F 53  44 4B 5F 56 45 52 53 49 | SYS_LP_SDK_VERSI
[LK-030A] > 4F 4E 22 2C 22 61 74 74  72 56 61 6C 75 65 22 3A | ON","attrValue":
[LK-030A] > 22 61 6F 73 2D 72 2D 33  2E 30 2E 30 22 2C 22 64 | "aos-r-3.0.0","d
[LK-030A] > 6F 6D 61 69 6E 22 3A 22  53 59 53 54 45 4D 22 7D | omain":"SYSTEM"}
[LK-030A] > 7B 22 61
***** connect lp succeed****
handle 0x80b9ff00
iot_device_handle:0x80b9ff00
ota register default status cb[1670291376.444][LK-0309] sub: /ota/device/upgrade//****/****/
ota Public topic:/sys/****/****/thing/deviceinfo/updateota Public msg:{"id":"0","version":"1.0","params":[{"attrKey":"SYS_OTA_ID","attrValue":"HOTA-3.3.0-1-0-0"}],"method":"thing.deviceinfo.update"}[1670291376.444][LK-0309] pub: /sys/****/****/thing/deviceinfo/update[LK-030A] > 7B[LK-030A] > 73 22 3A 5B 7B 22 61 74  74 72 4B 65 79 22 3A 22 | s":[{"attrKey":"
[LK-030A] > 53 59 53 5F 4F 54 41 5F  49 44 22 2[LK-030A] > 33 2E 30 2D 31 2D 30 2D  30 22 7D 5D 2C 22 6D 65 | 3.0-1-0-0"}],"me
[LK-030A] > 74 68 6F 64 22 3A 22 74  68 69 6E 67 2E 64 65 76 | thod":"thing.dev
[LK-030A] > 69 63 65 69 6E 66 6F 2E  75 70 64 61 74 65 22 7D | iceinfo.update"}
[LK-030A] > 0ota rollback err1:-1ota ota init fail, ret:-1[  12.000]<E>APP_OTA customer ota init failed!ota report submode versionota Public topic:/ota/device/inform/a1laDtv9VrO/866907051837598 msg:{"id":0,"params":{"version":"amp-v2.03","module":"system"}}[167029137[LK-030A] > 2D 76 32 2E 30 33 22 2C  22 6D 6F 64 75 6C 65 22 | -v2.03","module"
[LK-030A] > 3A 22 73 79 73 74 65 6D  22 7D 7D 0ota Public topic:/ota/device/inform/a1laDtv9VrO/866907051837598 msg:{"id":0,"params":{"version":"1.0.1"}}[1670291376.555][LK-0309] pub: /ota/device/inform/a1laDtv9VrO/866907051837598[LK-030A] > 7B 22 69 64 22 3A 30 2C  22 70 61 72 61 6D 73 22 | {"id":0[LK-030A] > 3A 7B 22 76 65 72 73 69  6F 6E 22 3A 22 31 2E 30 | :{"version":"1.0
[LK-030A] > 2E 31 22 7D 7D 00
[LK-030A] < 7B 22 63 6F 64 65 22 3A  32 30 30 2C 22 64 61 74 | {"code":200,"dat
[LK-030A] < 61 22 3A 7B 22 63 6F 6E  74 65 6E[LK-030A] < 64 22 3A 22 31 22 2C 22  6D 65 74 68 6F 64 22 3A | d":"1","method":
[LK-030A] < 22 74 68 69 6E 67 2E 63  6F 6E 66 6[LK-030A] < 3A 22 31 2E 30 22 7D                             | :"1.0"}[1670291376.666][LK-1507] LOGPOST user log config arrived
user log switch state is: 0
toggle it using the switch in device detail page in https://iot.console.aliyun.com
[[LK-030A] < 73 22 2C 22 6D 65 74 68  6F 64 22 3A 22 74 68 69 | s","method":"thi
[LK-030A] < 6E 67 2E 64 65 76 69 63  65 69 6E 6[LK-030A] < 73 22 2C 22 6D 65 74 68  6F 64 22 3A 22 74 68 69 | s","method":"thi
[LK-030A] < 6E 67 2E 64 65 76 69 63  65 69 6E 66 6F 2E 75 70 | ng.deviceinfo.up
[LK-030A] < 64 61 74 65 22 2C 22 76  65 72 73 69 6F 6E 22 3A | date","version":
[LK-030A] < 2--------------------- aliyun connect --------------------------
[1670291376.666][LK-0309] pub: /sys/a1laDtv9VrO/866907051837598/thing/event/property/post[LK-030A] > 7B 22 69 64 22 3A 22 33  22 2C 22 76 65 72 73 69 | {"id":"3","versi
[LK-030A] > 6F 6E[LK-030A] > BE 93 E5 85 A5 E8 AF AD  E9 9F B3 E4 BF A1 E6 81 | ................
[LK-030A] > AF 22 7D 2C 22 73 79 73  22 3A 7B 2MicroPython f036710-dirty on 2022-09-21, 14:50:41; haas506 with SLM320
Type "help()" for more information.
>>> [1670291376.777][LK-0309] pub: /sys/a1laDtv9VrO/866907051837598/thing/event/property/post_reply[LK-030A] < 7B 22 63 6F 64 65 22 3A  32 30 30 2C 22 64 61 74 | {"code":200,"dat
[LK-030A] < 61 22 3A 7B 7D 2C 22 69  64 22 3A 22 33 22 2C 22 | a":{},"id":"3","
[LK-030A] < 6D 65 73 73 61 67 65 22  3A 22 73 75 63 63 65 73 | message":"succes
[LK-030A] < 73 22 2C 22 6D 65 74 68  6F 64 22 3A 22 74 68 69 | s","method":"thi
[LK-030A] < 6E 67 2E 65 76 65 6E 74  2E 70 72 6F 70 65 72 74 | ng.event.propert
[LK-030A] < 79 2E 70 6F 73 74 22 2C  22 76 65 72 73 69 6F 6E | y.post","version
[LK-030A] < 22 3A 22 31 2E 30 22 7D                          | ":"1.0"}[1670291376.777][LK-0A08] DM recv generic reply
[1670291376.888][LK-0309] pub: /sys/a1laDtv9VrO/866907051837598/thing/event/property/post_reply[LK-030A] < 7B 22 63 6F 64 65 22 3A  32 30 30 2C 22 64 61 74 | {"code":200,"dat
[LK-030A] < 61 22 3A 7B 7D 2C 22 69  64 22 3A 22 34 22 2C 22 | a":{},"id":"4","
[LK-030A] < 6D 65 73 73 61 67 65 22  3A 22 73 75 63 63 65 73 | message":"succes
[LK-030A] < 73 22 2C 22 6D 65 74 68  6F 64 22 3A 22 74 68 69 | s","method":"thi
[LK-030A] < 6E 67 2E 65 76 65 6E 74  2E 70 72 6F 70 65 72 74 | ng.event.propert
[LK-030A] < 79 2E 70 6F 73 74 22 2C  22 76 65 72 73 69 6F 6E | y.post","version
[LK-030A] < 22 3A 22 31 2E 30 22 7D                          | ":"1.0"}[1670291376.888][LK-0A08] DM recv generic reply

2、阿里云平台,打开实时刷新,物模型会接收到开机默认物模型数据。

3.应用平台开发

以下是物联网应用开发流程,接下来按以下流程介绍移动端应用的开发。

3.1新建‘普通项目’

  • 使用阿里云IoTStudio创建项目。
  • 在项目管理新建空白项目

3.2关联产品和设备


3.3新建移动应用

  • 添加组件

  • 配置组件信息

  • 1,文字

  • 2,文本框

    • 配置数据源

    • 数据源

    • 配置交互

  • 配置按钮

    • 配置交互
  • 保存与预览

  • 手机扫描二维码就可在移动端应用

5.32 综合案例2.0 - TTS语音云播报(支持M320开发板)相关推荐

  1. 2.23 haas506 2.0开发教程 - KeyPad - 矩阵键盘(仅支持M320开发板)

    haas506 2.0开发教程 - KeyPad - 矩阵键盘 矩阵键盘 320矩阵键盘连线 案例说明 测试代码 功能测试 class - KeyPad keypad.init() - 初始化keyp ...

  2. 5.38 综合案例2.0 -语音助手(短信,蓝牙,M2M设备间通信)

    综合案例2.0 - 语音助手 效果展示 案例说明 原理 器件 语音助手功能实现 1,ASRPRO-2m模块 下载代码连线 模块编程说明 2,模块与开发板接线 3,语音助手代码 功能1:语音发短信说明 ...

  3. 5.39 综合案例2.0 - STM32蓝牙遥控小车2(语音控制)

    综合案例2.0 - 蓝牙遥控小车1- 语音控制 成品展示 案例说明 器件说明 小车连线 小车源码 语音模块遥控 语音遥控连线 模块使用说明 1.MLT-BT05 4.0 蓝牙模块 2.ASRPRO-2 ...

  4. 5.31 综合案例2.0 - 在线音乐盒

    综合案例2.0 - 在线音乐盒 一.案例说明 二.准备器件 三.案例连线 四.代码 代码说明 复制 五.测试 一.案例说明 用python写一个在线音乐播放器,MP3云喇叭 本案例制作一个联网下载声音 ...

  5. 5.19 综合案例2.0-智能风扇(仅支持2.2以上版本)

    综合案例2.0-智能风扇 简介 AHT10温湿度传感器 电机模块 准备 硬件连接图 代码流程 功能实现 1.物联网平台开发 2.设备端开发 调试 3.物联网应用开发 3.1新建'普通项目' 3.2关联 ...

  6. JavaWeb - 软件开发的流程,综合案例

    转载请注明出处:https://blog.csdn.net/mythmayor/article/details/72844266 1.软件开发的流程 第一:需求的讨论第二:设计系统的原型第三:根据原型 ...

  7. 【安信可ESP32语音开发板专题①】ESP32-A1S音频开发板之离线语音识别控制LED灯

    ---------- 本博客学习由 安信可开源团队 潜心编写,做ESP32-A1S离线语音初步入门技术交流分享.如有不完善之处,请留言,本团队及时更改. 文章目录 一.前言 二.离线语音框架 2.1 ...

  8. esp32录音功能开发_【安信可ESP32语音开发板专题①】ESP32-A1S音频开发板之离线语音识别控制LED灯...

    本博客学习由 一.前言 离线语音,顾名思义:在不连网络的状态下,产品能识别语音指令并执行相应的控制输出. 安信可基于乐鑫ESP32芯片开发的ESP32-A1S开发板智能语音助手,可支持唤醒词引擎(Wa ...

  9. 基于AM57x的GigE工业相机图像采集案例TL5728-IDK开发板

    1开发环境 表 1 开发板型号 是否支持本实验 TL5728-EasyEVM 支持 TL5728-IDK 不支持 TL5728F-EVM 不支持 AM57x开发板(使用7英寸液晶显示屏) 本案例所有 ...

最新文章

  1. Yii框架2.0的视图和widgets表单的使用
  2. POPUP_TO_CONFIRM_STEP
  3. 上海往事之与初中同学YS见面
  4. JavaScript 学习笔记-- ES6学习(一)介绍以及Babel的使用
  5. 使用kibana或postman操作Elasticsearch的常用命令
  6. 浅析 Spring 中的事件驱动机制
  7. 史上最经典Java入门基础视频,没有之一!
  8. 西门子STEP7、博图里的数据块(DB)编址规则
  9. 加密狗复制,破解,备份,模拟,OEM ,写狗工具开发
  10. JSP:9个隐含对象(隐含变量)
  11. WIFI系列协议--802.11ax--wifi6--高效率无线标准简称HE--11Gbit
  12. 教育部计算机考研大纲,2021考研计算机大纲计算机网络部分考查内容
  13. 13 岁女孩因发布JavaScript被捕,写个死循环你就进去了?
  14. tableau连接数据库时出现检查服务器是否正在运行以及您是否有权访问请求的数据库
  15. keep-alive 的详细介绍
  16. (转载)MatLab绘图
  17. 阅读笔记之《你的生命有什么可能》
  18. 连接mysql报错 errorCode 1129, state HY000, Host ‘xxx‘ is blocked because of many connection errors
  19. HDU-4540 威威猫系列故事——打地鼠
  20. AWS入门指南之一:怎样创建免费的AWS账号

热门文章

  1. vmware 远程桌面 usb设备ukey无法识别,usb无法重定向问题解决
  2. 拉格朗日松弛算法在组合优化问题中的应用
  3. ubuntu下载谷歌云盘大文件
  4. python数字转中文大写_Python 人民币数字转汉字表示 —— 大写金额
  5. 为什么总是有人说 Java 啰嗦,却没人说 C++ 啰嗦?
  6. steam教育课程是什么总结
  7. JS DOM(超级详细,如果对DOM知识还不熟悉的必看)
  8. 电脑怎么通过IP连接打印机??
  9. 国考银保监会面试上岸指南-计算机岗
  10. 求数组中的最大值和次大值