NRF52832空中升级DFU

silencehuan 2019-06-12 19:29:00 阅读数:25 评论数:0 收藏数:0

Secure DFU环境搭建

升级原理,加密原理在此不做描述,详情参考http://www.cnblogs.com/iini/p/9314246.html


 

1.工具一览

  • gcc-arm-none-eabi编译环境:GCC编译环境

https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads

  • mingw 平台(win版的Linux命令行)

https://sourceforge.net/projects/mingw/files/latest/download?source

  • micro-ecc-master源码

https://github.com/kmackay/micro-ecc

  • python 安装文件

https://www.python.org/downloads/

  • pc-nrfutil

https://github.com/NordicSemiconductor/pc-nrfutil/

  • nrfgo-studio
  • nrf connect app

 

2.安装指导

Secure DFU需要micro-ecc库进行签名验证,需要micro_ecc_lib_nrf52.lib,需要使用GCC编译器生成。

2.1 gcc-arm-none-eabi安装

gcc-arm-none-eabi-4_9-2015q3-20150921-win32.exe,直接双击安装,注意使用默认安装路径,不要修改

安装完成


 

2.2 mingw 平台安装

双击mingw-get-setup.exe,点击install进行安装,选择默认路径

安装好后弹出package包安装界面MinGW Installation Manager,按下图所示进行选择

选择后,点击InstallationàApply Changes


 

2.3 mingw 环境变量配置

 安装好MinGW,需要在系统环境变量Path添加路径

平台安装验证:

修改好系统环境变量后,重启电脑,运行命令提示符,如下所示则安装成功


2.4 micro-ecc库生成

需要生成micro_ecc_lib_nrf52.lib,也可直接使用已经编译好的文件micro-ecc_sdk14_15_newer.rar解压后替换micro-ecc文件夹。

1.将micro-ecc-master源码复制到SDK目录下的external\micro-ecc中,并重命名为micro-ecc

2.打开MinGW的命令行msys.bat

在批处理框里输入要生成库的gcc算法路径

cd E:/keil_workspace/NORDIC/nRF5_SDK_15.0.0_a53641a/external/micro-ecc/nrf52hf_keil/armgcc

 

之后输入make

出现错误后,按照提示修改gcc的Makefile.windows文件如下

 

将gcc编译器路径更换为实际路径

#GNU_INSTALL_ROOT := C:/Program Files (x86)/GNU Tools ARM Embedded/6 2017-q2-update/bin/

GNU_INSTALL_ROOT := C:/Program Files (x86)/GNU Tools ARM Embedded/4.9 2015q3/bin/

#GNU_VERSION := 6.3.1

GNU_VERSION := 6.3.0

GNU_PREFIX := arm-none-eabi

 修改之后,编译OK


 

2.5 python 安装

1.双击python-2.7.14.amd64.msi安装,注意使用默认路径,安装过程使用默认插件配置直接一直next。

2.系统环境变量添加

3.安装验证

修改环境变量后重启电脑,命令行输入python -V


 

2.6 nrfutil工具安装

需要联网

打开命令行,输入pip install nrfutil安装nrfutil

安装完成后,输入nrfutil version,如下则表示安装成功


 

3.升级文件制作

为便于调试与生产上的烧录,编写一些 bat 文件来操作nrfutil工具指令

工程在sdk中的目录 E:\keil_workspace\NORDIC\nRF52832_htwh_sdk15.0\examples\ble_peripheral\ble_app_gnt_freertos-release

脚本文件目录 E:\keil_workspace\NORDIC\nRF52832_htwh_sdk15.0\examples\ble_peripheral\ble_app_gnt_freertos-release\wh_Script_SDK15_S132_nRF52832_GNT

 3.1 密钥生成文件

key_generate.bat

生成的 dfu_public_key.c 文件会拷贝到 dfu 文件夹下供 secure_bootloader 使用 

@echo off

pause
echo "执行之前需要确认文件路径,修改完成后可注释..."
pause


::1)通过nrfutil生产私钥和公钥文件
::generate private key
nrfutil keys generate priv.pem
::generate public key related with private key: priv.pem
nrfutil keys display --key pk --format code priv.pem --out_file dfu_public_key.c


::2)复制dfu_public_key.c文件到dfu工程
::修改指定文件夹或文件自己修改ObjPath源文件位置,HexDestPath目标文件或文件夹位置
set ObjPath=dfu_public_key.c

set HexDestPath=E:\keil_workspace\NORDIC\nRF52832_htwh_sdk15.0\examples\dfu

::复制指定路径指定文件或文件夹,至HexDestPath路径文件夹
echo y | xcopy "%ObjPath%" /e /r /k "%HexDestPath%"
::xcopy /e/c/h/z "%~pd0*.*" "%out%"

pause

3.2 升级包制作bat文件

zip_generate.bat

文件中的工程目录请根据实际路径修改

@echo off

::1)复制工程hex文件到指定文件夹, 需设置文件地址
::修改指定文件夹或文件自己修改ObjPath源文件位置,HexDestPath目标文件或文件夹位置
set ObjPath=E:\keil_workspace\NORDIC\nRF52832_htwh_sdk15.0\examples\ble_peripheral\ble_app_gnt_freertos-release\pca10040\s132\arm5_no_packs\_build\gnt_app.hex

set HexDestPath=E:\keil_workspace\NORDIC\nRF52832_htwh_sdk15.0\examples\ble_peripheral\ble_app_gnt_freertos-release\wh_Script_SDK15_S132_nRF52832_GNT

::复制指定路径指定文件或文件夹,至HexDestPath路径文件夹
echo y | xcopy "%ObjPath%" /e /r /k "%HexDestPath%"
::xcopy /e/c/h/z "%~pd0*.*" "%out%"


::2)生成升级用zip文件
::nrfutil.exe pkg generate --hw-version 52 --application-version 1 --application gnt_app.hex --sd-req 0xA8 --key-file private.key gnt_app_Dfu15.zip

nrfutil pkg generate --hw-version 52 --application-version 1 --application gnt_app.hex --sd-req 0xA8 --key-file private.key gnt_app_Dfu15.zip


::pause 

3.2 生产烧录文件制作bat文件

 会将应用gnt_app.hex、bootloader.hex、settings.hex、s132_nrf52_6.0.0_softdevice.hex这四个程序合为whole.hex,用于生产烧录;

 mergehex.bat

@echo off

::1)生成 settings page for current image: gnt_app.hex
::Bootloader settings存储在Flash最后一个page,它将决定复位后芯片的行为,比如是进入DFU模式还是应用模式,同时它还包含image的CRC值和版本等信息。如果要求芯片复位后进入application,必须正确生成该bootloader settings hex

nrfutil settings generate --family NRF52 --application gnt_app.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 settings.hex


::2)合成一个hex用于生产烧录
::merge bootloader and settings
mergehex.exe --merge bootloader.hex settings.hex --output bl_temp.hex
::merge bootloader, app and softdevice
mergehex.exe --merge bl_temp.hex gnt_app.hex s132_nrf52_6.0.0_softdevice.hex --output whole.hex

::pause 

::merge bootloader and settings

4.工程添加DFU服务

1.工程文件

工程文件添加

头文件路径包含

2.工程内容修改

在main.c中添加 DFU 服务支持

// 头文件包含
#if (DFU_SUPPORT == 1)
#include "nrf_dfu_ble_svci_bond_sharing.h"
#include "nrf_svci_async_function.h"
#include "nrf_svci_async_handler.h"
#include "ble_dfu.h"
#include "nrf_power.h"
#include "nrf_bootloader_info.h"
#endif

#if (DFU_SUPPORT == 1)

// 进入DFU,应用关机之前的一些操作,注册到power manager电源管理中
static bool app_shutdown_handler(nrf_pwr_mgmt_evt_t event)
{
    switch (event)
    {
        case NRF_PWR_MGMT_EVT_PREPARE_DFU:
            NRF_LOG_INFO("Power management wants to reset to DFU mode.");
            #if (GNT_WDT_EN == 1)
            my_wdt_feed();
            #endif
            
            break;

        default:
            // YOUR_JOB: Implement any of the other events available from the power management module:
            //      -NRF_PWR_MGMT_EVT_PREPARE_SYSOFF
            //      -NRF_PWR_MGMT_EVT_PREPARE_WAKEUP
            //      -NRF_PWR_MGMT_EVT_PREPARE_RESET
            return true;
    }

    NRF_LOG_INFO("Power management allowed to reset to DFU mode.");
    return true;
}

// 注册应用关机事件处理函数(常用于关机前需要进行的一些操作:如flash操作,控制模块的关闭等)
NRF_PWR_MGMT_HANDLER_REGISTER(app_shutdown_handler, );

static void buttonless_dfu_sdh_state_observer(nrf_sdh_state_evt_t state, void * p_context)
{
    if (state == NRF_SDH_EVT_STATE_DISABLED)
    {
        NRF_LOG_INFO("NRF_SDH_EVT_STATE_DISABLED to DFU mode.");
        // Softdevice was disabled before going into reset. Inform bootloader to skip CRC on next boot.
        nrf_power_gpregret2_set(BOOTLOADER_DFU_SKIP_CRC);

        //Go to system off.
        nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_SYSOFF);
    }
}

/* nrf_sdh state observer. */
NRF_SDH_STATE_OBSERVER(m_buttonless_dfu_state_obs, ) =
{
    .handler = buttonless_dfu_sdh_state_observer,
};

#endif


#if (DFU_SUPPORT == 1)
/**@brief Function for handling dfu events from the Buttonless Secure DFU service
 *
 * @param[in]   event   Event from the Buttonless Secure DFU service.
 */
static void ble_dfu_evt_handler(ble_dfu_buttonless_evt_type_t event)
{
    switch (event)
    {
        case BLE_DFU_EVT_BOOTLOADER_ENTER_PREPARE:
            NRF_LOG_INFO("Device is preparing to enter bootloader mode.");
            // YOUR_JOB: Disconnect all bonded devices that currently are connected.
            //           This is required to receive a service changed indication
            //           on bootup after a successful (or aborted) Device Firmware Update.
            break;

        case BLE_DFU_EVT_BOOTLOADER_ENTER:
            // YOUR_JOB: Write app-specific unwritten data to FLASH, control finalization of this
            //           by delaying reset by reporting false in app_shutdown_handler
            NRF_LOG_INFO("Device will enter bootloader mode.");
            break;

        case BLE_DFU_EVT_BOOTLOADER_ENTER_FAILED:
            NRF_LOG_ERROR("Request to enter bootloader mode failed asynchroneously.");
            // YOUR_JOB: Take corrective measures to resolve the issue
            //           like calling APP_ERROR_CHECK to reset the device.
            break;

        case BLE_DFU_EVT_RESPONSE_SEND_ERROR:
            NRF_LOG_ERROR("Request to send a response to client failed.");
            // YOUR_JOB: Take corrective measures to resolve the issue
            //           like calling APP_ERROR_CHECK to reset the device.
            APP_ERROR_CHECK(false);
            break;

        default:
            NRF_LOG_ERROR("Unknown event from ble_dfu_buttonless.");
            break;
    }
}
#endif


static void services_init(void)
{
    ret_code_t         err_code;
    nrf_ble_qwr_init_t qwr_init = {};

    // Initialize Queued Write Module.
    qwr_init.error_handler = nrf_qwr_error_handler;

    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
    APP_ERROR_CHECK(err_code);
    
    
    // 添加GPS_NB_TAG服务
    ble_gnts_init_t     gnts_init;
    
    memset(&gnts_init, , sizeof(gnts_init));
    gnts_init.data_handler = gnts_data_handler;

    err_code = ble_gnts_init(&m_gnts, &gnts_init);
    APP_ERROR_CHECK(err_code);  
    
#if (DFU_SUPPORT == 1)
    ble_dfu_buttonless_init_t dfus_init = {};
    // Initialize the async SVCI interface to bootloader.
    err_code = ble_dfu_buttonless_async_svci_init();
    APP_ERROR_CHECK(err_code);

    dfus_init.evt_handler = ble_dfu_evt_handler;

    err_code = ble_dfu_buttonless_init(&dfus_init);
    APP_ERROR_CHECK(err_code);
#endif
    
}

3. sdk_config.h 文件设置


 

 

 另外 bootloader 工程中需要设置进入boot方式

 

 5. 实际测试

用keil编译工程之后,运行bat文件生成升级用 zip 包

连接设备蓝牙

1.使能Buttonless DFU的CCCD项;

2.点击按键2

 

点击SEND,设备进入boot模式,关闭当前连接,进入扫描项SCAN,连接DfuTrag

点击右上角的DFU小图标,选择ZIP文件(SDK12之后仅支持ZIP格式升级),点击OK,进入文件浏览器选择升级文件后自动开始升级,到100%时升级完成。

 


版权声明:本文为[silencehuan]原创文章
转载请带上:http://copyfuture.com/blogs-details/201906121934543089iqp1oi1bf8lr6a
或:https://www.cnblogs.com/silencehuan/p/11011716.html


  1. 为什么从前那些.NET开发者都不写单元测试呢?
  2. 爱立信称已获10个5G合同 行业最多
  3. Git:八、Git自定义:忽略特殊文件&配置别名
  4. oracle 分析函数和开窗函数的例子
  5. okio:定义简短高效
  6. 科创板主要规则解读——竟然只有300W散户满足条件
  7. 人间四月天 | 4月国内外旅行目的地推荐
  8. 巴厘岛攻略 | 吃住行玩详细干货,第一次去必备
  9. node 搭建静态服务
  10. 大理,活得简洁而单纯的人们
  11. 苦瓜、南瓜、粗粮是降糖神物?营养师有话说 | 同步收听
  12. 应用层(DNS域名系统、FTP文件传送协议、远程终端协议TELNET、超文本协议HTTP)
  13. 台湾著名作家林清玄谈阅读与写作
  14. 14JavaScript条件语句
  15. 采用(非)持续连接的HTTP
  16. 还以为狄仁杰只是射手,看了这出装,感觉更像是手长的战士!
  17. GIF-太秀了!恒大亚冠刚开场,塔利斯卡3秒内连续2次挑球过人
  18. 吃他汀类药物,该不该同时吃阿司匹林呢?看看心内科医生怎么说!
  19. 35岁前懂得这些财务规划知识,人生或许大不一样
  20. 一文读懂:AI如何改变矿业?
  21. 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习
  22. 【Java初探03】——流程控制语句
  23. 【吐血推荐】领域驱动设计学习输出
  24. pg10.1 orafce3.6 安装
  25. 年薪50W的Java程序员转大数据学习路线
  26. 美国最担心的事已经发生!这3名中国人,给全球老大上了一课
  27. 励志小故事:不以物喜,不以己悲,属于你的,终究不变!
  28. 技术文章如何写作才能有较好的阅读体验
  29. c3p0连接池封装
  30. 宝宝的“脐带咖”脱落后?你保留了吗?
  31. 四大无人区穿越你真的了解了么?
  32. 股东忙套现高管忙辞职 奥马电器还能指望冰箱主业吗
  33. 科技股收盘|融360遭央视点名暴跌近13% 特斯拉跌5%
  34. 苹果健康副总裁表示公司与FDA有良好关系 将继续在健康领域开展工作
  35. 任正非:未来华为业务不会拆分也不会卖掉
  36. 夏季避暑来新疆伊犁,4天经典线路领略大美北疆
  37. 实现CTF智能合约题目的环境部署
  38. 课后作业
  39. 设计模式之外观模式(结构型)
  40. 中国最经典的八首现代诗,美入骨髓,一生至少要读一次
  41. 现役谁最有希望拿3分?30岁库里得分仅1万5,杜兰特最有希望
  42. 2019年交付16架“光辉”战斗机,印度斯坦要扩大产能,17年才6架
  43. 北汽董事长:电动车续航过长没有意义,300公里足够
  44. 纽约首个无人车商业项目落地!预计可为8500人服务
  45. 整数、浮点数在计算机中的存储
  46. 优化至死:多数人都在努力过上坏日子
  47. 个人整理的 Windows 下 .NET 开发必装的软件
  48. 权利斗争失败的倒霉蛋、从少将到少尉的保安总局第六处处长约斯特
  49. 高圆圆消失八个月,被拍到孕肚依旧好漂亮,恭喜!
  50. 《跨越星弧》评测:探索宇宙不仅需要飞船,还需要肝
  51. 最干净女明星,毕业嫁初恋,34岁长了17岁的脸,儿子继承好基因
  52. 登陆Linux服务器时触发邮件提醒
  53. 苏永康透露许志安最新情况:活在后悔与愧疚中,心里一直在道歉
  54. 火箭输球也不亏?康利赛后为哈登叫板全联盟,但也承认了一个事实
  55. 博客园的推荐栏,怎么漂起来?
  56. 科尔评判勇士替补太被动,却不知错在自己,库克一哥太委屈
  57. 深入理解Java虚拟机(自动内存管理机制)
  58. 他是开国上将,也是林彪手下的五虎将之一,其战绩被载入美国军史......
  59. 俄罗斯在远东地区居然还占这么大一个半岛:被人遗忘的神秘勘察加
  60. CSS3 之 童年的纸飞机
  61. Linux基础命令<二>
  62. 最好看的一汽SUV,8.98万比博越性价比高,发动机是最大亮点
  63. 《全境封锁2》GameSpot评9分 剧情不足游戏性很强
  64. gitbook 入门教程之导出电子书
  65. Python——深拷贝和浅拷贝
  66. 【十年磨一剑】蓝月亮能否重现六冠奇迹?!
  67. 工程机械龙头股业绩大爆发!
  68. MySQL Online DDL导致全局锁表案例分析
  69. 锤子Smartisan OS变更认证信息:成为字节跳动旗下公司
  70. 中国最贵的景区,一张门票3500元,是第二名3倍,参观需提前申请
  71. 威胁古代中国数朝上千年的匈奴王国到底是从哪来的?
  72. java第四次作业
  73. jQuery仿迅雷图片轮换效果
  74. 一孕傻三年?宝妈半夜突然起床,下意识动作引起众人一大波回忆杀
  75. 曾经我也迷茫,你还在迷茫吗?写给像我一样的在校计算机专业学生。
  76. MySQL系列--1.安装卸载与用户权限管理
  77. “李梅烧烤”让10万日本人一夜间被烧死,二战侵略者可怕的噩梦!
  78. 中国手机格局:华为小米OV高端市场围剿苹果 锤子等小厂商崩盘
  79. 沪指放量大跌4.4% 正常调整还是掉头向下?
  80. 自如员工被控窃取公司信息七万条 涉侵犯公民信息罪
  81. Python后台开发Django(数据库)
  82. 996、小白兔、中年危机,互联网累了也老了
  83. 51nod1236 序列求和 V3
  84. 北京地铁16号线:国内首条5G信号全覆盖的地铁线路
  85. coding++ :在引入的css或者js文件后面加参数的作用
  86. C++面向对象程序设计_Part1
  87. 开春上火、手心热、浑身冷 可用菊花茶、银耳百合羹降火
  88. ASP.NET MVC5+EF6+LayUI实战教程,通用后台管理系统框架(5)- 创建项目结构
  89. 再而衰三而竭,脱胎于聆风,轩逸纯电还有机会翻身吗?
  90. Uber隐秘的金矿:送餐服务如何变成了十亿美元业务?
  91. 盟军在太平洋战场上策划的78次登陆行动
  92. IDEA中解决Edit Configurations中没有tomcat Server选项的问题(附配置Tomcat)
  93. 长江存储将于年底前量产64层3D闪存:明年迈进128层
  94. 史上最大假钞之神:造2.5亿美元的假币,没坐牢只交了1300块罚款
  95. 印远程火箭炮边境试射 44秒射12枚制导火箭摧毁目标
  96. postman自定义函数实现 时间函数
  97. 程序员的焦虑:年终奖发了二十万,总觉得自己不值这个价
  98. 新一期《跑男》嘉宾新鲜,延禧剧组有两人参加,连不老男神也来了
  99. 一生至少要读一次的六句话
  100. 基于Custom-metrics-apiserver实现HPA

  1. 前端笔记之NodeJS(一)初识NodeJS&内置模块&特点(1715)
  2. Python开发:部分第三方库无法在线安装解决方法(1521)
  3. Matlab 2019a 安装包下载以及安装和激活(1451)
  4. React 与 React-Native 使用同一个 meteor 后台(1341)
  5. Delphi 开发微信公众平台 (二) 用户管理(1294)
  6. C#读取excel文件提示未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序(1148)
  7. [深度应用]·实战掌握Dlib人脸识别开发教程(1114)
  8. 币安称 4000 万美元比特币被盗(1092)
  9. 《跃迁-成为高手的技术》之联机学习(1080)
  10. 独家 | 寒武纪二代芯片发布在即,提前解密如何挑战英伟达!(1011)
  11. WebGL three.js学习笔记 纹理贴图模拟太阳系运转(992)
  12. 使用 C 语言实现一个 HTTP GET 连接(978)
  13. 【译】.NET Core 是 .NET 的未来(892)
  14. Sublime Text3 最新版3207 安装及破解(819)
  15. 微软宣布 .NET 5 计划,支持跨平台、移动开发(770)
  16. 科学家在太平洋水域发现奇特的“砷呼吸”微生物(765)
  17. 75条笑死人的知乎神回复,用60行代码就爬完了(753)
  18. 小米有品员工签军令状,自动放弃年终奖!(745)
  19. Linux学习(三):XShell连接虚拟机+开通22端口(742)
  20. 【预警通告】Weblogic反序列化远程代码执行漏洞(738)
  21. layui的table参数条件缓存问题(731)
  22. Visual Studio 2019 正式发布,重磅更新,支持live share(692)
  23. 【预警通告】Apache Tomcat远程代码执行漏洞CVE-2019-0232(675)
  24. SQL简介及MySQL的安装目录详解(650)
  25. 10亿元巨贪山西吕梁原副市长张中生二审维持死刑判决(641)
  26. 5月13日公告精读丨一字跌停后,这只300亿市值的白马股出来澄清了(618)
  27. Vue之路由(608)
  28. 2019年程序员最值得学习的思维利器——任务分解(587)
  29. css-博客样式初体验(567)
  30. 如果想转行学习WEB前端,这样学也许更加利于找工作(561)
  31. 声明与定义的区别(550)
  32. 彭博社:苹果A13芯片即将产量 新iPhone"浴霸"无疑(542)
  33. MongoDB创建数据库和删除数据库05-14学习笔记(495)
  34. PJzhang:Lucifer1993的struts-scan漏洞全量检测工具(494)
  35. K8s集群安装--最新版 Kubernetes 1.14.1(494)
  36. 吴奇隆当爹!前妻马雅舒开心复出拍戏,颜值吸睛气质超赞(491)
  37. 【威胁通告】Oracle全系产品2019年4月关键补丁更新(485)
  38. 英媒:阿里将允许外国零售商在阿里平台上销售商品(477)
  39. Confluence SSRF及远程代码执行漏洞处置手册(473)
  40. 舍命生子产妇吴梦丈夫怒斥:没抢肺源不是精神分裂,网友断章取义(473)
  41. 美方拟升级关税措施?中方:反制!(463)
  42. Visual Studio 2019 正式发布(462)
  43. 香饽饽!米兰双雄均有意荷兰小将贝尔赫韦因(460)
  44. 短视频内容重复,如何伪原创处理(457)
  45. [翻译] Visual Studio 2019: 极速编码. 智能工作. 创造未来.(439)
  46. 绿盟科技互联网安全威胁周报NSFOCUS-19-13(437)
  47. 机器学习 ML.NET 发布 1.0 RC(436)
  48. 刘强东身边的CXO还有谁“幸存”(432)
  49. 阿里巴巴2018年纳税516亿元 同比增40%(428)
  50. 告诉你去越南芽庄必带回的好东西(418)
  51. 宝宝多大可以自己吃饭?错过孩子独立吃饭黄金期,等着后悔吧(407)
  52. 针对django2.2报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: ill....(391)
  53. 小米手机卖不动了?(390)
  54. 太奇葩!买100元债只给1.63元购物券和1.11元现金?网友炸锅:得买多少债券才能换一双鞋(389)
  55. 马光远:全球货币政策进入摇摆期,包括房价的资产价格何去何从(389)
  56. 我司使用了六年的分布式锁(384)
  57. 雷军清华演讲实录:小米9年的创新、变革与未来(382)
  58. 积分一样却选手下败将出战国际赛,《最强大脑》云队选手被坑了?(377)
  59. F#周报2019年第14期(372)
  60. Webpack 4教程 - 第八部分 使用prefetch和preload进行动态加载(371)
  61. Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!(370)
  62. 报告显示:一季度中国家庭总资产缩水而消费支出增加(343)
  63. 《最强大脑》要垮?桑洁魏坤琳出轨细节被扒,戚薇才是神助攻(340)
  64. 他联系叙恐怖分子“卖军火”,称能搞到2000枚导弹,关键时刻中国警察出手(339)
  65. 直认与老公感情淡了!27岁TVB上位女星:我们不是好熟(339)
  66. 谁是苏小明饭局爆粗偷拍者?知情人称另有其人(327)
  67. Oracle甲骨文大规模裁员,你背离时代就会被淘汰(327)
  68. 苹果应用商店被判垄断?然而并没有(324)
  69. 日本明仁天皇退位,日本“平成”年代结束(318)
  70. 华电教授孙玉兵被指与昔日同学共同学术造假,多所高校调查(312)
  71. 迪玛希好惨!昨晚《歌手》为声入人心男团帮帮唱,却再被指控侵权(311)
  72. linux系统安装cdcfordb2udb(309)
  73. 女友被曝插足许志安郑秀文婚姻 知情人透露马国明已下定决心分手(309)
  74. 智慧停车场系统开发建设解决方案(306)
  75. F#周报2019年第15期(299)
  76. shopify网站转化率优化之结账页checkout优化(293)
  77. 真实!这部8.5分的缉毒剧,毒贩公然贿赂警察:80万,把我放出去(285)
  78. 威廉王子出轨凯特王妃闺蜜? 外媒称婚外情致兄弟反目(285)
  79. spring-cloud-sleuth+zipkin源码探究(283)
  80. 深度学习python的配置(Windows)(282)
  81. NodeJs之邮件(email)发送(280)
  82. 许志安出轨视频系蓄谋偷拍?司机被曝收40万装红外摄像头(280)
  83. 赌命生子九个月后,吴梦离世:前半辈子任性了,我用生命买单(280)
  84. 视觉中国深夜道歉:全面配合监管部门彻底积极整改(278)
  85. 新更新kb4493472导致无法正常开机(267)
  86. 韦杰落网,金诚集团终局(265)
  87. 美国各州18年人均GDP排名(附中国各省市区人均GDP排名)(265)
  88. 她做个半永久眉毛就被说整容了?(263)
  89. 【硬盘版】下载利器IDM+优特(uTorrent)BT下载器类(263)
  90. 阿里 EasyExcel 使用及避坑(263)
  91. 机器学习基石笔记:01 The Learning Problem(258)
  92. Google AI 系统 DeepMind 高中数学考试不及格(258)
  93. 华为推出方舟编译器 称可提升安卓系统效率(256)
  94. 张丹峰出轨最新锤来了!毕滢的朋友圈简直刷新下限啊!(255)
  95. 如何设置使chrome新标签页中打开链接自动跳转到新标签页?(254)
  96. TikTok抖音海外版安卓版、ios、网页版多种下载观看姿势~(254)
  97. 山东庆云民企3000亩土地被贱卖 国企接盘拟转性(252)
  98. 不要996!程序员创建955.WLB不加班公司名单,GitHub周榜第二(251)
  99. 河南汝州农商行“百万丢款案”调查,两级法院现“判决书打架”(244)
  100. 那些年,我们一起看的毛片(244)

  1. 「解局」习近平此时出访朝鲜,有何深意?
  2. 在北京月薪多少,才能吃得起24.75元/斤的水培蔬菜?
  3. thinkphp整合系列之极验滑动验证码geetest
  4. Java线程之Synchronized用法
  5. 不定个数的输入数字 并做复数运算
  6. 突发!四川宜宾长宁县发生6.0级地震,记者连夜奔赴现场
  7. 长春长生疫苗案新动向!91亿元罚没款将被强制执行
  8. 重写类加载器,实现简单的热替换
  9. Java核心技术梳理-IO
  10. java基础知识入门
  11. spark 机器学习 随机森林 原理(一)
  12. React总述
  13. # 大项目之网上书城(四)——主页(下中)
  14. TypeScript `this` 入参
  15. 绿盟科技互联网安全威胁周报NSFOCUS-2019-24
  16. 正式测定!四川宜宾发生6级地震
  17. 项目测试操作规范
  18. es6入门7--Set Map数据结构
  19. 这个要起诉华为的人啥来头?刚刚说死磕是因为任正非,网友这样说
  20. robotframework - 框架做接口自动化get请求
  21. 吉林珲春1.3级地震原因公布:碎石场两次爆破作业所致,共用6吨炸药
  22. PHP面向对象(二)
  23. SpringBoot整合Swagger和Actuator
  24. Jira集成方式:Cookie方式登录
  25. 高仿富途牛牛-组件化(二)-磁力吸附
  26. 校园表白墙APP使用体验
  27. SpringBoot整合Swagger和Actuator
  28. [hdu517] 小奇的集合
  29. 论编程与武学的相关性
  30. Python 元组
  31. Hibernate事务管理
  32. 京东618发布1-17日战报:低线市场突破 大牌名牌受青睐
  33. springboot如何读取自定义配置项
  34. 报文、报文段、分组、包、数据报、帧、数据流
  35. Qt信号阻塞和断开信号槽
  36. mysql 第三天 实体与实体的关系
  37. mysql 第三天 高级查询
  38. mysql 第三天 group by子句
  39. mysql 第三天 having子句
  40. Python————面向对象高级特性
  41. Java之异常丢失
  42. 2091操作系统引论
  43. 【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick
  44. 美方指责我军在吉布提“限制国际空域”,外交部:与事实完全不符
  45. 张曼玉再谈梁朝伟,真羡慕她任性妄为的这一生
  46. 在return中使用finally
  47. 深水炸弹!投保香港保险一夜归零,数百投资人、数亿投资打水漂,还倒欠管理费!香港保险神话被打破?
  48. Nginx location匹配规则
  49. 电商、P2P等大型互联网系统包含哪些业务模块?
  50. 【Java源码】集合类-优先队列PriorityQueue
  51. 一篇文章说完Java的垃圾回收过程
  52. Python基础数据类型(五) dict字典
  53. 微信商城小程序 带java后台源码
  54. 封装
  55. SpringBoot + Redis:基本配置及使用
  56. 菜鸟初学 node 推荐 亲测easy
  57. 科学家证实在地球深处的确隐藏着未知磁力源!
  58. 人类虐待机器人遭反杀,网友:心疼机器人
  59. 以色列公司Cellebrite宣称可解锁所有iOS 12设备
  60. 世界第一大岛格陵兰岛出问题:单日融冰量达20亿吨
  61. 龙芯胡伟武:补课18年 未来几年将同国际主流产品竞争
  62. 新能源界首陷“漏电门”奥迪将召回1644辆电动车e-tron
  63. 许家印大笔押注新能源:恒大集团1200亿沈阳投资建厂造车
  64. 亦真亦幻 AI让虚拟世界“触手可感”
  65. 大学社团“拉赞助”成为个人隐私泄露的重灾区
  66. 地量地价,将迎变盘?看看大V怎么说(6月17日)
  67. 富士康科技集团发声明否认“撤离大陆”
  68. 5G来了,需要更换SIM卡吗?
  69. 任正非:遭受打压不会阻止华为前进的步伐
  70. MIT新机器人“成精了” 能通过视觉和触觉识别事物
  71. 让港股小股东买得起?阿里计划分拆普通股:1拆8
  72. 任正非:未来华为业务不会拆分也不会卖掉
  73. 英伟达与ARM打造超级计算机 开发气候预测与核武器建模系统
  74. 任正非:华为不会像高通一样 收那么高的专利费
  75. 渐冻人有望“解冻”
  76. 富士康科技集团声明否认“撤离大陆”:无撤资现象发生
  77. 人体就像马赛克,大量组织充满致癌突变
  78. 超级计算机500强史上首次全部千万亿次!中国神威太湖之光第三
  79. 哈勃太空望远镜观测到有“大心脏”的小星系
  80. 节能超算Green500排行榜公布 NVIDIA笑到了最后
  81. 兴衰成败三百年:俄罗斯数学的光荣与梦想
  82. 任正非:通过科学的数学模型 AI可继承人类智慧
  83. 美国航空机上 WiFi 全面升级为卫星网络,空中上网的体验更好了
  84. 4G的小程序与5G的Chromium OS?
  85. 2249万元!UCloud 中标中移信息技术“异地多活”云平台试点工程
  86. 地球历史的24个转折点
  87. 激光摧毁血液中的癌细胞
  88. 什么是报文
  89. Item
  90. Eclipse 常用快捷键及使用技巧
  91. 2.urllib库的使用
  92. java基础
  93. 【Swift】WKWebView与JS的交互使用
  94. python基础数据类型和初级应用
  95. Echarts 设置 图标 默认平铺 数据为零时绘画
  96. uni-app学习(三)好用的插件1
  97. java 学习第一步---安装JDK以及配置环境变量
  98. Spring Boot:实现MyBatis动态创建表
  99. Django表单
  100. 《七哥说道》【第十四章:趁着夏天还在,回校园】