[藍芽] 6、基於nRF51822的藍芽心率計工程訊息流Log分析(詳細)
轉載自:
http://www.cnblogs.com/zjutlitao/p/5051166.html
開機初始化Log
Log編號 函式名 所在檔名
1 000001: main ..\main.c2 000002: timers_init ..\main.c 3 000003: gpiote_init ..\main.c 4 000004: buttons_init ..\main.c5 000005: ble_stack_init ..\main.c 6 000006: bond_manager_init ..\main.c 7 000007: gap_params_init ..\main.c8 000008: advertising_init ..\main.c 9 000009: services_init ..\main.c 10 000010: ble_hrs_init ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 11 000011: heart_rate_measurement_char_add ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 12 000012: hrm_encode ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 13 000013: body_sensor_location_char_add ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 14 000014: ble_bas_init ..\..\..\..\..\Source\ble\ble_services\ble_bas.c 15 000015: battery_level_char_add ..\..\..\..\..\Source\ble\ble_services\ble_bas.c 16 000016: ble_dis_init ..\..\..\..\..\Source\ble\ble_services\ble_dis.c 17 000017: char_add ..\..\..\..\..\Source\ble\ble_services\ble_dis.c 18 000018: conn_params_init ..\main.c 19 000019: sec_params_init ..\main.c 20 000020: advertising_start ..\main.c 21 000021: led_start ..\led.c 22 000022: ppi_init ..\led.c 23 000023: timer1_init ..\led.c 24 000024: gpiote_init ..\led.c
下面是main函式對應的初始化函式:
※ 上面Log中第九行server_init中會跳轉到hrs,bas,dis中進行相關操作,我們重點分析——
【第一段黃色地帶講解】
1 uint32_t ble_hrs_init(ble_hrs_t * p_hrs, const ble_hrs_init_t * p_hrs_init) 2 { 3 LOG(__FUNCTION__); 4 uint32_t err_code; 5 ble_uuid_t ble_uuid; 6 7 // Initialize service structure 8 p_hrs->evt_handler = p_hrs_init->evt_handler; 9 p_hrs->is_sensor_contact_supported = p_hrs_init->is_sensor_contact_supported; 10 p_hrs->conn_handle = BLE_CONN_HANDLE_INVALID; 11 p_hrs->is_sensor_contact_detected = false; 12 p_hrs->rr_interval_count = 0;
這一部分主要是初始化p_hrs結構體,p_hrs_init的內容在server_init賦值的,如下:
其中第433行設定hrs的事件控制代碼,這樣可以在其中監聽hrs的相關事件,如下:
這個和ble_evt_dispatch傳送BLE協議棧事件給hrs模組的ble_hrs_on_ble_evt函式稍有不同
在on_xxxx中主要處理on_connect、disconnect和write事件
注:其中case的兩個事件型別是自定義的列舉型
上面437~443是設定hrs的attribute的可讀可寫等屬性的
其中hrs_hrm_attr_md是Initial security level for heart rate service measurement attribute
其中hrs_bsl_attr_md是Initial security level for body sensor location attribute
上面89、90行的紅色部分的結構體為:
可見,cccd比無cccd的多了個cccd_write_perm
這裡的cccd為:客戶端特性配置描述符(Client Characteristic Configuration Descriptor,CCCD)
這個帶cccd的結構體在SDK描述如下:
Security settings structure.
This structure contains the security options needed during initialization of the service. It can be used when the charecteristics contains cccd.
我的理解是attribute中的屬性有兩種:屬性值或描述符。如果想支援通知或指示notify,那麼就得選用cccd的這種~
注:關於BLE的一些名詞[1] profile\service\characteristic\uuid關係[2]
綜上:HRS服務配置了兩個characteristic,他們分別是heart rate measurement characteristic(簡稱HRMC)和body sensor location characteristic。其中HRMC具有notify功能,不具有讀寫功能,即:他的值不能被其他藍芽裝置請求讀寫,只能主動傳送給裝置(稱為notify,類似於web中的推送~)
14 // Add service 15 BLE_UUID_BLE_ASSIGN(ble_uuid, BLE_UUID_HEART_RATE_SERVICE);
16
17 err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &p_hrs->service_handle);
18 if (err_code != NRF_SUCCESS)
19 {
20 return err_code;
21 }
其中BLE_UUID_BLE_ASSIGN是一個給uuid初始賦值的巨集定義:
而sd_ble_gatts_service_add負責:Add a service declaration to the local server ATT table.
談到sd_ble_gatts_service_add,就必須談一下Function packet format:
綜上:上面14~21行程式碼就實現了將BLE_UUID_HEART_RATE_SERVICE加入到藍芽協議棧中~
23 // Add heart rate measurement characteristic 24 err_code = heart_rate_measurement_char_add(p_hrs, p_hrs_init); 25 if (err_code != NRF_SUCCESS) 26 { 27 return err_code; 28 }
這裡heart_rate_measurement_char_add是向上面新增的服務中新增characteristic的,非API函式,具體拆分講解如下:
該函式前面都是一些賦值操作,最後呼叫了一個API函式:
如下,該API實現將一個屬性宣告,一個屬性值宣告和一個可選屬性描述符宣告新增進ATT表。
這個新增的屬性會新增進最近新增的服務中,當然perminssions需要統一等情況要注意~
該函式的引數情況如下:
· 第一個service_handle指向該屬性所在的服務
· 第二個p_char_md是屬性的原資料
· 第三個p_attr_char_value是指向attribute結構體所對應的屬性值
· 第四個p_handles是指向指定控制代碼所儲存的結構體
在呼叫上面API之前,首先對p_char_md屬性原資料進行配置attribute
接著配置p_attr_char_value進行配置:
其實經過前面的這些配置之後,再呼叫API函式sd_ble_gatts_characteristic_add就會形成一個下面格式的包:
注:sd_ble_gatts_characteristic_add 功能的包格式[3]
30 if (p_hrs_init->p_body_sensor_location != NULL) 31 { 32 // Add body sensor location characteristic 33 err_code = body_sensor_location_char_add(p_hrs, p_hrs_init); 34 if (err_code != NRF_SUCCESS) 35 { 36 return err_code; 37 } 38 }
最後判斷是否要把body sensor location characteristic加入到hrs服務中~
40 return NRF_SUCCESS; 41 }
連線藍芽後的效果
1 000025: ble_evt_dispatch ..\main.c 2 000026: ble_hrs_on_ble_evt ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 3 000027: on_connect ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 4 000028: ble_bas_on_ble_evt ..\..\..\..\..\Source\ble\ble_services\ble_bas.c 5 000029: on_connect ..\..\..\..\..\Source\ble\ble_services\ble_bas.c 6 000030: on_ble_evt ..\main.c 7 000031: led_stop ..\led.c 8 000032: application_timers_start ..\main.c 9 000033: heart_rate_meas_timeout_handler ..\main.c 10 000034: ble_hrs_heart_rate_measurement_send ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 11 000035: hrm_encode ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 12 000036: heart_rate_meas_timeout_handler ..\main.c 13 000037: ble_hrs_heart_rate_measurement_send ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 14 000038: hrm_encode ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 15 000039: battery_level_meas_timeout_handler ..\main.c 16 000040: battery_start ..\battery.c 17 000041: ADC_IRQHandler ..\battery.c 18 000042: ble_bas_battery_level_update ..\..\..\..\..\Source\ble\ble_services\ble_bas.c 19 000043: heart_rate_meas_timeout_handler ..\main.c 20 000044: ble_hrs_heart_rate_measurement_send ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 21 000045: hrm_encode ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 22 000046: heart_rate_meas_timeout_handler ..\main.c 23 000047: ble_hrs_heart_rate_measurement_send ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c the same...
如Log第25行手機連線上nRF51822之後,BLE協議棧把事件通過ble_evt_dispatch分配到每個模
1 /**@brief Function for dispatching a BLE stack event to all modules with a BLE stack event handler. 2 * 3 * @details This function is called from the BLE Stack event interrupt handler after a BLE stack 4 * event has been received. 5 * 6 * @param[in] p_ble_evt Bluetooth stack event. 7 */ 8 static void ble_evt_dispatch(ble_evt_t * p_ble_evt) 9 { 10 LOG(__FUNCTION__); 11 ble_bondmngr_on_ble_evt(p_ble_evt); 12 ble_hrs_on_ble_evt(&m_hrs, p_ble_evt);
先進入ble_hrs_on_ble_evt,進而解析事件執行on_connect,如下:eto
13 ble_bas_on_ble_evt(&bas, p_ble_evt); 14 ble_conn_params_on_ble_evt(p_ble_evt); 15 on_ble_evt(p_ble_evt);
在on_ble_evt中當檢測到connected事件,
則關閉標誌廣播進行中的燈的定時器,
start在timer初始化中設定的hrs和bas定時器,也因此在Log中接著會輪流週期性觸發hrs和bas的timeout控制代碼
16 }
Heart Rate Measurement啟動或終止notify監聽時的Log
1 002044: ble_evt_dispatch ..\main.c 2 002045: ble_hrs_on_ble_evt ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 3 002046: on_write ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 4 002047: on_hrm_cccd_write ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 5 002048: hrs_event_handler ..\main.c 6 002049: ble_bas_on_ble_evt ..\..\..\..\..\Source\ble\ble_services\ble_bas.c 7 002050: on_write ..\..\..\..\..\Source\ble\ble_services\ble_bas.c
當上位機(手機端)點選start notify時,其實有一個互動過程的!
如上面的Log:
1、首先BLE協議棧把該事件通過dispatch分派給模組ble_hrs_on_ble_evt
2、ble_hrs_on_ble_evt 對事件解析發現是BLE_GATTS_EVT_WRITE,並呼叫on_write
3、從on_write又進入on_hrm_cccd_write,在其中判斷併發送相應的evt_handler事件訊息
4、該訊息會發送到其接受函式hrs_event_handler中,並根據情況設定notify
Heart Rate Measurement啟動監聽中的Log
1 000895: heart_rate_meas_timeout_handler ..\main.c 2 000896: ble_hrs_heart_rate_measurement_send ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 3 000897: hrm_encode ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 4 000898: ble_evt_dispatch ..\main.c 5 000899: ble_hrs_on_ble_evt ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 6 000900: ble_bas_on_ble_evt ..\..\..\..\..\Source\ble\ble_services\ble_bas.c 7 000901: on_ble_evt ..\main.c 8 000902: heart_rate_meas_timeout_handler ..\main.c 9 000903: ble_hrs_heart_rate_measurement_send ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 10 000904: hrm_encode ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 11 000905: battery_level_meas_timeout_handler ..\main.c 12 000906: battery_start ..\battery.c 13 000907: ADC_IRQHandler ..\battery.c 14 000908: ble_bas_battery_level_update ..\..\..\..\..\Source\ble\ble_services\ble_bas.c 15 000909: ble_evt_dispatch ..\main.c 16 000910: ble_hrs_on_ble_evt ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 17 000911: ble_bas_on_ble_evt ..\..\..\..\..\Source\ble\ble_services\ble_bas.c 18 000912: on_ble_evt ..\main.c
和連線藍芽後的Log的12-18行對比,由於這裡開啟了notify,所以出現了些許不一樣的地方:
即:紅色字型的部分!
根據Log猜測(暫時沒有器材,無法除錯,到早上試,再給出最終結果~):
1、可能是因為上位機使能了notification,執行了紅線那句話
2、之前由於沒有執行這句話使ble_hrs_heart_rate_measurement_send和ble_bas_battery_level_update中的sd_ble_gatts_hvx函式沒有被執行,而一旦紅線那句話執行後sd_ble_gatts_hvx將被週期性地執行:
3、而每次sd_ble_gatts_hvx函式都會觸發ble協議棧產生相應的訊息,通過ble_evt_dispatch派送到各個模組,最終被on_ble_evt解析到BLE_GAP_EVT_SEC_PARAMS_REQUEST訊息並執行相關操作,把訊息傳送出去:
藍芽斷開時的Log
1 008913: ble_evt_dispatch ..\main.c 2 008914: ble_hrs_on_ble_evt ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 3 008915: on_disconnect ..\..\..\..\..\Source\ble\ble_services\ble_hrs.c 4 008916: ble_bas_on_ble_evt ..\..\..\..\..\Source\ble\ble_services\ble_bas.c 5 008917: on_disconnect ..\..\..\..\..\Source\ble\ble_services\ble_bas.c 6 008918: on_ble_evt ..\main.c 7 008919: system_off_mode_enter ..\main.c
斷開藍芽比較簡單,訊息從協議棧經dispatch分發到hrs、bas和on_ble_evt分別做相應處理!
注:
[1]、關於BLE的一些名詞:
每個attribute屬性被UUID(通用唯一識別符號)唯一標識 ,UUID是標準128-bit格式的ID用來唯一標識資訊。attributes 被 ATT 格式化characteristics和services形式進行傳送。
· 特徵(Characteristics)— 一個characteristics包含一個單獨的value值和0 –n個用來描述characteristic 值(value)的descriptors。一個characteristics可以被認為是一種型別的,類似於一個類。
· 描述符(descriptor) —descriptor是被定義的attributes,用來描述一個characteristic的值。例如,一個descriptor可以指定一個人類可讀的描述中,在可接受的範圍裡characteristic值,或者是測量單位,用來明確characteristic的值。
· 服務(service) —service是characteristic的集合。例如,你可以有一個所謂的“Heart RateMonitor”service,其中包括characteristic,如“heart rate measurement ”。你可以在 bluetooth.org找到關於一系列基於GATT的profile和service。
他們關係為:藍芽裝置可以包括多個Profile,一個Profile中有多個Service,一個Service中有多個Characteristic,一個Characteristic中包括一個value和多個Descriptor。
[2]、profile\service\characteristic\uuid關係:
1、profile profile可以理解為一種規範,一個標準的通訊協議,它存在於從機中。藍芽組織規定了一些標準的profile,例如 HID OVER GATT ,防丟器 ,心率計等。每個profile中會包含多個service,每個service代表從機的一種能力。 2、service service可以理解為一個服務,在ble從機中,通過有多個服務,例如電量資訊服務、系統資訊服務等,每個service中又包含多個characteristic特徵值。每個具體的characteristic特徵值才是ble通訊的主題。比如當前的電量是80%,所以會通過電量的characteristic特徵值存在從機的profile裡,這樣主機就可以通過這個characteristic來讀取80%這個資料 3、characteristic characteristic特徵值,ble主從機的通訊均是通過characteristic來實現,可以理解為一個標籤,通過這個標籤可以獲取或者寫入想要的內容。 4、UUID UUID,統一識別碼,我們剛才提到的service和characteristic,都需要一個唯一的uuid來標識 每個從機都會有一個叫做profile的東西存在,不管是上面的自定義的simpleprofile,還是標準的防丟器profile,他們都是由一些列service組成,然後每個service又包含了多個characteristic,主機和從機之間的通訊,均是通過characteristic來實現。 實際產品中,每個藍芽4.0的裝置都是通過服務和特徵來展示自己的,服務和特徵都是用UUID來唯一標識的。一個裝置必然包含一個或多個服務,每個服務下面又包含若干個特徵。特徵是與外界互動的最小單位。藍芽裝置硬體廠商通常都會提供他們的裝置裡面各個服務(service)和特徵(characteristics)的功能,比如哪些是用來互動(讀寫),哪些可獲取模組資訊(只讀)等。比如說,一臺藍芽4.0裝置,用特徵A來描述自己的出廠資訊,用特徵B來與收發資料等。 [3]、sd_ble_gatts_characteristic_add 功能的包格式: 1、Frame format encoding of the sd_ble_gatts_characteristic_add packet.2、Operation Code = 0xA2 (162) for sd_ble_gatts_characteristic_add, see BLE_GATTS_SVCS.
3、The parameters provided as input to sd_ble_gatts_characteristic_add are encoded in the following order
- 1 byte: | Operation Code, Value = 0xA2 (162) |
|
- 2 bytes: | Service Handle |
|
- 1 byte: | Metadata Present | |
0x00 Field not present | ||
0x01 Field present and follows immediately in the packet | ||
- 11..539 bytes: | ble_gatts_char_md_t | Conditional: Characteristic Metadata |
- 1 byte: | Characteristic Attribute Present | |
0x00 Field not present | ||
0x01 Field present and follows immediately in the packet | ||
- 9..527 bytes: | ble_gatts_attr_t | Conditional: Characteristic Attribute |
- 1 byte: | Handles Present | |
0x00 Field not present | ||
0x01 Field present on Application Chip |
其包格式影象表示為:(其中characteristic metadata和char attributes展開太多,請參看SDK)
注:
本篇講了nrf51822藍芽ble工程的訊息流
至此整個藍芽心率計工程分析得差不多了
本工程連結:http://pan.baidu.com/s/1dEalb6h
More:
[藍芽] 1、藍芽核心技術瞭解(藍芽協議、架構、硬體和軟體筆記)
[藍芽] 2、藍芽BLE協議及架構淺析&&基於廣播超時待機說廣播事件
[藍芽] 4、Heart Rate Service module
@beautifulzzzz 2015-12-17 continue~
分類: 硬體_通訊組網 好文要頂 關注我 收藏該文 beautifulzzzz
關注 - 43
粉絲 - 487 榮譽: 推薦部落格 +加關注 5 0 (請您對文章做出評價) 關注 | 頂部 | 評論 « 上一篇: [藍芽] 5、Battery Service module
» 下一篇: [異常解決] ubuntu上安裝虛擬機器遇到的問題(vmware坑了,virtual-box簡單安裝,在virtual-box中安裝精簡版win7)
posted @ 2015-12-17 01:50 beautifulzzzz 閱讀( 278) 評論( 2) 編輯 收藏
評論 #1樓 [ 樓主] 2015-12-17 11:39 | beautifulzzzz 上面存在猜測部分,我現在測了下:
1 2 3 4 5 6 7 8 9 10 11 |
static
void
ble_evt_dispatch(ble_evt_t * p_ble_evt)
{
LOG(__FUNCTION__);
ble_bondmngr_on_ble_evt(p_ble_evt);
相關推薦[藍芽] 6、基於nRF51822的藍芽心率計工程訊息流Log分析(詳細)轉載自: http://www.cnblogs.com/zjutlitao/p/5051166.html 開機初始化Log Log編號 基於hadoop生態系統的mahout推薦和聚類分析(1)簡介 hadoop是Apache旗下的一個開源分散式計算平臺,在分散式環境下為使用者提供處理海量資料的能力。 mahout是hadoop下的一個子專案,主要用於推薦、分類和聚類分析 一、推薦 關於推薦的演算法有很多,本次主要介紹協同過濾演算法。 (1)基於使用者的協 Android平臺藍芽程式設計之藍芽聊天分析(二)接著上一篇沒有完成的任務,我們繼續分析這個藍芽聊天程式的實現,本文主要包括以下兩個部分的內容:其一,分析掃描裝置部分DeviceListActivity,其二,分析具體的聊天過程的完整通訊方案,包括埠監聽、連結配對、訊息傳送和接收等,如果有對上一篇文章不太熟悉的,可以返回 《ArcGIS Runtime SDK for Android開發筆記》——(6)、基於Android Studio的ArcGIS Android工程結構解析1、前言 Android Studio 是第一個Google官方的 Android 開發環境。其他工具,例如 Eclipse,在 Android Studio 釋出之前已經有了大規模的使用。為了幫助開發者轉向 Android Studio,谷歌已經寫出一套遷移指南。Google 同時也釋出宣告稱,在接下來的 【金陽光測試】基於控件核心技術探討---Android自己主動化系列(2)---2013年5月進程 實用 版本 信號 監聽 dialog otto 設計 核心技術 第一講分享了下安卓自己主動化一些概況和一些自己主動化框架現狀和技術可以解決什麽樣的問題。這次課就深入到android世界裏面。遨遊、翺翔。深入了解自己主動化測試核心技術。 Linux——信息分析(四)域名分析dig、host、p地址 blog alt src org amt png 負責 一級域名 1、域名的命名格式為:WWW.<用戶名>.<二級域名>.<一級域名> dig www.baidu.com 解析過程說明 基於itchat的微信群聊小助手基礎開發(一)log 表達式 數據包 gin 找到 ont 基本 時間 msg 前段時間由於要管理微信群,基於itchat開發了一個簡單的微信機器人 主要功能有: 圖靈機器人功能 群聊昵稱格式修改提示 消息防撤回功能 鬥圖功能 要開發一個基於itchat的最基本的聊天機器人, 字符、字符集、編碼,以及它們python中會遇到的一些問題(下)區別 做了 and 內部 eve nbsp nes 文字 相對 在看了很多的博客文章之後,總結整理得到了以下文章,非常感謝這些無私奉獻的博主! 文章末尾有本文引用的文章的鏈接,如果有漏掉的文章引用,可以發郵件聯系我,隨後再次附上鏈接! 侵刪!!! 這一部分是下篇,主要 一個基於JRTPLIB的輕量級RTSP客戶端(myRTSPClient)——實現篇:(六)RTP音視頻傳輸解析層之音視頻數據傳輸格式客戶端 會有 服務 client 基本 cnblogs 存在 額外 導致 一、差異 本地音視頻數據格式和用來傳輸的音視頻數據格式存在些許差異,由於音視頻數據流到達客戶端時,需要考慮數據流的數據邊界、分包、組包順序等問題,所以傳輸中的音視頻數據往往會多一些字節。 舉個例子 《Flask Web開發——基於Python的Web應用開發實踐》一字一句上機實踐(下)屬性 一個用戶 臨時 target 說明 實戰 分享圖片 ace 庫文件 目錄 前言 第8章 用戶認證 第9章 用戶角色 第10章 用戶資料 第11章 博客文章 第12章 關註者 第13章 用戶評論 第14章 應用編程接口 前言 基於RISC-V架構的開源處理器及SoC研究綜述(二)收錄 soc jxl gfs ldl ddx dtb ref ssl 5f吮撼墻l3窘簿夢l1承凸幹http://byzzjf.wikidot.com/zv壕握久v3毀誌喲7n霞煞已http://byzdsbbb.wikidot.com/4e諶蕉副2w奔略盜oe晌堵閡htt 基於qml創建最簡單的圖像處理程序(1)-基於qml創建界面cep font mes quit vid www 習慣 image ble 為什麽使用QT,包括進一步使用QML?兩個主要原因,一是因為我是一個c++程序員,有語言使用慣性;二是我主要做圖像處理方面工作,使用什麽平臺對於我來說不重要,我只需要在不同平臺上面能 基於qml創建最簡單的圖像處理程序(2)-使用c++&qml進行圖像處理.cn turn isnull 按鈕 編寫 可能 finish height 通過 《基於qml創建最簡單的圖像處理程序》系列課程及配套代碼基於qml創建最簡單的圖像處理程序(1)-基於qml創建界面http://www.cnblogs.com/jsxyhelu/p/83 基於qml創建最簡單的圖像處理程序(3)-使用opencv&qml進行圖像處理結果 tar isempty reat features eabi qt quick resources 也會 《基於qml創建最簡單的圖像處理程序》系列課程及配套代碼基於qml創建最簡單的圖像處理程序(1)-基於qml創建界面http://www.cnblogs.com/ Django基於Pycharm開發之四[關於靜態文件的使用,配置以及源碼分析](原創)OS director 一個 pin mes map text 開發人員 容易 對於django靜態文件的使用,如果開發過netcore程序的開發人員,可能會比較容易理解django關於靜態文件訪問的設計原理,個人覺得,這是一個middlerware的設計,但是在djang 一個基於JRTPLIB的輕量級RTSP客戶端(myRTSPClient)——實現篇:(九)以g711-mulaw為例添加新的編碼格式解析支持調用 pcm 2個 h265 pri 源碼 返回 .cn memcpy 一、myRtspClient音頻解析架構 AudioTypeBase是處理解析各種編碼的音頻數據的接口類。處理MPA數據的MPEG_Audio類和處理g711-mulaw的PCMU_Audio類均從Au kafka源碼分析(二)Metadata的數據結構與讀取、更新策略思路 sync 源碼分析 png ada ret code 入隊 後臺線程 一、基本思路 異步發送的基本思路就是:send的時候,KafkaProducer把消息放到本地的消息隊列RecordAccumulator,然後一個後臺線程Sender不斷循環,把消息發給K [python機器學習及實踐(6)]Sklearn實現主成分分析(PCA)相關性 hit 變量 gray tran total 空間 mach show 1.PCA原理 主成分分析(Principal Component Analysis,PCA), 是一種統計方法。通過正交變換將一組可能存在相關性的變量轉換為一組線性不相關的變量,轉換後的這組 基於環境變量為多用戶配置不同的JDK(win)pat 相同 使用 net window java_home str tool 同步 情景 同一服務器同時部署不同項目需要使用不同的JRE 環境 Windows Server 2008 需求 用戶admin 需要使用jdk1.8 用戶admin1 需要使用jdk1 基於天氣預報項目談springcloud構建的微服務(一)個人理解 動態 spring 解決方案 消費 服務架構 方式 mage 什麽是 單體架構 簡單介紹一下四個模塊分別的作用: 城市信息模塊: 主要是調用第三方服務獲取所有的城市信息,用於數據采集的時候調用 數據采集模塊: 由於是基於調用第三方 api 的服務,所以我們要考 |